@@ -78,82 +78,72 @@ static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip)
78
78
static int br_mdb_fill_info (struct sk_buff * skb , struct netlink_callback * cb ,
79
79
struct net_device * dev )
80
80
{
81
+ int idx = 0 , s_idx = cb -> args [1 ], err = 0 ;
81
82
struct net_bridge * br = netdev_priv (dev );
82
- struct net_bridge_mdb_htable * mdb ;
83
+ struct net_bridge_mdb_entry * mp ;
83
84
struct nlattr * nest , * nest2 ;
84
- int i , err = 0 ;
85
- int idx = 0 , s_idx = cb -> args [1 ];
86
85
87
86
if (!br_opt_get (br , BROPT_MULTICAST_ENABLED ))
88
87
return 0 ;
89
88
90
- mdb = rcu_dereference (br -> mdb );
91
- if (!mdb )
92
- return 0 ;
93
-
94
89
nest = nla_nest_start (skb , MDBA_MDB );
95
90
if (nest == NULL )
96
91
return - EMSGSIZE ;
97
92
98
- for (i = 0 ; i < mdb -> max ; i ++ ) {
99
- struct net_bridge_mdb_entry * mp ;
93
+ hlist_for_each_entry_rcu (mp , & br -> mdb_list , mdb_node ) {
100
94
struct net_bridge_port_group * p ;
101
95
struct net_bridge_port_group __rcu * * pp ;
102
96
struct net_bridge_port * port ;
103
97
104
- hlist_for_each_entry_rcu (mp , & mdb -> mhash [i ], hlist [mdb -> ver ]) {
105
- if (idx < s_idx )
106
- goto skip ;
98
+ if (idx < s_idx )
99
+ goto skip ;
107
100
108
- nest2 = nla_nest_start (skb , MDBA_MDB_ENTRY );
109
- if (nest2 == NULL ) {
110
- err = - EMSGSIZE ;
111
- goto out ;
112
- }
101
+ nest2 = nla_nest_start (skb , MDBA_MDB_ENTRY );
102
+ if (! nest2 ) {
103
+ err = - EMSGSIZE ;
104
+ break ;
105
+ }
113
106
114
- for (pp = & mp -> ports ;
115
- (p = rcu_dereference (* pp )) != NULL ;
116
- pp = & p -> next ) {
117
- struct nlattr * nest_ent ;
118
- struct br_mdb_entry e ;
119
-
120
- port = p -> port ;
121
- if (!port )
122
- continue ;
123
-
124
- memset (& e , 0 , sizeof (e ));
125
- e .ifindex = port -> dev -> ifindex ;
126
- e .vid = p -> addr .vid ;
127
- __mdb_entry_fill_flags (& e , p -> flags );
128
- if (p -> addr .proto == htons (ETH_P_IP ))
129
- e .addr .u .ip4 = p -> addr .u .ip4 ;
107
+ for (pp = & mp -> ports ; (p = rcu_dereference (* pp )) != NULL ;
108
+ pp = & p -> next ) {
109
+ struct nlattr * nest_ent ;
110
+ struct br_mdb_entry e ;
111
+
112
+ port = p -> port ;
113
+ if (!port )
114
+ continue ;
115
+
116
+ memset (& e , 0 , sizeof (e ));
117
+ e .ifindex = port -> dev -> ifindex ;
118
+ e .vid = p -> addr .vid ;
119
+ __mdb_entry_fill_flags (& e , p -> flags );
120
+ if (p -> addr .proto == htons (ETH_P_IP ))
121
+ e .addr .u .ip4 = p -> addr .u .ip4 ;
130
122
#if IS_ENABLED (CONFIG_IPV6 )
131
- if (p -> addr .proto == htons (ETH_P_IPV6 ))
132
- e .addr .u .ip6 = p -> addr .u .ip6 ;
123
+ if (p -> addr .proto == htons (ETH_P_IPV6 ))
124
+ e .addr .u .ip6 = p -> addr .u .ip6 ;
133
125
#endif
134
- e .addr .proto = p -> addr .proto ;
135
- nest_ent = nla_nest_start (skb ,
136
- MDBA_MDB_ENTRY_INFO );
137
- if (!nest_ent ) {
138
- nla_nest_cancel (skb , nest2 );
139
- err = - EMSGSIZE ;
140
- goto out ;
141
- }
142
- if (nla_put_nohdr (skb , sizeof (e ), & e ) ||
143
- nla_put_u32 (skb ,
144
- MDBA_MDB_EATTR_TIMER ,
145
- br_timer_value (& p -> timer ))) {
146
- nla_nest_cancel (skb , nest_ent );
147
- nla_nest_cancel (skb , nest2 );
148
- err = - EMSGSIZE ;
149
- goto out ;
150
- }
151
- nla_nest_end (skb , nest_ent );
126
+ e .addr .proto = p -> addr .proto ;
127
+ nest_ent = nla_nest_start (skb , MDBA_MDB_ENTRY_INFO );
128
+ if (!nest_ent ) {
129
+ nla_nest_cancel (skb , nest2 );
130
+ err = - EMSGSIZE ;
131
+ goto out ;
152
132
}
153
- nla_nest_end (skb , nest2 );
154
- skip :
155
- idx ++ ;
133
+ if (nla_put_nohdr (skb , sizeof (e ), & e ) ||
134
+ nla_put_u32 (skb ,
135
+ MDBA_MDB_EATTR_TIMER ,
136
+ br_timer_value (& p -> timer ))) {
137
+ nla_nest_cancel (skb , nest_ent );
138
+ nla_nest_cancel (skb , nest2 );
139
+ err = - EMSGSIZE ;
140
+ goto out ;
141
+ }
142
+ nla_nest_end (skb , nest_ent );
156
143
}
144
+ nla_nest_end (skb , nest2 );
145
+ skip :
146
+ idx ++ ;
157
147
}
158
148
159
149
out :
@@ -203,8 +193,7 @@ static int br_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
203
193
204
194
rcu_read_lock ();
205
195
206
- /* In theory this could be wrapped to 0... */
207
- cb -> seq = net -> dev_base_seq + br_mdb_rehash_seq ;
196
+ cb -> seq = net -> dev_base_seq ;
208
197
209
198
for_each_netdev_rcu (net , dev ) {
210
199
if (dev -> priv_flags & IFF_EBRIDGE ) {
@@ -297,7 +286,6 @@ static void br_mdb_complete(struct net_device *dev, int err, void *priv)
297
286
struct br_mdb_complete_info * data = priv ;
298
287
struct net_bridge_port_group __rcu * * pp ;
299
288
struct net_bridge_port_group * p ;
300
- struct net_bridge_mdb_htable * mdb ;
301
289
struct net_bridge_mdb_entry * mp ;
302
290
struct net_bridge_port * port = data -> port ;
303
291
struct net_bridge * br = port -> br ;
@@ -306,8 +294,7 @@ static void br_mdb_complete(struct net_device *dev, int err, void *priv)
306
294
goto err ;
307
295
308
296
spin_lock_bh (& br -> multicast_lock );
309
- mdb = mlock_dereference (br -> mdb , br );
310
- mp = br_mdb_ip_get (mdb , & data -> ip );
297
+ mp = br_mdb_ip_get (br , & data -> ip );
311
298
if (!mp )
312
299
goto out ;
313
300
for (pp = & mp -> ports ; (p = mlock_dereference (* pp , br )) != NULL ;
@@ -588,14 +575,12 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port,
588
575
struct net_bridge_mdb_entry * mp ;
589
576
struct net_bridge_port_group * p ;
590
577
struct net_bridge_port_group __rcu * * pp ;
591
- struct net_bridge_mdb_htable * mdb ;
592
578
unsigned long now = jiffies ;
593
579
int err ;
594
580
595
- mdb = mlock_dereference (br -> mdb , br );
596
- mp = br_mdb_ip_get (mdb , group );
581
+ mp = br_mdb_ip_get (br , group );
597
582
if (!mp ) {
598
- mp = br_multicast_new_group (br , port , group );
583
+ mp = br_multicast_new_group (br , group );
599
584
err = PTR_ERR_OR_ZERO (mp );
600
585
if (err )
601
586
return err ;
@@ -696,7 +681,6 @@ static int br_mdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
696
681
697
682
static int __br_mdb_del (struct net_bridge * br , struct br_mdb_entry * entry )
698
683
{
699
- struct net_bridge_mdb_htable * mdb ;
700
684
struct net_bridge_mdb_entry * mp ;
701
685
struct net_bridge_port_group * p ;
702
686
struct net_bridge_port_group __rcu * * pp ;
@@ -709,9 +693,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
709
693
__mdb_entry_to_br_ip (entry , & ip );
710
694
711
695
spin_lock_bh (& br -> multicast_lock );
712
- mdb = mlock_dereference (br -> mdb , br );
713
-
714
- mp = br_mdb_ip_get (mdb , & ip );
696
+ mp = br_mdb_ip_get (br , & ip );
715
697
if (!mp )
716
698
goto unlock ;
717
699
@@ -728,7 +710,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
728
710
rcu_assign_pointer (* pp , p -> next );
729
711
hlist_del_init (& p -> mglist );
730
712
del_timer (& p -> timer );
731
- call_rcu_bh ( & p -> rcu , br_multicast_free_pg );
713
+ kfree_rcu ( p , rcu );
732
714
err = 0 ;
733
715
734
716
if (!mp -> ports && !mp -> host_joined &&
0 commit comments