net: bridge: mcast: add support for raw L2 multicast groups
[linux-2.6-microblaze.git] / net / bridge / br_multicast.c
index eae898c..484820c 100644 (file)
@@ -179,7 +179,8 @@ struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
                break;
 #endif
        default:
-               return NULL;
+               ip.proto = 0;
+               ether_addr_copy(ip.dst.mac_addr, eth_hdr(skb)->h_dest);
        }
 
        return br_mdb_ip_get_rcu(br, &ip);
@@ -1203,6 +1204,10 @@ void br_multicast_host_join(struct net_bridge_mdb_entry *mp, bool notify)
                if (notify)
                        br_mdb_notify(mp->br->dev, mp, NULL, RTM_NEWMDB);
        }
+
+       if (br_group_is_l2(&mp->addr))
+               return;
+
        mod_timer(&mp->timer, jiffies + mp->br->multicast_membership_interval);
 }
 
@@ -1254,8 +1259,8 @@ __br_multicast_add_group(struct net_bridge *br,
                        break;
        }
 
-       p = br_multicast_new_port_group(port, group, *pp, 0, src, filter_mode,
-                                       RTPROT_KERNEL);
+       p = br_multicast_new_port_group(port, group, *pp, 0, src,
+                                       filter_mode, RTPROT_KERNEL);
        if (unlikely(!p)) {
                p = ERR_PTR(-ENOMEM);
                goto out;
@@ -3690,7 +3695,7 @@ bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto)
        memset(&eth, 0, sizeof(eth));
        eth.h_proto = htons(proto);
 
-       ret = br_multicast_querier_exists(br, &eth);
+       ret = br_multicast_querier_exists(br, &eth, NULL);
 
 unlock:
        rcu_read_unlock();