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