device.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  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 <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <libubox/list.h>
  21. #include "netifd.h"
  22. #include "system.h"
  23. #include "config.h"
  24. static struct list_head devtypes = LIST_HEAD_INIT(devtypes);
  25. static struct avl_tree devices;
  26. static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
  27. [DEV_ATTR_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING },
  28. [DEV_ATTR_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 },
  29. [DEV_ATTR_MTU6] = { .name = "mtu6", .type = BLOBMSG_TYPE_INT32 },
  30. [DEV_ATTR_MACADDR] = { .name = "macaddr", .type = BLOBMSG_TYPE_STRING },
  31. [DEV_ATTR_TXQUEUELEN] = { .name = "txqueuelen", .type = BLOBMSG_TYPE_INT32 },
  32. [DEV_ATTR_ENABLED] = { .name = "enabled", .type = BLOBMSG_TYPE_BOOL },
  33. [DEV_ATTR_IPV6] = { .name = "ipv6", .type = BLOBMSG_TYPE_BOOL },
  34. [DEV_ATTR_IP6SEGMENTROUTING] = { .name = "ip6segmentrouting", .type = BLOBMSG_TYPE_BOOL },
  35. [DEV_ATTR_PROMISC] = { .name = "promisc", .type = BLOBMSG_TYPE_BOOL },
  36. [DEV_ATTR_RPFILTER] = { .name = "rpfilter", .type = BLOBMSG_TYPE_STRING },
  37. [DEV_ATTR_ACCEPTLOCAL] = { .name = "acceptlocal", .type = BLOBMSG_TYPE_BOOL },
  38. [DEV_ATTR_IGMPVERSION] = { .name = "igmpversion", .type = BLOBMSG_TYPE_INT32 },
  39. [DEV_ATTR_MLDVERSION] = { .name = "mldversion", .type = BLOBMSG_TYPE_INT32 },
  40. [DEV_ATTR_NEIGHREACHABLETIME] = { .name = "neighreachabletime", .type = BLOBMSG_TYPE_INT32 },
  41. [DEV_ATTR_NEIGHGCSTALETIME] = { .name = "neighgcstaletime", .type = BLOBMSG_TYPE_INT32 },
  42. [DEV_ATTR_DADTRANSMITS] = { .name = "dadtransmits", .type = BLOBMSG_TYPE_INT32 },
  43. [DEV_ATTR_MULTICAST_TO_UNICAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
  44. [DEV_ATTR_MULTICAST_ROUTER] = { .name = "multicast_router", .type = BLOBMSG_TYPE_INT32 },
  45. [DEV_ATTR_MULTICAST_FAST_LEAVE] = { .name = "multicast_fast_leave", . type = BLOBMSG_TYPE_BOOL },
  46. [DEV_ATTR_MULTICAST] = { .name ="multicast", .type = BLOBMSG_TYPE_BOOL },
  47. [DEV_ATTR_LEARNING] = { .name ="learning", .type = BLOBMSG_TYPE_BOOL },
  48. [DEV_ATTR_UNICAST_FLOOD] = { .name ="unicast_flood", .type = BLOBMSG_TYPE_BOOL },
  49. [DEV_ATTR_SENDREDIRECTS] = { .name = "sendredirects", .type = BLOBMSG_TYPE_BOOL },
  50. [DEV_ATTR_NEIGHLOCKTIME] = { .name = "neighlocktime", .type = BLOBMSG_TYPE_INT32 },
  51. [DEV_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
  52. [DEV_ATTR_DROP_V4_UNICAST_IN_L2_MULTICAST] = { .name = "drop_v4_unicast_in_l2_multicast", .type = BLOBMSG_TYPE_BOOL },
  53. [DEV_ATTR_DROP_V6_UNICAST_IN_L2_MULTICAST] = { .name = "drop_v6_unicast_in_l2_multicast", .type = BLOBMSG_TYPE_BOOL },
  54. [DEV_ATTR_DROP_GRATUITOUS_ARP] = { .name = "drop_gratuitous_arp", .type = BLOBMSG_TYPE_BOOL },
  55. [DEV_ATTR_DROP_UNSOLICITED_NA] = { .name = "drop_unsolicited_na", .type = BLOBMSG_TYPE_BOOL },
  56. [DEV_ATTR_ARP_ACCEPT] = { .name = "arp_accept", .type = BLOBMSG_TYPE_BOOL },
  57. };
  58. const struct uci_blob_param_list device_attr_list = {
  59. .n_params = __DEV_ATTR_MAX,
  60. .params = dev_attrs,
  61. };
  62. static int __devlock = 0;
  63. int device_type_add(struct device_type *devtype)
  64. {
  65. if (device_type_get(devtype->name)) {
  66. netifd_log_message(L_WARNING, "Device handler '%s' already exists\n",
  67. devtype->name);
  68. return 1;
  69. }
  70. netifd_log_message(L_NOTICE, "Added device handler type: %s\n",
  71. devtype->name);
  72. list_add(&devtype->list, &devtypes);
  73. return 0;
  74. }
  75. struct device_type *
  76. device_type_get(const char *tname)
  77. {
  78. struct device_type *cur;
  79. list_for_each_entry(cur, &devtypes, list)
  80. if (!strcmp(cur->name, tname))
  81. return cur;
  82. return NULL;
  83. }
  84. void device_lock(void)
  85. {
  86. __devlock++;
  87. }
  88. void device_unlock(void)
  89. {
  90. __devlock--;
  91. if (!__devlock)
  92. device_free_unused(NULL);
  93. }
  94. static int device_vlan_len(struct kvlist *kv, const void *data)
  95. {
  96. return sizeof(unsigned int);
  97. }
  98. void device_vlan_update(bool done)
  99. {
  100. struct device *dev;
  101. avl_for_each_element(&devices, dev, avl) {
  102. if (!dev->vlans.update)
  103. continue;
  104. if (!done) {
  105. if (dev->vlan_aliases.get_len)
  106. kvlist_free(&dev->vlan_aliases);
  107. else
  108. kvlist_init(&dev->vlan_aliases, device_vlan_len);
  109. vlist_update(&dev->vlans);
  110. } else {
  111. vlist_flush(&dev->vlans);
  112. }
  113. }
  114. }
  115. static int set_device_state(struct device *dev, bool state)
  116. {
  117. if (state) {
  118. /* Get ifindex for all devices being enabled so a valid */
  119. /* ifindex is in place avoiding possible race conditions */
  120. device_set_ifindex(dev, system_if_resolve(dev));
  121. if (!dev->ifindex)
  122. return -1;
  123. system_if_get_settings(dev, &dev->orig_settings);
  124. /* Only keep orig settings based on what needs to be set */
  125. dev->orig_settings.valid_flags = dev->orig_settings.flags;
  126. dev->orig_settings.flags &= dev->settings.flags;
  127. system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
  128. system_if_up(dev);
  129. } else {
  130. system_if_down(dev);
  131. system_if_apply_settings(dev, &dev->orig_settings, dev->orig_settings.flags);
  132. }
  133. return 0;
  134. }
  135. static int
  136. simple_device_set_state(struct device *dev, bool state)
  137. {
  138. struct device *pdev;
  139. int ret = 0;
  140. pdev = dev->parent.dev;
  141. if (state && !pdev) {
  142. pdev = system_if_get_parent(dev);
  143. if (pdev)
  144. device_add_user(&dev->parent, pdev);
  145. }
  146. if (pdev) {
  147. if (state)
  148. ret = device_claim(&dev->parent);
  149. else
  150. device_release(&dev->parent);
  151. if (ret < 0)
  152. return ret;
  153. }
  154. return set_device_state(dev, state);
  155. }
  156. static struct device *
  157. simple_device_create(const char *name, struct device_type *devtype,
  158. struct blob_attr *attr)
  159. {
  160. struct blob_attr *tb[__DEV_ATTR_MAX];
  161. struct device *dev = NULL;
  162. /* device type is unused for simple devices */
  163. devtype = NULL;
  164. blobmsg_parse(dev_attrs, __DEV_ATTR_MAX, tb, blob_data(attr), blob_len(attr));
  165. dev = device_get(name, true);
  166. if (!dev)
  167. return NULL;
  168. dev->set_state = simple_device_set_state;
  169. device_init_settings(dev, tb);
  170. return dev;
  171. }
  172. static void simple_device_free(struct device *dev)
  173. {
  174. if (dev->parent.dev)
  175. device_remove_user(&dev->parent);
  176. free(dev);
  177. }
  178. struct device_type simple_device_type = {
  179. .name = "Network device",
  180. .config_params = &device_attr_list,
  181. .create = simple_device_create,
  182. .check_state = system_if_check,
  183. .free = simple_device_free,
  184. };
  185. void
  186. device_merge_settings(struct device *dev, struct device_settings *n)
  187. {
  188. struct device_settings *os = &dev->orig_settings;
  189. struct device_settings *s = &dev->settings;
  190. memset(n, 0, sizeof(*n));
  191. n->mtu = s->flags & DEV_OPT_MTU ? s->mtu : os->mtu;
  192. n->mtu6 = s->flags & DEV_OPT_MTU6 ? s->mtu6 : os->mtu6;
  193. n->txqueuelen = s->flags & DEV_OPT_TXQUEUELEN ?
  194. s->txqueuelen : os->txqueuelen;
  195. memcpy(n->macaddr,
  196. (s->flags & (DEV_OPT_MACADDR|DEV_OPT_DEFAULT_MACADDR) ? s->macaddr : os->macaddr),
  197. sizeof(n->macaddr));
  198. n->ipv6 = s->flags & DEV_OPT_IPV6 ? s->ipv6 : os->ipv6;
  199. n->ip6segmentrouting = s->flags & DEV_OPT_IP6SEGMENTROUTING ? s->ip6segmentrouting : os->ip6segmentrouting;
  200. n->promisc = s->flags & DEV_OPT_PROMISC ? s->promisc : os->promisc;
  201. n->rpfilter = s->flags & DEV_OPT_RPFILTER ? s->rpfilter : os->rpfilter;
  202. n->acceptlocal = s->flags & DEV_OPT_ACCEPTLOCAL ? s->acceptlocal : os->acceptlocal;
  203. n->igmpversion = s->flags & DEV_OPT_IGMPVERSION ? s->igmpversion : os->igmpversion;
  204. n->mldversion = s->flags & DEV_OPT_MLDVERSION ? s->mldversion : os->mldversion;
  205. n->neigh4reachabletime = s->flags & DEV_OPT_NEIGHREACHABLETIME ?
  206. s->neigh4reachabletime : os->neigh4reachabletime;
  207. n->neigh6reachabletime = s->flags & DEV_OPT_NEIGHREACHABLETIME ?
  208. s->neigh6reachabletime : os->neigh6reachabletime;
  209. n->neigh4gcstaletime = s->flags & DEV_OPT_NEIGHGCSTALETIME ?
  210. s->neigh4gcstaletime : os->neigh4gcstaletime;
  211. n->neigh6gcstaletime = s->flags & DEV_OPT_NEIGHGCSTALETIME ?
  212. s->neigh6gcstaletime : os->neigh6gcstaletime;
  213. n->neigh4locktime = s->flags & DEV_OPT_NEIGHLOCKTIME ?
  214. s->neigh4locktime : os->neigh4locktime;
  215. n->dadtransmits = s->flags & DEV_OPT_DADTRANSMITS ?
  216. s->dadtransmits : os->dadtransmits;
  217. n->multicast = s->flags & DEV_OPT_MULTICAST ?
  218. s->multicast : os->multicast;
  219. n->multicast_to_unicast = s->multicast_to_unicast;
  220. n->multicast_router = s->multicast_router;
  221. n->multicast_fast_leave = s->multicast_fast_leave;
  222. n->learning = s->learning;
  223. n->unicast_flood = s->unicast_flood;
  224. n->sendredirects = s->flags & DEV_OPT_SENDREDIRECTS ?
  225. s->sendredirects : os->sendredirects;
  226. n->drop_v4_unicast_in_l2_multicast = s->flags & DEV_OPT_DROP_V4_UNICAST_IN_L2_MULTICAST ?
  227. s->drop_v4_unicast_in_l2_multicast : os->drop_v4_unicast_in_l2_multicast;
  228. n->drop_v6_unicast_in_l2_multicast = s->flags & DEV_OPT_DROP_V6_UNICAST_IN_L2_MULTICAST ?
  229. s->drop_v6_unicast_in_l2_multicast : os->drop_v6_unicast_in_l2_multicast;
  230. n->drop_gratuitous_arp = s->flags & DEV_OPT_DROP_GRATUITOUS_ARP ?
  231. s->drop_gratuitous_arp : os->drop_gratuitous_arp;
  232. n->drop_unsolicited_na = s->flags & DEV_OPT_DROP_UNSOLICITED_NA ?
  233. s->drop_unsolicited_na : os->drop_unsolicited_na;
  234. n->arp_accept = s->flags & DEV_OPT_ARP_ACCEPT ?
  235. s->arp_accept : os->arp_accept;
  236. n->flags = s->flags | os->flags | os->valid_flags;
  237. }
  238. void
  239. device_init_settings(struct device *dev, struct blob_attr **tb)
  240. {
  241. struct device_settings *s = &dev->settings;
  242. struct blob_attr *cur;
  243. struct ether_addr *ea;
  244. bool disabled = false;
  245. s->flags = 0;
  246. if ((cur = tb[DEV_ATTR_ENABLED]))
  247. disabled = !blobmsg_get_bool(cur);
  248. if ((cur = tb[DEV_ATTR_MTU]) && blobmsg_get_u32(cur) >= 68) {
  249. s->mtu = blobmsg_get_u32(cur);
  250. s->flags |= DEV_OPT_MTU;
  251. }
  252. if ((cur = tb[DEV_ATTR_MTU6]) && blobmsg_get_u32(cur) >= 1280) {
  253. s->mtu6 = blobmsg_get_u32(cur);
  254. s->flags |= DEV_OPT_MTU6;
  255. }
  256. if ((cur = tb[DEV_ATTR_TXQUEUELEN])) {
  257. s->txqueuelen = blobmsg_get_u32(cur);
  258. s->flags |= DEV_OPT_TXQUEUELEN;
  259. }
  260. if ((cur = tb[DEV_ATTR_MACADDR])) {
  261. ea = ether_aton(blobmsg_data(cur));
  262. if (ea) {
  263. memcpy(s->macaddr, ea, 6);
  264. s->flags |= DEV_OPT_MACADDR;
  265. }
  266. }
  267. if ((cur = tb[DEV_ATTR_IPV6])) {
  268. s->ipv6 = blobmsg_get_bool(cur);
  269. s->flags |= DEV_OPT_IPV6;
  270. }
  271. if ((cur = tb[DEV_ATTR_IP6SEGMENTROUTING])) {
  272. s->ip6segmentrouting = blobmsg_get_bool(cur);
  273. s->flags |= DEV_OPT_IP6SEGMENTROUTING;
  274. }
  275. if ((cur = tb[DEV_ATTR_PROMISC])) {
  276. s->promisc = blobmsg_get_bool(cur);
  277. s->flags |= DEV_OPT_PROMISC;
  278. }
  279. if ((cur = tb[DEV_ATTR_RPFILTER])) {
  280. if (system_resolve_rpfilter(blobmsg_data(cur), &s->rpfilter))
  281. s->flags |= DEV_OPT_RPFILTER;
  282. else
  283. DPRINTF("Failed to resolve rpfilter: %s\n", (char *) blobmsg_data(cur));
  284. }
  285. if ((cur = tb[DEV_ATTR_ACCEPTLOCAL])) {
  286. s->acceptlocal = blobmsg_get_bool(cur);
  287. s->flags |= DEV_OPT_ACCEPTLOCAL;
  288. }
  289. if ((cur = tb[DEV_ATTR_IGMPVERSION])) {
  290. s->igmpversion = blobmsg_get_u32(cur);
  291. if (s->igmpversion >= 1 && s->igmpversion <= 3)
  292. s->flags |= DEV_OPT_IGMPVERSION;
  293. else
  294. DPRINTF("Failed to resolve igmpversion: %d\n", blobmsg_get_u32(cur));
  295. }
  296. if ((cur = tb[DEV_ATTR_MLDVERSION])) {
  297. s->mldversion = blobmsg_get_u32(cur);
  298. if (s->mldversion >= 1 && s->mldversion <= 2)
  299. s->flags |= DEV_OPT_MLDVERSION;
  300. else
  301. DPRINTF("Failed to resolve mldversion: %d\n", blobmsg_get_u32(cur));
  302. }
  303. if ((cur = tb[DEV_ATTR_NEIGHREACHABLETIME])) {
  304. s->neigh6reachabletime = s->neigh4reachabletime = blobmsg_get_u32(cur);
  305. s->flags |= DEV_OPT_NEIGHREACHABLETIME;
  306. }
  307. if ((cur = tb[DEV_ATTR_NEIGHGCSTALETIME])) {
  308. s->neigh6gcstaletime = s->neigh4gcstaletime = blobmsg_get_u32(cur);
  309. s->flags |= DEV_OPT_NEIGHGCSTALETIME;
  310. }
  311. if ((cur = tb[DEV_ATTR_NEIGHLOCKTIME])) {
  312. s->neigh4locktime = blobmsg_get_u32(cur);
  313. s->flags |= DEV_OPT_NEIGHLOCKTIME;
  314. }
  315. if ((cur = tb[DEV_ATTR_DADTRANSMITS])) {
  316. s->dadtransmits = blobmsg_get_u32(cur);
  317. s->flags |= DEV_OPT_DADTRANSMITS;
  318. }
  319. if ((cur = tb[DEV_ATTR_MULTICAST_TO_UNICAST])) {
  320. s->multicast_to_unicast = blobmsg_get_bool(cur);
  321. s->flags |= DEV_OPT_MULTICAST_TO_UNICAST;
  322. }
  323. if ((cur = tb[DEV_ATTR_MULTICAST_ROUTER])) {
  324. s->multicast_router = blobmsg_get_u32(cur);
  325. if (s->multicast_router <= 2)
  326. s->flags |= DEV_OPT_MULTICAST_ROUTER;
  327. else
  328. DPRINTF("Invalid value: %d - (Use 0: never, 1: learn, 2: always)\n", blobmsg_get_u32(cur));
  329. }
  330. if ((cur = tb[DEV_ATTR_MULTICAST_FAST_LEAVE])) {
  331. s->multicast_fast_leave = blobmsg_get_bool(cur);
  332. s->flags |= DEV_OPT_MULTICAST_FAST_LEAVE;
  333. }
  334. if ((cur = tb[DEV_ATTR_MULTICAST])) {
  335. s->multicast = blobmsg_get_bool(cur);
  336. s->flags |= DEV_OPT_MULTICAST;
  337. }
  338. if ((cur = tb[DEV_ATTR_LEARNING])) {
  339. s->learning = blobmsg_get_bool(cur);
  340. s->flags |= DEV_OPT_LEARNING;
  341. }
  342. if ((cur = tb[DEV_ATTR_UNICAST_FLOOD])) {
  343. s->unicast_flood = blobmsg_get_bool(cur);
  344. s->flags |= DEV_OPT_UNICAST_FLOOD;
  345. }
  346. if ((cur = tb[DEV_ATTR_SENDREDIRECTS])) {
  347. s->sendredirects = blobmsg_get_bool(cur);
  348. s->flags |= DEV_OPT_SENDREDIRECTS;
  349. }
  350. if ((cur = tb[DEV_ATTR_ISOLATE])) {
  351. s->isolate = blobmsg_get_bool(cur);
  352. s->flags |= DEV_OPT_ISOLATE;
  353. }
  354. if ((cur = tb[DEV_ATTR_DROP_V4_UNICAST_IN_L2_MULTICAST])) {
  355. s->drop_v4_unicast_in_l2_multicast = blobmsg_get_bool(cur);
  356. s->flags |= DEV_OPT_DROP_V4_UNICAST_IN_L2_MULTICAST;
  357. }
  358. if ((cur = tb[DEV_ATTR_DROP_V6_UNICAST_IN_L2_MULTICAST])) {
  359. s->drop_v6_unicast_in_l2_multicast = blobmsg_get_bool(cur);
  360. s->flags |= DEV_OPT_DROP_V6_UNICAST_IN_L2_MULTICAST;
  361. }
  362. if ((cur = tb[DEV_ATTR_DROP_GRATUITOUS_ARP])) {
  363. s->drop_gratuitous_arp = blobmsg_get_bool(cur);
  364. s->flags |= DEV_OPT_DROP_GRATUITOUS_ARP;
  365. }
  366. if ((cur = tb[DEV_ATTR_DROP_UNSOLICITED_NA])) {
  367. s->drop_unsolicited_na = blobmsg_get_bool(cur);
  368. s->flags |= DEV_OPT_DROP_UNSOLICITED_NA;
  369. }
  370. if ((cur = tb[DEV_ATTR_ARP_ACCEPT])) {
  371. s->arp_accept = blobmsg_get_bool(cur);
  372. s->flags |= DEV_OPT_ARP_ACCEPT;
  373. }
  374. device_set_disabled(dev, disabled);
  375. }
  376. static void __init dev_init(void)
  377. {
  378. avl_init(&devices, avl_strcmp, true, NULL);
  379. }
  380. static int device_broadcast_cb(void *ctx, struct safe_list *list)
  381. {
  382. struct device_user *dep = container_of(list, struct device_user, list);
  383. int *ev = ctx;
  384. /* device might have been removed by an earlier callback */
  385. if (!dep->dev)
  386. return 0;
  387. if (dep->cb)
  388. dep->cb(dep, *ev);
  389. return 0;
  390. }
  391. void device_broadcast_event(struct device *dev, enum device_event ev)
  392. {
  393. int dev_ev = ev;
  394. safe_list_for_each(&dev->aliases, device_broadcast_cb, &dev_ev);
  395. safe_list_for_each(&dev->users, device_broadcast_cb, &dev_ev);
  396. }
  397. static void
  398. device_fill_default_settings(struct device *dev)
  399. {
  400. struct device_settings *s = &dev->settings;
  401. struct ether_addr *ea;
  402. if (!(s->flags & DEV_OPT_MACADDR)) {
  403. ea = config_get_default_macaddr(dev->ifname);
  404. if (ea) {
  405. memcpy(s->macaddr, ea, 6);
  406. s->flags |= DEV_OPT_DEFAULT_MACADDR;
  407. }
  408. }
  409. }
  410. int device_claim(struct device_user *dep)
  411. {
  412. struct device *dev = dep->dev;
  413. int ret = 0;
  414. if (dep->claimed)
  415. return 0;
  416. if (!dev)
  417. return -1;
  418. dep->claimed = true;
  419. D(DEVICE, "Claim %s %s, new active count: %d\n", dev->type->name, dev->ifname, dev->active + 1);
  420. if (++dev->active != 1)
  421. return 0;
  422. device_broadcast_event(dev, DEV_EVENT_SETUP);
  423. device_fill_default_settings(dev);
  424. if (dev->external) {
  425. /* Get ifindex for external claimed devices so a valid */
  426. /* ifindex is in place avoiding possible race conditions */
  427. device_set_ifindex(dev, system_if_resolve(dev));
  428. if (!dev->ifindex)
  429. ret = -1;
  430. system_if_get_settings(dev, &dev->orig_settings);
  431. } else
  432. ret = dev->set_state(dev, true);
  433. if (ret == 0)
  434. device_broadcast_event(dev, DEV_EVENT_UP);
  435. else {
  436. D(DEVICE, "claim %s %s failed: %d\n", dev->type->name, dev->ifname, ret);
  437. dev->active = 0;
  438. dep->claimed = false;
  439. }
  440. return ret;
  441. }
  442. void device_release(struct device_user *dep)
  443. {
  444. struct device *dev = dep->dev;
  445. if (!dep->claimed)
  446. return;
  447. dep->claimed = false;
  448. dev->active--;
  449. D(DEVICE, "Release %s %s, new active count: %d\n", dev->type->name, dev->ifname, dev->active);
  450. assert(dev->active >= 0);
  451. if (dev->active)
  452. return;
  453. device_broadcast_event(dev, DEV_EVENT_TEARDOWN);
  454. if (!dev->external)
  455. dev->set_state(dev, false);
  456. if (dev->active)
  457. return;
  458. device_broadcast_event(dev, DEV_EVENT_DOWN);
  459. }
  460. int device_check_state(struct device *dev)
  461. {
  462. if (!dev->type->check_state)
  463. return simple_device_type.check_state(dev);
  464. return dev->type->check_state(dev);
  465. }
  466. int device_init_virtual(struct device *dev, struct device_type *type, const char *name)
  467. {
  468. assert(dev);
  469. assert(type);
  470. D(DEVICE, "Initialize device '%s'\n", name ? name : "");
  471. INIT_SAFE_LIST(&dev->users);
  472. INIT_SAFE_LIST(&dev->aliases);
  473. dev->type = type;
  474. if (name) {
  475. int ret;
  476. ret = device_set_ifname(dev, name);
  477. if (ret < 0)
  478. return ret;
  479. }
  480. if (!dev->set_state)
  481. dev->set_state = set_device_state;
  482. return 0;
  483. }
  484. int device_init(struct device *dev, struct device_type *type, const char *ifname)
  485. {
  486. int ret;
  487. ret = device_init_virtual(dev, type, ifname);
  488. if (ret < 0)
  489. return ret;
  490. dev->avl.key = dev->ifname;
  491. ret = avl_insert(&devices, &dev->avl);
  492. if (ret < 0)
  493. return ret;
  494. system_if_clear_state(dev);
  495. return 0;
  496. }
  497. static struct device *
  498. device_create_default(const char *name, bool external)
  499. {
  500. struct device *dev;
  501. if (!external && system_if_force_external(name))
  502. return NULL;
  503. D(DEVICE, "Create simple device '%s'\n", name);
  504. dev = calloc(1, sizeof(*dev));
  505. if (!dev)
  506. return NULL;
  507. dev->external = external;
  508. dev->set_state = simple_device_set_state;
  509. if (device_init(dev, &simple_device_type, name) < 0) {
  510. device_cleanup(dev);
  511. free(dev);
  512. return NULL;
  513. }
  514. dev->default_config = true;
  515. if (external)
  516. system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
  517. device_check_state(dev);
  518. return dev;
  519. }
  520. struct device *
  521. device_find(const char *name)
  522. {
  523. struct device *dev;
  524. return avl_find_element(&devices, name, dev, avl);
  525. }
  526. struct device *
  527. device_get(const char *name, int create)
  528. {
  529. struct device *dev;
  530. dev = avl_find_element(&devices, name, dev, avl);
  531. if (!dev && strchr(name, '.'))
  532. return get_vlan_device_chain(name, create);
  533. if (name[0] == '@')
  534. return device_alias_get(name + 1);
  535. if (dev) {
  536. if (create > 1 && !dev->external) {
  537. system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
  538. dev->external = true;
  539. device_set_present(dev, true);
  540. }
  541. return dev;
  542. }
  543. if (!create)
  544. return NULL;
  545. return device_create_default(name, create > 1);
  546. }
  547. static void
  548. device_delete(struct device *dev)
  549. {
  550. if (!dev->avl.key)
  551. return;
  552. D(DEVICE, "Delete device '%s' from list\n", dev->ifname);
  553. avl_delete(&devices, &dev->avl);
  554. dev->avl.key = NULL;
  555. }
  556. static int device_cleanup_cb(void *ctx, struct safe_list *list)
  557. {
  558. struct device_user *dep = container_of(list, struct device_user, list);
  559. if (dep->cb)
  560. dep->cb(dep, DEV_EVENT_REMOVE);
  561. device_release(dep);
  562. return 0;
  563. }
  564. void device_cleanup(struct device *dev)
  565. {
  566. D(DEVICE, "Clean up device '%s'\n", dev->ifname);
  567. safe_list_for_each(&dev->users, device_cleanup_cb, NULL);
  568. safe_list_for_each(&dev->aliases, device_cleanup_cb, NULL);
  569. device_delete(dev);
  570. }
  571. static void __device_set_present(struct device *dev, bool state)
  572. {
  573. if (dev->present == state)
  574. return;
  575. dev->present = state;
  576. device_broadcast_event(dev, state ? DEV_EVENT_ADD : DEV_EVENT_REMOVE);
  577. }
  578. void
  579. device_refresh_present(struct device *dev)
  580. {
  581. bool state = dev->sys_present;
  582. if (dev->disabled || dev->deferred)
  583. state = false;
  584. __device_set_present(dev, state);
  585. }
  586. void device_set_present(struct device *dev, bool state)
  587. {
  588. if (dev->sys_present == state)
  589. return;
  590. D(DEVICE, "%s '%s' %s present\n", dev->type->name, dev->ifname, state ? "is now" : "is no longer" );
  591. dev->sys_present = state;
  592. device_refresh_present(dev);
  593. }
  594. void device_set_link(struct device *dev, bool state)
  595. {
  596. if (dev->link_active == state)
  597. return;
  598. netifd_log_message(L_NOTICE, "%s '%s' link is %s\n", dev->type->name, dev->ifname, state ? "up" : "down" );
  599. dev->link_active = state;
  600. device_broadcast_event(dev, state ? DEV_EVENT_LINK_UP : DEV_EVENT_LINK_DOWN);
  601. }
  602. void device_set_ifindex(struct device *dev, int ifindex)
  603. {
  604. if (dev->ifindex == ifindex)
  605. return;
  606. dev->ifindex = ifindex;
  607. device_broadcast_event(dev, DEV_EVENT_UPDATE_IFINDEX);
  608. }
  609. int device_set_ifname(struct device *dev, const char *name)
  610. {
  611. int ret = 0;
  612. if (!strcmp(dev->ifname, name))
  613. return 0;
  614. if (strlen(name) > sizeof(dev->ifname) - 1)
  615. return -1;
  616. if (dev->avl.key)
  617. avl_delete(&devices, &dev->avl);
  618. strcpy(dev->ifname, name);
  619. if (dev->avl.key)
  620. ret = avl_insert(&devices, &dev->avl);
  621. if (ret == 0)
  622. device_broadcast_event(dev, DEV_EVENT_UPDATE_IFNAME);
  623. return ret;
  624. }
  625. static int device_refcount(struct device *dev)
  626. {
  627. struct list_head *list;
  628. int count = 0;
  629. list_for_each(list, &dev->users.list)
  630. count++;
  631. list_for_each(list, &dev->aliases.list)
  632. count++;
  633. return count;
  634. }
  635. static void
  636. __device_add_user(struct device_user *dep, struct device *dev)
  637. {
  638. struct safe_list *head;
  639. dep->dev = dev;
  640. if (dep->alias)
  641. head = &dev->aliases;
  642. else
  643. head = &dev->users;
  644. safe_list_add(&dep->list, head);
  645. D(DEVICE, "Add user for device '%s', refcount=%d\n", dev->ifname, device_refcount(dev));
  646. if (dep->cb && dev->present) {
  647. dep->cb(dep, DEV_EVENT_ADD);
  648. if (dev->active)
  649. dep->cb(dep, DEV_EVENT_UP);
  650. if (dev->link_active)
  651. dep->cb(dep, DEV_EVENT_LINK_UP);
  652. }
  653. }
  654. void device_add_user(struct device_user *dep, struct device *dev)
  655. {
  656. if (dep->dev == dev)
  657. return;
  658. if (dep->dev)
  659. device_remove_user(dep);
  660. if (!dev)
  661. return;
  662. __device_add_user(dep, dev);
  663. }
  664. static void
  665. device_free(struct device *dev)
  666. {
  667. __devlock++;
  668. free(dev->config);
  669. device_cleanup(dev);
  670. dev->type->free(dev);
  671. __devlock--;
  672. }
  673. static void
  674. __device_free_unused(struct device *dev)
  675. {
  676. if (!safe_list_empty(&dev->users) ||
  677. !safe_list_empty(&dev->aliases) ||
  678. dev->current_config || __devlock)
  679. return;
  680. device_free(dev);
  681. }
  682. void device_remove_user(struct device_user *dep)
  683. {
  684. struct device *dev = dep->dev;
  685. if (!dep->dev)
  686. return;
  687. dep->hotplug = false;
  688. if (dep->claimed)
  689. device_release(dep);
  690. safe_list_del(&dep->list);
  691. dep->dev = NULL;
  692. D(DEVICE, "Remove user for device '%s', refcount=%d\n", dev->ifname, device_refcount(dev));
  693. __device_free_unused(dev);
  694. }
  695. void
  696. device_free_unused(struct device *dev)
  697. {
  698. struct device *tmp;
  699. if (dev)
  700. return __device_free_unused(dev);
  701. avl_for_each_element_safe(&devices, dev, avl, tmp)
  702. __device_free_unused(dev);
  703. }
  704. void
  705. device_init_pending(void)
  706. {
  707. struct device *dev, *tmp;
  708. avl_for_each_element_safe(&devices, dev, avl, tmp) {
  709. if (!dev->config_pending)
  710. continue;
  711. dev->type->config_init(dev);
  712. dev->config_pending = false;
  713. device_check_state(dev);
  714. }
  715. }
  716. bool
  717. device_check_ip6segmentrouting(void)
  718. {
  719. struct device *dev;
  720. bool ip6segmentrouting = false;
  721. avl_for_each_element(&devices, dev, avl)
  722. ip6segmentrouting |= dev->settings.ip6segmentrouting;
  723. return ip6segmentrouting;
  724. }
  725. static enum dev_change_type
  726. device_set_config(struct device *dev, struct device_type *type,
  727. struct blob_attr *attr)
  728. {
  729. struct blob_attr *tb[__DEV_ATTR_MAX];
  730. const struct uci_blob_param_list *cfg = type->config_params;
  731. if (type != dev->type)
  732. return DEV_CONFIG_RECREATE;
  733. if (dev->type->reload)
  734. return dev->type->reload(dev, attr);
  735. if (uci_blob_check_equal(dev->config, attr, cfg))
  736. return DEV_CONFIG_NO_CHANGE;
  737. if (cfg == &device_attr_list) {
  738. memset(tb, 0, sizeof(tb));
  739. if (attr)
  740. blobmsg_parse(dev_attrs, __DEV_ATTR_MAX, tb,
  741. blob_data(attr), blob_len(attr));
  742. device_init_settings(dev, tb);
  743. return DEV_CONFIG_RESTART;
  744. } else
  745. return DEV_CONFIG_RECREATE;
  746. }
  747. enum dev_change_type
  748. device_apply_config(struct device *dev, struct device_type *type,
  749. struct blob_attr *config)
  750. {
  751. enum dev_change_type change;
  752. change = device_set_config(dev, type, config);
  753. if (dev->external) {
  754. system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
  755. change = DEV_CONFIG_APPLIED;
  756. }
  757. switch (change) {
  758. case DEV_CONFIG_RESTART:
  759. case DEV_CONFIG_APPLIED:
  760. D(DEVICE, "Device '%s': config applied\n", dev->ifname);
  761. config = blob_memdup(config);
  762. free(dev->config);
  763. dev->config = config;
  764. if (change == DEV_CONFIG_RESTART && dev->present) {
  765. int ret = 0;
  766. device_set_present(dev, false);
  767. if (dev->active && !dev->external) {
  768. ret = dev->set_state(dev, false);
  769. if (!ret)
  770. ret = dev->set_state(dev, true);
  771. }
  772. if (!ret)
  773. device_set_present(dev, true);
  774. }
  775. break;
  776. case DEV_CONFIG_NO_CHANGE:
  777. D(DEVICE, "Device '%s': no configuration change\n", dev->ifname);
  778. break;
  779. case DEV_CONFIG_RECREATE:
  780. break;
  781. }
  782. return change;
  783. }
  784. static void
  785. device_replace(struct device *dev, struct device *odev)
  786. {
  787. struct device_user *dep, *tmp;
  788. __devlock++;
  789. if (odev->present)
  790. device_set_present(odev, false);
  791. list_for_each_entry_safe(dep, tmp, &odev->users.list, list.list) {
  792. device_release(dep);
  793. safe_list_del(&dep->list);
  794. __device_add_user(dep, dev);
  795. }
  796. __devlock--;
  797. device_free(odev);
  798. }
  799. void
  800. device_reset_config(void)
  801. {
  802. struct device *dev;
  803. avl_for_each_element(&devices, dev, avl)
  804. dev->current_config = false;
  805. }
  806. void
  807. device_reset_old(void)
  808. {
  809. struct device *dev, *tmp, *ndev;
  810. avl_for_each_element_safe(&devices, dev, avl, tmp) {
  811. if (dev->current_config || dev->default_config)
  812. continue;
  813. if (dev->type != &simple_device_type)
  814. continue;
  815. ndev = device_create_default(dev->ifname, dev->external);
  816. if (!ndev)
  817. continue;
  818. device_replace(ndev, dev);
  819. }
  820. }
  821. struct device *
  822. device_create(const char *name, struct device_type *type,
  823. struct blob_attr *config)
  824. {
  825. struct device *odev = NULL, *dev;
  826. enum dev_change_type change;
  827. odev = device_find(name);
  828. if (odev) {
  829. odev->current_config = true;
  830. change = device_apply_config(odev, type, config);
  831. switch (change) {
  832. case DEV_CONFIG_RECREATE:
  833. D(DEVICE, "Device '%s': recreate device\n", odev->ifname);
  834. device_delete(odev);
  835. break;
  836. default:
  837. return odev;
  838. }
  839. } else
  840. D(DEVICE, "Create new device '%s' (%s)\n", name, type->name);
  841. config = blob_memdup(config);
  842. if (!config)
  843. return NULL;
  844. dev = type->create(name, type, config);
  845. if (!dev)
  846. return NULL;
  847. dev->current_config = true;
  848. dev->config = config;
  849. if (odev)
  850. device_replace(dev, odev);
  851. if (!config_init && dev->config_pending) {
  852. type->config_init(dev);
  853. dev->config_pending = false;
  854. }
  855. device_check_state(dev);
  856. return dev;
  857. }
  858. void
  859. device_dump_status(struct blob_buf *b, struct device *dev)
  860. {
  861. struct device_settings st;
  862. void *c, *s;
  863. if (!dev) {
  864. avl_for_each_element(&devices, dev, avl) {
  865. if (!dev->present)
  866. continue;
  867. c = blobmsg_open_table(b, dev->ifname);
  868. device_dump_status(b, dev);
  869. blobmsg_close_table(b, c);
  870. }
  871. return;
  872. }
  873. blobmsg_add_u8(b, "external", dev->external);
  874. blobmsg_add_u8(b, "present", dev->present);
  875. blobmsg_add_string(b, "type", dev->type->name);
  876. if (!dev->present)
  877. return;
  878. blobmsg_add_u8(b, "up", !!dev->active);
  879. blobmsg_add_u8(b, "carrier", !!dev->link_active);
  880. if (dev->type->dump_info)
  881. dev->type->dump_info(dev, b);
  882. else
  883. system_if_dump_info(dev, b);
  884. if (dev->active) {
  885. device_merge_settings(dev, &st);
  886. if (st.flags & DEV_OPT_MTU)
  887. blobmsg_add_u32(b, "mtu", st.mtu);
  888. if (st.flags & DEV_OPT_MTU6)
  889. blobmsg_add_u32(b, "mtu6", st.mtu6);
  890. if (st.flags & DEV_OPT_MACADDR)
  891. blobmsg_add_string(b, "macaddr", format_macaddr(st.macaddr));
  892. if (st.flags & DEV_OPT_TXQUEUELEN)
  893. blobmsg_add_u32(b, "txqueuelen", st.txqueuelen);
  894. if (st.flags & DEV_OPT_IPV6)
  895. blobmsg_add_u8(b, "ipv6", st.ipv6);
  896. if (st.flags & DEV_OPT_IP6SEGMENTROUTING)
  897. blobmsg_add_u8(b, "ip6segmentrouting", st.ip6segmentrouting);
  898. if (st.flags & DEV_OPT_PROMISC)
  899. blobmsg_add_u8(b, "promisc", st.promisc);
  900. if (st.flags & DEV_OPT_RPFILTER)
  901. blobmsg_add_u32(b, "rpfilter", st.rpfilter);
  902. if (st.flags & DEV_OPT_ACCEPTLOCAL)
  903. blobmsg_add_u8(b, "acceptlocal", st.acceptlocal);
  904. if (st.flags & DEV_OPT_IGMPVERSION)
  905. blobmsg_add_u32(b, "igmpversion", st.igmpversion);
  906. if (st.flags & DEV_OPT_MLDVERSION)
  907. blobmsg_add_u32(b, "mldversion", st.mldversion);
  908. if (st.flags & DEV_OPT_NEIGHREACHABLETIME) {
  909. blobmsg_add_u32(b, "neigh4reachabletime", st.neigh4reachabletime);
  910. blobmsg_add_u32(b, "neigh6reachabletime", st.neigh6reachabletime);
  911. }
  912. if (st.flags & DEV_OPT_NEIGHGCSTALETIME) {
  913. blobmsg_add_u32(b, "neigh4gcstaletime", st.neigh4gcstaletime);
  914. blobmsg_add_u32(b, "neigh6gcstaletime", st.neigh6gcstaletime);
  915. }
  916. if (st.flags & DEV_OPT_NEIGHLOCKTIME)
  917. blobmsg_add_u32(b, "neigh4locktime", st.neigh4locktime);
  918. if (st.flags & DEV_OPT_DADTRANSMITS)
  919. blobmsg_add_u32(b, "dadtransmits", st.dadtransmits);
  920. if (st.flags & DEV_OPT_MULTICAST_TO_UNICAST)
  921. blobmsg_add_u8(b, "multicast_to_unicast", st.multicast_to_unicast);
  922. if (st.flags & DEV_OPT_MULTICAST_ROUTER)
  923. blobmsg_add_u32(b, "multicast_router", st.multicast_router);
  924. if (st.flags & DEV_OPT_MULTICAST_FAST_LEAVE)
  925. blobmsg_add_u8(b, "multicast_fast_leave", st.multicast_fast_leave);
  926. if (st.flags & DEV_OPT_MULTICAST)
  927. blobmsg_add_u8(b, "multicast", st.multicast);
  928. if (st.flags & DEV_OPT_LEARNING)
  929. blobmsg_add_u8(b, "learning", st.learning);
  930. if (st.flags & DEV_OPT_UNICAST_FLOOD)
  931. blobmsg_add_u8(b, "unicast_flood", st.unicast_flood);
  932. if (st.flags & DEV_OPT_SENDREDIRECTS)
  933. blobmsg_add_u8(b, "sendredirects", st.sendredirects);
  934. if (st.flags & DEV_OPT_DROP_V4_UNICAST_IN_L2_MULTICAST)
  935. blobmsg_add_u8(b, "drop_v4_unicast_in_l2_multicast", st.drop_v4_unicast_in_l2_multicast);
  936. if (st.flags & DEV_OPT_DROP_V6_UNICAST_IN_L2_MULTICAST)
  937. blobmsg_add_u8(b, "drop_v6_unicast_in_l2_multicast", st.drop_v6_unicast_in_l2_multicast);
  938. if (st.flags & DEV_OPT_DROP_GRATUITOUS_ARP)
  939. blobmsg_add_u8(b, "drop_gratuitous_arp", st.drop_gratuitous_arp);
  940. if (st.flags & DEV_OPT_DROP_UNSOLICITED_NA)
  941. blobmsg_add_u8(b, "drop_unsolicited_na", st.drop_unsolicited_na);
  942. if (st.flags & DEV_OPT_ARP_ACCEPT)
  943. blobmsg_add_u8(b, "arp_accept", st.arp_accept);
  944. }
  945. s = blobmsg_open_table(b, "statistics");
  946. if (dev->type->dump_stats)
  947. dev->type->dump_stats(dev, b);
  948. else
  949. system_if_dump_stats(dev, b);
  950. blobmsg_close_table(b, s);
  951. }
  952. static void __init simple_device_type_init(void)
  953. {
  954. device_type_add(&simple_device_type);
  955. }