wireless.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660
  1. /*
  2. * netifd - network interface daemon
  3. * Copyright (C) 2013 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. /* The wireless configuration is projected on the following objects
  15. *
  16. * 1. wireless device
  17. * 2. wireless interface
  18. * 3. wireless vlan
  19. * 4. wireless station
  20. *
  21. * A wireless device is a phy or simplified a wireless card.
  22. * A wireless interface is a SSID on a phy.
  23. * A wireless vlan can be assigned to a wireless interface. A wireless interface can
  24. * have multiple vlans.
  25. * A wireless station is a client connected to an wireless interface.
  26. */
  27. #include <signal.h>
  28. #include "netifd.h"
  29. #include "wireless.h"
  30. #include "handler.h"
  31. #include "ubus.h"
  32. #define WIRELESS_SETUP_RETRY 3
  33. struct vlist_tree wireless_devices;
  34. struct avl_tree wireless_drivers;
  35. static struct blob_buf b;
  36. static int drv_fd;
  37. static LIST_HEAD(handlers);
  38. static bool handler_pending;
  39. enum {
  40. WDEV_ATTR_DISABLED,
  41. WDEV_ATTR_RECONF,
  42. WDEV_ATTR_SERIALIZE,
  43. __WDEV_ATTR_MAX,
  44. };
  45. static const struct blobmsg_policy wdev_policy[__WDEV_ATTR_MAX] = {
  46. [WDEV_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
  47. [WDEV_ATTR_RECONF] = { .name = "reconf", .type = BLOBMSG_TYPE_BOOL },
  48. [WDEV_ATTR_SERIALIZE] = { .name = "serialize", .type = BLOBMSG_TYPE_BOOL },
  49. };
  50. static const struct uci_blob_param_list wdev_param = {
  51. .n_params = ARRAY_SIZE(wdev_policy),
  52. .params = wdev_policy,
  53. };
  54. enum {
  55. VIF_ATTR_DISABLED,
  56. VIF_ATTR_NETWORK,
  57. VIF_ATTR_NETWORK_VLAN,
  58. VIF_ATTR_BRIDGE_ISOLATE,
  59. VIF_ATTR_ISOLATE,
  60. VIF_ATTR_MODE,
  61. VIF_ATTR_PROXYARP,
  62. VIF_ATTR_MCAST_TO_UCAST,
  63. __VIF_ATTR_MAX,
  64. };
  65. static const struct blobmsg_policy vif_policy[__VIF_ATTR_MAX] = {
  66. [VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
  67. [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
  68. [VIF_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
  69. [VIF_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
  70. [VIF_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
  71. [VIF_ATTR_MODE] = { .name = "mode", .type = BLOBMSG_TYPE_STRING },
  72. [VIF_ATTR_PROXYARP] = { .name = "proxy_arp", .type = BLOBMSG_TYPE_BOOL },
  73. [VIF_ATTR_MCAST_TO_UCAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
  74. };
  75. static const struct uci_blob_param_list vif_param = {
  76. .n_params = ARRAY_SIZE(vif_policy),
  77. .params = vif_policy,
  78. };
  79. enum {
  80. VLAN_ATTR_DISABLED,
  81. VLAN_ATTR_NETWORK,
  82. VLAN_ATTR_NETWORK_VLAN,
  83. VLAN_ATTR_BRIDGE_ISOLATE,
  84. VLAN_ATTR_ISOLATE,
  85. VLAN_ATTR_MCAST_TO_UCAST,
  86. __VLAN_ATTR_MAX,
  87. };
  88. static const struct blobmsg_policy vlan_policy[__VLAN_ATTR_MAX] = {
  89. [VLAN_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
  90. [VLAN_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
  91. [VLAN_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
  92. [VLAN_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
  93. [VLAN_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
  94. [VLAN_ATTR_MCAST_TO_UCAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
  95. };
  96. static const struct uci_blob_param_list vlan_param = {
  97. .n_params = ARRAY_SIZE(vlan_policy),
  98. .params = vlan_policy,
  99. };
  100. enum {
  101. STA_ATTR_DISABLED,
  102. __STA_ATTR_MAX,
  103. };
  104. static const struct blobmsg_policy sta_policy[__STA_ATTR_MAX] = {
  105. [STA_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
  106. };
  107. static const struct uci_blob_param_list station_param = {
  108. .n_params = ARRAY_SIZE(sta_policy),
  109. .params = sta_policy,
  110. };
  111. static void
  112. wireless_handler_stop(struct wireless_device *wdev)
  113. {
  114. if (wdev->handler_pending) {
  115. wdev->handler_pending = false;
  116. list_del(&wdev->handler);
  117. }
  118. }
  119. static void
  120. put_container(struct blob_buf *buf, struct blob_attr *attr, const char *name)
  121. {
  122. void *c = blobmsg_open_table(buf, name);
  123. blob_put_raw(buf, blob_data(attr), blob_len(attr));
  124. blobmsg_close_table(buf, c);
  125. }
  126. static void
  127. vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool prepare)
  128. {
  129. struct interface *iface;
  130. struct device *dev = NULL, *orig_dev;
  131. struct blob_attr *cur;
  132. const char *network;
  133. size_t rem;
  134. if (!networks)
  135. return;
  136. blobmsg_for_each_attr(cur, networks, rem) {
  137. network = blobmsg_data(cur);
  138. iface = vlist_find(&interfaces, network, iface, node);
  139. if (!iface)
  140. continue;
  141. dev = iface->main_dev.dev;
  142. if (!dev)
  143. return;
  144. if (!dev->hotplug_ops)
  145. return;
  146. }
  147. if (!dev)
  148. return;
  149. orig_dev = dev;
  150. if (dev->hotplug_ops && dev->hotplug_ops->prepare)
  151. dev->hotplug_ops->prepare(dev, &dev);
  152. if (!dev || !dev->type->bridge_capability)
  153. return;
  154. blobmsg_add_string(buf, "bridge", dev->ifname);
  155. blobmsg_add_string(buf, "bridge-ifname", orig_dev->ifname);
  156. if (dev->settings.flags & DEV_OPT_MULTICAST_TO_UNICAST)
  157. blobmsg_add_u8(buf, "multicast_to_unicast",
  158. dev->settings.multicast_to_unicast);
  159. }
  160. static void
  161. prepare_config(struct wireless_device *wdev, struct blob_buf *buf, bool up)
  162. {
  163. struct wireless_interface *vif;
  164. struct wireless_vlan *vlan;
  165. struct wireless_station *sta;
  166. void *l, *i, *j, *k;
  167. blob_buf_init(&b, 0);
  168. put_container(&b, wdev->config, "config");
  169. if (wdev->data)
  170. blobmsg_add_blob(&b, wdev->data);
  171. l = blobmsg_open_table(&b, "interfaces");
  172. vlist_for_each_element(&wdev->interfaces, vif, node) {
  173. if (vif->disabled)
  174. continue;
  175. i = blobmsg_open_table(&b, vif->name);
  176. vif_config_add_bridge(&b, vif->network, up);
  177. put_container(&b, vif->config, "config");
  178. if (vif->data)
  179. blobmsg_add_blob(&b, vif->data);
  180. j = blobmsg_open_table(&b, "vlans");
  181. vlist_for_each_element(&vif->vlans, vlan, node) {
  182. k = blobmsg_open_table(&b, vlan->name);
  183. vif_config_add_bridge(&b, vlan->network, up);
  184. put_container(&b, vlan->config, "config");
  185. if (vlan->data)
  186. blobmsg_add_blob(&b, vlan->data);
  187. blobmsg_close_table(&b, k);
  188. }
  189. blobmsg_close_table(&b, j);
  190. j = blobmsg_open_table(&b, "stas");
  191. vlist_for_each_element(&vif->stations, sta, node) {
  192. k = blobmsg_open_table(&b, sta->name);
  193. put_container(&b, sta->config, "config");
  194. if (sta->data)
  195. blobmsg_add_blob(&b, sta->data);
  196. blobmsg_close_table(&b, k);
  197. }
  198. blobmsg_close_table(&b, j);
  199. blobmsg_close_table(&b, i);
  200. }
  201. blobmsg_close_table(&b, l);
  202. }
  203. static bool
  204. wireless_process_check(struct wireless_process *proc)
  205. {
  206. return check_pid_path(proc->pid, proc->exe);
  207. }
  208. static void
  209. wireless_complete_kill_request(struct wireless_device *wdev)
  210. {
  211. if (!wdev->kill_request)
  212. return;
  213. ubus_complete_deferred_request(ubus_ctx, wdev->kill_request, 0);
  214. free(wdev->kill_request);
  215. wdev->kill_request = NULL;
  216. }
  217. static void
  218. wireless_process_free(struct wireless_device *wdev, struct wireless_process *proc)
  219. {
  220. D(WIRELESS, "Wireless device '%s' free pid %d", wdev->name, proc->pid);
  221. list_del(&proc->list);
  222. free(proc);
  223. if (list_empty(&wdev->script_proc))
  224. wireless_complete_kill_request(wdev);
  225. }
  226. static void
  227. wireless_close_script_proc_fd(struct wireless_device *wdev)
  228. {
  229. if (wdev->script_proc_fd.fd < 0)
  230. return;
  231. uloop_fd_delete(&wdev->script_proc_fd);
  232. close(wdev->script_proc_fd.fd);
  233. wdev->script_proc_fd.fd = -1;
  234. }
  235. static void
  236. wireless_process_kill_all(struct wireless_device *wdev, int signal, bool free)
  237. {
  238. struct wireless_process *proc, *tmp;
  239. list_for_each_entry_safe(proc, tmp, &wdev->script_proc, list) {
  240. bool check = wireless_process_check(proc);
  241. if (check && !proc->keep) {
  242. D(WIRELESS, "Wireless device '%s' kill pid %d", wdev->name, proc->pid);
  243. kill(proc->pid, signal);
  244. }
  245. if (free || !check)
  246. wireless_process_free(wdev, proc);
  247. }
  248. if (free)
  249. wireless_close_script_proc_fd(wdev);
  250. }
  251. static void
  252. wireless_device_free_state(struct wireless_device *wdev)
  253. {
  254. struct wireless_interface *vif;
  255. struct wireless_vlan *vlan;
  256. struct wireless_station *sta;
  257. wireless_handler_stop(wdev);
  258. uloop_timeout_cancel(&wdev->script_check);
  259. uloop_timeout_cancel(&wdev->timeout);
  260. wireless_complete_kill_request(wdev);
  261. free(wdev->data);
  262. wdev->data = NULL;
  263. vlist_for_each_element(&wdev->interfaces, vif, node) {
  264. free(vif->data);
  265. vif->data = NULL;
  266. vif->ifname = NULL;
  267. vlist_for_each_element(&vif->vlans, vlan, node) {
  268. free(vlan->data);
  269. vlan->data = NULL;
  270. vlan->ifname = NULL;
  271. }
  272. vlist_for_each_element(&vif->stations, sta, node) {
  273. free(sta->data);
  274. sta->data = NULL;
  275. }
  276. }
  277. }
  278. static void wireless_device_set_mcast_to_unicast(struct device *dev, int val)
  279. {
  280. if (val < 0) {
  281. dev->settings.flags &= ~DEV_OPT_MULTICAST_TO_UNICAST;
  282. return;
  283. }
  284. dev->settings.multicast_to_unicast = !!val;
  285. dev->settings.flags |= DEV_OPT_MULTICAST_TO_UNICAST;
  286. }
  287. static void wireless_interface_handle_link(struct wireless_interface *vif, const char *ifname, bool up)
  288. {
  289. struct interface *iface;
  290. struct blob_attr *cur;
  291. const char *network;
  292. struct device *dev;
  293. size_t rem;
  294. if (!vif->network || !vif->ifname)
  295. return;
  296. if (!ifname)
  297. ifname = vif->ifname;
  298. if (!up)
  299. goto out;
  300. dev = __device_get(ifname, 2, false);
  301. if (!dev)
  302. goto out;
  303. dev->wireless = true;
  304. dev->settings.flags |= DEV_OPT_ISOLATE;
  305. dev->settings.isolate = vif->bridge_isolate;
  306. if (strcmp(ifname, vif->ifname) != 0)
  307. goto out;
  308. dev->wireless_isolate = vif->isolate;
  309. dev->wireless_proxyarp = vif->proxyarp;
  310. dev->wireless_ap = vif->ap_mode;
  311. wireless_device_set_mcast_to_unicast(dev, vif->multicast_to_unicast);
  312. dev->bpdu_filter = dev->wireless_ap;
  313. out:
  314. blobmsg_for_each_attr(cur, vif->network, rem) {
  315. network = blobmsg_data(cur);
  316. iface = vlist_find(&interfaces, network, iface, node);
  317. if (!iface)
  318. continue;
  319. interface_handle_link(iface, ifname, vif->network_vlan, up, true);
  320. }
  321. }
  322. static void wireless_vlan_handle_link(struct wireless_vlan *vlan, bool up)
  323. {
  324. struct interface *iface;
  325. struct blob_attr *cur;
  326. const char *network;
  327. size_t rem;
  328. if (!vlan->network || !vlan->ifname)
  329. return;
  330. if (up) {
  331. struct device *dev = device_get(vlan->ifname, 2);
  332. if (dev) {
  333. dev->wireless_isolate = vlan->isolate;
  334. dev->wireless = true;
  335. dev->wireless_ap = true;
  336. dev->bpdu_filter = true;
  337. dev->settings.flags |= DEV_OPT_ISOLATE;
  338. dev->settings.isolate = vlan->bridge_isolate;
  339. wireless_device_set_mcast_to_unicast(dev, vlan->multicast_to_unicast);
  340. }
  341. }
  342. blobmsg_for_each_attr(cur, vlan->network, rem) {
  343. network = blobmsg_data(cur);
  344. iface = vlist_find(&interfaces, network, iface, node);
  345. if (!iface)
  346. continue;
  347. interface_handle_link(iface, vlan->ifname, vlan->network_vlan, up, true);
  348. }
  349. }
  350. static void
  351. wireless_device_setup_cancel(struct wireless_device *wdev)
  352. {
  353. if (wdev->cancel)
  354. return;
  355. wireless_handler_stop(wdev);
  356. D(WIRELESS, "Cancel wireless device '%s' setup", wdev->name);
  357. wdev->cancel = true;
  358. uloop_timeout_set(&wdev->timeout, 10 * 1000);
  359. }
  360. static void
  361. wireless_device_run_handler(struct wireless_device *wdev, bool up)
  362. {
  363. const char *action = up ? "setup" : "teardown";
  364. const char *argv[6];
  365. char *config;
  366. int i = 0;
  367. int fds[2] = { -1, -1 };
  368. wireless_handler_stop(wdev);
  369. if (handler_pending && wdev->serialize) {
  370. wdev->handler_action = up;
  371. wdev->handler_pending = true;
  372. list_add_tail(&wdev->handler, &handlers);
  373. return;
  374. }
  375. if (wdev->serialize)
  376. handler_pending = true;
  377. D(WIRELESS, "Wireless device '%s' run %s handler", wdev->name, action);
  378. if (!up && wdev->prev_config) {
  379. config = blobmsg_format_json(wdev->prev_config, true);
  380. free(wdev->prev_config);
  381. wdev->prev_config = NULL;
  382. } else {
  383. prepare_config(wdev, &b, up);
  384. free(wdev->prev_config);
  385. wdev->prev_config = up ? blob_memdup(b.head) : NULL;
  386. config = blobmsg_format_json(b.head, true);
  387. }
  388. argv[i++] = wdev->drv->script;
  389. argv[i++] = wdev->drv->name;
  390. argv[i++] = action;
  391. argv[i++] = wdev->name;
  392. argv[i++] = config;
  393. argv[i] = NULL;
  394. if (up && pipe(fds) == 0) {
  395. if (wdev->script_proc_fd.fd >= 0)
  396. wireless_close_script_proc_fd(wdev);
  397. wdev->script_proc_fd.fd = fds[0];
  398. uloop_fd_add(&wdev->script_proc_fd,
  399. ULOOP_READ | ULOOP_EDGE_TRIGGER);
  400. }
  401. netifd_start_process(argv, NULL, &wdev->script_task);
  402. if (fds[1] >= 0)
  403. close(fds[1]);
  404. free(config);
  405. }
  406. static void
  407. wireless_handler_next(void)
  408. {
  409. struct wireless_device *wdev;
  410. if (handler_pending)
  411. return;
  412. if (list_empty(&handlers))
  413. return;
  414. wdev = list_first_entry(&handlers, struct wireless_device, handler);
  415. list_del(&wdev->handler);
  416. wdev->handler_pending = false;
  417. wireless_device_run_handler(wdev, wdev->handler_action);
  418. }
  419. static void
  420. __wireless_device_set_up(struct wireless_device *wdev, int force)
  421. {
  422. if (wdev->disabled)
  423. return;
  424. if (wdev->retry_setup_failed)
  425. return;
  426. if (!wdev->autostart)
  427. return;
  428. if ((!force && wdev->state != IFS_DOWN) || config_init)
  429. return;
  430. wdev->state = IFS_SETUP;
  431. wireless_device_run_handler(wdev, true);
  432. }
  433. static void
  434. wireless_device_free(struct wireless_device *wdev)
  435. {
  436. wireless_handler_stop(wdev);
  437. vlist_flush_all(&wdev->interfaces);
  438. avl_delete(&wireless_devices.avl, &wdev->node.avl);
  439. free(wdev->config);
  440. free(wdev->prev_config);
  441. free(wdev);
  442. }
  443. static void
  444. wdev_handle_config_change(struct wireless_device *wdev)
  445. {
  446. enum interface_config_state state = wdev->config_state;
  447. switch(state) {
  448. case IFC_RELOAD:
  449. wdev->retry = WIRELESS_SETUP_RETRY;
  450. wdev->retry_setup_failed = false;
  451. fallthrough;
  452. case IFC_NORMAL:
  453. __wireless_device_set_up(wdev, 0);
  454. wdev->config_state = IFC_NORMAL;
  455. break;
  456. case IFC_REMOVE:
  457. wireless_device_free(wdev);
  458. break;
  459. }
  460. }
  461. static void
  462. wireless_device_mark_down(struct wireless_device *wdev)
  463. {
  464. struct wireless_interface *vif;
  465. struct wireless_vlan *vlan;
  466. netifd_log_message(L_NOTICE, "Wireless device '%s' is now down\n", wdev->name);
  467. vlist_for_each_element(&wdev->interfaces, vif, node) {
  468. wireless_interface_handle_link(vif, NULL, false);
  469. vlist_for_each_element(&vif->vlans, vlan, node)
  470. wireless_vlan_handle_link(vlan, false);
  471. }
  472. wireless_process_kill_all(wdev, SIGTERM, true);
  473. wdev->cancel = false;
  474. wdev->state = IFS_DOWN;
  475. wireless_device_free_state(wdev);
  476. wdev_handle_config_change(wdev);
  477. }
  478. /* timeout callback to protect the tear down */
  479. static void
  480. wireless_device_setup_timeout(struct uloop_timeout *timeout)
  481. {
  482. struct wireless_device *wdev = container_of(timeout, struct wireless_device, timeout);
  483. if (wdev->handler_pending) {
  484. wdev->handler_pending = false;
  485. list_del(&wdev->handler);
  486. }
  487. netifd_kill_process(&wdev->script_task);
  488. wdev->script_task.cb(&wdev->script_task, -1);
  489. wireless_device_mark_down(wdev);
  490. }
  491. void
  492. wireless_device_set_up(struct wireless_device *wdev)
  493. {
  494. wdev->retry = WIRELESS_SETUP_RETRY;
  495. wdev->autostart = true;
  496. __wireless_device_set_up(wdev, 0);
  497. }
  498. void
  499. wireless_device_reconf(struct wireless_device *wdev)
  500. {
  501. wdev->retry = WIRELESS_SETUP_RETRY;
  502. wdev->autostart = true;
  503. __wireless_device_set_up(wdev, wdev->reconf && (wdev->state == IFS_UP));
  504. }
  505. static void
  506. __wireless_device_set_down(struct wireless_device *wdev)
  507. {
  508. if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN)
  509. return;
  510. if (wdev->script_task.uloop.pending) {
  511. wireless_device_setup_cancel(wdev);
  512. return;
  513. }
  514. wdev->state = IFS_TEARDOWN;
  515. wireless_device_run_handler(wdev, false);
  516. }
  517. /* ubus callback network.wireless.notify, command = up */
  518. static void
  519. wireless_device_mark_up(struct wireless_device *wdev)
  520. {
  521. struct wireless_interface *vif;
  522. struct wireless_vlan *vlan;
  523. if (wdev->cancel) {
  524. wdev->cancel = false;
  525. __wireless_device_set_down(wdev);
  526. return;
  527. }
  528. netifd_log_message(L_NOTICE, "Wireless device '%s' is now up\n", wdev->name);
  529. wdev->retry = WIRELESS_SETUP_RETRY;
  530. wdev->state = IFS_UP;
  531. vlist_for_each_element(&wdev->interfaces, vif, node) {
  532. wireless_interface_handle_link(vif, NULL, true);
  533. vlist_for_each_element(&vif->vlans, vlan, node)
  534. wireless_vlan_handle_link(vlan, true);
  535. }
  536. }
  537. static void
  538. wireless_device_retry_setup(struct wireless_device *wdev)
  539. {
  540. if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || wdev->cancel)
  541. return;
  542. netifd_log_message(wdev->retry ? L_WARNING : L_CRIT,
  543. "Wireless device '%s' setup failed, retry=%d\n",
  544. wdev->name, wdev->retry);
  545. if (--wdev->retry < 0)
  546. wdev->retry_setup_failed = true;
  547. __wireless_device_set_down(wdev);
  548. }
  549. static void
  550. wireless_device_script_task_cb(struct netifd_process *proc, int ret)
  551. {
  552. struct wireless_device *wdev = container_of(proc, struct wireless_device, script_task);
  553. switch (wdev->state) {
  554. case IFS_SETUP:
  555. wireless_device_retry_setup(wdev);
  556. break;
  557. case IFS_TEARDOWN:
  558. wireless_device_mark_down(wdev);
  559. break;
  560. default:
  561. break;
  562. }
  563. if (wdev->serialize) {
  564. handler_pending = false;
  565. wireless_handler_next();
  566. }
  567. }
  568. void
  569. wireless_device_set_down(struct wireless_device *wdev)
  570. {
  571. wdev->retry_setup_failed = false;
  572. wdev->autostart = false;
  573. __wireless_device_set_down(wdev);
  574. }
  575. static void
  576. wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state s)
  577. {
  578. if (wdev->config_state != IFC_NORMAL)
  579. return;
  580. wdev->config_update = false;
  581. if (!wdev->disabled && s == IFC_RELOAD && wdev->reconf && wdev->state == IFS_UP) {
  582. wireless_device_reconf(wdev);
  583. return;
  584. }
  585. wdev->config_state = s;
  586. if (wdev->state == IFS_DOWN)
  587. wdev_handle_config_change(wdev);
  588. else
  589. __wireless_device_set_down(wdev);
  590. }
  591. static void
  592. wdev_prepare_prev_config(struct wireless_device *wdev)
  593. {
  594. prepare_config(wdev, &b, false);
  595. free(wdev->prev_config);
  596. wdev->prev_config = blob_memdup(b.head);
  597. }
  598. static void
  599. wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new)
  600. {
  601. struct blob_attr *new_config = wd_new->config;
  602. bool disabled = wd_new->disabled;
  603. wdev->reconf = wd_new->reconf;
  604. wdev->serialize = wd_new->serialize;
  605. free(wd_new);
  606. if (blob_attr_equal(wdev->config, new_config) && wdev->disabled == disabled)
  607. return;
  608. D(WIRELESS, "Update configuration of wireless device '%s'", wdev->name);
  609. free(wdev->config);
  610. wdev->config = blob_memdup(new_config);
  611. wdev->disabled = disabled;
  612. wdev->config_update = true;
  613. }
  614. static void
  615. wdev_create(struct wireless_device *wdev)
  616. {
  617. wdev->retry = WIRELESS_SETUP_RETRY;
  618. wdev->config = blob_memdup(wdev->config);
  619. }
  620. /* vlist update call for wireless device list */
  621. static void
  622. wdev_update(struct vlist_tree *tree, struct vlist_node *node_new,
  623. struct vlist_node *node_old)
  624. {
  625. struct wireless_device *wd_old = container_of(node_old, struct wireless_device, node);
  626. struct wireless_device *wd_new = container_of(node_new, struct wireless_device, node);
  627. if (wd_old && wd_new) {
  628. D(WIRELESS, "Update wireless device '%s'", wd_old->name);
  629. wdev_change_config(wd_old, wd_new);
  630. } else if (wd_old) {
  631. D(WIRELESS, "Delete wireless device '%s'", wd_old->name);
  632. wdev_set_config_state(wd_old, IFC_REMOVE);
  633. } else if (wd_new) {
  634. D(WIRELESS, "Create wireless device '%s'", wd_new->name);
  635. wdev_create(wd_new);
  636. }
  637. }
  638. /* wireless netifd script handler */
  639. static void
  640. wireless_add_handler(const char *script, const char *name, json_object *obj)
  641. {
  642. struct wireless_driver *drv;
  643. char *name_str, *script_str;
  644. json_object *dev_config_obj, *iface_config_obj, *vlan_config_obj, *station_config_obj;
  645. struct uci_blob_param_list *dev_config, *iface_config, *vlan_config, *station_config;
  646. dev_config_obj = json_get_field(obj, "device", json_type_array);
  647. iface_config_obj = json_get_field(obj, "iface", json_type_array);
  648. vlan_config_obj = json_get_field(obj, "vlan", json_type_array);
  649. station_config_obj = json_get_field(obj, "station", json_type_array);
  650. if (!dev_config_obj || !iface_config_obj || !vlan_config_obj || !station_config_obj)
  651. return;
  652. drv = calloc_a(sizeof(*drv),
  653. &dev_config, sizeof(*dev_config) + sizeof(void *),
  654. &iface_config, sizeof(*iface_config) + sizeof(void *),
  655. &vlan_config, sizeof(*vlan_config) + sizeof(void *),
  656. &station_config, sizeof(*station_config) + sizeof(void *),
  657. &name_str, strlen(name) + 1,
  658. &script_str, strlen(script) + 1);
  659. drv->name = strcpy(name_str, name);
  660. drv->script = strcpy(script_str, script);
  661. dev_config->n_next = 1;
  662. dev_config->next[0] = &wdev_param;
  663. drv->device.config = dev_config;
  664. iface_config->n_next = 1;
  665. iface_config->next[0] = &vif_param;
  666. drv->interface.config = iface_config;
  667. vlan_config->n_next = 1;
  668. vlan_config->next[0] = &vlan_param;
  669. drv->vlan.config = vlan_config;
  670. station_config->n_next = 1;
  671. station_config->next[0] = &station_param;
  672. drv->station.config = station_config;
  673. drv->device.buf = netifd_handler_parse_config(drv->device.config, dev_config_obj);
  674. drv->interface.buf = netifd_handler_parse_config(drv->interface.config, iface_config_obj);
  675. drv->vlan.buf = netifd_handler_parse_config(drv->vlan.config, vlan_config_obj);
  676. drv->station.buf = netifd_handler_parse_config(drv->station.config, station_config_obj);
  677. drv->node.key = drv->name;
  678. avl_insert(&wireless_drivers, &drv->node);
  679. D(WIRELESS, "Add handler for script %s: %s", script, name);
  680. }
  681. void wireless_init(void)
  682. {
  683. vlist_init(&wireless_devices, avl_strcmp, wdev_update);
  684. wireless_devices.keep_old = true;
  685. wireless_devices.no_delete = true;
  686. avl_init(&wireless_drivers, avl_strcmp, false, NULL);
  687. drv_fd = netifd_open_subdir("wireless");
  688. if (drv_fd < 0)
  689. return;
  690. netifd_init_script_handlers(drv_fd, wireless_add_handler);
  691. }
  692. /* parse blob config into the wireless interface object */
  693. static void
  694. wireless_interface_init_config(struct wireless_interface *vif)
  695. {
  696. struct blob_attr *tb[__VIF_ATTR_MAX];
  697. struct blob_attr *cur;
  698. vif->network = NULL;
  699. blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(vif->config), blob_len(vif->config));
  700. if ((cur = tb[VIF_ATTR_NETWORK]))
  701. vif->network = cur;
  702. if ((cur = tb[VIF_ATTR_NETWORK_VLAN]))
  703. vif->network_vlan = cur;
  704. cur = tb[VIF_ATTR_MODE];
  705. vif->ap_mode = cur && !strcmp(blobmsg_get_string(cur), "ap");
  706. cur = tb[VIF_ATTR_BRIDGE_ISOLATE];
  707. vif->bridge_isolate = cur && blobmsg_get_bool(cur);
  708. cur = tb[VIF_ATTR_ISOLATE];
  709. vif->isolate = cur && blobmsg_get_bool(cur);
  710. cur = tb[VIF_ATTR_PROXYARP];
  711. vif->proxyarp = vif->ap_mode && cur && blobmsg_get_bool(cur);
  712. cur = tb[VIF_ATTR_MCAST_TO_UCAST];
  713. vif->multicast_to_unicast = cur ? blobmsg_get_bool(cur) : -1;
  714. }
  715. static void
  716. vif_free(struct wireless_interface *vif)
  717. {
  718. vlist_flush_all(&vif->vlans);
  719. vlist_flush_all(&vif->stations);
  720. free((void *) vif->section);
  721. free(vif->config);
  722. free(vif);
  723. }
  724. /* vlist update call for wireless interface list */
  725. static void
  726. vif_update(struct vlist_tree *tree, struct vlist_node *node_new,
  727. struct vlist_node *node_old)
  728. {
  729. struct wireless_interface *vif_old = container_of(node_old, struct wireless_interface, node);
  730. struct wireless_interface *vif_new = container_of(node_new, struct wireless_interface, node);
  731. struct wireless_device *wdev;
  732. if (vif_old)
  733. wdev = vif_old->wdev;
  734. else
  735. wdev = vif_new->wdev;
  736. if (vif_old && vif_new) {
  737. free((void *) vif_old->section);
  738. vif_old->section = strdup(vif_new->section);
  739. if (blob_attr_equal(vif_old->config, vif_new->config)) {
  740. free(vif_new);
  741. return;
  742. }
  743. D(WIRELESS, "Update wireless interface %s on device %s", vif_new->name, wdev->name);
  744. wireless_interface_handle_link(vif_old, NULL, false);
  745. free(vif_old->config);
  746. vif_old->config = blob_memdup(vif_new->config);
  747. wireless_interface_init_config(vif_old);
  748. free(vif_new);
  749. } else if (vif_new) {
  750. D(WIRELESS, "Create new wireless interface %s on device %s", vif_new->name, wdev->name);
  751. vif_new->section = strdup(vif_new->section);
  752. vif_new->config = blob_memdup(vif_new->config);
  753. wireless_interface_init_config(vif_new);
  754. } else if (vif_old) {
  755. D(WIRELESS, "Delete wireless interface %s on device %s", vif_old->name, wdev->name);
  756. wireless_interface_handle_link(vif_old, NULL, false);
  757. vif_free(vif_old);
  758. }
  759. wdev->config_update = true;
  760. }
  761. /* parse blob config into the vlan object */
  762. static void
  763. wireless_vlan_init_config(struct wireless_vlan *vlan)
  764. {
  765. struct blob_attr *tb[__VLAN_ATTR_MAX];
  766. struct blob_attr *cur;
  767. vlan->network = NULL;
  768. blobmsg_parse(vlan_policy, __VLAN_ATTR_MAX, tb, blob_data(vlan->config), blob_len(vlan->config));
  769. if ((cur = tb[VLAN_ATTR_NETWORK]))
  770. vlan->network = cur;
  771. if ((cur = tb[VLAN_ATTR_NETWORK_VLAN]))
  772. vlan->network_vlan = cur;
  773. cur = tb[VLAN_ATTR_BRIDGE_ISOLATE];
  774. vlan->bridge_isolate = cur && blobmsg_get_bool(cur);
  775. cur = tb[VLAN_ATTR_ISOLATE];
  776. vlan->isolate = cur && blobmsg_get_bool(cur);
  777. cur = tb[VLAN_ATTR_MCAST_TO_UCAST];
  778. vlan->multicast_to_unicast = cur ? blobmsg_get_bool(cur) : -1;
  779. }
  780. /* vlist update call for vlan list */
  781. static void
  782. vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
  783. struct vlist_node *node_old)
  784. {
  785. struct wireless_vlan *vlan_old = container_of_safe(node_old, struct wireless_vlan, node);
  786. struct wireless_vlan *vlan_new = container_of_safe(node_new, struct wireless_vlan, node);
  787. struct wireless_interface *vif = container_of(tree, struct wireless_interface, vlans);
  788. struct wireless_device *wdev = vif->wdev;
  789. if (vlan_old && vlan_new) {
  790. free((void *) vlan_old->section);
  791. vlan_old->section = strdup(vlan_new->section);
  792. if (blob_attr_equal(vlan_old->config, vlan_new->config)) {
  793. free(vlan_new);
  794. return;
  795. }
  796. D(WIRELESS, "Update wireless vlan %s on device %s", vlan_new->name, wdev->name);
  797. wireless_vlan_handle_link(vlan_old, false);
  798. free(vlan_old->config);
  799. vlan_old->config = blob_memdup(vlan_new->config);
  800. vlan_old->isolate = vlan_new->isolate;
  801. wireless_vlan_init_config(vlan_old);
  802. free(vlan_new);
  803. } else if (vlan_new) {
  804. D(WIRELESS, "Create new wireless vlan %s on device %s", vlan_new->name, wdev->name);
  805. vlan_new->section = strdup(vlan_new->section);
  806. vlan_new->config = blob_memdup(vlan_new->config);
  807. wireless_vlan_init_config(vlan_new);
  808. } else if (vlan_old) {
  809. D(WIRELESS, "Delete wireless vlan %s on device %s", vlan_old->name, wdev->name);
  810. wireless_vlan_handle_link(vlan_old, false);
  811. free((void *) vlan_old->section);
  812. free(vlan_old->config);
  813. free(vlan_old);
  814. }
  815. wdev->config_update = true;
  816. }
  817. /* vlist update call for station list */
  818. static void
  819. station_update(struct vlist_tree *tree, struct vlist_node *node_new,
  820. struct vlist_node *node_old)
  821. {
  822. struct wireless_station *sta_old = container_of_safe(node_old, struct wireless_station, node);
  823. struct wireless_station *sta_new = container_of_safe(node_new, struct wireless_station, node);
  824. struct wireless_interface *vif = container_of(tree, struct wireless_interface, stations);
  825. struct wireless_device *wdev = vif->wdev;
  826. if (sta_old && sta_new) {
  827. free((void *) sta_old->section);
  828. sta_old->section = strdup(sta_new->section);
  829. if (blob_attr_equal(sta_old->config, sta_new->config)) {
  830. free(sta_new);
  831. return;
  832. }
  833. D(WIRELESS, "Update wireless station %s on device %s", sta_new->name, wdev->name);
  834. free(sta_old->config);
  835. sta_old->config = blob_memdup(sta_new->config);
  836. free(sta_new);
  837. } else if (sta_new) {
  838. D(WIRELESS, "Create new wireless station %s on device %s", sta_new->name, wdev->name);
  839. sta_new->section = strdup(sta_new->section);
  840. sta_new->config = blob_memdup(sta_new->config);
  841. } else if (sta_old) {
  842. D(WIRELESS, "Delete wireless station %s on device %s", sta_old->name, wdev->name);
  843. free((void *) sta_old->section);
  844. free(sta_old->config);
  845. free(sta_old);
  846. }
  847. wdev->config_update = true;
  848. }
  849. static void
  850. wireless_proc_poll_fd(struct uloop_fd *fd, unsigned int events)
  851. {
  852. struct wireless_device *wdev = container_of(fd, struct wireless_device, script_proc_fd);
  853. char buf[128];
  854. while (1) {
  855. int b = read(fd->fd, buf, sizeof(buf));
  856. if (b < 0) {
  857. if (errno == EINTR)
  858. continue;
  859. if (errno == EAGAIN)
  860. return;
  861. goto done;
  862. }
  863. if (!b)
  864. goto done;
  865. }
  866. done:
  867. uloop_timeout_set(&wdev->script_check, 0);
  868. wireless_close_script_proc_fd(wdev);
  869. }
  870. /* watchdog and garbage collector for wireless processes.
  871. * It cleans up terminated processes. If a process is a requirement for the wireless device, it retries the setup */
  872. static void
  873. wireless_device_check_script_tasks(struct uloop_timeout *timeout)
  874. {
  875. struct wireless_device *wdev = container_of(timeout, struct wireless_device, script_check);
  876. struct wireless_process *proc, *tmp;
  877. bool restart = false;
  878. list_for_each_entry_safe(proc, tmp, &wdev->script_proc, list) {
  879. if (wireless_process_check(proc))
  880. continue;
  881. D(WIRELESS, "Wireless device '%s' pid %d has terminated", wdev->name, proc->pid);
  882. if (proc->required)
  883. restart = true;
  884. wireless_process_free(wdev, proc);
  885. }
  886. if (restart)
  887. wireless_device_retry_setup(wdev);
  888. else
  889. uloop_timeout_set(&wdev->script_check, 1000);
  890. }
  891. /* creates a wireless device object. Called by config */
  892. void
  893. wireless_device_create(struct wireless_driver *drv, const char *name, struct blob_attr *data)
  894. {
  895. struct wireless_device *wdev;
  896. char *name_buf;
  897. struct blob_attr *tb[__WDEV_ATTR_MAX];
  898. struct blob_attr *cur;
  899. blobmsg_parse(wdev_policy, __WDEV_ATTR_MAX, tb, blob_data(data), blob_len(data));
  900. wdev = calloc_a(sizeof(*wdev), &name_buf, strlen(name) + 1);
  901. cur = tb[WDEV_ATTR_DISABLED];
  902. wdev->disabled = cur && blobmsg_get_bool(cur);
  903. wdev->drv = drv;
  904. wdev->state = IFS_DOWN;
  905. wdev->config_state = IFC_NORMAL;
  906. wdev->name = strcpy(name_buf, name);
  907. wdev->config = data;
  908. wdev->handler_pending = false;
  909. cur = tb[WDEV_ATTR_SERIALIZE];
  910. wdev->serialize = cur && blobmsg_get_bool(cur);
  911. cur = tb[WDEV_ATTR_RECONF];
  912. wdev->reconf = !cur || blobmsg_get_bool(cur);
  913. wdev->retry_setup_failed = false;
  914. wdev->autostart = true;
  915. INIT_LIST_HEAD(&wdev->script_proc);
  916. vlist_init(&wdev->interfaces, avl_strcmp, vif_update);
  917. wdev->interfaces.keep_old = true;
  918. wdev->timeout.cb = wireless_device_setup_timeout;
  919. wdev->script_task.cb = wireless_device_script_task_cb;
  920. wdev->script_task.dir_fd = drv_fd;
  921. wdev->script_task.log_prefix = wdev->name;
  922. wdev->script_proc_fd.fd = -1;
  923. wdev->script_proc_fd.cb = wireless_proc_poll_fd;
  924. wdev->script_check.cb = wireless_device_check_script_tasks;
  925. vlist_add(&wireless_devices, &wdev->node, wdev->name);
  926. }
  927. /* creates a wireless station object. Called by config */
  928. void
  929. wireless_station_create(struct wireless_interface *vif, struct blob_attr *data, const char *section)
  930. {
  931. struct wireless_station *sta;
  932. struct blob_attr *tb[__STA_ATTR_MAX];
  933. struct blob_attr *cur;
  934. char *name_buf;
  935. char name[8];
  936. blobmsg_parse(sta_policy, __STA_ATTR_MAX, tb, blob_data(data), blob_len(data));
  937. cur = tb[STA_ATTR_DISABLED];
  938. if (cur && blobmsg_get_bool(cur))
  939. return;
  940. sprintf(name, "%d", vif->sta_idx++);
  941. sta = calloc_a(sizeof(*sta),
  942. &name_buf, strlen(name) + 1);
  943. sta->name = strcpy(name_buf, name);
  944. sta->config = data;
  945. sta->section = section;
  946. vlist_add(&vif->stations, &sta->node, sta->name);
  947. }
  948. /* ubus callback network.wireless.status, runs for every interface, encode the station */
  949. static void
  950. wireless_station_status(struct wireless_station *sta, struct blob_buf *b)
  951. {
  952. void *i;
  953. i = blobmsg_open_table(b, NULL);
  954. if (sta->section)
  955. blobmsg_add_string(b, "section", sta->section);
  956. put_container(b, sta->config, "config");
  957. blobmsg_close_table(b, i);
  958. }
  959. /* create a vlan object. Called by config */
  960. void
  961. wireless_vlan_create(struct wireless_interface *vif, struct blob_attr *data, const char *section)
  962. {
  963. struct wireless_vlan *vlan;
  964. struct blob_attr *tb[__VLAN_ATTR_MAX];
  965. struct blob_attr *cur;
  966. char *name_buf;
  967. char name[8];
  968. blobmsg_parse(vlan_policy, __VLAN_ATTR_MAX, tb, blob_data(data), blob_len(data));
  969. cur = tb[VLAN_ATTR_DISABLED];
  970. if (cur && blobmsg_get_bool(cur))
  971. return;
  972. sprintf(name, "%d", vif->vlan_idx++);
  973. vlan = calloc_a(sizeof(*vlan), &name_buf, strlen(name) + 1);
  974. vlan->name = strcpy(name_buf, name);
  975. vlan->config = data;
  976. vlan->section = section;
  977. vlist_add(&vif->vlans, &vlan->node, vlan->name);
  978. }
  979. /* ubus callback network.wireless.status, runs for every interface, encode the vlan informations */
  980. static void
  981. wireless_vlan_status(struct wireless_vlan *vlan, struct blob_buf *b)
  982. {
  983. void *i;
  984. i = blobmsg_open_table(b, NULL);
  985. if (vlan->section)
  986. blobmsg_add_string(b, "section", vlan->section);
  987. if (vlan->ifname)
  988. blobmsg_add_string(b, "ifname", vlan->ifname);
  989. put_container(b, vlan->config, "config");
  990. blobmsg_close_table(b, i);
  991. }
  992. /* create a wireless interface object. Called by config */
  993. struct wireless_interface* wireless_interface_create(struct wireless_device *wdev, struct blob_attr *data, const char *section)
  994. {
  995. struct wireless_interface *vif;
  996. struct blob_attr *tb[__VIF_ATTR_MAX];
  997. struct blob_attr *cur;
  998. char *name_buf;
  999. char name[8];
  1000. blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(data), blob_len(data));
  1001. cur = tb[VIF_ATTR_DISABLED];
  1002. if (cur && blobmsg_get_bool(cur))
  1003. return NULL;
  1004. sprintf(name, "%d", wdev->vif_idx++);
  1005. vif = calloc_a(sizeof(*vif),
  1006. &name_buf, strlen(name) + 1);
  1007. vif->name = strcpy(name_buf, name);
  1008. vif->wdev = wdev;
  1009. vif->config = data;
  1010. vif->section = section;
  1011. vif->isolate = false;
  1012. vlist_init(&vif->vlans, avl_strcmp, vlan_update);
  1013. vif->vlans.keep_old = true;
  1014. vlist_init(&vif->stations, avl_strcmp, station_update);
  1015. vif->stations.keep_old = true;
  1016. vlist_add(&wdev->interfaces, &vif->node, vif->name);
  1017. return vlist_find(&wdev->interfaces, name, vif, node);
  1018. }
  1019. /* ubus callback network.wireless.status, runs for every interface */
  1020. static void
  1021. wireless_interface_status(struct wireless_interface *iface, struct blob_buf *b)
  1022. {
  1023. struct wireless_vlan *vlan;
  1024. struct wireless_station *sta;
  1025. void *i, *j;
  1026. i = blobmsg_open_table(b, NULL);
  1027. if (iface->section)
  1028. blobmsg_add_string(b, "section", iface->section);
  1029. if (iface->ifname)
  1030. blobmsg_add_string(b, "ifname", iface->ifname);
  1031. put_container(b, iface->config, "config");
  1032. j = blobmsg_open_array(b, "vlans");
  1033. vlist_for_each_element(&iface->vlans, vlan, node)
  1034. wireless_vlan_status(vlan, b);
  1035. blobmsg_close_array(b, j);
  1036. j = blobmsg_open_array(b, "stations");
  1037. vlist_for_each_element(&iface->stations, sta, node)
  1038. wireless_station_status(sta, b);
  1039. blobmsg_close_array(b, j);
  1040. blobmsg_close_table(b, i);
  1041. }
  1042. /* ubus callback network.wireless.status */
  1043. void
  1044. wireless_device_status(struct wireless_device *wdev, struct blob_buf *b)
  1045. {
  1046. struct wireless_interface *iface;
  1047. void *c, *i;
  1048. c = blobmsg_open_table(b, wdev->name);
  1049. blobmsg_add_u8(b, "up", wdev->state == IFS_UP);
  1050. blobmsg_add_u8(b, "pending", wdev->state == IFS_SETUP || wdev->state == IFS_TEARDOWN);
  1051. blobmsg_add_u8(b, "autostart", wdev->autostart);
  1052. blobmsg_add_u8(b, "disabled", wdev->disabled);
  1053. blobmsg_add_u8(b, "retry_setup_failed", wdev->retry_setup_failed);
  1054. put_container(b, wdev->config, "config");
  1055. i = blobmsg_open_array(b, "interfaces");
  1056. vlist_for_each_element(&wdev->interfaces, iface, node)
  1057. wireless_interface_status(iface, b);
  1058. blobmsg_close_array(b, i);
  1059. blobmsg_close_table(b, c);
  1060. }
  1061. /* ubus callback network.wireless.get_validate */
  1062. void
  1063. wireless_device_get_validate(struct wireless_device *wdev, struct blob_buf *b)
  1064. {
  1065. struct uci_blob_param_list *p;
  1066. void *c, *d;
  1067. int i;
  1068. c = blobmsg_open_table(b, wdev->name);
  1069. d = blobmsg_open_table(b, "device");
  1070. p = wdev->drv->device.config;
  1071. for (i = 0; i < p->n_params; i++)
  1072. blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i));
  1073. blobmsg_close_table(b, d);
  1074. d = blobmsg_open_table(b, "interface");
  1075. p = wdev->drv->interface.config;
  1076. for (i = 0; i < p->n_params; i++)
  1077. blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i));
  1078. blobmsg_close_table(b, d);
  1079. blobmsg_close_table(b, c);
  1080. }
  1081. /* ubus callback network.wireless.notify, command = set data, for vif */
  1082. static void
  1083. wireless_interface_set_data(struct wireless_interface *vif)
  1084. {
  1085. enum {
  1086. VIF_DATA_IFNAME,
  1087. __VIF_DATA_MAX,
  1088. };
  1089. static const struct blobmsg_policy data_policy[__VIF_DATA_MAX] = {
  1090. [VIF_DATA_IFNAME] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING },
  1091. };
  1092. struct blob_attr *tb[__VIF_DATA_MAX];
  1093. struct blob_attr *cur;
  1094. blobmsg_parse(data_policy, __VIF_DATA_MAX, tb,
  1095. blobmsg_data(vif->data), blobmsg_data_len(vif->data));
  1096. if ((cur = tb[VIF_DATA_IFNAME]))
  1097. vif->ifname = blobmsg_data(cur);
  1098. }
  1099. /* ubus callback network.wireless.notify, command = set data, for vlan */
  1100. static void
  1101. wireless_vlan_set_data(struct wireless_vlan *vlan)
  1102. {
  1103. enum {
  1104. VLAN_DATA_IFNAME,
  1105. __VLAN_DATA_MAX,
  1106. };
  1107. static const struct blobmsg_policy data_policy[__VLAN_DATA_MAX] = {
  1108. [VLAN_DATA_IFNAME] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING },
  1109. };
  1110. struct blob_attr *tb[__VLAN_DATA_MAX];
  1111. struct blob_attr *cur;
  1112. blobmsg_parse(data_policy, __VLAN_DATA_MAX, tb,
  1113. blobmsg_data(vlan->data), blobmsg_data_len(vlan->data));
  1114. if ((cur = tb[VLAN_DATA_IFNAME]))
  1115. vlan->ifname = blobmsg_data(cur);
  1116. }
  1117. /* ubus callback network.wireless.notify, command = process add */
  1118. static int
  1119. wireless_device_add_process(struct wireless_device *wdev, struct blob_attr *data)
  1120. {
  1121. enum {
  1122. PROC_ATTR_PID,
  1123. PROC_ATTR_EXE,
  1124. PROC_ATTR_REQUIRED,
  1125. PROC_ATTR_KEEP,
  1126. __PROC_ATTR_MAX
  1127. };
  1128. static const struct blobmsg_policy proc_policy[__PROC_ATTR_MAX] = {
  1129. [PROC_ATTR_PID] = { .name = "pid", .type = BLOBMSG_TYPE_INT32 },
  1130. [PROC_ATTR_EXE] = { .name = "exe", .type = BLOBMSG_TYPE_STRING },
  1131. [PROC_ATTR_REQUIRED] = { .name = "required", .type = BLOBMSG_TYPE_BOOL },
  1132. [PROC_ATTR_KEEP] = { .name = "keep", .type = BLOBMSG_TYPE_BOOL },
  1133. };
  1134. struct blob_attr *tb[__PROC_ATTR_MAX];
  1135. struct wireless_process *proc;
  1136. char *name;
  1137. int pid;
  1138. if (!data)
  1139. return UBUS_STATUS_INVALID_ARGUMENT;
  1140. blobmsg_parse(proc_policy, __PROC_ATTR_MAX, tb, blobmsg_data(data), blobmsg_data_len(data));
  1141. if (!tb[PROC_ATTR_PID] || !tb[PROC_ATTR_EXE])
  1142. return UBUS_STATUS_INVALID_ARGUMENT;
  1143. pid = blobmsg_get_u32(tb[PROC_ATTR_PID]);
  1144. if (pid < 2)
  1145. return UBUS_STATUS_INVALID_ARGUMENT;
  1146. proc = calloc_a(sizeof(*proc),
  1147. &name, strlen(blobmsg_data(tb[PROC_ATTR_EXE])) + 1);
  1148. proc->pid = pid;
  1149. proc->exe = strcpy(name, blobmsg_data(tb[PROC_ATTR_EXE]));
  1150. if (tb[PROC_ATTR_REQUIRED])
  1151. proc->required = blobmsg_get_bool(tb[PROC_ATTR_REQUIRED]);
  1152. if (tb[PROC_ATTR_KEEP])
  1153. proc->keep = blobmsg_get_bool(tb[PROC_ATTR_KEEP]);
  1154. D(WIRELESS, "Wireless device '%s' add pid %d", wdev->name, proc->pid);
  1155. list_add(&proc->list, &wdev->script_proc);
  1156. uloop_timeout_set(&wdev->script_check, 0);
  1157. return 0;
  1158. }
  1159. /* ubus callback network.wireless.notify, command = process kill all */
  1160. static int
  1161. wireless_device_process_kill_all(struct wireless_device *wdev, struct blob_attr *data,
  1162. struct ubus_request_data *req)
  1163. {
  1164. enum {
  1165. KILL_ATTR_SIGNAL,
  1166. KILL_ATTR_IMMEDIATE,
  1167. __KILL_ATTR_MAX
  1168. };
  1169. static const struct blobmsg_policy kill_policy[__KILL_ATTR_MAX] = {
  1170. [KILL_ATTR_SIGNAL] = { .name = "signal", .type = BLOBMSG_TYPE_INT32 },
  1171. [KILL_ATTR_IMMEDIATE] = { .name = "immediate", .type = BLOBMSG_TYPE_BOOL },
  1172. };
  1173. struct blob_attr *tb[__KILL_ATTR_MAX];
  1174. struct blob_attr *cur;
  1175. bool immediate = false;
  1176. int signal = SIGTERM;
  1177. blobmsg_parse(kill_policy, __KILL_ATTR_MAX, tb, blobmsg_data(data), blobmsg_data_len(data));
  1178. if ((cur = tb[KILL_ATTR_SIGNAL]))
  1179. signal = blobmsg_get_u32(cur);
  1180. if ((cur = tb[KILL_ATTR_IMMEDIATE]))
  1181. immediate = blobmsg_get_bool(cur);
  1182. if (wdev->state != IFS_TEARDOWN || wdev->kill_request)
  1183. return UBUS_STATUS_PERMISSION_DENIED;
  1184. wireless_process_kill_all(wdev, signal, immediate);
  1185. if (list_empty(&wdev->script_proc))
  1186. return 0;
  1187. wdev->kill_request = calloc(1, sizeof(*wdev->kill_request));
  1188. ubus_defer_request(ubus_ctx, req, wdev->kill_request);
  1189. return 0;
  1190. }
  1191. /* ubus callback network.wireless.notify, command = set_retry */
  1192. static int
  1193. wireless_device_set_retry(struct wireless_device *wdev, struct blob_attr *data)
  1194. {
  1195. static const struct blobmsg_policy retry_policy = {
  1196. .name = "retry", .type = BLOBMSG_TYPE_INT32
  1197. };
  1198. struct blob_attr *val;
  1199. blobmsg_parse(&retry_policy, 1, &val, blobmsg_data(data), blobmsg_data_len(data));
  1200. if (val)
  1201. wdev->retry = blobmsg_get_u32(val);
  1202. else
  1203. wdev->retry = WIRELESS_SETUP_RETRY;
  1204. __wireless_device_set_up(wdev, 0);
  1205. netifd_log_message(L_NOTICE, "Wireless device '%s' set retry=%d\n", wdev->name, wdev->retry);
  1206. return 0;
  1207. }
  1208. enum {
  1209. NOTIFY_CMD_UP = 0,
  1210. NOTIFY_CMD_SET_DATA = 1,
  1211. NOTIFY_CMD_PROCESS_ADD = 2,
  1212. NOTIFY_CMD_PROCESS_KILL_ALL = 3,
  1213. NOTIFY_CMD_SET_RETRY = 4,
  1214. };
  1215. /* ubus callback network.wireless.notify */
  1216. int
  1217. wireless_device_notify(struct wireless_device *wdev, struct blob_attr *data,
  1218. struct ubus_request_data *req)
  1219. {
  1220. enum {
  1221. NOTIFY_ATTR_COMMAND,
  1222. NOTIFY_ATTR_VIF,
  1223. NOTIFY_ATTR_VLAN,
  1224. NOTIFY_ATTR_DATA,
  1225. __NOTIFY_MAX,
  1226. };
  1227. static const struct blobmsg_policy notify_policy[__NOTIFY_MAX] = {
  1228. [NOTIFY_ATTR_COMMAND] = { .name = "command", .type = BLOBMSG_TYPE_INT32 },
  1229. [NOTIFY_ATTR_VIF] = { .name = "interface", .type = BLOBMSG_TYPE_STRING },
  1230. [NOTIFY_ATTR_VLAN] = { .name = "vlan", .type = BLOBMSG_TYPE_STRING },
  1231. [NOTIFY_ATTR_DATA] = { .name = "data", .type = BLOBMSG_TYPE_TABLE },
  1232. };
  1233. struct wireless_interface *vif = NULL;
  1234. struct wireless_vlan *vlan = NULL;
  1235. struct blob_attr *tb[__NOTIFY_MAX];
  1236. struct blob_attr *cur, **pdata;
  1237. blobmsg_parse(notify_policy, __NOTIFY_MAX, tb, blob_data(data), blob_len(data));
  1238. if (!tb[NOTIFY_ATTR_COMMAND])
  1239. return UBUS_STATUS_INVALID_ARGUMENT;
  1240. if ((cur = tb[NOTIFY_ATTR_VIF]) != NULL) {
  1241. vif = vlist_find(&wdev->interfaces, blobmsg_data(cur), vif, node);
  1242. if (!vif)
  1243. return UBUS_STATUS_NOT_FOUND;
  1244. }
  1245. if ((cur = tb[NOTIFY_ATTR_VLAN]) != NULL) {
  1246. if (!vif)
  1247. return UBUS_STATUS_NOT_FOUND;
  1248. vlan = vlist_find(&vif->vlans, blobmsg_data(cur), vlan, node);
  1249. if (!vlan)
  1250. return UBUS_STATUS_NOT_FOUND;
  1251. }
  1252. cur = tb[NOTIFY_ATTR_DATA];
  1253. if (!cur)
  1254. return UBUS_STATUS_INVALID_ARGUMENT;
  1255. switch (blobmsg_get_u32(tb[NOTIFY_ATTR_COMMAND])) {
  1256. case NOTIFY_CMD_UP:
  1257. if (vif || vlan)
  1258. return UBUS_STATUS_INVALID_ARGUMENT;
  1259. if (wdev->state != IFS_SETUP)
  1260. return UBUS_STATUS_PERMISSION_DENIED;
  1261. wireless_device_mark_up(wdev);
  1262. break;
  1263. case NOTIFY_CMD_SET_DATA:
  1264. if (vlan)
  1265. pdata = &vlan->data;
  1266. else if (vif)
  1267. pdata = &vif->data;
  1268. else
  1269. pdata = &wdev->data;
  1270. free(*pdata);
  1271. *pdata = blob_memdup(cur);
  1272. if (vlan)
  1273. wireless_vlan_set_data(vlan);
  1274. else if (vif)
  1275. wireless_interface_set_data(vif);
  1276. wdev_prepare_prev_config(wdev);
  1277. break;
  1278. case NOTIFY_CMD_PROCESS_ADD:
  1279. return wireless_device_add_process(wdev, cur);
  1280. case NOTIFY_CMD_PROCESS_KILL_ALL:
  1281. return wireless_device_process_kill_all(wdev, cur, req);
  1282. case NOTIFY_CMD_SET_RETRY:
  1283. return wireless_device_set_retry(wdev, cur);
  1284. default:
  1285. return UBUS_STATUS_INVALID_ARGUMENT;
  1286. }
  1287. return 0;
  1288. }
  1289. static void
  1290. wdev_check_network_enabled(struct wireless_device *wdev)
  1291. {
  1292. struct wireless_interface *vif;
  1293. struct interface *iface;
  1294. struct blob_attr *cur;
  1295. size_t rem;
  1296. vlist_for_each_element(&wdev->interfaces, vif, node) {
  1297. int enabled = -1;
  1298. blobmsg_for_each_attr(cur, vif->network, rem) {
  1299. iface = vlist_find(&interfaces, blobmsg_get_string(cur), iface, node);
  1300. if (!iface)
  1301. continue;
  1302. if (iface->autostart) {
  1303. enabled = 1;
  1304. break;
  1305. }
  1306. if (enabled != 1)
  1307. enabled = 0;
  1308. }
  1309. if (vif->disabled == !enabled)
  1310. continue;
  1311. vif->disabled = !enabled;
  1312. wdev->config_update = true;
  1313. }
  1314. }
  1315. static void
  1316. __wireless_start_pending(struct uloop_timeout *t)
  1317. {
  1318. struct wireless_device *wdev;
  1319. vlist_for_each_element(&wireless_devices, wdev, node) {
  1320. wdev_check_network_enabled(wdev);
  1321. if (wdev->config_update)
  1322. wdev_set_config_state(wdev, IFC_RELOAD);
  1323. __wireless_device_set_up(wdev, 0);
  1324. }
  1325. }
  1326. void wireless_start_pending(int timeout)
  1327. {
  1328. static struct uloop_timeout timer = {
  1329. .cb = __wireless_start_pending
  1330. };
  1331. if (timeout) {
  1332. uloop_timeout_set(&timer, timeout);
  1333. return;
  1334. }
  1335. uloop_timeout_cancel(&timer);
  1336. timer.cb(&timer);
  1337. }
  1338. void wireless_check_network_enabled(void)
  1339. {
  1340. struct wireless_device *wdev;
  1341. vlist_for_each_element(&wireless_devices, wdev, node) {
  1342. wdev_check_network_enabled(wdev);
  1343. if (wdev->config_update)
  1344. wireless_start_pending(1000);
  1345. }
  1346. }
  1347. void wireless_device_hotplug_event(const char *name, bool add)
  1348. {
  1349. struct wireless_interface *vif;
  1350. struct wireless_device *wdev;
  1351. const char *s;
  1352. size_t len;
  1353. s = strstr(name, ".sta");
  1354. if (s) {
  1355. if (strchr(s + 4, '.'))
  1356. return;
  1357. len = s - name;
  1358. } else if (!device_find(name)) {
  1359. len = strlen(name);
  1360. } else {
  1361. return;
  1362. }
  1363. vlist_for_each_element(&wireless_devices, wdev, node) {
  1364. vlist_for_each_element(&wdev->interfaces, vif, node) {
  1365. if (!vif->ifname)
  1366. continue;
  1367. if (strlen(vif->ifname) != len ||
  1368. strncmp(vif->ifname, name, len) != 0)
  1369. continue;
  1370. wireless_interface_handle_link(vif, name, add);
  1371. }
  1372. }
  1373. }