diff options
author | Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> | 2014-06-10 07:59:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-11 18:22:53 -0400 |
commit | f2808d226f4efe15a0ea44697a3525176d6c8eae (patch) | |
tree | 45b3017e9b56116a23e835b5eeece8aada211f7e /net/bridge | |
parent | 8580e2117c06ac0c97a561219eaab6dab968ea3f (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.c | 1 | ||||
-rw-r--r-- | net/bridge/br_input.c | 8 | ||||
-rw-r--r-- | net/bridge/br_private.h | 3 |
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; |