ubus: add a dummy mode ubus call to simulate hotplug events
[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
708 return vlan;
709 }
710
711 static struct bridge_vlan_hotplug_port *
712 bridge_hotplug_get_vlan_port(struct bridge_vlan *vlan, const char *ifname)
713 {
714 struct bridge_vlan_hotplug_port *port;
715
716 list_for_each_entry(port, &vlan->hotplug_ports, list)
717 if (!strcmp(port->port.ifname, ifname))
718 return port;
719
720 return NULL;
721 }
722
723 static void
724 bridge_hotplug_set_member_vlans(struct bridge_state *bst, struct blob_attr *vlans,
725 const char *ifname, struct bridge_member *bm, bool add)
726 {
727 struct bridge_vlan *vlan;
728 struct blob_attr *cur;
729 int rem;
730
731 if (!vlans)
732 return;
733
734 blobmsg_for_each_attr(cur, vlans, rem) {
735 struct bridge_vlan_hotplug_port *port;
736 uint16_t flags = BRVLAN_F_UNTAGGED;
737 char *name_buf;
738 unsigned int vid;
739 char *end;
740
741 if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
742 continue;
743
744 vid = strtoul(blobmsg_get_string(cur), &end, 0);
745 if (!vid || vid > 4095)
746 continue;
747
748 vlan = bridge_hotplug_get_vlan(bst, vid);
749 if (!vlan)
750 continue;
751
752 if (end && *end) {
753 if (*end != ':')
754 continue;
755
756 for (end++; *end; end++) {
757 switch (*end) {
758 case 't':
759 flags &= ~BRVLAN_F_UNTAGGED;
760 break;
761 case '*':
762 flags |= BRVLAN_F_PVID;
763 break;
764 }
765 }
766 }
767
768 port = bridge_hotplug_get_vlan_port(vlan, ifname);
769 if (!add) {
770 if (!port)
771 continue;
772
773 __bridge_set_member_vlan(bm, vlan, &port->port, false);
774 list_del(&port->list);
775 free(port);
776 continue;
777 }
778
779 if (port) {
780 if (port->port.flags == flags)
781 continue;
782
783 __bridge_set_member_vlan(bm, vlan, &port->port, false);
784 port->port.flags = flags;
785 __bridge_set_member_vlan(bm, vlan, &port->port, true);
786 continue;
787 }
788
789 port = calloc_a(sizeof(*port), &name_buf, strlen(ifname) + 1);
790 if (!port)
791 continue;
792
793 port->port.flags = flags;
794 port->port.ifname = strcpy(name_buf, ifname);
795 list_add_tail(&port->list, &vlan->hotplug_ports);
796
797 if (!bm)
798 continue;
799
800 __bridge_set_member_vlan(bm, vlan, &port->port, true);
801 }
802 }
803
804 static int
805 bridge_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan)
806 {
807 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
808 struct bridge_member *bm;
809
810 bm = vlist_find(&bst->members, member->ifname, bm, node);
811 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, true);
812 if (!bm)
813 bridge_create_member(bst, member->ifname, member, true);
814
815 return 0;
816 }
817
818 static int
819 bridge_hotplug_del(struct device *dev, struct device *member, struct blob_attr *vlan)
820 {
821 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
822 struct bridge_member *bm;
823
824 bm = vlist_find(&bst->members, member->ifname, bm, node);
825 if (!bm)
826 return UBUS_STATUS_NOT_FOUND;
827
828 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, false);
829 if (!bm->dev.hotplug)
830 return 0;
831
832 vlist_delete(&bst->members, &bm->node);
833 return 0;
834 }
835
836 static int
837 bridge_hotplug_prepare(struct device *dev, struct device **bridge_dev)
838 {
839 struct bridge_state *bst;
840
841 if (bridge_dev)
842 *bridge_dev = dev;
843
844 bst = container_of(dev, struct bridge_state, dev);
845 bst->force_active = true;
846 device_set_present(&bst->dev, true);
847
848 return 0;
849 }
850
851 static const struct device_hotplug_ops bridge_ops = {
852 .prepare = bridge_hotplug_prepare,
853 .add = bridge_hotplug_add,
854 .del = bridge_hotplug_del
855 };
856
857 static void
858 bridge_free(struct device *dev)
859 {
860 struct bridge_state *bst;
861
862 bst = container_of(dev, struct bridge_state, dev);
863 vlist_flush_all(&bst->members);
864 vlist_flush_all(&dev->vlans);
865 kvlist_free(&dev->vlan_aliases);
866 free(bst->config_data);
867 free(bst);
868 }
869
870 static void
871 bridge_dump_port(struct blob_buf *b, struct bridge_vlan_port *port)
872 {
873 bool tagged = !(port->flags & BRVLAN_F_UNTAGGED);
874 bool pvid = (port->flags & BRVLAN_F_PVID);
875
876 blobmsg_printf(b, "%s%s%s%s\n", port->ifname,
877 tagged || pvid ? ":" : "",
878 tagged ? "t" : "",
879 pvid ? "*" : "");
880 }
881
882 static void
883 bridge_dump_vlan(struct blob_buf *b, struct bridge_vlan *vlan)
884 {
885 struct bridge_vlan_hotplug_port *port;
886 void *c, *p;
887 int i;
888
889 c = blobmsg_open_table(b, NULL);
890
891 blobmsg_add_u32(b, "id", vlan->vid);
892 blobmsg_add_u8(b, "local", vlan->local);
893
894 p = blobmsg_open_array(b, "ports");
895
896 for (i = 0; i < vlan->n_ports; i++)
897 bridge_dump_port(b, &vlan->ports[i]);
898
899 list_for_each_entry(port, &vlan->hotplug_ports, list)
900 bridge_dump_port(b, &port->port);
901
902 blobmsg_close_array(b, p);
903
904 blobmsg_close_table(b, c);
905 }
906
907 static void
908 bridge_dump_info(struct device *dev, struct blob_buf *b)
909 {
910 struct bridge_state *bst;
911 struct bridge_member *bm;
912 struct bridge_vlan *vlan;
913 void *list;
914
915 bst = container_of(dev, struct bridge_state, dev);
916
917 system_if_dump_info(dev, b);
918 list = blobmsg_open_array(b, "bridge-members");
919
920 vlist_for_each_element(&bst->members, bm, node) {
921 if (bm->dev.dev->hidden)
922 continue;
923
924 blobmsg_add_string(b, NULL, bm->dev.dev->ifname);
925 }
926
927 blobmsg_close_array(b, list);
928
929 if (avl_is_empty(&dev->vlans.avl))
930 return;
931
932 list = blobmsg_open_array(b, "bridge-vlans");
933
934 vlist_for_each_element(&bst->dev.vlans, vlan, node)
935 bridge_dump_vlan(b, vlan);
936
937 blobmsg_close_array(b, list);
938 }
939
940 static void
941 bridge_config_init(struct device *dev)
942 {
943 struct bridge_state *bst;
944 struct bridge_vlan *vlan;
945 struct blob_attr *cur;
946 int i, rem;
947
948 bst = container_of(dev, struct bridge_state, dev);
949
950 if (bst->config.bridge_empty) {
951 bst->force_active = true;
952 device_set_present(&bst->dev, true);
953 }
954
955 bst->n_failed = 0;
956 vlist_update(&bst->members);
957 if (bst->ports) {
958 blobmsg_for_each_attr(cur, bst->ports, rem) {
959 bridge_add_member(bst, blobmsg_data(cur));
960 }
961 }
962
963 vlist_for_each_element(&bst->dev.vlans, vlan, node)
964 for (i = 0; i < vlan->n_ports; i++)
965 bridge_add_member(bst, vlan->ports[i].ifname);
966
967 vlist_flush(&bst->members);
968 bridge_check_retry(bst);
969 }
970
971 static void
972 bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
973 {
974 struct bridge_config *cfg = &bst->config;
975 struct blob_attr *cur;
976
977 /* defaults */
978 cfg->stp = false;
979 cfg->forward_delay = 2;
980 cfg->robustness = 2;
981 cfg->igmp_snoop = false;
982 cfg->multicast_querier = false;
983 cfg->query_interval = 12500;
984 cfg->query_response_interval = 1000;
985 cfg->last_member_interval = 100;
986 cfg->hash_max = 512;
987 cfg->bridge_empty = false;
988 cfg->priority = 0x7FFF;
989 cfg->vlan_filtering = false;
990
991 if ((cur = tb[BRIDGE_ATTR_STP]))
992 cfg->stp = blobmsg_get_bool(cur);
993
994 if ((cur = tb[BRIDGE_ATTR_FORWARD_DELAY]))
995 cfg->forward_delay = blobmsg_get_u32(cur);
996
997 if ((cur = tb[BRIDGE_ATTR_PRIORITY]))
998 cfg->priority = blobmsg_get_u32(cur);
999
1000 if ((cur = tb[BRIDGE_ATTR_IGMP_SNOOP]))
1001 cfg->multicast_querier = cfg->igmp_snoop = blobmsg_get_bool(cur);
1002
1003 if ((cur = tb[BRIDGE_ATTR_MULTICAST_QUERIER]))
1004 cfg->multicast_querier = blobmsg_get_bool(cur);
1005
1006 if ((cur = tb[BRIDGE_ATTR_HASH_MAX]))
1007 cfg->hash_max = blobmsg_get_u32(cur);
1008
1009 if ((cur = tb[BRIDGE_ATTR_ROBUSTNESS])) {
1010 cfg->robustness = blobmsg_get_u32(cur);
1011 cfg->flags |= BRIDGE_OPT_ROBUSTNESS;
1012 }
1013
1014 if ((cur = tb[BRIDGE_ATTR_QUERY_INTERVAL])) {
1015 cfg->query_interval = blobmsg_get_u32(cur);
1016 cfg->flags |= BRIDGE_OPT_QUERY_INTERVAL;
1017 }
1018
1019 if ((cur = tb[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL])) {
1020 cfg->query_response_interval = blobmsg_get_u32(cur);
1021 cfg->flags |= BRIDGE_OPT_QUERY_RESPONSE_INTERVAL;
1022 }
1023
1024 if ((cur = tb[BRIDGE_ATTR_LAST_MEMBER_INTERVAL])) {
1025 cfg->last_member_interval = blobmsg_get_u32(cur);
1026 cfg->flags |= BRIDGE_OPT_LAST_MEMBER_INTERVAL;
1027 }
1028
1029 if ((cur = tb[BRIDGE_ATTR_AGEING_TIME])) {
1030 cfg->ageing_time = blobmsg_get_u32(cur);
1031 cfg->flags |= BRIDGE_OPT_AGEING_TIME;
1032 }
1033
1034 if ((cur = tb[BRIDGE_ATTR_HELLO_TIME])) {
1035 cfg->hello_time = blobmsg_get_u32(cur);
1036 cfg->flags |= BRIDGE_OPT_HELLO_TIME;
1037 }
1038
1039 if ((cur = tb[BRIDGE_ATTR_MAX_AGE])) {
1040 cfg->max_age = blobmsg_get_u32(cur);
1041 cfg->flags |= BRIDGE_OPT_MAX_AGE;
1042 }
1043
1044 if ((cur = tb[BRIDGE_ATTR_BRIDGE_EMPTY]))
1045 cfg->bridge_empty = blobmsg_get_bool(cur);
1046
1047 if ((cur = tb[BRIDGE_ATTR_VLAN_FILTERING]))
1048 cfg->vlan_filtering = blobmsg_get_bool(cur);
1049 }
1050
1051 static enum dev_change_type
1052 bridge_reload(struct device *dev, struct blob_attr *attr)
1053 {
1054 struct blob_attr *tb_dev[__DEV_ATTR_MAX];
1055 struct blob_attr *tb_br[__BRIDGE_ATTR_MAX];
1056 enum dev_change_type ret = DEV_CONFIG_APPLIED;
1057 unsigned long diff;
1058 struct bridge_state *bst;
1059
1060 BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / 8);
1061 BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
1062
1063 bst = container_of(dev, struct bridge_state, dev);
1064 attr = blob_memdup(attr);
1065
1066 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, tb_dev,
1067 blob_data(attr), blob_len(attr));
1068 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, tb_br,
1069 blob_data(attr), blob_len(attr));
1070
1071 if (tb_dev[DEV_ATTR_MACADDR])
1072 bst->primary_port = NULL;
1073
1074 bst->ports = tb_br[BRIDGE_ATTR_PORTS];
1075 device_init_settings(dev, tb_dev);
1076 bridge_apply_settings(bst, tb_br);
1077
1078 if (bst->config_data) {
1079 struct blob_attr *otb_dev[__DEV_ATTR_MAX];
1080 struct blob_attr *otb_br[__BRIDGE_ATTR_MAX];
1081
1082 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
1083 blob_data(bst->config_data), blob_len(bst->config_data));
1084
1085 diff = 0;
1086 uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
1087 if (diff)
1088 ret = DEV_CONFIG_RESTART;
1089
1090 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, otb_br,
1091 blob_data(bst->config_data), blob_len(bst->config_data));
1092
1093 diff = 0;
1094 uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff);
1095 if (diff & ~(1 << BRIDGE_ATTR_PORTS))
1096 ret = DEV_CONFIG_RESTART;
1097
1098 bridge_config_init(dev);
1099 }
1100
1101 free(bst->config_data);
1102 bst->config_data = attr;
1103 return ret;
1104 }
1105
1106 static void
1107 bridge_retry_members(struct uloop_timeout *timeout)
1108 {
1109 struct bridge_state *bst = container_of(timeout, struct bridge_state, retry);
1110 struct bridge_member *bm;
1111
1112 bst->n_failed = 0;
1113 vlist_for_each_element(&bst->members, bm, node) {
1114 if (bm->present)
1115 continue;
1116
1117 if (!bm->dev.dev->present)
1118 continue;
1119
1120 bm->present = true;
1121 bst->n_present++;
1122 bridge_enable_member(bm);
1123 }
1124 }
1125
1126 static int bridge_avl_cmp_u16(const void *k1, const void *k2, void *ptr)
1127 {
1128 const uint16_t *i1 = k1, *i2 = k2;
1129
1130 return *i1 - *i2;
1131 }
1132
1133 static bool
1134 bridge_vlan_equal(struct bridge_vlan *v1, struct bridge_vlan *v2)
1135 {
1136 int i;
1137
1138 if (v1->n_ports != v2->n_ports)
1139 return false;
1140
1141 for (i = 0; i < v1->n_ports; i++)
1142 if (v1->ports[i].flags != v2->ports[i].flags ||
1143 strcmp(v1->ports[i].ifname, v2->ports[i].ifname) != 0)
1144 return false;
1145
1146 return true;
1147 }
1148
1149 static void
1150 bridge_vlan_free(struct bridge_vlan *vlan)
1151 {
1152 struct bridge_vlan_hotplug_port *port, *tmp;
1153
1154 if (!vlan)
1155 return;
1156
1157 list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list)
1158 free(port);
1159
1160 free(vlan);
1161 }
1162
1163 static void
1164 bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
1165 struct vlist_node *node_old)
1166 {
1167 struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
1168 struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
1169
1170 if (!bst->has_vlans || !bst->active)
1171 goto out;
1172
1173 if (node_old)
1174 vlan_old = container_of(node_old, struct bridge_vlan, node);
1175 if (node_new)
1176 vlan_new = container_of(node_new, struct bridge_vlan, node);
1177
1178 if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
1179 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1180 goto out;
1181 }
1182
1183 if (node_old)
1184 bridge_set_vlan_state(bst, vlan_old, false);
1185
1186 if (node_old && node_new)
1187 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1188
1189 if (node_new)
1190 vlan_new->pending = true;
1191
1192 bst->dev.config_pending = true;
1193
1194 out:
1195 bridge_vlan_free(vlan_old);
1196 }
1197
1198 static void
1199 bridge_dev_vlan_update(struct device *dev)
1200 {
1201 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
1202 struct bridge_vlan *vlan;
1203
1204 vlist_for_each_element(&dev->vlans, vlan, node) {
1205 if (!vlan->pending)
1206 continue;
1207
1208 vlan->pending = false;
1209 bridge_set_vlan_state(bst, vlan, true);
1210 }
1211 }
1212
1213 static struct device *
1214 bridge_create(const char *name, struct device_type *devtype,
1215 struct blob_attr *attr)
1216 {
1217 struct bridge_state *bst;
1218 struct device *dev = NULL;
1219
1220 bst = calloc(1, sizeof(*bst));
1221 if (!bst)
1222 return NULL;
1223
1224 dev = &bst->dev;
1225
1226 if (device_init(dev, devtype, name) < 0) {
1227 device_cleanup(dev);
1228 free(bst);
1229 return NULL;
1230 }
1231
1232 dev->config_pending = true;
1233 bst->retry.cb = bridge_retry_members;
1234
1235 bst->set_state = dev->set_state;
1236 dev->set_state = bridge_set_state;
1237
1238 dev->hotplug_ops = &bridge_ops;
1239
1240 vlist_init(&bst->members, avl_strcmp, bridge_member_update);
1241 bst->members.keep_old = true;
1242
1243 vlist_init(&dev->vlans, bridge_avl_cmp_u16, bridge_vlan_update);
1244
1245 bridge_reload(dev, attr);
1246
1247 return dev;
1248 }
1249
1250 static void __init bridge_device_type_init(void)
1251 {
1252 device_type_add(&bridge_device_type);
1253 }