]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/bridge/br_input.c
Merge tag 'at91-fixes' of git://github.com/at91linux/linux-at91 into fixes
[karo-tx-linux.git] / net / bridge / br_input.c
index 04d6348fd530f854769bf2e0220ba4b4a4489833..366c43649079d9bdef66063af2ab848965ca8197 100644 (file)
@@ -177,6 +177,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
        p = br_port_get_rcu(skb->dev);
 
        if (unlikely(is_link_local_ether_addr(dest))) {
+               u16 fwd_mask = p->br->group_fwd_mask_required;
+
                /*
                 * See IEEE 802.1D Table 7-10 Reserved addresses
                 *
@@ -194,7 +196,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
                case 0x00:      /* Bridge Group Address */
                        /* If STP is turned off,
                           then must forward to keep loop detection */
-                       if (p->br->stp_enabled == BR_NO_STP)
+                       if (p->br->stp_enabled == BR_NO_STP ||
+                           fwd_mask & (1u << dest[5]))
                                goto forward;
                        break;
 
@@ -203,7 +206,8 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
 
                default:
                        /* Allow selective forwarding for most other protocols */
-                       if (p->br->group_fwd_mask & (1u << dest[5]))
+                       fwd_mask |= p->br->group_fwd_mask;
+                       if (fwd_mask & (1u << dest[5]))
                                goto forward;
                }