bridge: make it more clear why the config was applied
[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, 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, 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, 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 int
398 bridge_enable_member(struct bridge_member *bm)
399 {
400 struct bridge_state *bst = bm->bst;
401 struct bridge_vlan *vlan;
402 struct device *dev;
403 int ret;
404
405 if (!bm->present)
406 return 0;
407
408 ret = bridge_enable_interface(bst);
409 if (ret)
410 goto error;
411
412 /* Disable IPv6 for bridge members */
413 if (!(bm->dev.dev->settings.flags & DEV_OPT_IPV6)) {
414 bm->dev.dev->settings.ipv6 = 0;
415 bm->dev.dev->settings.flags |= DEV_OPT_IPV6;
416 }
417
418 ret = device_claim(&bm->dev);
419 if (ret < 0)
420 goto error;
421
422 dev = bm->dev.dev;
423 if (dev->settings.auth && !dev->auth_status)
424 return -1;
425
426 if (bm->active)
427 return 0;
428
429 ret = system_bridge_addif(&bst->dev, bm->dev.dev);
430 if (ret < 0) {
431 D(DEVICE, "Bridge device %s could not be added\n", bm->dev.dev->ifname);
432 goto error;
433 }
434
435 bm->active = true;
436 if (bst->has_vlans) {
437 /* delete default VLAN 1 */
438 system_bridge_vlan(bm->dev.dev->ifname, 1, false, 0);
439
440 vlist_for_each_element(&bst->dev.vlans, vlan, node)
441 bridge_set_member_vlan(bm, vlan, true);
442 }
443
444 device_set_present(&bst->dev, true);
445 device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
446
447 return 0;
448
449 error:
450 bst->n_failed++;
451 bm->present = false;
452 bst->n_present--;
453 device_release(&bm->dev);
454
455 return ret;
456 }
457
458 static void
459 bridge_remove_member(struct bridge_member *bm)
460 {
461 struct bridge_state *bst = bm->bst;
462
463 if (!bm->present)
464 return;
465
466 if (bst->dev.active)
467 bridge_disable_member(bm, false);
468
469 bm->present = false;
470 bm->bst->n_present--;
471
472 if (bm == bst->primary_port)
473 bridge_reset_primary(bst);
474
475 if (bst->config.bridge_empty)
476 return;
477
478 bst->force_active = false;
479 if (bst->n_present == 0)
480 device_set_present(&bst->dev, false);
481 }
482
483 static void
484 bridge_free_member(struct bridge_member *bm)
485 {
486 struct bridge_state *bst = bm->bst;
487 struct device *dev = bm->dev.dev;
488 const char *ifname = dev->ifname;
489 struct bridge_vlan *vlan;
490
491 bridge_remove_member(bm);
492
493 restart:
494 vlist_for_each_element(&bst->dev.vlans, vlan, node) {
495 struct bridge_vlan_hotplug_port *port, *tmp;
496 bool free_port = false;
497
498 list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list) {
499 if (strcmp(port->port.ifname, ifname) != 0)
500 continue;
501
502 list_del(&port->list);
503 free(port);
504 free_port = true;
505 }
506
507 if (!free_port || !list_empty(&vlan->hotplug_ports) ||
508 vlan->n_ports || vlan->node.version != -1)
509 continue;
510
511 vlist_delete(&bst->dev.vlans, &vlan->node);
512 goto restart;
513 }
514
515 device_remove_user(&bm->dev);
516 uloop_timeout_cancel(&bm->check_timer);
517
518 /*
519 * When reloading the config and moving a device from one bridge to
520 * another, the other bridge may have tried to claim this device
521 * before it was removed here.
522 * Ensure that claiming the device is retried by toggling its present
523 * state
524 */
525 if (dev->present) {
526 device_set_present(dev, false);
527 device_set_present(dev, true);
528 }
529
530 free(bm);
531 }
532
533 static void
534 bridge_check_retry(struct bridge_state *bst)
535 {
536 if (!bst->n_failed)
537 return;
538
539 uloop_timeout_set(&bst->retry, 100);
540 }
541
542 static void
543 bridge_member_check_cb(struct uloop_timeout *t)
544 {
545 struct bridge_member *bm;
546 struct bridge_state *bst;
547
548 bm = container_of(t, struct bridge_member, check_timer);
549 bst = bm->bst;
550
551 if (system_bridge_vlan_check(&bst->dev, bm->dev.dev->ifname) <= 0)
552 return;
553
554 bridge_disable_member(bm, true);
555 bridge_enable_member(bm);
556 }
557
558 static void
559 bridge_member_cb(struct device_user *dep, enum device_event ev)
560 {
561 struct bridge_member *bm = container_of(dep, struct bridge_member, dev);
562 struct bridge_state *bst = bm->bst;
563 struct device *dev = dep->dev;
564
565 switch (ev) {
566 case DEV_EVENT_ADD:
567 assert(!bm->present);
568
569 bm->present = true;
570 bst->n_present++;
571
572 if (bst->n_present == 1)
573 device_set_present(&bst->dev, true);
574 fallthrough;
575 case DEV_EVENT_AUTH_UP:
576 if (!bst->dev.active)
577 break;
578
579 if (bridge_enable_member(bm))
580 break;
581
582 /*
583 * Adding a bridge member can overwrite the bridge mtu
584 * in the kernel, apply the bridge settings in case the
585 * bridge mtu is set
586 */
587 system_if_apply_settings(&bst->dev, &bst->dev.settings,
588 DEV_OPT_MTU | DEV_OPT_MTU6);
589 break;
590 case DEV_EVENT_LINK_UP:
591 if (bst->has_vlans)
592 uloop_timeout_set(&bm->check_timer, 1000);
593 break;
594 case DEV_EVENT_LINK_DOWN:
595 if (!dev->settings.auth)
596 break;
597
598 bridge_disable_member(bm, true);
599 break;
600 case DEV_EVENT_REMOVE:
601 if (dep->hotplug) {
602 vlist_delete(&bst->members, &bm->node);
603 return;
604 }
605
606 if (bm->present)
607 bridge_remove_member(bm);
608
609 break;
610 default:
611 return;
612 }
613 }
614
615 static int
616 bridge_set_down(struct bridge_state *bst)
617 {
618 struct bridge_member *bm;
619
620 bst->set_state(&bst->dev, false);
621
622 vlist_for_each_element(&bst->members, bm, node)
623 bridge_disable_member(bm, false);
624
625 bridge_disable_interface(bst);
626
627 return 0;
628 }
629
630 static int
631 bridge_set_up(struct bridge_state *bst)
632 {
633 struct bridge_member *bm;
634 int ret;
635
636 bst->has_vlans = !avl_is_empty(&bst->dev.vlans.avl);
637 if (!bst->n_present) {
638 if (!bst->force_active)
639 return -ENOENT;
640
641 ret = bridge_enable_interface(bst);
642 if (ret)
643 return ret;
644 }
645
646 bst->n_failed = 0;
647 vlist_for_each_element(&bst->members, bm, node)
648 bridge_enable_member(bm);
649 bridge_check_retry(bst);
650
651 if (!bst->force_active && !bst->n_present) {
652 /* initialization of all member interfaces failed */
653 bridge_disable_interface(bst);
654 device_set_present(&bst->dev, false);
655 return -ENOENT;
656 }
657
658 bridge_reset_primary(bst);
659 ret = bst->set_state(&bst->dev, true);
660 if (ret < 0)
661 bridge_set_down(bst);
662
663 return ret;
664 }
665
666 static int
667 bridge_set_state(struct device *dev, bool up)
668 {
669 struct bridge_state *bst;
670
671 bst = container_of(dev, struct bridge_state, dev);
672
673 if (up)
674 return bridge_set_up(bst);
675 else
676 return bridge_set_down(bst);
677 }
678
679 static struct bridge_member *
680 bridge_create_member(struct bridge_state *bst, const char *name,
681 struct device *dev, bool hotplug)
682 {
683 struct bridge_member *bm;
684
685 bm = calloc(1, sizeof(*bm) + strlen(name) + 1);
686 if (!bm)
687 return NULL;
688
689 bm->bst = bst;
690 bm->dev.cb = bridge_member_cb;
691 bm->dev.hotplug = hotplug;
692 bm->check_timer.cb = bridge_member_check_cb;
693 strcpy(bm->name, name);
694 bm->dev.dev = dev;
695 vlist_add(&bst->members, &bm->node, bm->name);
696 /*
697 * Need to look up the bridge member again as the above
698 * created pointer will be freed in case the bridge member
699 * already existed
700 */
701 bm = vlist_find(&bst->members, name, bm, node);
702 if (hotplug && bm)
703 bm->node.version = -1;
704
705 return bm;
706 }
707
708 static void
709 bridge_member_update(struct vlist_tree *tree, struct vlist_node *node_new,
710 struct vlist_node *node_old)
711 {
712 struct bridge_member *bm;
713 struct device *dev;
714
715 if (node_new) {
716 bm = container_of(node_new, struct bridge_member, node);
717
718 if (node_old) {
719 free(bm);
720 return;
721 }
722
723 dev = bm->dev.dev;
724 bm->dev.dev = NULL;
725 device_add_user(&bm->dev, dev);
726 }
727
728
729 if (node_old) {
730 bm = container_of(node_old, struct bridge_member, node);
731 bridge_free_member(bm);
732 }
733 }
734
735
736 static void
737 bridge_add_member(struct bridge_state *bst, const char *name)
738 {
739 struct device *dev;
740
741 dev = device_get(name, true);
742 if (!dev)
743 return;
744
745 bridge_create_member(bst, name, dev, false);
746 }
747
748 static struct bridge_vlan *
749 bridge_hotplug_get_vlan(struct bridge_state *bst, uint16_t vid)
750 {
751 struct bridge_vlan *vlan;
752
753 vlan = vlist_find(&bst->dev.vlans, &vid, vlan, node);
754 if (vlan)
755 return vlan;
756
757 vlan = calloc(1, sizeof(*vlan));
758 vlan->vid = vid;
759 vlan->local = true;
760 INIT_LIST_HEAD(&vlan->hotplug_ports);
761 vlist_add(&bst->dev.vlans, &vlan->node, &vlan->vid);
762 vlan->node.version = -1;
763
764 return vlan;
765 }
766
767 static struct bridge_vlan_hotplug_port *
768 bridge_hotplug_get_vlan_port(struct bridge_vlan *vlan, const char *ifname)
769 {
770 struct bridge_vlan_hotplug_port *port;
771
772 list_for_each_entry(port, &vlan->hotplug_ports, list)
773 if (!strcmp(port->port.ifname, ifname))
774 return port;
775
776 return NULL;
777 }
778
779 static void
780 bridge_hotplug_set_member_vlans(struct bridge_state *bst, struct blob_attr *vlans,
781 const char *ifname, struct bridge_member *bm, bool add)
782 {
783 struct bridge_vlan *vlan;
784 struct blob_attr *cur;
785 size_t rem;
786
787 if (!vlans)
788 return;
789
790 blobmsg_for_each_attr(cur, vlans, rem) {
791 struct bridge_vlan_hotplug_port *port;
792 uint16_t flags = BRVLAN_F_UNTAGGED;
793 char *name_buf;
794 unsigned int vid;
795 char *end;
796
797 if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
798 continue;
799
800 vid = strtoul(blobmsg_get_string(cur), &end, 0);
801 if (!vid || vid > 4095)
802 continue;
803
804 vlan = bridge_hotplug_get_vlan(bst, vid);
805 if (!vlan)
806 continue;
807
808 if (vlan->pending) {
809 vlan->pending = false;
810 bridge_set_vlan_state(bst, vlan, true);
811 }
812
813 if (end && *end) {
814 if (*end != ':')
815 continue;
816
817 for (end++; *end; end++) {
818 switch (*end) {
819 case 't':
820 flags &= ~BRVLAN_F_UNTAGGED;
821 break;
822 case '*':
823 flags |= BRVLAN_F_PVID;
824 break;
825 }
826 }
827 }
828
829 port = bridge_hotplug_get_vlan_port(vlan, ifname);
830 if (!add) {
831 if (!port)
832 continue;
833
834 __bridge_set_member_vlan(bm, vlan, &port->port, false);
835 list_del(&port->list);
836 free(port);
837 continue;
838 }
839
840 if (port) {
841 if (port->port.flags == flags)
842 continue;
843
844 __bridge_set_member_vlan(bm, vlan, &port->port, false);
845 port->port.flags = flags;
846 __bridge_set_member_vlan(bm, vlan, &port->port, true);
847 continue;
848 }
849
850 port = calloc_a(sizeof(*port), &name_buf, strlen(ifname) + 1);
851 if (!port)
852 continue;
853
854 port->port.flags = flags;
855 port->port.ifname = strcpy(name_buf, ifname);
856 list_add_tail(&port->list, &vlan->hotplug_ports);
857
858 if (!bm)
859 continue;
860
861 __bridge_set_member_vlan(bm, vlan, &port->port, true);
862 }
863 }
864
865 static int
866 bridge_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan)
867 {
868 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
869 struct bridge_member *bm;
870
871 bm = vlist_find(&bst->members, member->ifname, bm, node);
872 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, true);
873 if (!bm)
874 bridge_create_member(bst, member->ifname, member, true);
875
876 return 0;
877 }
878
879 static int
880 bridge_hotplug_del(struct device *dev, struct device *member, struct blob_attr *vlan)
881 {
882 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
883 struct bridge_member *bm;
884
885 bm = vlist_find(&bst->members, member->ifname, bm, node);
886 if (!bm)
887 return UBUS_STATUS_NOT_FOUND;
888
889 bridge_hotplug_set_member_vlans(bst, vlan, member->ifname, bm, false);
890 if (!bm->dev.hotplug)
891 return 0;
892
893 vlist_delete(&bst->members, &bm->node);
894 return 0;
895 }
896
897 static int
898 bridge_hotplug_prepare(struct device *dev, struct device **bridge_dev)
899 {
900 struct bridge_state *bst;
901
902 if (bridge_dev)
903 *bridge_dev = dev;
904
905 bst = container_of(dev, struct bridge_state, dev);
906 bst->force_active = true;
907 device_set_present(&bst->dev, true);
908
909 return 0;
910 }
911
912 static const struct device_hotplug_ops bridge_ops = {
913 .prepare = bridge_hotplug_prepare,
914 .add = bridge_hotplug_add,
915 .del = bridge_hotplug_del
916 };
917
918 static void
919 bridge_free(struct device *dev)
920 {
921 struct bridge_state *bst;
922
923 bst = container_of(dev, struct bridge_state, dev);
924 vlist_flush_all(&bst->members);
925 vlist_flush_all(&dev->vlans);
926 kvlist_free(&dev->vlan_aliases);
927 free(bst->config_data);
928 free(bst);
929 }
930
931 static void
932 bridge_dump_port(struct blob_buf *b, struct bridge_vlan_port *port)
933 {
934 bool tagged = !(port->flags & BRVLAN_F_UNTAGGED);
935 bool pvid = (port->flags & BRVLAN_F_PVID);
936
937 blobmsg_printf(b, NULL, "%s%s%s%s", port->ifname,
938 tagged || pvid ? ":" : "",
939 tagged ? "t" : "",
940 pvid ? "*" : "");
941 }
942
943 static void
944 bridge_dump_vlan(struct blob_buf *b, struct bridge_vlan *vlan)
945 {
946 struct bridge_vlan_hotplug_port *port;
947 void *c, *p;
948 int i;
949
950 c = blobmsg_open_table(b, NULL);
951
952 blobmsg_add_u32(b, "id", vlan->vid);
953 blobmsg_add_u8(b, "local", vlan->local);
954
955 p = blobmsg_open_array(b, "ports");
956
957 for (i = 0; i < vlan->n_ports; i++)
958 bridge_dump_port(b, &vlan->ports[i]);
959
960 list_for_each_entry(port, &vlan->hotplug_ports, list)
961 bridge_dump_port(b, &port->port);
962
963 blobmsg_close_array(b, p);
964
965 blobmsg_close_table(b, c);
966 }
967
968 static void
969 bridge_dump_info(struct device *dev, struct blob_buf *b)
970 {
971 struct bridge_state *bst;
972 struct bridge_member *bm;
973 struct bridge_vlan *vlan;
974 void *list;
975
976 bst = container_of(dev, struct bridge_state, dev);
977
978 system_if_dump_info(dev, b);
979 list = blobmsg_open_array(b, "bridge-members");
980
981 vlist_for_each_element(&bst->members, bm, node) {
982 if (bm->dev.dev->hidden)
983 continue;
984
985 blobmsg_add_string(b, NULL, bm->dev.dev->ifname);
986 }
987
988 blobmsg_close_array(b, list);
989
990 if (avl_is_empty(&dev->vlans.avl))
991 return;
992
993 list = blobmsg_open_array(b, "bridge-vlans");
994
995 vlist_for_each_element(&bst->dev.vlans, vlan, node)
996 bridge_dump_vlan(b, vlan);
997
998 blobmsg_close_array(b, list);
999 }
1000
1001 static void
1002 bridge_config_init(struct device *dev)
1003 {
1004 struct bridge_state *bst;
1005 struct bridge_vlan *vlan;
1006 struct blob_attr *cur;
1007 size_t rem;
1008 int i;
1009
1010 bst = container_of(dev, struct bridge_state, dev);
1011
1012 if (bst->config.bridge_empty) {
1013 bst->force_active = true;
1014 device_set_present(&bst->dev, true);
1015 }
1016
1017 bst->n_failed = 0;
1018 vlist_update(&bst->members);
1019 if (bst->ports) {
1020 blobmsg_for_each_attr(cur, bst->ports, rem) {
1021 bridge_add_member(bst, blobmsg_data(cur));
1022 }
1023 }
1024
1025 vlist_for_each_element(&bst->dev.vlans, vlan, node)
1026 for (i = 0; i < vlan->n_ports; i++)
1027 bridge_add_member(bst, vlan->ports[i].ifname);
1028
1029 vlist_flush(&bst->members);
1030 bridge_check_retry(bst);
1031 }
1032
1033 static void
1034 bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
1035 {
1036 struct bridge_config *cfg = &bst->config;
1037 struct blob_attr *cur;
1038
1039 /* defaults */
1040 memset(cfg, 0, sizeof(*cfg));
1041 cfg->stp = false;
1042 cfg->stp_kernel = false;
1043 cfg->robustness = 2;
1044 cfg->igmp_snoop = false;
1045 cfg->multicast_querier = false;
1046 cfg->query_interval = 12500;
1047 cfg->query_response_interval = 1000;
1048 cfg->last_member_interval = 100;
1049 cfg->hash_max = 512;
1050 cfg->bridge_empty = false;
1051 cfg->priority = 0x7FFF;
1052 cfg->vlan_filtering = false;
1053
1054 cfg->forward_delay = 8;
1055 cfg->max_age = 10;
1056 cfg->hello_time = 1;
1057
1058 if ((cur = tb[BRIDGE_ATTR_STP]))
1059 cfg->stp = blobmsg_get_bool(cur);
1060
1061 if ((cur = tb[BRIDGE_ATTR_STP_KERNEL]))
1062 cfg->stp = blobmsg_get_bool(cur);
1063
1064 if ((cur = tb[BRIDGE_ATTR_STP_PROTO]))
1065 cfg->stp_proto = blobmsg_get_string(cur);
1066
1067 if ((cur = tb[BRIDGE_ATTR_FORWARD_DELAY]))
1068 cfg->forward_delay = blobmsg_get_u32(cur);
1069
1070 if ((cur = tb[BRIDGE_ATTR_PRIORITY]))
1071 cfg->priority = blobmsg_get_u32(cur);
1072
1073 if ((cur = tb[BRIDGE_ATTR_IGMP_SNOOP]))
1074 cfg->multicast_querier = cfg->igmp_snoop = blobmsg_get_bool(cur);
1075
1076 if ((cur = tb[BRIDGE_ATTR_MULTICAST_QUERIER]))
1077 cfg->multicast_querier = blobmsg_get_bool(cur);
1078
1079 if ((cur = tb[BRIDGE_ATTR_HASH_MAX]))
1080 cfg->hash_max = blobmsg_get_u32(cur);
1081
1082 if ((cur = tb[BRIDGE_ATTR_ROBUSTNESS])) {
1083 cfg->robustness = blobmsg_get_u32(cur);
1084 cfg->flags |= BRIDGE_OPT_ROBUSTNESS;
1085 }
1086
1087 if ((cur = tb[BRIDGE_ATTR_QUERY_INTERVAL])) {
1088 cfg->query_interval = blobmsg_get_u32(cur);
1089 cfg->flags |= BRIDGE_OPT_QUERY_INTERVAL;
1090 }
1091
1092 if ((cur = tb[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL])) {
1093 cfg->query_response_interval = blobmsg_get_u32(cur);
1094 cfg->flags |= BRIDGE_OPT_QUERY_RESPONSE_INTERVAL;
1095 }
1096
1097 if ((cur = tb[BRIDGE_ATTR_LAST_MEMBER_INTERVAL])) {
1098 cfg->last_member_interval = blobmsg_get_u32(cur);
1099 cfg->flags |= BRIDGE_OPT_LAST_MEMBER_INTERVAL;
1100 }
1101
1102 if ((cur = tb[BRIDGE_ATTR_AGEING_TIME])) {
1103 cfg->ageing_time = blobmsg_get_u32(cur);
1104 cfg->flags |= BRIDGE_OPT_AGEING_TIME;
1105 }
1106
1107 if ((cur = tb[BRIDGE_ATTR_HELLO_TIME]))
1108 cfg->hello_time = blobmsg_get_u32(cur);
1109
1110 if ((cur = tb[BRIDGE_ATTR_MAX_AGE]))
1111 cfg->max_age = blobmsg_get_u32(cur);
1112
1113 if ((cur = tb[BRIDGE_ATTR_BRIDGE_EMPTY]))
1114 cfg->bridge_empty = blobmsg_get_bool(cur);
1115
1116 if ((cur = tb[BRIDGE_ATTR_VLAN_FILTERING]))
1117 cfg->vlan_filtering = blobmsg_get_bool(cur);
1118 }
1119
1120 static enum dev_change_type
1121 bridge_reload(struct device *dev, struct blob_attr *attr)
1122 {
1123 struct blob_attr *tb_dev[__DEV_ATTR_MAX];
1124 struct blob_attr *tb_br[__BRIDGE_ATTR_MAX];
1125 enum dev_change_type ret = DEV_CONFIG_APPLIED;
1126 unsigned long diff;
1127 struct bridge_state *bst;
1128
1129 BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / 8);
1130 BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
1131
1132 bst = container_of(dev, struct bridge_state, dev);
1133 attr = blob_memdup(attr);
1134
1135 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, tb_dev,
1136 blob_data(attr), blob_len(attr));
1137 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, tb_br,
1138 blob_data(attr), blob_len(attr));
1139
1140 if (tb_dev[DEV_ATTR_MACADDR])
1141 bst->primary_port = NULL;
1142
1143 bst->ports = tb_br[BRIDGE_ATTR_PORTS];
1144 device_init_settings(dev, tb_dev);
1145 bridge_apply_settings(bst, tb_br);
1146
1147 if (bst->config_data) {
1148 struct blob_attr *otb_dev[__DEV_ATTR_MAX];
1149 struct blob_attr *otb_br[__BRIDGE_ATTR_MAX];
1150
1151 blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
1152 blob_data(bst->config_data), blob_len(bst->config_data));
1153
1154 diff = 0;
1155 uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
1156 if (diff) {
1157 ret = DEV_CONFIG_RESTART;
1158 D(DEVICE, "Bridge %s device attributes have changed, diff=0x%lx\n",
1159 dev->ifname, diff);
1160 }
1161
1162 blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, otb_br,
1163 blob_data(bst->config_data), blob_len(bst->config_data));
1164
1165 diff = 0;
1166 uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff);
1167 if (diff & ~(1 << BRIDGE_ATTR_PORTS)) {
1168 ret = DEV_CONFIG_RESTART;
1169 D(DEVICE, "Bridge %s attributes have changed, diff=0x%lx\n",
1170 dev->ifname, diff);
1171 }
1172
1173 bridge_config_init(dev);
1174 }
1175
1176 free(bst->config_data);
1177 bst->config_data = attr;
1178 return ret;
1179 }
1180
1181 static void
1182 bridge_retry_members(struct uloop_timeout *timeout)
1183 {
1184 struct bridge_state *bst = container_of(timeout, struct bridge_state, retry);
1185 struct bridge_member *bm;
1186
1187 bst->n_failed = 0;
1188 vlist_for_each_element(&bst->members, bm, node) {
1189 if (bm->present)
1190 continue;
1191
1192 if (!bm->dev.dev->present)
1193 continue;
1194
1195 bm->present = true;
1196 bst->n_present++;
1197 bridge_enable_member(bm);
1198 }
1199 }
1200
1201 static int bridge_avl_cmp_u16(const void *k1, const void *k2, void *ptr)
1202 {
1203 const uint16_t *i1 = k1, *i2 = k2;
1204
1205 return *i1 - *i2;
1206 }
1207
1208 static bool
1209 bridge_vlan_equal(struct bridge_vlan *v1, struct bridge_vlan *v2)
1210 {
1211 int i;
1212
1213 if (v1->n_ports != v2->n_ports)
1214 return false;
1215
1216 for (i = 0; i < v1->n_ports; i++)
1217 if (v1->ports[i].flags != v2->ports[i].flags ||
1218 strcmp(v1->ports[i].ifname, v2->ports[i].ifname) != 0)
1219 return false;
1220
1221 return true;
1222 }
1223
1224 static void
1225 bridge_vlan_free(struct bridge_vlan *vlan)
1226 {
1227 struct bridge_vlan_hotplug_port *port, *tmp;
1228
1229 if (!vlan)
1230 return;
1231
1232 list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list)
1233 free(port);
1234
1235 free(vlan);
1236 }
1237
1238 static void
1239 bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
1240 struct vlist_node *node_old)
1241 {
1242 struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
1243 struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
1244
1245 if (!bst->has_vlans || !bst->active)
1246 goto out;
1247
1248 if (node_old)
1249 vlan_old = container_of(node_old, struct bridge_vlan, node);
1250 if (node_new)
1251 vlan_new = container_of(node_new, struct bridge_vlan, node);
1252
1253 if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
1254 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1255 goto out;
1256 }
1257
1258 if (node_old)
1259 bridge_set_vlan_state(bst, vlan_old, false);
1260
1261 if (node_old && node_new)
1262 list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
1263
1264 if (node_new)
1265 vlan_new->pending = true;
1266
1267 bst->dev.config_pending = true;
1268
1269 out:
1270 bridge_vlan_free(vlan_old);
1271 }
1272
1273 static void
1274 bridge_dev_vlan_update(struct device *dev)
1275 {
1276 struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
1277 struct bridge_vlan *vlan;
1278
1279 vlist_for_each_element(&dev->vlans, vlan, node) {
1280 if (!vlan->pending)
1281 continue;
1282
1283 vlan->pending = false;
1284 bridge_set_vlan_state(bst, vlan, true);
1285 }
1286 }
1287
1288 static struct device *
1289 bridge_create(const char *name, struct device_type *devtype,
1290 struct blob_attr *attr)
1291 {
1292 struct bridge_state *bst;
1293 struct device *dev = NULL;
1294
1295 bst = calloc(1, sizeof(*bst));
1296 if (!bst)
1297 return NULL;
1298
1299 dev = &bst->dev;
1300
1301 if (device_init(dev, devtype, name) < 0) {
1302 device_cleanup(dev);
1303 free(bst);
1304 return NULL;
1305 }
1306
1307 dev->config_pending = true;
1308 bst->retry.cb = bridge_retry_members;
1309
1310 bst->set_state = dev->set_state;
1311 dev->set_state = bridge_set_state;
1312
1313 dev->hotplug_ops = &bridge_ops;
1314
1315 vlist_init(&bst->members, avl_strcmp, bridge_member_update);
1316 bst->members.keep_old = true;
1317
1318 vlist_init(&dev->vlans, bridge_avl_cmp_u16, bridge_vlan_update);
1319
1320 bridge_reload(dev, attr);
1321
1322 return dev;
1323 }
1324
1325 static void __init bridge_device_type_init(void)
1326 {
1327 device_type_add(&bridge_device_type);
1328 }