aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Yasevich <vyasevic@redhat.com>2013-06-05 10:08:00 -0400
committerDavid S. Miller <davem@davemloft.net>2013-06-11 05:04:32 -0400
commit9ba18891f75535eca3ef53138b48970eb60f5255 (patch)
treecdd724cc45f489ae601d22f3ffdd64be02b5c049
parent30f3a40f9a2a2869a560a9cb9ef488d10c803e14 (diff)
bridge: Add flag to control mac learning.
Allow user to control whether mac learning is enabled on the port. By default, mac learning is enabled. Disabling mac learning will cause new dynamic FDB entries to not be created for a particular port. Signed-off-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/uapi/linux/if_link.h1
-rw-r--r--net/bridge/br_if.c2
-rw-r--r--net/bridge/br_input.c6
-rw-r--r--net/bridge/br_netlink.c6
-rw-r--r--net/bridge/br_private.h1
-rw-r--r--net/bridge/br_sysfs_if.c2
6 files changed, 14 insertions, 4 deletions
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index b05823cae784..8643809d8417 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -221,6 +221,7 @@ enum {
221 IFLA_BRPORT_GUARD, /* bpdu guard */ 221 IFLA_BRPORT_GUARD, /* bpdu guard */
222 IFLA_BRPORT_PROTECT, /* root port protection */ 222 IFLA_BRPORT_PROTECT, /* root port protection */
223 IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ 223 IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */
224 IFLA_BRPORT_LEARNING, /* mac learning */
224 __IFLA_BRPORT_MAX 225 __IFLA_BRPORT_MAX
225}; 226};
226#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) 227#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 4cdba60926ff..2c08911df578 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -221,7 +221,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
221 p->path_cost = port_cost(dev); 221 p->path_cost = port_cost(dev);
222 p->priority = 0x8000 >> BR_PORT_BITS; 222 p->priority = 0x8000 >> BR_PORT_BITS;
223 p->port_no = index; 223 p->port_no = index;
224 p->flags = 0; 224 p->flags = BR_LEARNING;
225 br_init_port(p); 225 br_init_port(p);
226 p->state = BR_STATE_DISABLED; 226 p->state = BR_STATE_DISABLED;
227 br_stp_port_timer_init(p); 227 br_stp_port_timer_init(p);
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 828e2bcc1f52..7e993667d4bf 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -75,7 +75,8 @@ int br_handle_frame_finish(struct sk_buff *skb)
75 75
76 /* insert into forwarding database after filtering to avoid spoofing */ 76 /* insert into forwarding database after filtering to avoid spoofing */
77 br = p->br; 77 br = p->br;
78 br_fdb_update(br, p, eth_hdr(skb)->h_source, vid); 78 if (p->flags & BR_LEARNING)
79 br_fdb_update(br, p, eth_hdr(skb)->h_source, vid);
79 80
80 if (!is_broadcast_ether_addr(dest) && is_multicast_ether_addr(dest) && 81 if (!is_broadcast_ether_addr(dest) && is_multicast_ether_addr(dest) &&
81 br_multicast_rcv(br, p, skb)) 82 br_multicast_rcv(br, p, skb))
@@ -142,7 +143,8 @@ static int br_handle_local_finish(struct sk_buff *skb)
142 u16 vid = 0; 143 u16 vid = 0;
143 144
144 br_vlan_get_tag(skb, &vid); 145 br_vlan_get_tag(skb, &vid);
145 br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid); 146 if (p->flags & BR_LEARNING)
147 br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid);
146 return 0; /* process further */ 148 return 0; /* process further */
147} 149}
148 150
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 8e3abf564798..ce902bf8a618 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -30,6 +30,7 @@ static inline size_t br_port_info_size(void)
30 + nla_total_size(1) /* IFLA_BRPORT_GUARD */ 30 + nla_total_size(1) /* IFLA_BRPORT_GUARD */
31 + nla_total_size(1) /* IFLA_BRPORT_PROTECT */ 31 + nla_total_size(1) /* IFLA_BRPORT_PROTECT */
32 + nla_total_size(1) /* IFLA_BRPORT_FAST_LEAVE */ 32 + nla_total_size(1) /* IFLA_BRPORT_FAST_LEAVE */
33 + nla_total_size(1) /* IFLA_BRPORT_LEARNING */
33 + 0; 34 + 0;
34} 35}
35 36
@@ -56,7 +57,8 @@ static int br_port_fill_attrs(struct sk_buff *skb,
56 nla_put_u8(skb, IFLA_BRPORT_MODE, mode) || 57 nla_put_u8(skb, IFLA_BRPORT_MODE, mode) ||
57 nla_put_u8(skb, IFLA_BRPORT_GUARD, !!(p->flags & BR_BPDU_GUARD)) || 58 nla_put_u8(skb, IFLA_BRPORT_GUARD, !!(p->flags & BR_BPDU_GUARD)) ||
58 nla_put_u8(skb, IFLA_BRPORT_PROTECT, !!(p->flags & BR_ROOT_BLOCK)) || 59 nla_put_u8(skb, IFLA_BRPORT_PROTECT, !!(p->flags & BR_ROOT_BLOCK)) ||
59 nla_put_u8(skb, IFLA_BRPORT_FAST_LEAVE, !!(p->flags & BR_MULTICAST_FAST_LEAVE))) 60 nla_put_u8(skb, IFLA_BRPORT_FAST_LEAVE, !!(p->flags & BR_MULTICAST_FAST_LEAVE)) ||
61 nla_put_u8(skb, IFLA_BRPORT_LEARNING, !!(p->flags & BR_LEARNING)))
60 return -EMSGSIZE; 62 return -EMSGSIZE;
61 63
62 return 0; 64 return 0;
@@ -281,6 +283,7 @@ static const struct nla_policy ifla_brport_policy[IFLA_BRPORT_MAX + 1] = {
281 [IFLA_BRPORT_MODE] = { .type = NLA_U8 }, 283 [IFLA_BRPORT_MODE] = { .type = NLA_U8 },
282 [IFLA_BRPORT_GUARD] = { .type = NLA_U8 }, 284 [IFLA_BRPORT_GUARD] = { .type = NLA_U8 },
283 [IFLA_BRPORT_PROTECT] = { .type = NLA_U8 }, 285 [IFLA_BRPORT_PROTECT] = { .type = NLA_U8 },
286 [IFLA_BRPORT_LEARNING] = { .type = NLA_U8 },
284}; 287};
285 288
286/* Change the state of the port and notify spanning tree */ 289/* Change the state of the port and notify spanning tree */
@@ -328,6 +331,7 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
328 br_set_port_flag(p, tb, IFLA_BRPORT_GUARD, BR_BPDU_GUARD); 331 br_set_port_flag(p, tb, IFLA_BRPORT_GUARD, BR_BPDU_GUARD);
329 br_set_port_flag(p, tb, IFLA_BRPORT_FAST_LEAVE, BR_MULTICAST_FAST_LEAVE); 332 br_set_port_flag(p, tb, IFLA_BRPORT_FAST_LEAVE, BR_MULTICAST_FAST_LEAVE);
330 br_set_port_flag(p, tb, IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK); 333 br_set_port_flag(p, tb, IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK);
334 br_set_port_flag(p, tb, IFLA_BRPORT_LEARNING, BR_LEARNING);
331 335
332 if (tb[IFLA_BRPORT_COST]) { 336 if (tb[IFLA_BRPORT_COST]) {
333 err = br_stp_set_path_cost(p, nla_get_u32(tb[IFLA_BRPORT_COST])); 337 err = br_stp_set_path_cost(p, nla_get_u32(tb[IFLA_BRPORT_COST]));
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 1b0ac95a5c37..04d7f43508f7 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -158,6 +158,7 @@ struct net_bridge_port
158#define BR_ROOT_BLOCK 0x00000004 158#define BR_ROOT_BLOCK 0x00000004
159#define BR_MULTICAST_FAST_LEAVE 0x00000008 159#define BR_MULTICAST_FAST_LEAVE 0x00000008
160#define BR_ADMIN_COST 0x00000010 160#define BR_ADMIN_COST 0x00000010
161#define BR_LEARNING 0x00000020
161 162
162#ifdef CONFIG_BRIDGE_IGMP_SNOOPING 163#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
163 u32 multicast_startup_queries_sent; 164 u32 multicast_startup_queries_sent;
diff --git a/net/bridge/br_sysfs_if.c b/net/bridge/br_sysfs_if.c
index a1ef1b6e14dc..707f3628e9cd 100644
--- a/net/bridge/br_sysfs_if.c
+++ b/net/bridge/br_sysfs_if.c
@@ -158,6 +158,7 @@ static BRPORT_ATTR(flush, S_IWUSR, NULL, store_flush);
158BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPIN_MODE); 158BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPIN_MODE);
159BRPORT_ATTR_FLAG(bpdu_guard, BR_BPDU_GUARD); 159BRPORT_ATTR_FLAG(bpdu_guard, BR_BPDU_GUARD);
160BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLOCK); 160BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLOCK);
161BRPORT_ATTR_FLAG(learning, BR_LEARNING);
161 162
162#ifdef CONFIG_BRIDGE_IGMP_SNOOPING 163#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
163static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf) 164static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
@@ -195,6 +196,7 @@ static const struct brport_attribute *brport_attrs[] = {
195 &brport_attr_hairpin_mode, 196 &brport_attr_hairpin_mode,
196 &brport_attr_bpdu_guard, 197 &brport_attr_bpdu_guard,
197 &brport_attr_root_block, 198 &brport_attr_root_block,
199 &brport_attr_learning,
198#ifdef CONFIG_BRIDGE_IGMP_SNOOPING 200#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
199 &brport_attr_multicast_router, 201 &brport_attr_multicast_router,
200 &brport_attr_multicast_fast_leave, 202 &brport_attr_multicast_fast_leave,