Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/bridge/br_if.c
15109 views
1
/*
2
* Userspace interface
3
* Linux ethernet bridge
4
*
5
* Authors:
6
* Lennert Buytenhek <[email protected]>
7
*
8
* This program is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU General Public License
10
* as published by the Free Software Foundation; either version
11
* 2 of the License, or (at your option) any later version.
12
*/
13
14
#include <linux/kernel.h>
15
#include <linux/netdevice.h>
16
#include <linux/netpoll.h>
17
#include <linux/ethtool.h>
18
#include <linux/if_arp.h>
19
#include <linux/module.h>
20
#include <linux/init.h>
21
#include <linux/rtnetlink.h>
22
#include <linux/if_ether.h>
23
#include <linux/slab.h>
24
#include <net/sock.h>
25
26
#include "br_private.h"
27
28
/*
29
* Determine initial path cost based on speed.
30
* using recommendations from 802.1d standard
31
*
32
* Since driver might sleep need to not be holding any locks.
33
*/
34
static int port_cost(struct net_device *dev)
35
{
36
if (dev->ethtool_ops && dev->ethtool_ops->get_settings) {
37
struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET, };
38
39
if (!dev_ethtool_get_settings(dev, &ecmd)) {
40
switch (ethtool_cmd_speed(&ecmd)) {
41
case SPEED_10000:
42
return 2;
43
case SPEED_1000:
44
return 4;
45
case SPEED_100:
46
return 19;
47
case SPEED_10:
48
return 100;
49
}
50
}
51
}
52
53
/* Old silly heuristics based on name */
54
if (!strncmp(dev->name, "lec", 3))
55
return 7;
56
57
if (!strncmp(dev->name, "plip", 4))
58
return 2500;
59
60
return 100; /* assume old 10Mbps */
61
}
62
63
64
/* Check for port carrier transistions. */
65
void br_port_carrier_check(struct net_bridge_port *p)
66
{
67
struct net_device *dev = p->dev;
68
struct net_bridge *br = p->br;
69
70
if (netif_running(dev) && netif_carrier_ok(dev))
71
p->path_cost = port_cost(dev);
72
73
if (!netif_running(br->dev))
74
return;
75
76
spin_lock_bh(&br->lock);
77
if (netif_running(dev) && netif_carrier_ok(dev)) {
78
if (p->state == BR_STATE_DISABLED)
79
br_stp_enable_port(p);
80
} else {
81
if (p->state != BR_STATE_DISABLED)
82
br_stp_disable_port(p);
83
}
84
spin_unlock_bh(&br->lock);
85
}
86
87
static void release_nbp(struct kobject *kobj)
88
{
89
struct net_bridge_port *p
90
= container_of(kobj, struct net_bridge_port, kobj);
91
kfree(p);
92
}
93
94
static struct kobj_type brport_ktype = {
95
#ifdef CONFIG_SYSFS
96
.sysfs_ops = &brport_sysfs_ops,
97
#endif
98
.release = release_nbp,
99
};
100
101
static void destroy_nbp(struct net_bridge_port *p)
102
{
103
struct net_device *dev = p->dev;
104
105
p->br = NULL;
106
p->dev = NULL;
107
dev_put(dev);
108
109
kobject_put(&p->kobj);
110
}
111
112
static void destroy_nbp_rcu(struct rcu_head *head)
113
{
114
struct net_bridge_port *p =
115
container_of(head, struct net_bridge_port, rcu);
116
destroy_nbp(p);
117
}
118
119
/* Delete port(interface) from bridge is done in two steps.
120
* via RCU. First step, marks device as down. That deletes
121
* all the timers and stops new packets from flowing through.
122
*
123
* Final cleanup doesn't occur until after all CPU's finished
124
* processing packets.
125
*
126
* Protected from multiple admin operations by RTNL mutex
127
*/
128
static void del_nbp(struct net_bridge_port *p)
129
{
130
struct net_bridge *br = p->br;
131
struct net_device *dev = p->dev;
132
133
sysfs_remove_link(br->ifobj, p->dev->name);
134
135
dev_set_promiscuity(dev, -1);
136
137
spin_lock_bh(&br->lock);
138
br_stp_disable_port(p);
139
spin_unlock_bh(&br->lock);
140
141
br_ifinfo_notify(RTM_DELLINK, p);
142
143
br_fdb_delete_by_port(br, p, 1);
144
145
list_del_rcu(&p->list);
146
147
dev->priv_flags &= ~IFF_BRIDGE_PORT;
148
149
netdev_rx_handler_unregister(dev);
150
synchronize_net();
151
152
netdev_set_master(dev, NULL);
153
154
br_multicast_del_port(p);
155
156
kobject_uevent(&p->kobj, KOBJ_REMOVE);
157
kobject_del(&p->kobj);
158
159
br_netpoll_disable(p);
160
161
call_rcu(&p->rcu, destroy_nbp_rcu);
162
}
163
164
/* called with RTNL */
165
static void del_br(struct net_bridge *br, struct list_head *head)
166
{
167
struct net_bridge_port *p, *n;
168
169
list_for_each_entry_safe(p, n, &br->port_list, list) {
170
del_nbp(p);
171
}
172
173
del_timer_sync(&br->gc_timer);
174
175
br_sysfs_delbr(br->dev);
176
unregister_netdevice_queue(br->dev, head);
177
}
178
179
/* find an available port number */
180
static int find_portno(struct net_bridge *br)
181
{
182
int index;
183
struct net_bridge_port *p;
184
unsigned long *inuse;
185
186
inuse = kcalloc(BITS_TO_LONGS(BR_MAX_PORTS), sizeof(unsigned long),
187
GFP_KERNEL);
188
if (!inuse)
189
return -ENOMEM;
190
191
set_bit(0, inuse); /* zero is reserved */
192
list_for_each_entry(p, &br->port_list, list) {
193
set_bit(p->port_no, inuse);
194
}
195
index = find_first_zero_bit(inuse, BR_MAX_PORTS);
196
kfree(inuse);
197
198
return (index >= BR_MAX_PORTS) ? -EXFULL : index;
199
}
200
201
/* called with RTNL but without bridge lock */
202
static struct net_bridge_port *new_nbp(struct net_bridge *br,
203
struct net_device *dev)
204
{
205
int index;
206
struct net_bridge_port *p;
207
208
index = find_portno(br);
209
if (index < 0)
210
return ERR_PTR(index);
211
212
p = kzalloc(sizeof(*p), GFP_KERNEL);
213
if (p == NULL)
214
return ERR_PTR(-ENOMEM);
215
216
p->br = br;
217
dev_hold(dev);
218
p->dev = dev;
219
p->path_cost = port_cost(dev);
220
p->priority = 0x8000 >> BR_PORT_BITS;
221
p->port_no = index;
222
p->flags = 0;
223
br_init_port(p);
224
p->state = BR_STATE_DISABLED;
225
br_stp_port_timer_init(p);
226
br_multicast_add_port(p);
227
228
return p;
229
}
230
231
int br_add_bridge(struct net *net, const char *name)
232
{
233
struct net_device *dev;
234
235
dev = alloc_netdev(sizeof(struct net_bridge), name,
236
br_dev_setup);
237
238
if (!dev)
239
return -ENOMEM;
240
241
dev_net_set(dev, net);
242
243
return register_netdev(dev);
244
}
245
246
int br_del_bridge(struct net *net, const char *name)
247
{
248
struct net_device *dev;
249
int ret = 0;
250
251
rtnl_lock();
252
dev = __dev_get_by_name(net, name);
253
if (dev == NULL)
254
ret = -ENXIO; /* Could not find device */
255
256
else if (!(dev->priv_flags & IFF_EBRIDGE)) {
257
/* Attempt to delete non bridge device! */
258
ret = -EPERM;
259
}
260
261
else if (dev->flags & IFF_UP) {
262
/* Not shutdown yet. */
263
ret = -EBUSY;
264
}
265
266
else
267
del_br(netdev_priv(dev), NULL);
268
269
rtnl_unlock();
270
return ret;
271
}
272
273
/* MTU of the bridge pseudo-device: ETH_DATA_LEN or the minimum of the ports */
274
int br_min_mtu(const struct net_bridge *br)
275
{
276
const struct net_bridge_port *p;
277
int mtu = 0;
278
279
ASSERT_RTNL();
280
281
if (list_empty(&br->port_list))
282
mtu = ETH_DATA_LEN;
283
else {
284
list_for_each_entry(p, &br->port_list, list) {
285
if (!mtu || p->dev->mtu < mtu)
286
mtu = p->dev->mtu;
287
}
288
}
289
return mtu;
290
}
291
292
/*
293
* Recomputes features using slave's features
294
*/
295
u32 br_features_recompute(struct net_bridge *br, u32 features)
296
{
297
struct net_bridge_port *p;
298
u32 mask;
299
300
if (list_empty(&br->port_list))
301
return features;
302
303
mask = features;
304
features &= ~NETIF_F_ONE_FOR_ALL;
305
306
list_for_each_entry(p, &br->port_list, list) {
307
features = netdev_increment_features(features,
308
p->dev->features, mask);
309
}
310
311
return features;
312
}
313
314
/* called with RTNL */
315
int br_add_if(struct net_bridge *br, struct net_device *dev)
316
{
317
struct net_bridge_port *p;
318
int err = 0;
319
bool changed_addr;
320
321
/* Don't allow bridging non-ethernet like devices */
322
if ((dev->flags & IFF_LOOPBACK) ||
323
dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN)
324
return -EINVAL;
325
326
/* No bridging of bridges */
327
if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
328
return -ELOOP;
329
330
/* Device is already being bridged */
331
if (br_port_exists(dev))
332
return -EBUSY;
333
334
/* No bridging devices that dislike that (e.g. wireless) */
335
if (dev->priv_flags & IFF_DONT_BRIDGE)
336
return -EOPNOTSUPP;
337
338
p = new_nbp(br, dev);
339
if (IS_ERR(p))
340
return PTR_ERR(p);
341
342
call_netdevice_notifiers(NETDEV_JOIN, dev);
343
344
err = dev_set_promiscuity(dev, 1);
345
if (err)
346
goto put_back;
347
348
err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
349
SYSFS_BRIDGE_PORT_ATTR);
350
if (err)
351
goto err0;
352
353
err = br_fdb_insert(br, p, dev->dev_addr);
354
if (err)
355
goto err1;
356
357
err = br_sysfs_addif(p);
358
if (err)
359
goto err2;
360
361
if (br_netpoll_info(br) && ((err = br_netpoll_enable(p))))
362
goto err3;
363
364
err = netdev_set_master(dev, br->dev);
365
if (err)
366
goto err3;
367
368
err = netdev_rx_handler_register(dev, br_handle_frame, p);
369
if (err)
370
goto err4;
371
372
dev->priv_flags |= IFF_BRIDGE_PORT;
373
374
dev_disable_lro(dev);
375
376
list_add_rcu(&p->list, &br->port_list);
377
378
netdev_update_features(br->dev);
379
380
spin_lock_bh(&br->lock);
381
changed_addr = br_stp_recalculate_bridge_id(br);
382
383
if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) &&
384
(br->dev->flags & IFF_UP))
385
br_stp_enable_port(p);
386
spin_unlock_bh(&br->lock);
387
388
br_ifinfo_notify(RTM_NEWLINK, p);
389
390
if (changed_addr)
391
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
392
393
dev_set_mtu(br->dev, br_min_mtu(br));
394
395
kobject_uevent(&p->kobj, KOBJ_ADD);
396
397
return 0;
398
399
err4:
400
netdev_set_master(dev, NULL);
401
err3:
402
sysfs_remove_link(br->ifobj, p->dev->name);
403
err2:
404
br_fdb_delete_by_port(br, p, 1);
405
err1:
406
kobject_put(&p->kobj);
407
p = NULL; /* kobject_put frees */
408
err0:
409
dev_set_promiscuity(dev, -1);
410
put_back:
411
dev_put(dev);
412
kfree(p);
413
return err;
414
}
415
416
/* called with RTNL */
417
int br_del_if(struct net_bridge *br, struct net_device *dev)
418
{
419
struct net_bridge_port *p;
420
421
p = br_port_get_rtnl(dev);
422
if (!p || p->br != br)
423
return -EINVAL;
424
425
del_nbp(p);
426
427
spin_lock_bh(&br->lock);
428
br_stp_recalculate_bridge_id(br);
429
spin_unlock_bh(&br->lock);
430
431
netdev_update_features(br->dev);
432
433
return 0;
434
}
435
436
void __net_exit br_net_exit(struct net *net)
437
{
438
struct net_device *dev;
439
LIST_HEAD(list);
440
441
rtnl_lock();
442
for_each_netdev(net, dev)
443
if (dev->priv_flags & IFF_EBRIDGE)
444
del_br(netdev_priv(dev), &list);
445
446
unregister_netdevice_many(&list);
447
rtnl_unlock();
448
449
}
450
451