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