aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge
diff options
context:
space:
mode:
authorToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>2014-06-10 07:59:24 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-11 18:22:53 -0400
commitf2808d226f4efe15a0ea44697a3525176d6c8eae (patch)
tree45b3017e9b56116a23e835b5eeece8aada211f7e /net/bridge
parent8580e2117c06ac0c97a561219eaab6dab968ea3f (diff)
bridge: Prepare for forwarding another bridge group addresses
If a bridge is an 802.1ad bridge, it must forward another bridge group addresses (the Nearest Customer Bridge group addresses). (For details, see IEEE 802.1Q-2011 8.6.3.) As user might not want group_fwd_mask to be modified by enabling 802.1ad, introduce a new mask, group_fwd_mask_required, which indicates addresses the bridge wants to forward. This will be set by enabling 802.1ad. Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
-rw-r--r--net/bridge/br_device.c1
-rw-r--r--net/bridge/br_input.c8
-rw-r--r--net/bridge/br_private.h3
3 files changed, 10 insertions, 2 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 1b797c42ef5f..568cccd39a3d 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -378,6 +378,7 @@ void br_dev_setup(struct net_device *dev)
378 378
379 br->stp_enabled = BR_NO_STP; 379 br->stp_enabled = BR_NO_STP;
380 br->group_fwd_mask = BR_GROUPFWD_DEFAULT; 380 br->group_fwd_mask = BR_GROUPFWD_DEFAULT;
381 br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT;
381 382
382 br->designated_root = br->bridge_id; 383 br->designated_root = br->bridge_id;
383 br->bridge_max_age = br->max_age = 20 * HZ; 384 br->bridge_max_age = br->max_age = 20 * HZ;
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 04d6348fd530..366c43649079 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -177,6 +177,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
177 p = br_port_get_rcu(skb->dev); 177 p = br_port_get_rcu(skb->dev);
178 178
179 if (unlikely(is_link_local_ether_addr(dest))) { 179 if (unlikely(is_link_local_ether_addr(dest))) {
180 u16 fwd_mask = p->br->group_fwd_mask_required;
181
180 /* 182 /*
181 * See IEEE 802.1D Table 7-10 Reserved addresses 183 * See IEEE 802.1D Table 7-10 Reserved addresses
182 * 184 *
@@ -194,7 +196,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
194 case 0x00: /* Bridge Group Address */ 196 case 0x00: /* Bridge Group Address */
195 /* If STP is turned off, 197 /* If STP is turned off,
196 then must forward to keep loop detection */ 198 then must forward to keep loop detection */
197 if (p->br->stp_enabled == BR_NO_STP) 199 if (p->br->stp_enabled == BR_NO_STP ||
200 fwd_mask & (1u << dest[5]))
198 goto forward; 201 goto forward;
199 break; 202 break;
200 203
@@ -203,7 +206,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
203 206
204 default: 207 default:
205 /* Allow selective forwarding for most other protocols */ 208 /* Allow selective forwarding for most other protocols */
206 if (p->br->group_fwd_mask & (1u << dest[5])) 209 fwd_mask |= p->br->group_fwd_mask;
210 if (fwd_mask & (1u << dest[5]))
207 goto forward; 211 goto forward;
208 } 212 }
209 213
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 13e570e8b0fc..4eba348a985b 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -35,6 +35,8 @@
35#define BR_GROUPFWD_DEFAULT 0 35#define BR_GROUPFWD_DEFAULT 0
36/* Don't allow forwarding control protocols like STP and LLDP */ 36/* Don't allow forwarding control protocols like STP and LLDP */
37#define BR_GROUPFWD_RESTRICTED 0x4007u 37#define BR_GROUPFWD_RESTRICTED 0x4007u
38/* The Nearest Customer Bridge Group Address, 01-80-C2-00-00-[00,0B,0C,0D,0F] */
39#define BR_GROUPFWD_8021AD 0xB801u
38 40
39/* Path to usermode spanning tree program */ 41/* Path to usermode spanning tree program */
40#define BR_STP_PROG "/sbin/bridge-stp" 42#define BR_STP_PROG "/sbin/bridge-stp"
@@ -226,6 +228,7 @@ struct net_bridge
226 bool nf_call_arptables; 228 bool nf_call_arptables;
227#endif 229#endif
228 u16 group_fwd_mask; 230 u16 group_fwd_mask;
231 u16 group_fwd_mask_required;
229 232
230 /* STP */ 233 /* STP */
231 bridge_id designated_root; 234 bridge_id designated_root;