bridge: make hotplug-added vlans default to tagged
[project/netifd.git] / bridge.c
1 /*
2 * netifd - network interface daemon
3 * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14 #include <string.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <assert.h>
18 #include <errno.h>
19
20 #include "netifd.h"
21 #include "device.h"
22 #include "interface.h"
23 #include "system.h"
24 #include "ubus.h"
25
26 enum {
27 BRIDGE_ATTR_PORTS,
28 BRIDGE_ATTR_STP,
29 BRIDGE_ATTR_FORWARD_DELAY,
30 BRIDGE_ATTR_PRIORITY,
31 BRIDGE_ATTR_IGMP_SNOOP,
32 BRIDGE_ATTR_AGEING_TIME,
33 BRIDGE_ATTR_HELLO_TIME,
34 BRIDGE_ATTR_MAX_AGE,
35 BRIDGE_ATTR_BRIDGE_EMPTY,
36 BRIDGE_ATTR_MULTICAST_QUERIER,
37 BRIDGE_ATTR_HASH_MAX,
38 BRIDGE_ATTR_ROBUSTNESS,
39 BRIDGE_ATTR_QUERY_INTERVAL,
40 BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL,
41 BRIDGE_ATTR_LAST_MEMBER_INTERVAL,
42 BRIDGE_ATTR_VLAN_FILTERING,
43 BRIDGE_ATTR_HAS_VLANS,
44 BRIDGE_ATTR_STP_KERNEL,
45 BRIDGE_ATTR_STP_PROTO,
46 __BRIDGE_ATTR_MAX
47 };
48
49 static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = {
50 [BRIDGE_ATTR_PORTS] = { "ports", BLOBMSG_TYPE_ARRAY },
51 [BRIDGE_ATTR_STP] = { "stp", BLOBMSG_TYPE_BOOL },
52 [BRIDGE_ATTR_FORWARD_DELAY] = { "forward_delay", BLOBMSG_TYPE_INT32 },
53 [BRIDGE_ATTR_PRIORITY] = { "priority", BLOBMSG_TYPE_INT32 },
54 [BRIDGE_ATTR_AGEING_TIME] = { "ageing_time", BLOBMSG_TYPE_INT32 },
55 [BRIDGE_ATTR_HELLO_TIME] = { "hello_time", BLOBMSG_TYPE_INT32 },
56 [BRIDGE_ATTR_MAX_AGE] = { "max_age", BLOBMSG_TYPE_INT32 },
57 [BRIDGE_ATTR_IGMP_SNOOP] = { "igmp_snooping", BLOBMSG_TYPE_BOOL },
58 [BRIDGE_ATTR_BRIDGE_EMPTY] = { "bridge_empty", BLOBMSG_TYPE_BOOL },
59 [BRIDGE_ATTR_MULTICAST_QUERIER] = { "multicast_querier", BLOBMSG_TYPE_BOOL },
60 [BRIDGE_ATTR_HASH_MAX] = { "hash_max", BLOBMSG_TYPE_INT32 },
61 [BRIDGE_ATTR_ROBUSTNESS] = { "robustness", BLOBMSG_TYPE_INT32 },
62 [BRIDGE_ATTR_QUERY_INTERVAL] = { "query_interval", BLOBMSG_TYPE_INT32 },
63 [BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL] = { "query_response_interval", BLOBMSG_TYPE_INT32 },
64 [BRIDGE_ATTR_LAST_MEMBER_INTERVAL] = { "last_member_interval", BLOBMSG_TYPE_INT32 },
65 [BRIDGE_ATTR_VLAN_FILTERING] = { "vlan_filtering", BLOBMSG_TYPE_BOOL },
66 [BRIDGE_ATTR_HAS_VLANS] = { "__has_vlans", BLOBMSG_TYPE_BOOL }, /* internal */
67 [BRIDGE_ATTR_STP_KERNEL] = { "stp_kernel", BLOBMSG_TYPE_BOOL },
68 [BRIDGE_ATTR_STP_PROTO] = { "stp_proto", BLOBMSG_TYPE_STRING },
69 };
70
71 static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = {
72 [BRIDGE_ATTR_PORTS] = { .type = BLOBMSG_TYPE_STRING },
73 };
74
75 static const struct uci_blob_param_list bridge_attr_list = {
76 .n_params = __BRIDGE_ATTR_MAX,
77 .params = bridge_attrs,
78 .info = bridge_attr_info,
79
80 .n_next = 1,
81 .next = { &device_attr_list },
82 };
83
84 static struct blob_buf b;
85 static struct device *bridge_create(const char *name, struct device_type *devtype,
86 struct blob_attr *attr);
87 static void bridge_config_init(struct device *dev);
88 static void bridge_dev_vlan_update(struct device *dev);
89 static void bridge_free(struct device *dev);
90 static void bridge_stp_init(struct device *dev);
91 static void bridge_dump_info(struct device *dev, struct blob_buf *b);
92 static enum dev_change_type
93 bridge_reload(struct device *dev, struct blob_attr *attr);
94
95 static struct device_type bridge_device_type = {
96 .name = "bridge",
97 .config_params = &bridge_attr_list,
98
99 .bridge_capability = true,
100 .name_prefix = "br",
101
102 .create = bridge_create,
103 .config_init = bridge_config_init,
104 .vlan_update = bridge_dev_vlan_update,
105 .reload = bridge_reload,
106 .free = bridge_free,
107 .dump_info = bridge_dump_info,
108 .stp_init = bridge_stp_init,
109 };
110
111 struct bridge_state {
112 struct device dev;
113 device_state_cb set_state;
114
115 struct blob_attr *config_data;
116 struct bridge_config config;
117 struct blob_attr *ports;
118 bool active;
119 bool force_active;
120 bool has_vlans;
121
122 struct uloop_timeout retry;
123 struct bridge_member *primary_port;
124 struct vlist_tree members;
125 int n_present;
126 int n_failed;
127 };
128
129 struct bridge_member {
130 struct vlist_node node;
131 struct bridge_state *bst;
132 struct device_user dev;
133 struct uloop_timeout check_timer;
134 uint16_t pvid;
135 bool present;
136 bool active;
137 char name[];
138 };
139
140 static void
141 bridge_reset_primary(struct bridge_state *bst)
142 {
143 struct bridge_member *bm;
144
145 if (!bst->primary_port &&
146 (bst->dev.settings.flags & DEV_OPT_MACADDR))
147 return;
148
149 bst->primary_port = NULL;
150 bst->dev.settings.flags &= ~DEV_OPT_MACADDR;
151 vlist_for_each_element(&bst->members, bm, node) {
152 uint8_t *macaddr;
153
154 if (!bm->present)
155 continue;
156
157 bst->primary_port = bm;
158 if (bm->dev.dev->settings.flags & DEV_OPT_MACADDR)
159 macaddr = bm->dev.dev->settings.macaddr;
160 else
161 macaddr = bm->dev.dev->orig_settings.macaddr;
162 memcpy(bst->dev.settings.macaddr, macaddr, 6);
163 bst->dev.settings.flags |= DEV_OPT_MACADDR;
164 return;
165 }
166 }
167
168 static struct bridge_vlan_port *
169 bridge_find_vlan_member_port(struct bridge_member *bm, struct bridge_vlan *vlan)
170 {
171 struct bridge_vlan_hotplug_port *port;
172 const char *ifname = bm->dev.dev->ifname;
173 int i;
174
175 for (i = 0; i < vlan->n_ports; i++) {
176 if (strcmp(vlan->ports[i].ifname, ifname) != 0)
177 continue;
178
179 return &vlan->ports[i];
180 }
181
182 list_for_each_entry(port, &vlan->hotplug_ports, list) {
183 if (strcmp(port->port.ifname, ifname) != 0)
184 continue;
185
186 return &port->port;
187 }
188
189 return NULL;
190 }
191
192 static bool
193 bridge_member_vlan_is_pvid(struct bridge_member *bm, struct bridge_vlan_port *port)
194 {
195 return (!bm->pvid && (port->flags & BRVLAN_F_UNTAGGED)) ||
196 (port->flags & BRVLAN_F_PVID);
197 }
198
199 static void
200 __bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan,
201 struct bridge_vlan_port *port, bool add)
202 {
203 uint16_t flags;
204
205 flags = port->flags;
206 if (bm->pvid == vlan->vid)
207 flags |= BRVLAN_F_PVID;
208
209 system_bridge_vlan(port->ifname, vlan->vid, -1, add, flags);
210 }
211
212 static void
213 bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan, bool add)
214 {
215 struct bridge_vlan_port *port;
216
217 if (!bm->present)
218 return;
219
220 port = bridge_find_vlan_member_port(bm, vlan);
221 if (!port)
222 return;
223
224 if (bridge_member_vlan_is_pvid(bm, port))
225 bm->pvid = vlan->vid;
226
227 __bridge_set_member_vlan(bm, vlan, port, add);
228 }
229
230 static void
231 bridge_set_local_vlan(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
232 {
233 if (!vlan->local && add)
234 return;
235
236 system_bridge_vlan(bst->dev.ifname, vlan->vid, -1, add, BRVLAN_F_SELF);
237 }
238
239 static void
240 bridge_set_local_vlans(struct bridge_state *bst, bool add)
241 {
242 struct bridge_vlan *vlan;
243
244 vlist_for_each_element(&bst->dev.vlans, vlan, node)
245 bridge_set_local_vlan(bst, vlan, add);
246 }
247
248 static struct bridge_vlan *
249 bridge_recalc_member_pvid(struct bridge_member *bm)
250 {
251 struct bridge_state *bst = bm->bst;
252 struct bridge_vlan_port *port;
253 struct bridge_vlan *vlan, *ret = NULL;
254
255 vlist_for_each_element(&bst->dev.vlans, vlan, node) {
256 port = bridge_find_vlan_member_port(bm, vlan);
257 if (!port)
258 continue;
259
260 if (!bridge_member_vlan_is_pvid(bm, port))
261 continue;
262
263 ret = vlan;
264 if (port->flags & BRVLAN_F_PVID)
265 break;
266 }
267
268 return ret;
269 }
270
271 static void
272 bridge_set_vlan_state(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
273 {
274 struct bridge_member *bm;
275 struct bridge_vlan *vlan2;
276
277 bridge_set_local_vlan(bst, vlan, add);
278
279 vlist_for_each_element(&bst->members, bm, node) {
280 struct bridge_vlan_port *port;
281 int new_pvid = -1;
282
283 port = bridge_find_vlan_member_port(bm, vlan);
284 if (!port)
285 continue;
286
287 if (add) {
288 if (bridge_member_vlan_is_pvid(bm, port))
289 bm->pvid = vlan->vid;
290 } else if (bm->pvid == vlan->vid) {
291 vlan2 = bridge_recalc_member_pvid(bm);
292 if (vlan2 && vlan2->vid != vlan->vid) {
293 bridge_set_member_vlan(bm, vlan2, false);
294 bridge_set_member_vlan(bm, vlan2, true);
295 }
296 new_pvid = vlan2 ? vlan2->vid : 0;
297 }
298
299 if (!bm->present)
300 continue;
301
302 __bridge_set_member_vlan(bm, vlan, port, add);
303 if (new_pvid >= 0)
304 bm->pvid = new_pvid;
305 }
306 }
307
308 static int
309 bridge_disable_member(struct bridge_member *bm, bool keep_dev)
310 {
311 struct bridge_state *bst = bm->bst;
312 struct bridge_vlan *vlan;
313
314 if (!bm->present || !bm->active)
315 return 0;
316
317 bm->active = false;
318 vlist_for_each_element(&bst->dev.vlans, vlan, node)
319 bridge_set_member_vlan(bm, vlan, false);
320
321 system_bridge_delif(&bst->dev, bm->dev.dev);
322 if (!keep_dev)
323 device_release(&bm->dev);
324
325 device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
326
327 return 0;
328 }
329
330 static void bridge_stp_notify(struct bridge_state *bst)
331 {
332 struct bridge_config *cfg = &bst->config;
333
334 if (!cfg->stp || cfg->stp_kernel)
335 return;
336
337 blob_buf_init(&b, 0);
338 blobmsg_add_string(&b, "name", bst->dev.ifname);
339 if (cfg->stp_proto)
340 blobmsg_add_string(&b, "proto", cfg->stp_proto);
341 blobmsg_add_u32(&b, "forward_delay", cfg->forward_delay);
342 blobmsg_add_u32(&b, "hello_time", cfg->hello_time);
343 blobmsg_add_u32(&b, "max_age", cfg->max_age);
344 if (cfg->flags & BRIDGE_OPT_AGEING_TIME)
345 blobmsg_add_u32(&b, "ageing_time", cfg->ageing_time);
346 netifd_ubus_device_notify("stp_init", b.head, 1000);
347 }
348
349 static int
350 bridge_enable_interface(struct bridge_state *bst)
351 {
352 int ret;
353
354 if (bst->active)
355 return 0;
356
357 bridge_stp_notify(bst);
358 ret = system_bridge_addbr(&bst->dev, &bst->config);
359 if (ret < 0)
360 return ret;
361
362 if (bst->has_vlans) {
363 /* delete default VLAN 1 */
364 system_bridge_vlan(bst->dev.ifname, 1, -1, false, BRVLAN_F_SELF);
365
366 bridge_set_local_vlans(bst, true);
367 }
368
369 bst->active = true;
370 return 0;
371 }
372
373 static void
374 bridge_stp_init(struct device *dev)
375 {
376 struct bridge_state *bst;
377
378 bst = container_of(dev, struct bridge_state, dev);
379 if (!bst->config.stp || !bst->active)
380 return;
381
382 bridge_stp_notify(bst);
383 system_bridge_set_stp_state(&bst->dev, false);
384 system_bridge_set_stp_state(&bst->dev, true);
385 }
386
387 static void
388 bridge_disable_interface(struct bridge_state *bst)
389 {
390 if (!bst->active)
391 return;
392
393 system_bridge_delbr(&bst->dev);
394 bst->active = false;
395 }
396
397 static void
398 bridge_member_add_extra_vlans(struct bridge_member *bm)
399 {
400 struct device *dev = bm->dev.dev;
401 int i;
402
403 for (i = 0; i < dev->n_extra_vlan; i++)
404 system_bridge_vlan(dev->ifname, dev->extra_vlan[i].start,
405 dev->extra_vlan[i].end, true, 0);
406 }
407
408 static int
409 bridge_enable_member(struct bridge_member *bm)
410 {
411 struct bridge_state *bst = bm->bst;
412 struct bridge_vlan *vlan;
413 struct device *dev;
414 int ret;
415
416 if (!bm->present)
417 return 0;
418
419 ret = bridge_enable_interface(bst);
420 if (ret)
421 goto error;
422
423 /* Disable IPv6 for bridge members */
424 if (!(bm->dev.dev->settings.flags & DEV_OPT_IPV6)) {
425 bm->dev.dev->settings.ipv6 = 0;
426 bm->dev.dev->settings.flags |= DEV_OPT_IPV6;
427 }
428
429 ret = device_claim(&bm->dev);
430 if (ret < 0)
431 goto error;
432
433 dev = bm->dev.dev;
434 if (dev->settings.auth && !dev->auth_status)
435 return -1;
436
437 if (bm->active)
438 return 0;
439
440 ret = system_bridge_addif(&bst->dev, bm->dev.dev);
441 if (ret < 0) {
442 D(DEVICE, "Bridge device %s could not be added\n", bm->dev.dev->ifname);
443 goto error;
444 }
445
446 bm->active = true;
447 if (bst->has_vlans) {
448 /* delete default VLAN 1 */
449 system_bridge_vlan(bm->dev.dev->ifname, 1, -1, false, 0);
450
451 bridge_member_add_extra_vlans(bm);
452 vlist_for_each_element(&bst->dev.vlans, vlan, node)
453 bridge_set_member_vlan(bm, vlan, true);
454 }
455
456 device_set_present(&bst->dev, true);
457 device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
458
459 return 0;
460
461 error:
462 bst->n_failed++;
463 bm->present = false;
464 bst->n_present--;
465 device_release(&bm->dev);
466
467 return ret;
468 }
469
470 static void
471 bridge_remove_member(struct bridge_member *bm)
472 {
473 struct bridge_state *bst = bm->bst;
474
475 if (!bm->present)
476 return;
477
478 if (bst->dev.active)
479 bridge_disable_member(bm, false);
480
481 bm->present = false;
482 bm->bst->n_present--;
483
484 if (bm == bst->primary_port)
485 bridge_reset_primary(bst);
486
487 if (bst->config.bridge_empty)
488 return;
489
490 bst->force_active = false;
491 if (bst->n_present == 0)
492 device_set_present(&bst->dev, false);
493 }
494
495 static void
496 bridge_free_member(struct bridge_member *bm)
497 {
498 struct bridge_state *bst = bm->bst;
499 struct device *dev = bm->dev.dev;
500 const char *ifname = dev->ifname;
501 struct bridge_vlan *vlan;
502
503 bridge_remove_member(bm);
504
505 restart:
506 vlist_for_each_element(&bst->dev.vlans, vlan, node) {
507 struct bridge_vlan_hotplug_port *port, *tmp;
508 bool free_port = false;
509
510 list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list) {
511 if (strcmp(port->port.ifname, ifname) != 0)
512 continue;
513
514 list_del(&port->list);
515 free(port);
516 free_port = true;
517 }
518
519 if (!free_port || !list_empty(&vlan->hotplug_ports) ||
520 vlan->n_ports || vlan->node.version != -1)
521 continue;
522
523 vlist_delete(&bst->dev.vlans, &vlan->node);
524 goto restart;
525 }
526
527 device_remove_user(&bm->dev);
528 uloop_timeout_cancel(&bm->check_timer);
529
530 /*
531 * When reloading the config and moving a device from one bridge to
532 * another, the other bridge may have tried to claim this device
533 * before it was removed here.
534 * Ensure that claiming the device is retried by toggling its present
535 * state
536 */
537 if (dev->present) {
538 device_set_present(dev, false);
539 device_set_present(dev, true);
540 }
541
542 free(bm);
543 }
544
545 static void
546 bridge_check_retry(struct bridge_state *bst)
547 {
548 if (!bst->n_failed)
549 return;
550
551 uloop_timeout_set(&bst->retry, 100);
552 }
553
554 static void
555 bridge_member_check_cb(struct uloop_timeout *t)
556 {
557 struct bridge_member *bm;
558 struct bridge_state *bst;
559
560 bm = container_of(t, struct bridge_member, check_timer);
561 bst = bm->bst;
562
563 if (system_bridge_vlan_check(&bst->dev, bm->dev.dev->ifname) <= 0)
564 return;
565
566 bridge_disable_member(bm, true);
567 bridge_enable_member(bm);
568 }
569
570 static void
571 bridge_member_cb(struct device_user *dep, enum device_event ev)
572 {
573 struct bridge_member *bm = container_of(dep, struct bridge_member, dev);
574 struct bridge_state *bst = bm->bst;
575 struct device *dev = dep->dev;
576
577 switch (ev) {
578 case DEV_EVENT_ADD:
579 assert(!bm->present);
580
581 bm->present = true;
582 bst->n_present++;
583
584 if (bst->n_present == 1)
585 device_set_present(&bst->dev, true);
586 fallthrough;
587 case DEV_EVENT_AUTH_UP:
588 if (!bst->dev.active)
589 break;
590
591 if (bridge_enable_member(bm))
592 break;
593
594 /*
595 * Adding a bridge member can overwrite the bridge mtu
596 * in the kernel, apply the bridge settings in case the
597 * bridge mtu is set
598 */
599 system_if_apply_settings(&bst->dev, &bst->dev.settings,
600 DEV_OPT_MTU | DEV_OPT_MTU6);
601 break;
602 case DEV_EVENT_LINK_UP:
603 if (bst->has_vlans)
604 uloop_timeout_set(&bm->check_timer, 1000);
605 break;
606 case DEV_EVENT_LINK_DOWN:
607 if (!dev->settings.auth)
608 break;
609
610 bridge_disable_member(bm, true);
611 break;
612 case DEV_EVENT_REMOVE:
613 if (dep->hotplug) {
614 vlist_delete(&bst->members, &bm->node);
615 return;
616 }
617
618 if (bm->present)
619 bridge_remove_member(bm);
620
621 break;
622 default:
623 return;
624 }
625 }
626
627 static int
628 bridge_set_down(struct bridge_state *bst)
629 {
630 struct bridge_member *bm;
631
632 bst->set_state(&bst->dev, false);
633
634 vlist_for_each_element(&bst->members, bm, node)
635 bridge_disable_member(bm, false);
636
637 bridge_disable_interface(bst);
638
639 return 0;
640 }
641
642 static int
643 bridge_set_up(struct bridge_state *bst)
644 {
645 struct bridge_member *bm;
646 int ret;
647
648 bst->has_vlans = !avl_is_empty(&bst->dev.vlans.avl);
649 if (!bst->n_present) {
650 if (!bst->force_active)
651 return -ENOENT;
652
653 ret = bridge_enable_interface(bst);
654 if (ret)
655 return ret;
656 }
657
658 bst->n_failed = 0;
659 vlist_for_each_element(&bst->members, bm, node)
660 bridge_enable_member(bm);
661 bridge_check_retry(bst);
662
663 if (!bst->force_active && !bst->n_present) {
664 /* initialization of all member interfaces failed */
665 bridge_disable_interface(bst);
666 device_set_present(&bst->dev, false);
667 return -ENOENT;
668 }
669
670 bridge_reset_primary(bst);
671 ret = bst->set_state(&bst->dev, true);
672 if (ret < 0)
673 bridge_set_down(bst);
674
675 return ret;
676 }
677
678 static int
679 bridge_set_state(struct device *dev, bool up)
680 {
681 struct bridge_state *bst;
682
683 bst = container_of(dev, struct bridge_state, dev);
684
685 if (up)
686 return bridge_set_up(bst);
687 else
688 return bridge_set_down(bst);
689 }
690
691 static struct bridge_member *
692 bridge_create_member(struct bridge_state *bst, const char *name,
693 struct device *dev, bool hotplug)
694 {
695 struct bridge_member *bm;
696
697 bm = calloc(1, sizeof(*bm) + strlen(name) + 1);
698 if (!bm)
699 return NULL;
700
701 bm->bst = bst;
702 bm->dev.cb = bridge_member_cb;
703 bm->dev.hotplug = hotplug;
704 bm->check_timer.cb = bridge_member_check_cb;
705 strcpy(bm->name, name);
706 bm->dev.dev = dev;
707 vlist_add(&bst->members, &bm->node, bm->name);
708 /*
709 * Need to look up the bridge member again as the above
710 * created pointer will be freed in case the bridge member
711 * already existed
712 */
713 bm = vlist_find(&bst->members, name, bm, node);
714 if (hotplug && bm)
715 bm->node.version = -1;
716
717 return bm;
718 }
719
720 static void
721 bridge_member_update(struct vlist_tree *tree, struct vlist_node *node_new,
722 struct vlist_node *node_old)
723 {
724 struct bridge_member *bm;
725 struct device *dev;
726
727 if (node_new) {
728 bm = container_of(node_new, struct bridge_member, node);
729
730 if (node_old) {
731 free(bm);
732 return;
733 }
734
735 dev = bm->dev.dev;
736 bm->dev.dev = NULL;
737 device_add_user(&bm->dev, dev);
738 }
739
740
741 if (node_old) {
742 bm = container_of(node_old, struct bridge_member, node);
743 bridge_free_member(bm);
744 }
745 }
746
747
748 static void
749 bridge_add_member(struct bridge_state *bst, const char *name)
750 {
751 struct device *dev;
752
753 dev = device_get(name, true);
754 if (!dev)
755 return;
756
757 bridge_create_member(bst, name, dev, false);
758 }
759
760 static struct bridge_vlan *
761 bridge_hotplug_get_vlan(struct bridge_state *bst, uint16_t vid)
762 {
763 struct bridge_vlan *vlan;
764
765 vlan = vlist_find(&bst->dev.vlans, &vid, vlan, node);
766 if (vlan)
767 return vlan;
768
769 vlan = calloc(1, sizeof(*vlan));
770 vlan->vid = vid;
771 vlan->local = true;
772 INIT_LIST_HEAD(&vlan->hotplug_ports);
773 vlist_add(&bst->dev.vlans, &vlan->node, &vlan->vid);
774 vlan->node.version = -1;
775
776 return vlan;
777 }
778
779 static struct bridge_vlan_hotplug_port *
780 bridge_hotplug_get_vlan_port(struct bridge_vlan *vlan, const char *ifname)
781 {
782 struct bridge_vlan_hotplug_port *port;
783
784 list_for_each_entry(port, &vlan->hotplug_ports, list)
785 if (!strcmp(port->port.ifname, ifname))
786 return port;
787
788 return NULL;
789 }
790
791 static void
792 bridge_hotplug_set_member_vlans(struct bridge_state *bst, struct blob_attr *vlans,
793 const char *ifname, struct bridge_member *bm, bool add)
794 {
795 struct bridge_vlan *vlan;
796 struct blob_attr *cur;
797 size_t rem;
798
799 if (!vlans)
800 return;
801
802 blobmsg_for_each_attr(cur, vlans, rem) {
803 struct bridge_vlan_hotplug_port *port;
804 uint16_t flags = 0;
805 char *name_buf;
806 unsigned int vid;
807 char *end;
808
809 if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
810 continue;
811
812 vid = strtoul(blobmsg_get_string(cur), &end, 0);
813 if (!vid || vid > 4095)
814 continue;
815
816 vlan = bridge_hotplug_get_vlan(bst, vid);
817 if (!vlan)
818 continue;
819
820 if (vlan->pending) {
821 vlan->pending = false;
822 bridge_set_vlan_state(bst, vlan, true);
823 }
824
825 if (end && *end) {
826 if (*end != ':')
827 continue;
828
829 for (end++; *end; end++) {
830 switch (*end) {
831 case 'u':
832 flags |= BRVLAN_F_UNTAGGED;
833 break;
834 case '*':
835 flags |= BRVLAN_F_PVID;
836 break;
837 }
838 }
839 }
840
841 port = bridge_hotplug_get_vlan_port(vlan, ifname);
842 if (!add) {
843 if (!port)
844 continue;
845
846 __bridge_set_member_vlan(bm, vlan, &port->port, false);
847 list_del(&port->list);
848 free(port);
849 continue;
850 }
851
852 if (port) {
853 if (port->port.flags == flags)
854 continue;
855
856 __bridge_set_member_vlan(bm, vlan, &port->port, false);
857 port->port.flags = flags;
858 __bridge_set_member_vlan(bm, vlan, &port->port, true);
859 continue;
860 }
861
862 port = calloc_a(sizeof(*port), &name_buf, strlen(ifname) + 1);
863 if (!port)
864 continue;
865
866 port->port.flags = flags;
867 port->port.ifname = strcpy(name_buf, ifname);
868 list_add_tail(&port->list, &vlan->hotplug_ports);
869
870 if (!bm)
871 continue;
872
873 __bridge_set_member_vlan(bm, vlan, &port->port, true);
874 }
875 }
876
877 static int
878 bridge_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan)
879 {
880 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
881 struct bridge_member *bm;
882
883 bm = vlist_find(&bst->members, member->ifname, bm, node);
884 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, true);
885 if (!bm)
886 bridge_create_member(bst, member->ifname, member, true);
887
888 return 0;
889 }
890
891 static int
892 bridge_hotplug_del(struct device *dev, struct device *member, struct blob_attr *vlan)
893 {
894 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
895 struct bridge_member *bm;
896
897 bm = vlist_find(&bst->members, member->ifname, bm, node);
898 if (!bm)
899 return UBUS_STATUS_NOT_FOUND;
900
901 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, false);
902 if (!bm->dev.hotplug)
903 return 0;
904
905 vlist_delete(&bst->members, &bm->node);
906 return 0;
907 }
908
909 static int
910 bridge_hotplug_prepare(struct device *dev, struct device **bridge_dev)
911 {
912 struct bridge_state *bst;
913
914 if (bridge_dev)
915 *bridge_dev = dev;
916
917 bst = container_of(dev, struct bridge_state, dev);
918 bst->force_active = true;
919 device_set_present(&bst->dev, true);
920
921 return 0;
922 }
923
924 static const struct device_hotplug_ops bridge_ops = {
925 .prepare = bridge_hotplug_prepare,
926 .add = bridge_hotplug_add,
927 .del = bridge_hotplug_del
928 };
929
930 static void
931 bridge_free(struct device *dev)
932 {
933 struct bridge_state *bst;
934
935 bst = container_of(dev, struct bridge_state, dev);
936 vlist_flush_all(&bst->members);
937 vlist_flush_all(&dev->vlans);
938 kvlist_free(&dev->vlan_aliases);
939 free(bst->config_data);
940 free(bst);
941 }
942
943 static void
944 bridge_dump_port(struct blob_buf *b, struct bridge_vlan_port *port)
945 {
946 bool tagged = !(port->flags & BRVLAN_F_UNTAGGED);
947 bool pvid = (port->flags & BRVLAN_F_PVID);
948
949 blobmsg_printf(b, NULL, "%s%s%s%s", port->ifname,
950 tagged || pvid ? ":" : "",
951 tagged ? "t" : "",
952 pvid ? "*" : "");
953 }
954
955 static void
956 bridge_dump_vlan(struct blob_buf *b, struct bridge_vlan *vlan)
957 {
958 struct bridge_vlan_hotplug_port *port;
959 void *c, *p;
960 int i;
961
962 c = blobmsg_open_table(b, NULL);
963
964 blobmsg_add_u32(b, "id", vlan->vid);
965 blobmsg_add_u8(b, "local", vlan->local);
966
967 p = blobmsg_open_array(b, "ports");
968
969 for (i = 0; i < vlan->n_ports; i++)
970 bridge_dump_port(b, &vlan->ports[i]);
971
972 list_for_each_entry(port, &vlan->hotplug_ports, list)
973 bridge_dump_port(b, &port->port);
974
975 blobmsg_close_array(b, p);
976
977 blobmsg_close_table(b, c);
978 }
979
980 static void
981 bridge_dump_info(struct device *dev, struct blob_buf *b)
982 {
983 struct bridge_config *cfg;
984 struct bridge_state *bst;
985 struct bridge_member *bm;
986 struct bridge_vlan *vlan;
987 void *list;
988 void *c;
989
990 bst = container_of(dev, struct bridge_state, dev);
991 cfg = &bst->config;
992
993 system_if_dump_info(dev, b);
994 list = blobmsg_open_array(b, "bridge-members");
995
996 vlist_for_each_element(&bst->members, bm, node) {
997 if (bm->dev.dev->hidden)
998 continue;
999
1000 blobmsg_add_string(b, NULL, bm->dev.dev->ifname);
1001 }
1002
1003 blobmsg_close_array(b, list);
1004
1005 c = blobmsg_open_table(b, "bridge-attributes");
1006
1007 blobmsg_add_u8(b, "stp", cfg->stp);
1008 blobmsg_add_u32(b, "forward_delay", cfg->forward_delay);
1009 blobmsg_add_u32(b, "priority", cfg->priority);
1010 blobmsg_add_u32(b, "ageing_time", cfg->ageing_time);
1011 blobmsg_add_u32(b, "hello_time", cfg->hello_time);
1012 blobmsg_add_u32(b, "max_age", cfg->max_age);
1013 blobmsg_add_u8(b, "igmp_snooping", cfg->igmp_snoop);
1014 blobmsg_add_u8(b, "bridge_empty", cfg->bridge_empty);
1015 blobmsg_add_u8(b, "multicast_querier", cfg->multicast_querier);
1016 blobmsg_add_u32(b, "hash_max", cfg->hash_max);
1017 blobmsg_add_u32(b, "robustness", cfg->robustness);
1018 blobmsg_add_u32(b, "query_interval", cfg->query_interval);
1019 blobmsg_add_u32(b, "query_response_interval", cfg->query_response_interval);
1020 blobmsg_add_u32(b, "last_member_interval", cfg->last_member_interval);
1021 blobmsg_add_u8(b, "vlan_filtering", cfg->vlan_filtering);
1022 blobmsg_add_u8(b, "stp_kernel", cfg->stp_kernel);
1023 if (cfg->stp_proto)
1024 blobmsg_add_string(b, "stp_proto", cfg->stp_proto);
1025
1026 blobmsg_close_table(b, c);
1027
1028 if (avl_is_empty(&dev->vlans.avl))
1029 return;
1030
1031 list = blobmsg_open_array(b, "bridge-vlans");
1032
1033 vlist_for_each_element(&bst->dev.vlans, vlan, node)
1034 bridge_dump_vlan(b, vlan);
1035
1036 blobmsg_close_array(b, list);
1037 }
1038
1039 static void
1040 bridge_config_init(struct device *dev)
1041 {
1042 struct bridge_state *bst;
1043 struct bridge_vlan *vlan;
1044 struct blob_attr *cur;
1045 size_t rem;
1046 int i;
1047
1048 bst = container_of(dev, struct bridge_state, dev);
1049
1050 if (bst->config.bridge_empty) {
1051 bst->force_active = true;
1052 device_set_present(&bst->dev, true);
1053 }
1054
1055 bst->n_failed = 0;
1056 vlist_update(&bst->members);
1057 if (bst->ports) {
1058 blobmsg_for_each_attr(cur, bst->ports, rem) {
1059 bridge_add_member(bst, blobmsg_data(cur));
1060 }
1061 }
1062
1063 vlist_for_each_element(&bst->dev.vlans, vlan, node)
1064 for (i = 0; i < vlan->n_ports; i++)
1065 bridge_add_member(bst, vlan->ports[i].ifname);
1066
1067 vlist_flush(&bst->members);
1068 bridge_check_retry(bst);
1069 }
1070
1071 static void
1072 bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
1073 {
1074 struct bridge_config *cfg = &bst->config;
1075 struct blob_attr *cur;
1076
1077 /* defaults */
1078 memset(cfg, 0, sizeof(*cfg));
1079 cfg->stp = false;
1080 cfg->stp_kernel = false;
1081 cfg->robustness = 2;
1082 cfg->igmp_snoop = false;
1083 cfg->multicast_querier = false;
1084 cfg->query_interval = 12500;
1085 cfg->query_response_interval = 1000;
1086 cfg->last_member_interval = 100;
1087 cfg->hash_max = 512;
1088 cfg->bridge_empty = false;
1089 cfg->priority = 0x7FFF;
1090 cfg->vlan_filtering = false;
1091
1092 cfg->forward_delay = 8;
1093 cfg->max_age = 10;
1094 cfg->hello_time = 1;
1095
1096 if ((cur = tb[BRIDGE_ATTR_STP]))
1097 cfg->stp = blobmsg_get_bool(cur);
1098
1099 if ((cur = tb[BRIDGE_ATTR_STP_KERNEL]))
1100 cfg->stp = blobmsg_get_bool(cur);
1101
1102 if ((cur = tb[BRIDGE_ATTR_STP_PROTO]))
1103 cfg->stp_proto = blobmsg_get_string(cur);
1104
1105 if ((cur = tb[BRIDGE_ATTR_FORWARD_DELAY]))
1106 cfg->forward_delay = blobmsg_get_u32(cur);
1107
1108 if ((cur = tb[BRIDGE_ATTR_PRIORITY]))
1109 cfg->priority = blobmsg_get_u32(cur);
1110
1111 if ((cur = tb[BRIDGE_ATTR_IGMP_SNOOP]))
1112 cfg->multicast_querier = cfg->igmp_snoop = blobmsg_get_bool(cur);
1113
1114 if ((cur = tb[BRIDGE_ATTR_MULTICAST_QUERIER]))
1115 cfg->multicast_querier = blobmsg_get_bool(cur);
1116
1117 if ((cur = tb[BRIDGE_ATTR_HASH_MAX]))
1118 cfg->hash_max = blobmsg_get_u32(cur);
1119
1120 if ((cur = tb[BRIDGE_ATTR_ROBUSTNESS])) {
1121 cfg->robustness = blobmsg_get_u32(cur);
1122 cfg->flags |= BRIDGE_OPT_ROBUSTNESS;
1123 }
1124
1125 if ((cur = tb[BRIDGE_ATTR_QUERY_INTERVAL])) {
1126 cfg->query_interval = blobmsg_get_u32(cur);
1127 cfg->flags |= BRIDGE_OPT_QUERY_INTERVAL;
1128 }
1129
1130 if ((cur = tb[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL])) {
1131 cfg->query_response_interval = blobmsg_get_u32(cur);
1132 cfg->flags |= BRIDGE_OPT_QUERY_RESPONSE_INTERVAL;
1133 }
1134
1135 if ((cur = tb[BRIDGE_ATTR_LAST_MEMBER_INTERVAL])) {
1136 cfg->last_member_interval = blobmsg_get_u32(cur);
1137 cfg->flags |= BRIDGE_OPT_LAST_MEMBER_INTERVAL;
1138 }
1139
1140 if ((cur = tb[BRIDGE_ATTR_AGEING_TIME])) {
1141 cfg->ageing_time = blobmsg_get_u32(cur);
1142 cfg->flags |= BRIDGE_OPT_AGEING_TIME;
1143 }
1144
1145 if ((cur = tb[BRIDGE_ATTR_HELLO_TIME]))
1146 cfg->hello_time = blobmsg_get_u32(cur);
1147
1148 if ((cur = tb[BRIDGE_ATTR_MAX_AGE]))
1149 cfg->max_age = blobmsg_get_u32(cur);
1150
1151 if ((cur = tb[BRIDGE_ATTR_BRIDGE_EMPTY]))
1152 cfg->bridge_empty = blobmsg_get_bool(cur);
1153
1154 if ((cur = tb[BRIDGE_ATTR_VLAN_FILTERING]))
1155 cfg->vlan_filtering = blobmsg_get_bool(cur);
1156 }
1157
1158 static enum dev_change_type
1159 bridge_reload(struct device *dev, struct blob_attr *attr)
1160 {
1161 struct blob_attr *tb_dev[__DEV_ATTR_MAX];
1162 struct blob_attr *tb_br[__BRIDGE_ATTR_MAX];
1163 enum dev_change_type ret = DEV_CONFIG_APPLIED;
1164 unsigned long diff;
1165 struct bridge_state *bst;
1166
1167 BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / 8);
1168 BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
1169
1170 bst = container_of(dev, struct bridge_state, dev);
1171 attr = blob_memdup(attr);
1172
1173 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, tb_dev,
1174 blob_data(attr), blob_len(attr));
1175 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, tb_br,
1176 blob_data(attr), blob_len(attr));
1177
1178 if (tb_dev[DEV_ATTR_MACADDR])
1179 bst->primary_port = NULL;
1180
1181 bst->ports = tb_br[BRIDGE_ATTR_PORTS];
1182 device_init_settings(dev, tb_dev);
1183 bridge_apply_settings(bst, tb_br);
1184
1185 if (bst->config_data) {
1186 struct blob_attr *otb_dev[__DEV_ATTR_MAX];
1187 struct blob_attr *otb_br[__BRIDGE_ATTR_MAX];
1188
1189 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
1190 blob_data(bst->config_data), blob_len(bst->config_data));
1191
1192 diff = 0;
1193 uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
1194 if (diff) {
1195 ret = DEV_CONFIG_RESTART;
1196 D(DEVICE, "Bridge %s device attributes have changed, diff=0x%lx\n",
1197 dev->ifname, diff);
1198 }
1199
1200 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, otb_br,
1201 blob_data(bst->config_data), blob_len(bst->config_data));
1202
1203 diff = 0;
1204 uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff);
1205 if (diff & ~(1 << BRIDGE_ATTR_PORTS)) {
1206 ret = DEV_CONFIG_RESTART;
1207 D(DEVICE, "Bridge %s attributes have changed, diff=0x%lx\n",
1208 dev->ifname, diff);
1209 }
1210
1211 bridge_config_init(dev);
1212 }
1213
1214 free(bst->config_data);
1215 bst->config_data = attr;
1216 return ret;
1217 }
1218
1219 static void
1220 bridge_retry_members(struct uloop_timeout *timeout)
1221 {
1222 struct bridge_state *bst = container_of(timeout, struct bridge_state, retry);
1223 struct bridge_member *bm;
1224
1225 bst->n_failed = 0;
1226 vlist_for_each_element(&bst->members, bm, node) {
1227 if (bm->present)
1228 continue;
1229
1230 if (!bm->dev.dev->present)
1231 continue;
1232
1233 bm->present = true;
1234 bst->n_present++;
1235 bridge_enable_member(bm);
1236 }
1237 }
1238
1239 static int bridge_avl_cmp_u16(const void *k1, const void *k2, void *ptr)
1240 {
1241 const uint16_t *i1 = k1, *i2 = k2;
1242
1243 return *i1 - *i2;
1244 }
1245
1246 static bool
1247 bridge_vlan_equal(struct bridge_vlan *v1, struct bridge_vlan *v2)
1248 {
1249 int i;
1250
1251 if (v1->n_ports != v2->n_ports)
1252 return false;
1253
1254 for (i = 0; i < v1->n_ports; i++)
1255 if (v1->ports[i].flags != v2->ports[i].flags ||
1256 strcmp(v1->ports[i].ifname, v2->ports[i].ifname) != 0)
1257 return false;
1258
1259 return true;
1260 }
1261
1262 static void
1263 bridge_vlan_free(struct bridge_vlan *vlan)
1264 {
1265 struct bridge_vlan_hotplug_port *port, *tmp;
1266
1267 if (!vlan)
1268 return;
1269
1270 list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list)
1271 free(port);
1272
1273 free(vlan);
1274 }
1275
1276 static void
1277 bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
1278 struct vlist_node *node_old)
1279 {
1280 struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
1281 struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
1282
1283 if (!bst->has_vlans || !bst->active)
1284 goto out;
1285
1286 if (node_old)
1287 vlan_old = container_of(node_old, struct bridge_vlan, node);
1288 if (node_new)
1289 vlan_new = container_of(node_new, struct bridge_vlan, node);
1290
1291 if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
1292 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1293 goto out;
1294 }
1295
1296 if (node_old)
1297 bridge_set_vlan_state(bst, vlan_old, false);
1298
1299 if (node_old && node_new)
1300 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1301
1302 if (node_new)
1303 vlan_new->pending = true;
1304
1305 bst->dev.config_pending = true;
1306
1307 out:
1308 bridge_vlan_free(vlan_old);
1309 }
1310
1311 static void
1312 bridge_dev_vlan_update(struct device *dev)
1313 {
1314 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
1315 struct bridge_vlan *vlan;
1316
1317 vlist_for_each_element(&dev->vlans, vlan, node) {
1318 if (!vlan->pending)
1319 continue;
1320
1321 vlan->pending = false;
1322 bridge_set_vlan_state(bst, vlan, true);
1323 }
1324 }
1325
1326 static struct device *
1327 bridge_create(const char *name, struct device_type *devtype,
1328 struct blob_attr *attr)
1329 {
1330 struct bridge_state *bst;
1331 struct device *dev = NULL;
1332
1333 bst = calloc(1, sizeof(*bst));
1334 if (!bst)
1335 return NULL;
1336
1337 dev = &bst->dev;
1338
1339 if (device_init(dev, devtype, name) < 0) {
1340 device_cleanup(dev);
1341 free(bst);
1342 return NULL;
1343 }
1344
1345 dev->config_pending = true;
1346 bst->retry.cb = bridge_retry_members;
1347
1348 bst->set_state = dev->set_state;
1349 dev->set_state = bridge_set_state;
1350
1351 dev->hotplug_ops = &bridge_ops;
1352
1353 vlist_init(&bst->members, avl_strcmp, bridge_member_update);
1354 bst->members.keep_old = true;
1355
1356 vlist_init(&dev->vlans, bridge_avl_cmp_u16, bridge_vlan_update);
1357
1358 bridge_reload(dev, attr);
1359
1360 return dev;
1361 }
1362
1363 static void __init bridge_device_type_init(void)
1364 {
1365 device_type_add(&bridge_device_type);
1366 }