]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/meta-ti-glsdk.git/blob - recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0062-bridge-Do-not-send-queries-on-multicast-group-leaves.patch
linux-ti33x-psp 3.2: update to 3.2.18
[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-ti33x-psp-3.2 / 3.2.17 / 0062-bridge-Do-not-send-queries-on-multicast-group-leaves.patch
1 From 9f8774d2e33d8c44b98e76db91cfc0d35b187f58 Mon Sep 17 00:00:00 2001
2 From: Herbert Xu <herbert@gondor.apana.org.au>
3 Date: Wed, 4 Apr 2012 01:01:20 +0000
4 Subject: [PATCH 062/165] bridge: Do not send queries on multicast group
5  leaves
7 [ Upstream commit 996304bbea3d2a094b7ba54c3bd65d3fffeac57b ]
9 As it stands the bridge IGMP snooping system will respond to
10 group leave messages with queries for remaining membership.
11 This is both unnecessary and undesirable.  First of all any
12 multicast routers present should be doing this rather than us.
13 What's more the queries that we send may end up upsetting other
14 multicast snooping swithces in the system that are buggy.
16 In fact, we can simply remove the code that send these queries
17 because the existing membership expiry mechanism doesn't rely
18 on them anyway.
20 So this patch simply removes all code associated with group
21 queries in response to group leave messages.
23 Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
24 Signed-off-by: David S. Miller <davem@davemloft.net>
25 Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
26 ---
27  net/bridge/br_multicast.c |   81 ---------------------------------------------
28  net/bridge/br_private.h   |    4 --
29  2 files changed, 0 insertions(+), 85 deletions(-)
31 diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
32 index 8eb6b15..5ac1811 100644
33 --- a/net/bridge/br_multicast.c
34 +++ b/net/bridge/br_multicast.c
35 @@ -241,7 +241,6 @@ static void br_multicast_group_expired(unsigned long data)
36         hlist_del_rcu(&mp->hlist[mdb->ver]);
37         mdb->size--;
38  
39 -       del_timer(&mp->query_timer);
40         call_rcu_bh(&mp->rcu, br_multicast_free_group);
41  
42  out:
43 @@ -271,7 +270,6 @@ static void br_multicast_del_pg(struct net_bridge *br,
44                 rcu_assign_pointer(*pp, p->next);
45                 hlist_del_init(&p->mglist);
46                 del_timer(&p->timer);
47 -               del_timer(&p->query_timer);
48                 call_rcu_bh(&p->rcu, br_multicast_free_pg);
49  
50                 if (!mp->ports && !mp->mglist &&
51 @@ -507,74 +505,6 @@ static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br,
52         return NULL;
53  }
54  
55 -static void br_multicast_send_group_query(struct net_bridge_mdb_entry *mp)
56 -{
57 -       struct net_bridge *br = mp->br;
58 -       struct sk_buff *skb;
59 -
60 -       skb = br_multicast_alloc_query(br, &mp->addr);
61 -       if (!skb)
62 -               goto timer;
63 -
64 -       netif_rx(skb);
65 -
66 -timer:
67 -       if (++mp->queries_sent < br->multicast_last_member_count)
68 -               mod_timer(&mp->query_timer,
69 -                         jiffies + br->multicast_last_member_interval);
70 -}
71 -
72 -static void br_multicast_group_query_expired(unsigned long data)
73 -{
74 -       struct net_bridge_mdb_entry *mp = (void *)data;
75 -       struct net_bridge *br = mp->br;
76 -
77 -       spin_lock(&br->multicast_lock);
78 -       if (!netif_running(br->dev) || !mp->mglist ||
79 -           mp->queries_sent >= br->multicast_last_member_count)
80 -               goto out;
81 -
82 -       br_multicast_send_group_query(mp);
83 -
84 -out:
85 -       spin_unlock(&br->multicast_lock);
86 -}
87 -
88 -static void br_multicast_send_port_group_query(struct net_bridge_port_group *pg)
89 -{
90 -       struct net_bridge_port *port = pg->port;
91 -       struct net_bridge *br = port->br;
92 -       struct sk_buff *skb;
93 -
94 -       skb = br_multicast_alloc_query(br, &pg->addr);
95 -       if (!skb)
96 -               goto timer;
97 -
98 -       br_deliver(port, skb);
99 -
100 -timer:
101 -       if (++pg->queries_sent < br->multicast_last_member_count)
102 -               mod_timer(&pg->query_timer,
103 -                         jiffies + br->multicast_last_member_interval);
104 -}
106 -static void br_multicast_port_group_query_expired(unsigned long data)
107 -{
108 -       struct net_bridge_port_group *pg = (void *)data;
109 -       struct net_bridge_port *port = pg->port;
110 -       struct net_bridge *br = port->br;
112 -       spin_lock(&br->multicast_lock);
113 -       if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) ||
114 -           pg->queries_sent >= br->multicast_last_member_count)
115 -               goto out;
117 -       br_multicast_send_port_group_query(pg);
119 -out:
120 -       spin_unlock(&br->multicast_lock);
121 -}
123  static struct net_bridge_mdb_entry *br_multicast_get_group(
124         struct net_bridge *br, struct net_bridge_port *port,
125         struct br_ip *group, int hash)
126 @@ -690,8 +620,6 @@ rehash:
127         mp->addr = *group;
128         setup_timer(&mp->timer, br_multicast_group_expired,
129                     (unsigned long)mp);
130 -       setup_timer(&mp->query_timer, br_multicast_group_query_expired,
131 -                   (unsigned long)mp);
132  
133         hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]);
134         mdb->size++;
135 @@ -746,8 +674,6 @@ static int br_multicast_add_group(struct net_bridge *br,
136         hlist_add_head(&p->mglist, &port->mglist);
137         setup_timer(&p->timer, br_multicast_port_group_expired,
138                     (unsigned long)p);
139 -       setup_timer(&p->query_timer, br_multicast_port_group_query_expired,
140 -                   (unsigned long)p);
141  
142         rcu_assign_pointer(*pp, p);
143  
144 @@ -1291,9 +1217,6 @@ static void br_multicast_leave_group(struct net_bridge *br,
145                      time_after(mp->timer.expires, time) :
146                      try_to_del_timer_sync(&mp->timer) >= 0)) {
147                         mod_timer(&mp->timer, time);
149 -                       mp->queries_sent = 0;
150 -                       mod_timer(&mp->query_timer, now);
151                 }
152  
153                 goto out;
154 @@ -1310,9 +1233,6 @@ static void br_multicast_leave_group(struct net_bridge *br,
155                      time_after(p->timer.expires, time) :
156                      try_to_del_timer_sync(&p->timer) >= 0)) {
157                         mod_timer(&p->timer, time);
159 -                       p->queries_sent = 0;
160 -                       mod_timer(&p->query_timer, now);
161                 }
162  
163                 break;
164 @@ -1680,7 +1600,6 @@ void br_multicast_stop(struct net_bridge *br)
165                 hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i],
166                                           hlist[ver]) {
167                         del_timer(&mp->timer);
168 -                       del_timer(&mp->query_timer);
169                         call_rcu_bh(&mp->rcu, br_multicast_free_group);
170                 }
171         }
172 diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
173 index d7d6fb0..93264df 100644
174 --- a/net/bridge/br_private.h
175 +++ b/net/bridge/br_private.h
176 @@ -82,9 +82,7 @@ struct net_bridge_port_group {
177         struct hlist_node               mglist;
178         struct rcu_head                 rcu;
179         struct timer_list               timer;
180 -       struct timer_list               query_timer;
181         struct br_ip                    addr;
182 -       u32                             queries_sent;
183  };
184  
185  struct net_bridge_mdb_entry
186 @@ -94,10 +92,8 @@ struct net_bridge_mdb_entry
187         struct net_bridge_port_group __rcu *ports;
188         struct rcu_head                 rcu;
189         struct timer_list               timer;
190 -       struct timer_list               query_timer;
191         struct br_ip                    addr;
192         bool                            mglist;
193 -       u32                             queries_sent;
194  };
195  
196  struct net_bridge_mdb_htable
197 -- 
198 1.7.7.6