43
43
44
44
/* Local Definitions and Declarations */
45
45
46
- struct rmnet_walk_data {
47
- struct net_device * real_dev ;
48
- struct list_head * head ;
49
- struct rmnet_port * port ;
50
- };
51
-
52
46
static int rmnet_is_real_dev_registered (const struct net_device * real_dev )
53
47
{
54
48
return rcu_access_pointer (real_dev -> rx_handler ) == rmnet_rx_handler ;
@@ -112,17 +106,14 @@ static int rmnet_register_real_device(struct net_device *real_dev)
112
106
static void rmnet_unregister_bridge (struct net_device * dev ,
113
107
struct rmnet_port * port )
114
108
{
115
- struct net_device * rmnet_dev , * bridge_dev ;
116
109
struct rmnet_port * bridge_port ;
110
+ struct net_device * bridge_dev ;
117
111
118
112
if (port -> rmnet_mode != RMNET_EPMODE_BRIDGE )
119
113
return ;
120
114
121
115
/* bridge slave handling */
122
116
if (!port -> nr_rmnet_devs ) {
123
- rmnet_dev = netdev_master_upper_dev_get_rcu (dev );
124
- netdev_upper_dev_unlink (dev , rmnet_dev );
125
-
126
117
bridge_dev = port -> bridge_ep ;
127
118
128
119
bridge_port = rmnet_get_port_rtnl (bridge_dev );
@@ -132,9 +123,6 @@ static void rmnet_unregister_bridge(struct net_device *dev,
132
123
bridge_dev = port -> bridge_ep ;
133
124
134
125
bridge_port = rmnet_get_port_rtnl (bridge_dev );
135
- rmnet_dev = netdev_master_upper_dev_get_rcu (bridge_dev );
136
- netdev_upper_dev_unlink (bridge_dev , rmnet_dev );
137
-
138
126
rmnet_unregister_real_device (bridge_dev , bridge_port );
139
127
}
140
128
}
@@ -173,10 +161,6 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
173
161
if (err )
174
162
goto err1 ;
175
163
176
- err = netdev_master_upper_dev_link (dev , real_dev , NULL , NULL , extack );
177
- if (err )
178
- goto err2 ;
179
-
180
164
port -> rmnet_mode = mode ;
181
165
182
166
hlist_add_head_rcu (& ep -> hlnode , & port -> muxed_ep [mux_id ]);
@@ -193,8 +177,6 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
193
177
194
178
return 0 ;
195
179
196
- err2 :
197
- rmnet_vnd_dellink (mux_id , port , ep );
198
180
err1 :
199
181
rmnet_unregister_real_device (real_dev , port );
200
182
err0 :
@@ -204,22 +186,20 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
204
186
205
187
static void rmnet_dellink (struct net_device * dev , struct list_head * head )
206
188
{
189
+ struct rmnet_priv * priv = netdev_priv (dev );
207
190
struct net_device * real_dev ;
208
191
struct rmnet_endpoint * ep ;
209
192
struct rmnet_port * port ;
210
193
u8 mux_id ;
211
194
212
- rcu_read_lock ();
213
- real_dev = netdev_master_upper_dev_get_rcu (dev );
214
- rcu_read_unlock ();
195
+ real_dev = priv -> real_dev ;
215
196
216
197
if (!real_dev || !rmnet_is_real_dev_registered (real_dev ))
217
198
return ;
218
199
219
200
port = rmnet_get_port_rtnl (real_dev );
220
201
221
202
mux_id = rmnet_vnd_get_mux (dev );
222
- netdev_upper_dev_unlink (dev , real_dev );
223
203
224
204
ep = rmnet_get_endpoint (port , mux_id );
225
205
if (ep ) {
@@ -233,47 +213,33 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head)
233
213
unregister_netdevice_queue (dev , head );
234
214
}
235
215
236
- static int rmnet_dev_walk_unreg (struct net_device * rmnet_dev , void * data )
237
- {
238
- struct rmnet_walk_data * d = data ;
239
- struct rmnet_endpoint * ep ;
240
- u8 mux_id ;
241
-
242
- mux_id = rmnet_vnd_get_mux (rmnet_dev );
243
- ep = rmnet_get_endpoint (d -> port , mux_id );
244
- if (ep ) {
245
- hlist_del_init_rcu (& ep -> hlnode );
246
- rmnet_vnd_dellink (mux_id , d -> port , ep );
247
- kfree (ep );
248
- }
249
- netdev_upper_dev_unlink (rmnet_dev , d -> real_dev );
250
- unregister_netdevice_queue (rmnet_dev , d -> head );
251
-
252
- return 0 ;
253
- }
254
-
255
216
static void rmnet_force_unassociate_device (struct net_device * dev )
256
217
{
257
218
struct net_device * real_dev = dev ;
258
- struct rmnet_walk_data d ;
219
+ struct hlist_node * tmp_ep ;
220
+ struct rmnet_endpoint * ep ;
259
221
struct rmnet_port * port ;
222
+ unsigned long bkt_ep ;
260
223
LIST_HEAD (list );
261
224
262
225
if (!rmnet_is_real_dev_registered (real_dev ))
263
226
return ;
264
227
265
228
ASSERT_RTNL ();
266
229
267
- d .real_dev = real_dev ;
268
- d .head = & list ;
269
-
270
230
port = rmnet_get_port_rtnl (dev );
271
- d .port = port ;
272
231
273
232
rcu_read_lock ();
274
233
rmnet_unregister_bridge (dev , port );
275
234
276
- netdev_walk_all_lower_dev_rcu (real_dev , rmnet_dev_walk_unreg , & d );
235
+ hash_for_each_safe (port -> muxed_ep , bkt_ep , tmp_ep , ep , hlnode ) {
236
+ unregister_netdevice_queue (ep -> egress_dev , & list );
237
+ rmnet_vnd_dellink (ep -> mux_id , port , ep );
238
+
239
+ hlist_del_init_rcu (& ep -> hlnode );
240
+ kfree (ep );
241
+ }
242
+
277
243
rcu_read_unlock ();
278
244
unregister_netdevice_many (& list );
279
245
@@ -422,11 +388,6 @@ int rmnet_add_bridge(struct net_device *rmnet_dev,
422
388
if (err )
423
389
return - EBUSY ;
424
390
425
- err = netdev_master_upper_dev_link (slave_dev , rmnet_dev , NULL , NULL ,
426
- extack );
427
- if (err )
428
- return - EINVAL ;
429
-
430
391
slave_port = rmnet_get_port (slave_dev );
431
392
slave_port -> rmnet_mode = RMNET_EPMODE_BRIDGE ;
432
393
slave_port -> bridge_ep = real_dev ;
@@ -449,7 +410,6 @@ int rmnet_del_bridge(struct net_device *rmnet_dev,
449
410
port -> rmnet_mode = RMNET_EPMODE_VND ;
450
411
port -> bridge_ep = NULL ;
451
412
452
- netdev_upper_dev_unlink (slave_dev , rmnet_dev );
453
413
slave_port = rmnet_get_port (slave_dev );
454
414
rmnet_unregister_real_device (slave_dev , slave_port );
455
415
0 commit comments