bridge.c 34 KB

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