bridge: Add multicast data-path hooks
[linux-2.6.git] / net / bridge / br_device.c
index 91dffe7..eb7062d 100644 (file)
@@ -25,6 +25,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        struct net_bridge *br = netdev_priv(dev);
        const unsigned char *dest = skb->data;
        struct net_bridge_fdb_entry *dst;
+       struct net_bridge_mdb_entry *mdst;
 
        BR_INPUT_SKB_CB(skb)->brdev = dev;
 
@@ -34,13 +35,21 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        skb_reset_mac_header(skb);
        skb_pull(skb, ETH_HLEN);
 
-       if (dest[0] & 1)
-               br_flood_deliver(br, skb);
-       else if ((dst = __br_fdb_get(br, dest)) != NULL)
+       if (dest[0] & 1) {
+               if (br_multicast_rcv(br, NULL, skb))
+                       goto out;
+
+               mdst = br_mdb_get(br, skb);
+               if (mdst || BR_INPUT_SKB_CB(skb)->mrouters_only)
+                       br_multicast_deliver(mdst, skb);
+               else
+                       br_flood_deliver(br, skb);
+       } else if ((dst = __br_fdb_get(br, dest)) != NULL)
                br_deliver(dst->dst, skb);
        else
                br_flood_deliver(br, skb);
 
+out:
        return NETDEV_TX_OK;
 }