bridge.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  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. #include "netifd.h"
  20. #include "device.h"
  21. #include "interface.h"
  22. #include "system.h"
  23. enum {
  24. BRIDGE_ATTR_IFNAME,
  25. BRIDGE_ATTR_STP,
  26. BRIDGE_ATTR_FORWARD_DELAY,
  27. BRIDGE_ATTR_PRIORITY,
  28. BRIDGE_ATTR_IGMP_SNOOP,
  29. BRIDGE_ATTR_AGEING_TIME,
  30. BRIDGE_ATTR_HELLO_TIME,
  31. BRIDGE_ATTR_MAX_AGE,
  32. BRIDGE_ATTR_BRIDGE_EMPTY,
  33. BRIDGE_ATTR_MULTICAST_QUERIER,
  34. BRIDGE_ATTR_HASH_MAX,
  35. BRIDGE_ATTR_ROBUSTNESS,
  36. BRIDGE_ATTR_QUERY_INTERVAL,
  37. BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL,
  38. BRIDGE_ATTR_LAST_MEMBER_INTERVAL,
  39. BRIDGE_ATTR_VLAN_FILTERING,
  40. BRIDGE_ATTR_HAS_VLANS,
  41. __BRIDGE_ATTR_MAX
  42. };
  43. static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = {
  44. [BRIDGE_ATTR_IFNAME] = { "ifname", BLOBMSG_TYPE_ARRAY },
  45. [BRIDGE_ATTR_STP] = { "stp", BLOBMSG_TYPE_BOOL },
  46. [BRIDGE_ATTR_FORWARD_DELAY] = { "forward_delay", BLOBMSG_TYPE_INT32 },
  47. [BRIDGE_ATTR_PRIORITY] = { "priority", BLOBMSG_TYPE_INT32 },
  48. [BRIDGE_ATTR_AGEING_TIME] = { "ageing_time", BLOBMSG_TYPE_INT32 },
  49. [BRIDGE_ATTR_HELLO_TIME] = { "hello_time", BLOBMSG_TYPE_INT32 },
  50. [BRIDGE_ATTR_MAX_AGE] = { "max_age", BLOBMSG_TYPE_INT32 },
  51. [BRIDGE_ATTR_IGMP_SNOOP] = { "igmp_snooping", BLOBMSG_TYPE_BOOL },
  52. [BRIDGE_ATTR_BRIDGE_EMPTY] = { "bridge_empty", BLOBMSG_TYPE_BOOL },
  53. [BRIDGE_ATTR_MULTICAST_QUERIER] = { "multicast_querier", BLOBMSG_TYPE_BOOL },
  54. [BRIDGE_ATTR_HASH_MAX] = { "hash_max", BLOBMSG_TYPE_INT32 },
  55. [BRIDGE_ATTR_ROBUSTNESS] = { "robustness", BLOBMSG_TYPE_INT32 },
  56. [BRIDGE_ATTR_QUERY_INTERVAL] = { "query_interval", BLOBMSG_TYPE_INT32 },
  57. [BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL] = { "query_response_interval", BLOBMSG_TYPE_INT32 },
  58. [BRIDGE_ATTR_LAST_MEMBER_INTERVAL] = { "last_member_interval", BLOBMSG_TYPE_INT32 },
  59. [BRIDGE_ATTR_VLAN_FILTERING] = { "vlan_filtering", BLOBMSG_TYPE_BOOL },
  60. [BRIDGE_ATTR_HAS_VLANS] = { "__has_vlans", BLOBMSG_TYPE_BOOL }, /* internal */
  61. };
  62. static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = {
  63. [BRIDGE_ATTR_IFNAME] = { .type = BLOBMSG_TYPE_STRING },
  64. };
  65. static const struct uci_blob_param_list bridge_attr_list = {
  66. .n_params = __BRIDGE_ATTR_MAX,
  67. .params = bridge_attrs,
  68. .info = bridge_attr_info,
  69. .n_next = 1,
  70. .next = { &device_attr_list },
  71. };
  72. static struct device *bridge_create(const char *name, struct device_type *devtype,
  73. struct blob_attr *attr);
  74. static void bridge_config_init(struct device *dev);
  75. static void bridge_free(struct device *dev);
  76. static void bridge_dump_info(struct device *dev, struct blob_buf *b);
  77. static enum dev_change_type
  78. bridge_reload(struct device *dev, struct blob_attr *attr);
  79. static struct device_type bridge_device_type = {
  80. .name = "bridge",
  81. .config_params = &bridge_attr_list,
  82. .bridge_capability = true,
  83. .name_prefix = "br",
  84. .create = bridge_create,
  85. .config_init = bridge_config_init,
  86. .reload = bridge_reload,
  87. .free = bridge_free,
  88. .dump_info = bridge_dump_info,
  89. };
  90. struct bridge_state {
  91. struct device dev;
  92. device_state_cb set_state;
  93. struct blob_attr *config_data;
  94. struct bridge_config config;
  95. struct blob_attr *ifnames;
  96. bool active;
  97. bool force_active;
  98. bool has_vlans;
  99. struct uloop_timeout retry;
  100. struct bridge_member *primary_port;
  101. struct vlist_tree members;
  102. int n_present;
  103. int n_failed;
  104. };
  105. struct bridge_member {
  106. struct vlist_node node;
  107. struct bridge_state *bst;
  108. struct device_user dev;
  109. uint16_t pvid;
  110. bool present;
  111. char name[];
  112. };
  113. struct bridge_vlan_hotplug_port {
  114. struct list_head list;
  115. struct bridge_vlan_port port;
  116. };
  117. static void
  118. bridge_reset_primary(struct bridge_state *bst)
  119. {
  120. struct bridge_member *bm;
  121. if (!bst->primary_port &&
  122. (bst->dev.settings.flags & DEV_OPT_MACADDR))
  123. return;
  124. bst->primary_port = NULL;
  125. bst->dev.settings.flags &= ~DEV_OPT_MACADDR;
  126. vlist_for_each_element(&bst->members, bm, node) {
  127. uint8_t *macaddr;
  128. if (!bm->present)
  129. continue;
  130. bst->primary_port = bm;
  131. if (bm->dev.dev->settings.flags & DEV_OPT_MACADDR)
  132. macaddr = bm->dev.dev->settings.macaddr;
  133. else
  134. macaddr = bm->dev.dev->orig_settings.macaddr;
  135. memcpy(bst->dev.settings.macaddr, macaddr, 6);
  136. bst->dev.settings.flags |= DEV_OPT_MACADDR;
  137. return;
  138. }
  139. }
  140. static struct bridge_vlan_port *
  141. bridge_find_vlan_member_port(struct bridge_member *bm, struct bridge_vlan *vlan)
  142. {
  143. struct bridge_vlan_hotplug_port *port;
  144. const char *ifname = bm->dev.dev->ifname;
  145. int i;
  146. for (i = 0; i < vlan->n_ports; i++) {
  147. if (strcmp(vlan->ports[i].ifname, ifname) != 0)
  148. continue;
  149. return &vlan->ports[i];
  150. }
  151. list_for_each_entry(port, &vlan->hotplug_ports, list) {
  152. if (strcmp(port->port.ifname, ifname) != 0)
  153. continue;
  154. return &port->port;
  155. }
  156. return NULL;
  157. }
  158. static bool
  159. bridge_member_vlan_is_pvid(struct bridge_member *bm, struct bridge_vlan_port *port)
  160. {
  161. return (!bm->pvid && (port->flags & BRVLAN_F_UNTAGGED)) ||
  162. (port->flags & BRVLAN_F_PVID);
  163. }
  164. static void
  165. __bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan,
  166. struct bridge_vlan_port *port, bool add)
  167. {
  168. uint16_t flags;
  169. flags = port->flags;
  170. if (bm->pvid == vlan->vid)
  171. flags |= BRVLAN_F_PVID;
  172. system_bridge_vlan(port->ifname, vlan->vid, add, flags);
  173. }
  174. static void
  175. bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan, bool add)
  176. {
  177. struct bridge_vlan_port *port;
  178. if (!bm->present)
  179. return;
  180. port = bridge_find_vlan_member_port(bm, vlan);
  181. if (!port)
  182. return;
  183. if (bridge_member_vlan_is_pvid(bm, port))
  184. bm->pvid = vlan->vid;
  185. __bridge_set_member_vlan(bm, vlan, port, add);
  186. }
  187. static void
  188. bridge_set_local_vlan(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
  189. {
  190. if (!vlan->local && add)
  191. return;
  192. system_bridge_vlan(bst->dev.ifname, vlan->vid, add, BRVLAN_F_SELF);
  193. }
  194. static void
  195. bridge_set_local_vlans(struct bridge_state *bst, bool add)
  196. {
  197. struct bridge_vlan *vlan;
  198. vlist_for_each_element(&bst->dev.vlans, vlan, node)
  199. bridge_set_local_vlan(bst, vlan, add);
  200. }
  201. static struct bridge_vlan *
  202. bridge_recalc_member_pvid(struct bridge_member *bm)
  203. {
  204. struct bridge_state *bst = bm->bst;
  205. struct bridge_vlan_port *port;
  206. struct bridge_vlan *vlan, *ret = NULL;
  207. vlist_for_each_element(&bst->dev.vlans, vlan, node) {
  208. port = bridge_find_vlan_member_port(bm, vlan);
  209. if (!port)
  210. continue;
  211. if (!bridge_member_vlan_is_pvid(bm, port))
  212. continue;
  213. ret = vlan;
  214. if (port->flags & BRVLAN_F_PVID)
  215. break;
  216. }
  217. return ret;
  218. }
  219. static void
  220. bridge_set_vlan_state(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
  221. {
  222. struct bridge_member *bm;
  223. struct bridge_vlan *vlan2;
  224. bridge_set_local_vlan(bst, vlan, add);
  225. vlist_for_each_element(&bst->members, bm, node) {
  226. struct bridge_vlan_port *port;
  227. int new_pvid = -1;
  228. port = bridge_find_vlan_member_port(bm, vlan);
  229. if (!port)
  230. continue;
  231. if (add) {
  232. if (bridge_member_vlan_is_pvid(bm, port))
  233. bm->pvid = vlan->vid;
  234. } else if (bm->pvid == vlan->vid) {
  235. vlan2 = bridge_recalc_member_pvid(bm);
  236. if (vlan2 && vlan2->vid != vlan->vid) {
  237. bridge_set_member_vlan(bm, vlan2, false);
  238. bridge_set_member_vlan(bm, vlan2, true);
  239. }
  240. new_pvid = vlan2 ? vlan2->vid : 0;
  241. }
  242. if (!bm->present)
  243. continue;
  244. __bridge_set_member_vlan(bm, vlan, port, add);
  245. if (new_pvid >= 0)
  246. bm->pvid = new_pvid;
  247. }
  248. }
  249. static int
  250. bridge_disable_member(struct bridge_member *bm)
  251. {
  252. struct bridge_state *bst = bm->bst;
  253. struct bridge_vlan *vlan;
  254. if (!bm->present)
  255. return 0;
  256. vlist_for_each_element(&bst->dev.vlans, vlan, node)
  257. bridge_set_member_vlan(bm, vlan, false);
  258. system_bridge_delif(&bst->dev, bm->dev.dev);
  259. device_release(&bm->dev);
  260. device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
  261. return 0;
  262. }
  263. static int
  264. bridge_enable_interface(struct bridge_state *bst)
  265. {
  266. int ret;
  267. if (bst->active)
  268. return 0;
  269. ret = system_bridge_addbr(&bst->dev, &bst->config);
  270. if (ret < 0)
  271. return ret;
  272. if (bst->has_vlans) {
  273. /* delete default VLAN 1 */
  274. system_bridge_vlan(bst->dev.ifname, 1, false, BRVLAN_F_SELF);
  275. bridge_set_local_vlans(bst, true);
  276. }
  277. bst->active = true;
  278. return 0;
  279. }
  280. static void
  281. bridge_disable_interface(struct bridge_state *bst)
  282. {
  283. if (!bst->active)
  284. return;
  285. system_bridge_delbr(&bst->dev);
  286. bst->active = false;
  287. }
  288. static int
  289. bridge_enable_member(struct bridge_member *bm)
  290. {
  291. struct bridge_state *bst = bm->bst;
  292. struct bridge_vlan *vlan;
  293. int ret;
  294. if (!bm->present)
  295. return 0;
  296. ret = bridge_enable_interface(bst);
  297. if (ret)
  298. goto error;
  299. /* Disable IPv6 for bridge members */
  300. if (!(bm->dev.dev->settings.flags & DEV_OPT_IPV6)) {
  301. bm->dev.dev->settings.ipv6 = 0;
  302. bm->dev.dev->settings.flags |= DEV_OPT_IPV6;
  303. }
  304. ret = device_claim(&bm->dev);
  305. if (ret < 0)
  306. goto error;
  307. ret = system_bridge_addif(&bst->dev, bm->dev.dev);
  308. if (ret < 0) {
  309. D(DEVICE, "Bridge device %s could not be added\n", bm->dev.dev->ifname);
  310. goto error;
  311. }
  312. if (bst->has_vlans) {
  313. /* delete default VLAN 1 */
  314. system_bridge_vlan(bm->dev.dev->ifname, 1, false, 0);
  315. vlist_for_each_element(&bst->dev.vlans, vlan, node)
  316. bridge_set_member_vlan(bm, vlan, true);
  317. }
  318. device_set_present(&bst->dev, true);
  319. device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
  320. return 0;
  321. error:
  322. bst->n_failed++;
  323. bm->present = false;
  324. bst->n_present--;
  325. device_release(&bm->dev);
  326. return ret;
  327. }
  328. static void
  329. bridge_remove_member(struct bridge_member *bm)
  330. {
  331. struct bridge_state *bst = bm->bst;
  332. if (!bm->present)
  333. return;
  334. if (bst->dev.active)
  335. bridge_disable_member(bm);
  336. bm->present = false;
  337. bm->bst->n_present--;
  338. if (bm == bst->primary_port)
  339. bridge_reset_primary(bst);
  340. if (bst->config.bridge_empty)
  341. return;
  342. bst->force_active = false;
  343. if (bst->n_present == 0)
  344. device_set_present(&bst->dev, false);
  345. }
  346. static void
  347. bridge_free_member(struct bridge_member *bm)
  348. {
  349. struct bridge_state *bst = bm->bst;
  350. struct device *dev = bm->dev.dev;
  351. const char *ifname = dev->ifname;
  352. struct bridge_vlan *vlan;
  353. bridge_remove_member(bm);
  354. vlist_for_each_element(&bst->dev.vlans, vlan, node) {
  355. struct bridge_vlan_hotplug_port *port, *tmp;
  356. list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list) {
  357. if (strcmp(port->port.ifname, ifname) != 0)
  358. continue;
  359. list_del(&port->list);
  360. free(port);
  361. }
  362. }
  363. device_lock();
  364. device_remove_user(&bm->dev);
  365. /*
  366. * When reloading the config and moving a device from one bridge to
  367. * another, the other bridge may have tried to claim this device
  368. * before it was removed here.
  369. * Ensure that claiming the device is retried by toggling its present
  370. * state
  371. */
  372. if (dev->present) {
  373. device_set_present(dev, false);
  374. device_set_present(dev, true);
  375. }
  376. device_unlock();
  377. free(bm);
  378. }
  379. static void
  380. bridge_check_retry(struct bridge_state *bst)
  381. {
  382. if (!bst->n_failed)
  383. return;
  384. uloop_timeout_set(&bst->retry, 100);
  385. }
  386. static void
  387. bridge_member_cb(struct device_user *dev, enum device_event ev)
  388. {
  389. struct bridge_member *bm = container_of(dev, struct bridge_member, dev);
  390. struct bridge_state *bst = bm->bst;
  391. switch (ev) {
  392. case DEV_EVENT_ADD:
  393. assert(!bm->present);
  394. bm->present = true;
  395. bst->n_present++;
  396. if (bst->n_present == 1)
  397. device_set_present(&bst->dev, true);
  398. if (bst->dev.active && !bridge_enable_member(bm)) {
  399. /*
  400. * Adding a bridge member can overwrite the bridge mtu
  401. * in the kernel, apply the bridge settings in case the
  402. * bridge mtu is set
  403. */
  404. system_if_apply_settings(&bst->dev, &bst->dev.settings,
  405. DEV_OPT_MTU | DEV_OPT_MTU6);
  406. }
  407. break;
  408. case DEV_EVENT_REMOVE:
  409. if (dev->hotplug) {
  410. vlist_delete(&bst->members, &bm->node);
  411. return;
  412. }
  413. if (bm->present)
  414. bridge_remove_member(bm);
  415. break;
  416. default:
  417. return;
  418. }
  419. }
  420. static int
  421. bridge_set_down(struct bridge_state *bst)
  422. {
  423. struct bridge_member *bm;
  424. bst->set_state(&bst->dev, false);
  425. vlist_for_each_element(&bst->members, bm, node)
  426. bridge_disable_member(bm);
  427. bridge_disable_interface(bst);
  428. return 0;
  429. }
  430. static int
  431. bridge_set_up(struct bridge_state *bst)
  432. {
  433. struct bridge_member *bm;
  434. int ret;
  435. bst->has_vlans = !avl_is_empty(&bst->dev.vlans.avl);
  436. if (!bst->n_present) {
  437. if (!bst->force_active)
  438. return -ENOENT;
  439. ret = bridge_enable_interface(bst);
  440. if (ret)
  441. return ret;
  442. }
  443. bst->n_failed = 0;
  444. vlist_for_each_element(&bst->members, bm, node)
  445. bridge_enable_member(bm);
  446. bridge_check_retry(bst);
  447. if (!bst->force_active && !bst->n_present) {
  448. /* initialization of all member interfaces failed */
  449. bridge_disable_interface(bst);
  450. device_set_present(&bst->dev, false);
  451. return -ENOENT;
  452. }
  453. bridge_reset_primary(bst);
  454. ret = bst->set_state(&bst->dev, true);
  455. if (ret < 0)
  456. bridge_set_down(bst);
  457. return ret;
  458. }
  459. static int
  460. bridge_set_state(struct device *dev, bool up)
  461. {
  462. struct bridge_state *bst;
  463. bst = container_of(dev, struct bridge_state, dev);
  464. if (up)
  465. return bridge_set_up(bst);
  466. else
  467. return bridge_set_down(bst);
  468. }
  469. static struct bridge_member *
  470. bridge_create_member(struct bridge_state *bst, const char *name,
  471. struct device *dev, bool hotplug)
  472. {
  473. struct bridge_member *bm;
  474. bm = calloc(1, sizeof(*bm) + strlen(name) + 1);
  475. if (!bm)
  476. return NULL;
  477. bm->bst = bst;
  478. bm->dev.cb = bridge_member_cb;
  479. bm->dev.hotplug = hotplug;
  480. strcpy(bm->name, name);
  481. bm->dev.dev = dev;
  482. vlist_add(&bst->members, &bm->node, bm->name);
  483. /*
  484. * Need to look up the bridge member again as the above
  485. * created pointer will be freed in case the bridge member
  486. * already existed
  487. */
  488. bm = vlist_find(&bst->members, name, bm, node);
  489. if (hotplug && bm)
  490. bm->node.version = -1;
  491. return bm;
  492. }
  493. static void
  494. bridge_member_update(struct vlist_tree *tree, struct vlist_node *node_new,
  495. struct vlist_node *node_old)
  496. {
  497. struct bridge_member *bm;
  498. struct device *dev;
  499. if (node_new) {
  500. bm = container_of(node_new, struct bridge_member, node);
  501. if (node_old) {
  502. free(bm);
  503. return;
  504. }
  505. dev = bm->dev.dev;
  506. bm->dev.dev = NULL;
  507. device_add_user(&bm->dev, dev);
  508. }
  509. if (node_old) {
  510. bm = container_of(node_old, struct bridge_member, node);
  511. bridge_free_member(bm);
  512. }
  513. }
  514. static void
  515. bridge_add_member(struct bridge_state *bst, const char *name)
  516. {
  517. struct device *dev;
  518. dev = device_get(name, true);
  519. if (!dev)
  520. return;
  521. bridge_create_member(bst, name, dev, false);
  522. }
  523. static void
  524. bridge_hotplug_create_member_vlans(struct bridge_state *bst, struct blob_attr *vlans, const char *ifname)
  525. {
  526. struct bridge_vlan *vlan;
  527. struct blob_attr *cur;
  528. int rem;
  529. if (!vlans)
  530. return;
  531. blobmsg_for_each_attr(cur, vlans, rem) {
  532. struct bridge_vlan_hotplug_port *port;
  533. uint16_t flags = BRVLAN_F_UNTAGGED;
  534. char *name_buf;
  535. unsigned int vid;
  536. char *end;
  537. if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
  538. continue;
  539. vid = strtoul(blobmsg_get_string(cur), &end, 0);
  540. if (!vid || vid > 4095)
  541. continue;
  542. vlan = vlist_find(&bst->dev.vlans, &vid, vlan, node);
  543. if (!vlan)
  544. continue;
  545. if (end && *end) {
  546. if (*end != ':')
  547. continue;
  548. for (end++; *end; end++) {
  549. switch (*end) {
  550. case 't':
  551. flags &= ~BRVLAN_F_UNTAGGED;
  552. break;
  553. case '*':
  554. flags |= BRVLAN_F_PVID;
  555. break;
  556. }
  557. }
  558. }
  559. port = calloc_a(sizeof(*port), &name_buf, strlen(ifname) + 1);
  560. if (!port)
  561. continue;
  562. port->port.flags = flags;
  563. port->port.ifname = strcpy(name_buf, ifname);
  564. list_add_tail(&port->list, &vlan->hotplug_ports);
  565. }
  566. }
  567. static int
  568. bridge_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan)
  569. {
  570. struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
  571. bridge_hotplug_create_member_vlans(bst, vlan, member->ifname);
  572. bridge_create_member(bst, member->ifname, member, true);
  573. return 0;
  574. }
  575. static int
  576. bridge_hotplug_del(struct device *dev, struct device *member)
  577. {
  578. struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
  579. struct bridge_member *bm;
  580. bm = vlist_find(&bst->members, member->ifname, bm, node);
  581. if (!bm)
  582. return UBUS_STATUS_NOT_FOUND;
  583. vlist_delete(&bst->members, &bm->node);
  584. return 0;
  585. }
  586. static int
  587. bridge_hotplug_prepare(struct device *dev, struct device **bridge_dev)
  588. {
  589. struct bridge_state *bst;
  590. if (bridge_dev)
  591. *bridge_dev = dev;
  592. bst = container_of(dev, struct bridge_state, dev);
  593. bst->force_active = true;
  594. device_set_present(&bst->dev, true);
  595. return 0;
  596. }
  597. static const struct device_hotplug_ops bridge_ops = {
  598. .prepare = bridge_hotplug_prepare,
  599. .add = bridge_hotplug_add,
  600. .del = bridge_hotplug_del
  601. };
  602. static void
  603. bridge_free(struct device *dev)
  604. {
  605. struct bridge_state *bst;
  606. bst = container_of(dev, struct bridge_state, dev);
  607. vlist_flush_all(&bst->members);
  608. vlist_flush_all(&dev->vlans);
  609. kvlist_free(&dev->vlan_aliases);
  610. free(bst->config_data);
  611. free(bst);
  612. }
  613. static void
  614. bridge_dump_port(struct blob_buf *b, struct bridge_vlan_port *port)
  615. {
  616. bool tagged = !(port->flags & BRVLAN_F_UNTAGGED);
  617. bool pvid = (port->flags & BRVLAN_F_PVID);
  618. blobmsg_printf(b, "%s%s%s%s\n", port->ifname,
  619. tagged || pvid ? ":" : "",
  620. tagged ? "t" : "",
  621. pvid ? "*" : "");
  622. }
  623. static void
  624. bridge_dump_vlan(struct blob_buf *b, struct bridge_vlan *vlan)
  625. {
  626. struct bridge_vlan_hotplug_port *port;
  627. void *c, *p;
  628. int i;
  629. c = blobmsg_open_table(b, NULL);
  630. blobmsg_add_u32(b, "id", vlan->vid);
  631. blobmsg_add_u8(b, "local", vlan->local);
  632. p = blobmsg_open_array(b, "ports");
  633. for (i = 0; i < vlan->n_ports; i++)
  634. bridge_dump_port(b, &vlan->ports[i]);
  635. list_for_each_entry(port, &vlan->hotplug_ports, list)
  636. bridge_dump_port(b, &port->port);
  637. blobmsg_close_array(b, p);
  638. blobmsg_close_table(b, c);
  639. }
  640. static void
  641. bridge_dump_info(struct device *dev, struct blob_buf *b)
  642. {
  643. struct bridge_state *bst;
  644. struct bridge_member *bm;
  645. struct bridge_vlan *vlan;
  646. void *list;
  647. bst = container_of(dev, struct bridge_state, dev);
  648. system_if_dump_info(dev, b);
  649. list = blobmsg_open_array(b, "bridge-members");
  650. vlist_for_each_element(&bst->members, bm, node) {
  651. if (bm->dev.dev->hidden)
  652. continue;
  653. blobmsg_add_string(b, NULL, bm->dev.dev->ifname);
  654. }
  655. blobmsg_close_array(b, list);
  656. if (avl_is_empty(&dev->vlans.avl))
  657. return;
  658. list = blobmsg_open_array(b, "bridge-vlans");
  659. vlist_for_each_element(&bst->dev.vlans, vlan, node)
  660. bridge_dump_vlan(b, vlan);
  661. blobmsg_close_array(b, list);
  662. }
  663. static void
  664. bridge_config_init(struct device *dev)
  665. {
  666. struct bridge_state *bst;
  667. struct bridge_vlan *vlan;
  668. struct blob_attr *cur;
  669. int i, rem;
  670. bst = container_of(dev, struct bridge_state, dev);
  671. if (bst->config.bridge_empty) {
  672. bst->force_active = true;
  673. device_set_present(&bst->dev, true);
  674. }
  675. bst->n_failed = 0;
  676. vlist_update(&bst->members);
  677. if (bst->ifnames) {
  678. blobmsg_for_each_attr(cur, bst->ifnames, rem) {
  679. bridge_add_member(bst, blobmsg_data(cur));
  680. }
  681. }
  682. vlist_for_each_element(&bst->dev.vlans, vlan, node)
  683. for (i = 0; i < vlan->n_ports; i++)
  684. bridge_add_member(bst, vlan->ports[i].ifname);
  685. vlist_flush(&bst->members);
  686. bridge_check_retry(bst);
  687. }
  688. static void
  689. bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
  690. {
  691. struct bridge_config *cfg = &bst->config;
  692. struct blob_attr *cur;
  693. /* defaults */
  694. cfg->stp = false;
  695. cfg->forward_delay = 2;
  696. cfg->robustness = 2;
  697. cfg->query_interval = 12500;
  698. cfg->query_response_interval = 1000;
  699. cfg->last_member_interval = 100;
  700. cfg->hash_max = 512;
  701. cfg->bridge_empty = false;
  702. cfg->priority = 0x7FFF;
  703. cfg->vlan_filtering = false;
  704. if ((cur = tb[BRIDGE_ATTR_STP]))
  705. cfg->stp = blobmsg_get_bool(cur);
  706. if ((cur = tb[BRIDGE_ATTR_FORWARD_DELAY]))
  707. cfg->forward_delay = blobmsg_get_u32(cur);
  708. if ((cur = tb[BRIDGE_ATTR_PRIORITY]))
  709. cfg->priority = blobmsg_get_u32(cur);
  710. if ((cur = tb[BRIDGE_ATTR_IGMP_SNOOP]))
  711. cfg->multicast_querier = cfg->igmp_snoop = blobmsg_get_bool(cur);
  712. if ((cur = tb[BRIDGE_ATTR_MULTICAST_QUERIER]))
  713. cfg->multicast_querier = blobmsg_get_bool(cur);
  714. if ((cur = tb[BRIDGE_ATTR_HASH_MAX]))
  715. cfg->hash_max = blobmsg_get_u32(cur);
  716. if ((cur = tb[BRIDGE_ATTR_ROBUSTNESS])) {
  717. cfg->robustness = blobmsg_get_u32(cur);
  718. cfg->flags |= BRIDGE_OPT_ROBUSTNESS;
  719. }
  720. if ((cur = tb[BRIDGE_ATTR_QUERY_INTERVAL])) {
  721. cfg->query_interval = blobmsg_get_u32(cur);
  722. cfg->flags |= BRIDGE_OPT_QUERY_INTERVAL;
  723. }
  724. if ((cur = tb[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL])) {
  725. cfg->query_response_interval = blobmsg_get_u32(cur);
  726. cfg->flags |= BRIDGE_OPT_QUERY_RESPONSE_INTERVAL;
  727. }
  728. if ((cur = tb[BRIDGE_ATTR_LAST_MEMBER_INTERVAL])) {
  729. cfg->last_member_interval = blobmsg_get_u32(cur);
  730. cfg->flags |= BRIDGE_OPT_LAST_MEMBER_INTERVAL;
  731. }
  732. if ((cur = tb[BRIDGE_ATTR_AGEING_TIME])) {
  733. cfg->ageing_time = blobmsg_get_u32(cur);
  734. cfg->flags |= BRIDGE_OPT_AGEING_TIME;
  735. }
  736. if ((cur = tb[BRIDGE_ATTR_HELLO_TIME])) {
  737. cfg->hello_time = blobmsg_get_u32(cur);
  738. cfg->flags |= BRIDGE_OPT_HELLO_TIME;
  739. }
  740. if ((cur = tb[BRIDGE_ATTR_MAX_AGE])) {
  741. cfg->max_age = blobmsg_get_u32(cur);
  742. cfg->flags |= BRIDGE_OPT_MAX_AGE;
  743. }
  744. if ((cur = tb[BRIDGE_ATTR_BRIDGE_EMPTY]))
  745. cfg->bridge_empty = blobmsg_get_bool(cur);
  746. if ((cur = tb[BRIDGE_ATTR_VLAN_FILTERING]))
  747. cfg->vlan_filtering = blobmsg_get_bool(cur);
  748. }
  749. static enum dev_change_type
  750. bridge_reload(struct device *dev, struct blob_attr *attr)
  751. {
  752. struct blob_attr *tb_dev[__DEV_ATTR_MAX];
  753. struct blob_attr *tb_br[__BRIDGE_ATTR_MAX];
  754. enum dev_change_type ret = DEV_CONFIG_APPLIED;
  755. unsigned long diff;
  756. struct bridge_state *bst;
  757. BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / 8);
  758. BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
  759. bst = container_of(dev, struct bridge_state, dev);
  760. attr = blob_memdup(attr);
  761. blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, tb_dev,
  762. blob_data(attr), blob_len(attr));
  763. blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, tb_br,
  764. blob_data(attr), blob_len(attr));
  765. if (tb_dev[DEV_ATTR_MACADDR])
  766. bst->primary_port = NULL;
  767. bst->ifnames = tb_br[BRIDGE_ATTR_IFNAME];
  768. device_init_settings(dev, tb_dev);
  769. bridge_apply_settings(bst, tb_br);
  770. if (bst->config_data) {
  771. struct blob_attr *otb_dev[__DEV_ATTR_MAX];
  772. struct blob_attr *otb_br[__BRIDGE_ATTR_MAX];
  773. blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
  774. blob_data(bst->config_data), blob_len(bst->config_data));
  775. diff = 0;
  776. uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
  777. if (diff)
  778. ret = DEV_CONFIG_RESTART;
  779. blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, otb_br,
  780. blob_data(bst->config_data), blob_len(bst->config_data));
  781. diff = 0;
  782. uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff);
  783. if (diff & ~(1 << BRIDGE_ATTR_IFNAME))
  784. ret = DEV_CONFIG_RESTART;
  785. bridge_config_init(dev);
  786. }
  787. free(bst->config_data);
  788. bst->config_data = attr;
  789. return ret;
  790. }
  791. static void
  792. bridge_retry_members(struct uloop_timeout *timeout)
  793. {
  794. struct bridge_state *bst = container_of(timeout, struct bridge_state, retry);
  795. struct bridge_member *bm;
  796. bst->n_failed = 0;
  797. vlist_for_each_element(&bst->members, bm, node) {
  798. if (bm->present)
  799. continue;
  800. if (!bm->dev.dev->present)
  801. continue;
  802. bm->present = true;
  803. bst->n_present++;
  804. bridge_enable_member(bm);
  805. }
  806. }
  807. static int bridge_avl_cmp_u16(const void *k1, const void *k2, void *ptr)
  808. {
  809. const uint16_t *i1 = k1, *i2 = k2;
  810. return *i1 - *i2;
  811. }
  812. static bool
  813. bridge_vlan_equal(struct bridge_vlan *v1, struct bridge_vlan *v2)
  814. {
  815. int i;
  816. if (v1->n_ports != v2->n_ports)
  817. return false;
  818. for (i = 0; i < v1->n_ports; i++)
  819. if (v1->ports[i].flags != v2->ports[i].flags ||
  820. strcmp(v1->ports[i].ifname, v2->ports[i].ifname) != 0)
  821. return false;
  822. return true;
  823. }
  824. static void
  825. bridge_vlan_free(struct bridge_vlan *vlan)
  826. {
  827. struct bridge_vlan_hotplug_port *port, *tmp;
  828. if (!vlan)
  829. return;
  830. list_for_each_entry_safe(port, tmp, &vlan->hotplug_ports, list)
  831. free(port);
  832. free(vlan);
  833. }
  834. static void
  835. bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
  836. struct vlist_node *node_old)
  837. {
  838. struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
  839. struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
  840. if (!bst->has_vlans || !bst->active)
  841. goto out;
  842. if (node_old)
  843. vlan_old = container_of(node_old, struct bridge_vlan, node);
  844. if (node_new)
  845. vlan_new = container_of(node_new, struct bridge_vlan, node);
  846. if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
  847. list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
  848. goto out;
  849. }
  850. if (node_old)
  851. bridge_set_vlan_state(bst, vlan_old, false);
  852. if (node_old && node_new)
  853. list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
  854. if (node_new)
  855. bridge_set_vlan_state(bst, vlan_new, true);
  856. bst->dev.config_pending = true;
  857. out:
  858. bridge_vlan_free(vlan_old);
  859. }
  860. static struct device *
  861. bridge_create(const char *name, struct device_type *devtype,
  862. struct blob_attr *attr)
  863. {
  864. struct bridge_state *bst;
  865. struct device *dev = NULL;
  866. bst = calloc(1, sizeof(*bst));
  867. if (!bst)
  868. return NULL;
  869. dev = &bst->dev;
  870. if (device_init(dev, devtype, name) < 0) {
  871. device_cleanup(dev);
  872. free(bst);
  873. return NULL;
  874. }
  875. dev->config_pending = true;
  876. bst->retry.cb = bridge_retry_members;
  877. bst->set_state = dev->set_state;
  878. dev->set_state = bridge_set_state;
  879. dev->hotplug_ops = &bridge_ops;
  880. vlist_init(&bst->members, avl_strcmp, bridge_member_update);
  881. bst->members.keep_old = true;
  882. vlist_init(&dev->vlans, bridge_avl_cmp_u16, bridge_vlan_update);
  883. bridge_reload(dev, attr);
  884. return dev;
  885. }
  886. static void __init bridge_device_type_init(void)
  887. {
  888. device_type_add(&bridge_device_type);
  889. }