]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/bridge/br_multicast.c
bridge: add missing vid to br_mdb_get()
[karo-tx-linux.git] / net / bridge / br_multicast.c
index 7d886b0a8b7b7ffbd0adf6d88011580f5adc2400..923fbeaf7afdbb957afb732fc226c4fb669e6a2e 100644 (file)
@@ -86,9 +86,8 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get(
        struct net_bridge_mdb_htable *mdb, struct br_ip *dst, int hash)
 {
        struct net_bridge_mdb_entry *mp;
-       struct hlist_node *p;
 
-       hlist_for_each_entry_rcu(mp, p, &mdb->mhash[hash], hlist[mdb->ver]) {
+       hlist_for_each_entry_rcu(mp, &mdb->mhash[hash], hlist[mdb->ver]) {
                if (br_ip_equal(&mp->addr, dst))
                        return mp;
        }
@@ -133,7 +132,7 @@ static struct net_bridge_mdb_entry *br_mdb_ip6_get(
 #endif
 
 struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
-                                       struct sk_buff *skb)
+                                       struct sk_buff *skb, u16 vid)
 {
        struct net_bridge_mdb_htable *mdb = rcu_dereference(br->mdb);
        struct br_ip ip;
@@ -145,6 +144,7 @@ struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
                return NULL;
 
        ip.proto = skb->protocol;
+       ip.vid = vid;
 
        switch (skb->protocol) {
        case htons(ETH_P_IP):
@@ -178,13 +178,12 @@ static int br_mdb_copy(struct net_bridge_mdb_htable *new,
                       int elasticity)
 {
        struct net_bridge_mdb_entry *mp;
-       struct hlist_node *p;
        int maxlen;
        int len;
        int i;
 
        for (i = 0; i < old->max; i++)
-               hlist_for_each_entry(mp, p, &old->mhash[i], hlist[old->ver])
+               hlist_for_each_entry(mp, &old->mhash[i], hlist[old->ver])
                        hlist_add_head(&mp->hlist[new->ver],
                                       &new->mhash[br_ip_hash(new, &mp->addr)]);
 
@@ -194,7 +193,7 @@ static int br_mdb_copy(struct net_bridge_mdb_htable *new,
        maxlen = 0;
        for (i = 0; i < new->max; i++) {
                len = 0;
-               hlist_for_each_entry(mp, p, &new->mhash[i], hlist[new->ver])
+               hlist_for_each_entry(mp, &new->mhash[i], hlist[new->ver])
                        len++;
                if (len > maxlen)
                        maxlen = len;
@@ -510,14 +509,13 @@ static struct net_bridge_mdb_entry *br_multicast_get_group(
 {
        struct net_bridge_mdb_htable *mdb;
        struct net_bridge_mdb_entry *mp;
-       struct hlist_node *p;
        unsigned int count = 0;
        unsigned int max;
        int elasticity;
        int err;
 
        mdb = rcu_dereference_protected(br->mdb, 1);
-       hlist_for_each_entry(mp, p, &mdb->mhash[hash], hlist[mdb->ver]) {
+       hlist_for_each_entry(mp, &mdb->mhash[hash], hlist[mdb->ver]) {
                count++;
                if (unlikely(br_ip_equal(group, &mp->addr)))
                        return mp;
@@ -882,10 +880,10 @@ void br_multicast_disable_port(struct net_bridge_port *port)
 {
        struct net_bridge *br = port->br;
        struct net_bridge_port_group *pg;
-       struct hlist_node *p, *n;
+       struct hlist_node *n;
 
        spin_lock(&br->multicast_lock);
-       hlist_for_each_entry_safe(pg, p, n, &port->mglist, mglist)
+       hlist_for_each_entry_safe(pg, n, &port->mglist, mglist)
                br_multicast_del_pg(br, pg);
 
        if (!hlist_unhashed(&port->rlist))
@@ -1025,12 +1023,12 @@ static void br_multicast_add_router(struct net_bridge *br,
                                    struct net_bridge_port *port)
 {
        struct net_bridge_port *p;
-       struct hlist_node *n, *slot = NULL;
+       struct hlist_node *slot = NULL;
 
-       hlist_for_each_entry(p, n, &br->router_list, rlist) {
+       hlist_for_each_entry(p, &br->router_list, rlist) {
                if ((unsigned long) port >= (unsigned long) p)
                        break;
-               slot = n;
+               slot = &p->rlist;
        }
 
        if (slot)
@@ -1653,7 +1651,7 @@ void br_multicast_stop(struct net_bridge *br)
 {
        struct net_bridge_mdb_htable *mdb;
        struct net_bridge_mdb_entry *mp;
-       struct hlist_node *p, *n;
+       struct hlist_node *n;
        u32 ver;
        int i;
 
@@ -1670,7 +1668,7 @@ void br_multicast_stop(struct net_bridge *br)
 
        ver = mdb->ver;
        for (i = 0; i < mdb->max; i++) {
-               hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i],
+               hlist_for_each_entry_safe(mp, n, &mdb->mhash[i],
                                          hlist[ver]) {
                        del_timer(&mp->timer);
                        call_rcu_bh(&mp->rcu, br_multicast_free_group);