interface-ip.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732
  1. /*
  2. * netifd - network interface daemon
  3. * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
  4. * Copyright (C) 2012 Steven Barth <steven@midlink.org>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2
  8. * as published by the Free Software Foundation
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <libgen.h>
  19. #include <sys/stat.h>
  20. #include <limits.h>
  21. #include <arpa/inet.h>
  22. #include <netinet/in.h>
  23. #ifdef linux
  24. #include <netinet/ether.h>
  25. #endif
  26. #include "netifd.h"
  27. #include "device.h"
  28. #include "interface.h"
  29. #include "interface-ip.h"
  30. #include "proto.h"
  31. #include "ubus.h"
  32. #include "system.h"
  33. enum {
  34. ROUTE_INTERFACE,
  35. ROUTE_TARGET,
  36. ROUTE_MASK,
  37. ROUTE_GATEWAY,
  38. ROUTE_METRIC,
  39. ROUTE_MTU,
  40. ROUTE_VALID,
  41. ROUTE_TABLE,
  42. ROUTE_SOURCE,
  43. ROUTE_ONLINK,
  44. ROUTE_TYPE,
  45. ROUTE_PROTO,
  46. __ROUTE_MAX
  47. };
  48. static const struct blobmsg_policy route_attr[__ROUTE_MAX] = {
  49. [ROUTE_INTERFACE] = { .name = "interface", .type = BLOBMSG_TYPE_STRING },
  50. [ROUTE_TARGET] = { .name = "target", .type = BLOBMSG_TYPE_STRING },
  51. [ROUTE_MASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING },
  52. [ROUTE_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
  53. [ROUTE_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 },
  54. [ROUTE_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 },
  55. [ROUTE_TABLE] = { .name = "table", .type = BLOBMSG_TYPE_STRING },
  56. [ROUTE_VALID] = { .name = "valid", .type = BLOBMSG_TYPE_INT32 },
  57. [ROUTE_SOURCE] = { .name = "source", .type = BLOBMSG_TYPE_STRING },
  58. [ROUTE_ONLINK] = { .name = "onlink", .type = BLOBMSG_TYPE_BOOL },
  59. [ROUTE_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING },
  60. [ROUTE_PROTO] = { .name = "proto", .type = BLOBMSG_TYPE_STRING },
  61. };
  62. const struct uci_blob_param_list route_attr_list = {
  63. .n_params = __ROUTE_MAX,
  64. .params = route_attr,
  65. };
  66. enum {
  67. NEIGHBOR_INTERFACE,
  68. NEIGHBOR_ADDRESS,
  69. NEIGHBOR_MAC,
  70. NEIGHBOR_PROXY,
  71. NEIGHBOR_ROUTER,
  72. __NEIGHBOR_MAX
  73. };
  74. static const struct blobmsg_policy neighbor_attr[__NEIGHBOR_MAX]={
  75. [NEIGHBOR_INTERFACE]= { .name = "interface", .type = BLOBMSG_TYPE_STRING},
  76. [NEIGHBOR_ADDRESS]= { .name = "ipaddr", .type = BLOBMSG_TYPE_STRING},
  77. [NEIGHBOR_MAC]= { .name = "mac", .type = BLOBMSG_TYPE_STRING},
  78. [NEIGHBOR_PROXY]= { .name = "proxy", .type = BLOBMSG_TYPE_BOOL},
  79. [NEIGHBOR_ROUTER]= {.name = "router", .type = BLOBMSG_TYPE_BOOL},
  80. };
  81. const struct uci_blob_param_list neighbor_attr_list = {
  82. .n_params = __NEIGHBOR_MAX,
  83. .params = neighbor_attr,
  84. };
  85. struct list_head prefixes = LIST_HEAD_INIT(prefixes);
  86. static struct device_prefix *ula_prefix = NULL;
  87. static struct uloop_timeout valid_until_timeout;
  88. static void
  89. clear_if_addr(union if_addr *a, int mask)
  90. {
  91. int m_bytes = (mask + 7) / 8;
  92. uint8_t m_clear = (1 << (m_bytes * 8 - mask)) - 1;
  93. uint8_t *p = (uint8_t *) a;
  94. if (m_bytes < sizeof(*a))
  95. memset(p + m_bytes, 0, sizeof(*a) - m_bytes);
  96. p[m_bytes - 1] &= ~m_clear;
  97. }
  98. static bool
  99. match_if_addr(union if_addr *a1, union if_addr *a2, int mask)
  100. {
  101. union if_addr *p1, *p2;
  102. p1 = alloca(sizeof(*a1));
  103. p2 = alloca(sizeof(*a2));
  104. memcpy(p1, a1, sizeof(*a1));
  105. clear_if_addr(p1, mask);
  106. memcpy(p2, a2, sizeof(*a2));
  107. clear_if_addr(p2, mask);
  108. return !memcmp(p1, p2, sizeof(*p1));
  109. }
  110. static int set_ip_source_policy(bool add, bool v6, unsigned int priority,
  111. const union if_addr *addr, uint8_t mask, unsigned int table,
  112. struct interface *in_iface, const char *action, bool src)
  113. {
  114. struct iprule rule = {
  115. .flags = IPRULE_PRIORITY,
  116. .priority = priority
  117. };
  118. if (addr) {
  119. if (src) {
  120. rule.flags |= IPRULE_SRC;
  121. rule.src_addr = *addr;
  122. rule.src_mask = mask;
  123. } else {
  124. rule.flags |= IPRULE_DEST;
  125. rule.dest_addr = *addr;
  126. rule.dest_mask = mask;
  127. }
  128. }
  129. if (table) {
  130. rule.flags |= IPRULE_LOOKUP;
  131. rule.lookup = table;
  132. if (!rule.lookup)
  133. return 0;
  134. } else if (action) {
  135. rule.flags |= IPRULE_ACTION;
  136. system_resolve_iprule_action(action, &rule.action);
  137. }
  138. if (in_iface && in_iface->l3_dev.dev) {
  139. rule.flags |= IPRULE_IN;
  140. strcpy(rule.in_dev, in_iface->l3_dev.dev->ifname);
  141. }
  142. rule.flags |= (v6) ? IPRULE_INET6 : IPRULE_INET4;
  143. return (add) ? system_add_iprule(&rule) : system_del_iprule(&rule);
  144. }
  145. static int set_ip_lo_policy(bool add, bool v6, struct interface *iface)
  146. {
  147. struct iprule rule = {
  148. .flags = IPRULE_IN | IPRULE_LOOKUP | IPRULE_PRIORITY,
  149. .priority = IPRULE_PRIORITY_NW + iface->l3_dev.dev->ifindex,
  150. .lookup = (v6) ? iface->ip6table : iface->ip4table,
  151. .in_dev = "lo"
  152. };
  153. if (!rule.lookup)
  154. return 0;
  155. rule.flags |= (v6) ? IPRULE_INET6 : IPRULE_INET4;
  156. return (add) ? system_add_iprule(&rule) : system_del_iprule(&rule);
  157. }
  158. static bool
  159. __find_ip_addr_target(struct interface_ip_settings *ip, union if_addr *a, bool v6)
  160. {
  161. struct device_addr *addr;
  162. vlist_for_each_element(&ip->addr, addr, node) {
  163. if (!addr->enabled)
  164. continue;
  165. if (v6 != ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET6))
  166. continue;
  167. if (((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4) &&
  168. addr->point_to_point && a->in.s_addr == addr->point_to_point)
  169. return true;
  170. /* Handle offlink addresses correctly */
  171. unsigned int mask = addr->mask;
  172. if ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET6 &&
  173. (addr->flags & DEVADDR_OFFLINK))
  174. mask = 128;
  175. if (!match_if_addr(&addr->addr, a, mask))
  176. continue;
  177. return true;
  178. }
  179. return false;
  180. }
  181. static void
  182. __find_ip_route_target(struct interface_ip_settings *ip, union if_addr *a,
  183. bool v6, struct device_route **res)
  184. {
  185. struct device_route *route;
  186. vlist_for_each_element(&ip->route, route, node) {
  187. if (!route->enabled)
  188. continue;
  189. if (v6 != ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET6))
  190. continue;
  191. if (!match_if_addr(&route->addr, a, route->mask))
  192. continue;
  193. if (route->flags & DEVROUTE_TABLE)
  194. continue;
  195. if (!*res || route->mask > (*res)->mask)
  196. *res = route;
  197. }
  198. }
  199. static bool
  200. interface_ip_find_addr_target(struct interface *iface, union if_addr *a, bool v6)
  201. {
  202. return __find_ip_addr_target(&iface->proto_ip, a, v6) ||
  203. __find_ip_addr_target(&iface->config_ip, a, v6);
  204. }
  205. static void
  206. interface_ip_find_route_target(struct interface *iface, union if_addr *a,
  207. bool v6, struct device_route **route)
  208. {
  209. __find_ip_route_target(&iface->proto_ip, a, v6, route);
  210. __find_ip_route_target(&iface->config_ip, a, v6, route);
  211. }
  212. struct interface *
  213. interface_ip_add_target_route(union if_addr *addr, bool v6, struct interface *iface)
  214. {
  215. struct device_route *route, *r_next = NULL;
  216. bool defaultroute_target = false;
  217. union if_addr addr_zero;
  218. int addrsize = v6 ? sizeof(addr->in6) : sizeof(addr->in);
  219. memset(&addr_zero, 0, sizeof(addr_zero));
  220. if (memcmp(&addr_zero, addr, addrsize) == 0)
  221. defaultroute_target = true;
  222. if (iface) {
  223. /* look for locally addressable target first */
  224. if (interface_ip_find_addr_target(iface, addr, v6))
  225. return iface;
  226. /* do not stop at the first route, let the lookup compare
  227. * masks to find the best match */
  228. interface_ip_find_route_target(iface, addr, v6, &r_next);
  229. } else {
  230. vlist_for_each_element(&interfaces, iface, node) {
  231. /* look for locally addressable target first */
  232. if (interface_ip_find_addr_target(iface, addr, v6))
  233. return iface;
  234. /* do not stop at the first route, let the lookup compare
  235. * masks to find the best match */
  236. interface_ip_find_route_target(iface, addr, v6, &r_next);
  237. }
  238. }
  239. if (!r_next)
  240. return NULL;
  241. iface = r_next->iface;
  242. if (defaultroute_target)
  243. return iface;
  244. route = calloc(1, sizeof(*route));
  245. if (!route)
  246. return NULL;
  247. route->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
  248. route->mask = v6 ? 128 : 32;
  249. memcpy(&route->addr, addr, addrsize);
  250. memcpy(&route->nexthop, &r_next->nexthop, sizeof(route->nexthop));
  251. route->mtu = r_next->mtu;
  252. route->metric = r_next->metric;
  253. route->table = r_next->table;
  254. route->iface = iface;
  255. vlist_add(&iface->host_routes, &route->node, route);
  256. return iface;
  257. }
  258. static void
  259. interface_set_route_info(struct interface *iface, struct device_route *route)
  260. {
  261. bool v6 = ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET6);
  262. if (!iface)
  263. return;
  264. if (!(route->flags & DEVROUTE_METRIC))
  265. route->metric = iface->metric;
  266. if (!(route->flags & DEVROUTE_TABLE)) {
  267. route->table = (v6) ? iface->ip6table : iface->ip4table;
  268. if (route->table)
  269. route->flags |= DEVROUTE_SRCTABLE;
  270. }
  271. }
  272. void
  273. interface_ip_add_neighbor(struct interface *iface, struct blob_attr *attr, bool v6)
  274. {
  275. struct interface_ip_settings *ip;
  276. struct blob_attr *tb[__NEIGHBOR_MAX], *cur;
  277. struct device_neighbor *neighbor;
  278. int af = v6 ? AF_INET6: AF_INET;
  279. struct ether_addr *ea;
  280. blobmsg_parse(neighbor_attr, __NEIGHBOR_MAX, tb, blobmsg_data(attr), blobmsg_data_len(attr));
  281. if (!iface) {
  282. if ((cur = tb[NEIGHBOR_INTERFACE]) == NULL)
  283. return;
  284. iface = vlist_find(&interfaces, blobmsg_data(cur), iface, node);
  285. if (!iface)
  286. return;
  287. ip = &iface->config_ip;
  288. } else
  289. ip = &iface->proto_ip;
  290. neighbor = calloc(1,sizeof(*neighbor));
  291. if (!neighbor)
  292. return;
  293. neighbor->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
  294. if ((cur = tb[NEIGHBOR_ADDRESS]) != NULL){
  295. if (!inet_pton(af, blobmsg_data(cur), &neighbor->addr))
  296. goto error;
  297. } else
  298. goto error;
  299. if ((cur = tb[NEIGHBOR_MAC]) != NULL) {
  300. neighbor->flags |= DEVNEIGH_MAC;
  301. ea = ether_aton(blobmsg_data(cur));
  302. if (!ea)
  303. goto error;
  304. memcpy(neighbor->macaddr, ea, 6);
  305. }
  306. if ((cur = tb[NEIGHBOR_PROXY]) != NULL)
  307. neighbor->proxy = blobmsg_get_bool(cur);
  308. if ((cur = tb[NEIGHBOR_ROUTER]) != NULL)
  309. neighbor->router = blobmsg_get_bool(cur);
  310. vlist_add(&ip->neighbor, &neighbor->node, neighbor);
  311. return;
  312. error:
  313. free(neighbor);
  314. }
  315. void
  316. interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
  317. {
  318. struct interface_ip_settings *ip;
  319. struct blob_attr *tb[__ROUTE_MAX], *cur;
  320. struct device_route *route;
  321. int af = v6 ? AF_INET6 : AF_INET;
  322. blobmsg_parse(route_attr, __ROUTE_MAX, tb, blobmsg_data(attr), blobmsg_data_len(attr));
  323. if (!iface) {
  324. if ((cur = tb[ROUTE_INTERFACE]) == NULL)
  325. return;
  326. iface = vlist_find(&interfaces, blobmsg_data(cur), iface, node);
  327. if (!iface)
  328. return;
  329. ip = &iface->config_ip;
  330. } else {
  331. ip = &iface->proto_ip;
  332. }
  333. route = calloc(1, sizeof(*route));
  334. if (!route)
  335. return;
  336. route->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
  337. route->mask = v6 ? 128 : 32;
  338. if ((cur = tb[ROUTE_MASK]) != NULL) {
  339. route->mask = parse_netmask_string(blobmsg_data(cur), v6);
  340. if (route->mask > (v6 ? 128 : 32))
  341. goto error;
  342. }
  343. if ((cur = tb[ROUTE_TARGET]) != NULL) {
  344. if (!parse_ip_and_netmask(af, blobmsg_data(cur), &route->addr, &route->mask)) {
  345. DPRINTF("Failed to parse route target: %s\n", (char *) blobmsg_data(cur));
  346. goto error;
  347. }
  348. }
  349. if ((cur = tb[ROUTE_GATEWAY]) != NULL) {
  350. if (!inet_pton(af, blobmsg_data(cur), &route->nexthop)) {
  351. DPRINTF("Failed to parse route gateway: %s\n", (char *) blobmsg_data(cur));
  352. goto error;
  353. }
  354. }
  355. if ((cur = tb[ROUTE_METRIC]) != NULL) {
  356. route->metric = blobmsg_get_u32(cur);
  357. route->flags |= DEVROUTE_METRIC;
  358. }
  359. if ((cur = tb[ROUTE_MTU]) != NULL) {
  360. route->mtu = blobmsg_get_u32(cur);
  361. route->flags |= DEVROUTE_MTU;
  362. }
  363. /* Use source-based routing */
  364. if ((cur = tb[ROUTE_SOURCE]) != NULL) {
  365. char *saveptr, *source = alloca(blobmsg_data_len(cur));
  366. memcpy(source, blobmsg_data(cur), blobmsg_data_len(cur));
  367. const char *addr = strtok_r(source, "/", &saveptr);
  368. const char *mask = strtok_r(NULL, "/", &saveptr);
  369. if (!addr || inet_pton(af, addr, &route->source) < 1) {
  370. DPRINTF("Failed to parse route source: %s\n", addr ? addr : "NULL");
  371. goto error;
  372. }
  373. route->sourcemask = (mask) ? atoi(mask) : ((af == AF_INET6) ? 128 : 32);
  374. }
  375. if ((cur = tb[ROUTE_ONLINK]) != NULL && blobmsg_get_bool(cur))
  376. route->flags |= DEVROUTE_ONLINK;
  377. if ((cur = tb[ROUTE_TABLE]) != NULL) {
  378. if (!system_resolve_rt_table(blobmsg_data(cur), &route->table)) {
  379. DPRINTF("Failed to resolve routing table: %s\n", (char *) blobmsg_data(cur));
  380. goto error;
  381. }
  382. /* only set the table flag if not using the main (default) table */
  383. if (system_is_default_rt_table(route->table))
  384. route->table = 0;
  385. if (route->table)
  386. route->flags |= DEVROUTE_TABLE;
  387. }
  388. if ((cur = tb[ROUTE_VALID]) != NULL) {
  389. int64_t valid = blobmsg_get_u32(cur);
  390. int64_t valid_until = valid + (int64_t)system_get_rtime();
  391. if (valid_until <= LONG_MAX && valid != 0xffffffffLL) /* Catch overflow */
  392. route->valid_until = valid_until;
  393. }
  394. if ((cur = tb[ROUTE_TYPE]) != NULL) {
  395. if (!system_resolve_rt_type(blobmsg_data(cur), &route->type)) {
  396. DPRINTF("Failed to resolve routing type: %s\n", (char *) blobmsg_data(cur));
  397. goto error;
  398. }
  399. route->flags |= DEVROUTE_TYPE;
  400. }
  401. if ((cur = tb[ROUTE_PROTO]) != NULL) {
  402. if (!system_resolve_rt_proto(blobmsg_data(cur), &route->proto)) {
  403. DPRINTF("Failed to resolve proto type: %s\n", (char *) blobmsg_data(cur));
  404. goto error;
  405. }
  406. route->flags |= DEVROUTE_PROTO;
  407. }
  408. interface_set_route_info(iface, route);
  409. vlist_add(&ip->route, &route->node, route);
  410. return;
  411. error:
  412. free(route);
  413. }
  414. static int
  415. addr_cmp(const void *k1, const void *k2, void *ptr)
  416. {
  417. return memcmp(k1, k2, sizeof(struct device_addr) -
  418. offsetof(struct device_addr, flags));
  419. }
  420. static int
  421. neighbor_cmp(const void *k1, const void *k2, void *ptr)
  422. {
  423. const struct device_neighbor *n1 = k1, *n2 = k2;
  424. return memcmp(&n1->addr, &n2->addr, sizeof(n2->addr));
  425. }
  426. static int
  427. route_cmp(const void *k1, const void *k2, void *ptr)
  428. {
  429. const struct device_route *r1 = k1, *r2 = k2;
  430. if (r1->mask != r2->mask)
  431. return r2->mask - r1->mask;
  432. if (r1->metric != r2->metric)
  433. return r1->metric - r2->metric;
  434. if (r1->flags != r2->flags)
  435. return r2->flags - r1->flags;
  436. if (r1->sourcemask != r2->sourcemask)
  437. return r1->sourcemask - r2->sourcemask;
  438. if (r1->table != r2->table)
  439. return r1->table - r2->table;
  440. int maskcmp = memcmp(&r1->source, &r2->source, sizeof(r1->source));
  441. if (maskcmp)
  442. return maskcmp;
  443. return memcmp(&r1->addr, &r2->addr, sizeof(r1->addr));
  444. }
  445. static int
  446. prefix_cmp(const void *k1, const void *k2, void *ptr)
  447. {
  448. return memcmp(k1, k2, offsetof(struct device_prefix, pclass) -
  449. offsetof(struct device_prefix, addr));
  450. }
  451. static void
  452. interface_handle_subnet_route(struct interface *iface, struct device_addr *addr, bool add)
  453. {
  454. struct device *dev = iface->l3_dev.dev;
  455. struct device_route *r = &addr->subnet;
  456. if (addr->flags & DEVADDR_OFFLINK)
  457. return;
  458. if (!add) {
  459. if (!addr->subnet.iface)
  460. return;
  461. system_del_route(dev, r);
  462. memset(r, 0, sizeof(*r));
  463. return;
  464. }
  465. r->iface = iface;
  466. r->flags = addr->flags;
  467. r->mask = addr->mask;
  468. memcpy(&r->addr, &addr->addr, sizeof(r->addr));
  469. clear_if_addr(&r->addr, r->mask);
  470. if (!system_resolve_rt_proto("kernel", &r->proto))
  471. return;
  472. r->flags |= DEVROUTE_PROTO;
  473. system_del_route(dev, r);
  474. r->flags &= ~DEVROUTE_PROTO;
  475. interface_set_route_info(iface, r);
  476. system_add_route(dev, r);
  477. }
  478. static void
  479. interface_add_addr_rules(struct device_addr *addr, bool enabled)
  480. {
  481. bool v6 = (addr->flags & DEVADDR_FAMILY) == DEVADDR_INET6;
  482. set_ip_source_policy(enabled, v6, IPRULE_PRIORITY_ADDR, &addr->addr,
  483. (v6) ? 128 : 32, addr->policy_table, NULL, NULL,
  484. true);
  485. set_ip_source_policy(enabled, v6, IPRULE_PRIORITY_ADDR_MASK,
  486. &addr->addr, addr->mask, addr->policy_table, NULL,
  487. NULL, false);
  488. }
  489. static void
  490. interface_update_proto_addr(struct vlist_tree *tree,
  491. struct vlist_node *node_new,
  492. struct vlist_node *node_old)
  493. {
  494. struct interface_ip_settings *ip;
  495. struct interface *iface;
  496. struct device *dev;
  497. struct device_addr *a_new = NULL, *a_old = NULL;
  498. bool replace = false;
  499. bool keep = false;
  500. bool v6 = false;
  501. ip = container_of(tree, struct interface_ip_settings, addr);
  502. iface = ip->iface;
  503. dev = iface->l3_dev.dev;
  504. if (!node_new || !node_old)
  505. iface->updated |= IUF_ADDRESS;
  506. if (node_new) {
  507. a_new = container_of(node_new, struct device_addr, node);
  508. if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET4 &&
  509. !a_new->broadcast) {
  510. /* /31 and /32 addressing need 255.255.255.255
  511. * as broadcast address. */
  512. if (a_new->mask >= 31) {
  513. a_new->broadcast = (uint32_t) ~0;
  514. } else {
  515. uint32_t mask = ~0;
  516. uint32_t *a = (uint32_t *) &a_new->addr;
  517. mask >>= a_new->mask;
  518. a_new->broadcast = *a | htonl(mask);
  519. }
  520. }
  521. }
  522. if (node_old)
  523. a_old = container_of(node_old, struct device_addr, node);
  524. if (a_new && a_old) {
  525. keep = true;
  526. if (a_old->flags != a_new->flags || a_old->failed)
  527. keep = false;
  528. if (a_old->valid_until != a_new->valid_until ||
  529. a_old->preferred_until != a_new->preferred_until)
  530. replace = true;
  531. if (((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET4) &&
  532. (a_new->broadcast != a_old->broadcast ||
  533. a_new->point_to_point != a_old->point_to_point))
  534. keep = false;
  535. }
  536. if (node_old) {
  537. if (a_old->enabled && !keep) {
  538. /*
  539. * This is needed for source routing to work correctly. If a device
  540. * has two connections to a network using the same subnet, adding
  541. * only the network-rule will cause packets to be routed through the
  542. * first matching network (source IP matches both masks)
  543. */
  544. if (a_old->policy_table)
  545. interface_add_addr_rules(a_old, false);
  546. if (!(a_old->flags & DEVADDR_EXTERNAL)) {
  547. interface_handle_subnet_route(iface, a_old, false);
  548. system_del_address(dev, a_old);
  549. }
  550. }
  551. free(a_old->pclass);
  552. free(a_old);
  553. }
  554. if (node_new) {
  555. a_new->enabled = true;
  556. if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET6)
  557. v6 = true;
  558. a_new->policy_table = (v6) ? iface->ip6table : iface->ip4table;
  559. if (!keep || replace) {
  560. if (!(a_new->flags & DEVADDR_EXTERNAL)) {
  561. if (system_add_address(dev, a_new))
  562. a_new->failed = true;
  563. if (iface->metric || a_new->policy_table)
  564. interface_handle_subnet_route(iface, a_new, true);
  565. }
  566. if (!keep) {
  567. if (a_new->policy_table)
  568. interface_add_addr_rules(a_new, true);
  569. }
  570. }
  571. }
  572. }
  573. static bool
  574. enable_route(struct interface_ip_settings *ip, struct device_route *route)
  575. {
  576. if (ip->no_defaultroute && !route->mask)
  577. return false;
  578. return ip->enabled;
  579. }
  580. static void
  581. interface_update_proto_neighbor(struct vlist_tree *tree,
  582. struct vlist_node * node_new,
  583. struct vlist_node *node_old)
  584. {
  585. struct device *dev;
  586. struct device_neighbor *neighbor_old, *neighbor_new;
  587. struct interface_ip_settings *ip;
  588. bool keep = false;
  589. ip = container_of(tree, struct interface_ip_settings, neighbor);
  590. dev = ip->iface->l3_dev.dev;
  591. neighbor_old = container_of(node_old, struct device_neighbor, node);
  592. neighbor_new = container_of(node_new, struct device_neighbor, node);
  593. if (node_old && node_new) {
  594. keep = (!memcmp(neighbor_old->macaddr, neighbor_new->macaddr, sizeof(neighbor_old->macaddr)) &&
  595. (neighbor_old->proxy == neighbor_new->proxy) &&
  596. (neighbor_old->router == neighbor_new->router));
  597. }
  598. if (node_old) {
  599. if (!keep && neighbor_old->enabled)
  600. system_del_neighbor(dev, neighbor_old);
  601. free(neighbor_old);
  602. }
  603. if (node_new) {
  604. if (!keep && ip->enabled)
  605. if (system_add_neighbor(dev, neighbor_new))
  606. neighbor_new->failed = true;
  607. neighbor_new->enabled = ip->enabled;
  608. }
  609. }
  610. static void
  611. interface_update_proto_route(struct vlist_tree *tree,
  612. struct vlist_node *node_new,
  613. struct vlist_node *node_old)
  614. {
  615. struct interface_ip_settings *ip;
  616. struct interface *iface;
  617. struct device *dev;
  618. struct device_route *route_old, *route_new;
  619. bool keep = false;
  620. ip = container_of(tree, struct interface_ip_settings, route);
  621. iface = ip->iface;
  622. dev = iface->l3_dev.dev;
  623. if (!node_new || !node_old)
  624. iface->updated |= IUF_ROUTE;
  625. route_old = container_of(node_old, struct device_route, node);
  626. route_new = container_of(node_new, struct device_route, node);
  627. if (node_old && node_new)
  628. keep = !memcmp(&route_old->nexthop, &route_new->nexthop, sizeof(route_old->nexthop)) &&
  629. (route_old->mtu == route_new->mtu) && (route_old->type == route_new->type) &&
  630. (route_old->proto == route_new->proto) && !route_old->failed;
  631. if (node_old) {
  632. if (!(route_old->flags & DEVADDR_EXTERNAL) && route_old->enabled && !keep)
  633. system_del_route(dev, route_old);
  634. free(route_old);
  635. }
  636. if (node_new) {
  637. bool _enabled = enable_route(ip, route_new);
  638. if (!(route_new->flags & DEVADDR_EXTERNAL) && !keep && _enabled)
  639. if (system_add_route(dev, route_new))
  640. route_new->failed = true;
  641. route_new->iface = iface;
  642. route_new->enabled = _enabled;
  643. }
  644. }
  645. static void
  646. interface_update_host_route(struct vlist_tree *tree,
  647. struct vlist_node *node_new,
  648. struct vlist_node *node_old)
  649. {
  650. struct interface *iface;
  651. struct device *dev;
  652. struct device_route *route_old, *route_new;
  653. iface = container_of(tree, struct interface, host_routes);
  654. dev = iface->l3_dev.dev;
  655. route_old = container_of(node_old, struct device_route, node);
  656. route_new = container_of(node_new, struct device_route, node);
  657. if (node_old) {
  658. system_del_route(dev, route_old);
  659. free(route_old);
  660. }
  661. if (node_new) {
  662. if (system_add_route(dev, route_new))
  663. route_new->failed = true;
  664. }
  665. }
  666. static void
  667. random_ifaceid(struct in6_addr *addr)
  668. {
  669. static bool initialized = false;
  670. struct timeval t;
  671. if (!initialized) {
  672. long int seed = 0;
  673. gettimeofday(&t, NULL);
  674. seed = t.tv_sec ^ t.tv_usec ^ getpid();
  675. srand48(seed);
  676. initialized = true;
  677. }
  678. addr->s6_addr32[2] = (uint32_t)mrand48();
  679. addr->s6_addr32[3] = (uint32_t)mrand48();
  680. }
  681. static bool
  682. eui64_ifaceid(struct interface *iface, struct in6_addr *addr)
  683. {
  684. struct device_settings st;
  685. device_merge_settings(iface->l3_dev.dev, &st);
  686. if (!(st.flags & DEV_OPT_MACADDR))
  687. return false;
  688. /* get mac address */
  689. uint8_t *ifaceid = addr->s6_addr + 8;
  690. memcpy(ifaceid, st.macaddr, 3);
  691. memcpy(ifaceid + 5, st.macaddr + 3, 3);
  692. ifaceid[3] = 0xff;
  693. ifaceid[4] = 0xfe;
  694. ifaceid[0] ^= 0x02;
  695. return true;
  696. }
  697. static bool
  698. generate_ifaceid(struct interface *iface, struct in6_addr *addr)
  699. {
  700. bool ret = true;
  701. /* generate new iface id */
  702. switch (iface->assignment_iface_id_selection) {
  703. case IFID_FIXED:
  704. /* fixed */
  705. /* copy host part from assignment_fixed_iface_id */
  706. memcpy(addr->s6_addr + 8, iface->assignment_fixed_iface_id.s6_addr + 8, 8);
  707. break;
  708. case IFID_RANDOM:
  709. /* randomize last 64 bits */
  710. random_ifaceid(addr);
  711. break;
  712. case IFID_EUI64:
  713. /* eui64 */
  714. ret = eui64_ifaceid(iface, addr);
  715. break;
  716. default:
  717. ret = false;
  718. break;
  719. }
  720. return ret;
  721. }
  722. static void
  723. interface_set_prefix_address(struct device_prefix_assignment *assignment,
  724. const struct device_prefix *prefix, struct interface *iface, bool add)
  725. {
  726. const struct interface *uplink = prefix->iface;
  727. if (!iface->l3_dev.dev)
  728. return;
  729. struct device *l3_downlink = iface->l3_dev.dev;
  730. struct device_addr addr;
  731. struct device_route route;
  732. memset(&addr, 0, sizeof(addr));
  733. memset(&route, 0, sizeof(route));
  734. addr.addr.in6 = assignment->addr;
  735. addr.mask = assignment->length;
  736. addr.flags = DEVADDR_INET6 | DEVADDR_OFFLINK;
  737. addr.preferred_until = prefix->preferred_until;
  738. addr.valid_until = prefix->valid_until;
  739. route.flags = DEVADDR_INET6;
  740. route.mask = addr.mask < 64 ? 64 : addr.mask;
  741. route.addr = addr.addr;
  742. if (!add && assignment->enabled) {
  743. time_t now = system_get_rtime();
  744. addr.preferred_until = now;
  745. if (!addr.valid_until || addr.valid_until - now > 7200)
  746. addr.valid_until = now + 7200;
  747. if (iface->ip6table)
  748. set_ip_source_policy(false, true, IPRULE_PRIORITY_ADDR_MASK, &addr.addr,
  749. addr.mask < 64 ? 64 : addr.mask, iface->ip6table, NULL, NULL, false);
  750. if (prefix->iface) {
  751. if (prefix->iface->ip6table)
  752. set_ip_source_policy(false, true, IPRULE_PRIORITY_NW, &addr.addr,
  753. addr.mask, prefix->iface->ip6table, iface, NULL, true);
  754. set_ip_source_policy(false, true, IPRULE_PRIORITY_REJECT, &addr.addr,
  755. addr.mask, 0, iface, "unreachable", true);
  756. }
  757. clear_if_addr(&route.addr, route.mask);
  758. interface_set_route_info(iface, &route);
  759. system_del_route(l3_downlink, &route);
  760. system_add_address(l3_downlink, &addr);
  761. assignment->addr = in6addr_any;
  762. assignment->enabled = false;
  763. } else if (add && (iface->state == IFS_UP || iface->state == IFS_SETUP)) {
  764. if (IN6_IS_ADDR_UNSPECIFIED(&addr.addr.in6)) {
  765. addr.addr.in6 = prefix->addr;
  766. addr.addr.in6.s6_addr32[1] |= htonl(assignment->assigned);
  767. if (!generate_ifaceid(iface, &addr.addr.in6))
  768. return;
  769. assignment->addr = addr.addr.in6;
  770. route.addr = addr.addr;
  771. }
  772. if (system_add_address(l3_downlink, &addr))
  773. return;
  774. if (!assignment->enabled) {
  775. if (iface->ip6table)
  776. set_ip_source_policy(true, true, IPRULE_PRIORITY_ADDR_MASK, &addr.addr,
  777. addr.mask < 64 ? 64 : addr.mask, iface->ip6table, NULL, NULL, false);
  778. if (prefix->iface) {
  779. set_ip_source_policy(true, true, IPRULE_PRIORITY_REJECT, &addr.addr,
  780. addr.mask, 0, iface, "unreachable", true);
  781. if (prefix->iface->ip6table)
  782. set_ip_source_policy(true, true, IPRULE_PRIORITY_NW, &addr.addr,
  783. addr.mask, prefix->iface->ip6table, iface, NULL, true);
  784. }
  785. }
  786. clear_if_addr(&route.addr, route.mask);
  787. interface_set_route_info(iface, &route);
  788. system_add_route(l3_downlink, &route);
  789. if (uplink && uplink->l3_dev.dev && !(l3_downlink->settings.flags & DEV_OPT_MTU6)) {
  790. int mtu = system_update_ipv6_mtu(uplink->l3_dev.dev, 0);
  791. int mtu_old = system_update_ipv6_mtu(l3_downlink, 0);
  792. if (mtu > 0 && mtu_old != mtu) {
  793. if (system_update_ipv6_mtu(l3_downlink, mtu) < 0 && mtu < mtu_old)
  794. netifd_log_message(L_WARNING, "Failed to set IPv6 mtu to %d "
  795. "on interface '%s'\n", mtu, iface->name);
  796. }
  797. }
  798. assignment->enabled = true;
  799. }
  800. }
  801. static bool interface_prefix_assign(struct list_head *list,
  802. struct device_prefix_assignment *assign)
  803. {
  804. int32_t current = 0, asize = (1 << (64 - assign->length)) - 1;
  805. struct device_prefix_assignment *c;
  806. list_for_each_entry(c, list, head) {
  807. if (assign->assigned != -1) {
  808. if (assign->assigned >= current && assign->assigned + asize < c->assigned) {
  809. list_add_tail(&assign->head, &c->head);
  810. return true;
  811. }
  812. } else if (assign->assigned == -1) {
  813. current = (current + asize) & (~asize);
  814. if (current + asize < c->assigned) {
  815. assign->assigned = current;
  816. list_add_tail(&assign->head, &c->head);
  817. return true;
  818. }
  819. }
  820. current = (c->assigned + (1 << (64 - c->length)));
  821. }
  822. return false;
  823. }
  824. /*
  825. * Sorting of assignment entries:
  826. * Primary on assignment length: smallest assignment first
  827. * Secondary on assignment weight: highest weight first
  828. * Finally alphabetical order of interface names
  829. */
  830. static int prefix_assignment_cmp(const void *k1, const void *k2, void *ptr)
  831. {
  832. const struct device_prefix_assignment *a1 = k1, *a2 = k2;
  833. if (a1->length != a2->length)
  834. return a1->length - a2->length;
  835. if (a1->weight != a2->weight)
  836. return a2->weight - a1->weight;
  837. return strcmp(a1->name, a2->name);
  838. }
  839. static void interface_update_prefix_assignments(struct device_prefix *prefix, bool setup)
  840. {
  841. struct device_prefix_assignment *c;
  842. struct interface *iface;
  843. /* Delete all assignments */
  844. while (!list_empty(&prefix->assignments)) {
  845. c = list_first_entry(&prefix->assignments,
  846. struct device_prefix_assignment, head);
  847. if ((iface = vlist_find(&interfaces, c->name, iface, node)))
  848. interface_set_prefix_address(c, prefix, iface, false);
  849. list_del(&c->head);
  850. free(c);
  851. }
  852. if (!setup)
  853. return;
  854. /* End-of-assignment sentinel */
  855. c = malloc(sizeof(*c) + 1);
  856. if (!c)
  857. return;
  858. c->assigned = 1 << (64 - prefix->length);
  859. c->length = 64;
  860. c->name[0] = 0;
  861. c->addr = in6addr_any;
  862. list_add(&c->head, &prefix->assignments);
  863. /* Excluded prefix */
  864. if (prefix->excl_length > 0) {
  865. const char name[] = "!excluded";
  866. c = malloc(sizeof(*c) + sizeof(name));
  867. if (c) {
  868. c->assigned = ntohl(prefix->excl_addr.s6_addr32[1]) &
  869. ((1 << (64 - prefix->length)) - 1);
  870. c->length = prefix->excl_length;
  871. c->addr = in6addr_any;
  872. memcpy(c->name, name, sizeof(name));
  873. list_add(&c->head, &prefix->assignments);
  874. }
  875. }
  876. bool assigned_any = false;
  877. struct {
  878. struct avl_node node;
  879. } *entry, *n_entry;
  880. struct avl_tree assign_later;
  881. avl_init(&assign_later, prefix_assignment_cmp, false, NULL);
  882. vlist_for_each_element(&interfaces, iface, node) {
  883. if (iface->assignment_length < 48 ||
  884. iface->assignment_length > 64)
  885. continue;
  886. /* Test whether there is a matching class */
  887. if (!list_empty(&iface->assignment_classes)) {
  888. bool found = false;
  889. struct interface_assignment_class *c;
  890. list_for_each_entry(c, &iface->assignment_classes, head) {
  891. if (!strcmp(c->name, prefix->pclass)) {
  892. found = true;
  893. break;
  894. }
  895. }
  896. if (!found)
  897. continue;
  898. }
  899. size_t namelen = strlen(iface->name) + 1;
  900. c = malloc(sizeof(*c) + namelen);
  901. if (!c)
  902. continue;
  903. c->length = iface->assignment_length;
  904. c->assigned = iface->assignment_hint;
  905. c->weight = iface->assignment_weight;
  906. c->addr = in6addr_any;
  907. c->enabled = false;
  908. memcpy(c->name, iface->name, namelen);
  909. /* First process all custom assignments, put all others in later-list */
  910. if (c->assigned == -1 || !interface_prefix_assign(&prefix->assignments, c)) {
  911. if (c->assigned != -1) {
  912. c->assigned = -1;
  913. netifd_log_message(L_WARNING, "Failed to assign requested subprefix "
  914. "of size %hhu for %s, trying other\n", c->length, c->name);
  915. }
  916. entry = calloc(1, sizeof(*entry));
  917. if (!entry) {
  918. free(c);
  919. continue;
  920. }
  921. entry->node.key = c;
  922. avl_insert(&assign_later, &entry->node);
  923. }
  924. if (c->assigned != -1)
  925. assigned_any = true;
  926. }
  927. /* Then try to assign all other + failed custom assignments */
  928. avl_for_each_element_safe(&assign_later, entry, node, n_entry) {
  929. bool assigned = false;
  930. c = (struct device_prefix_assignment *)entry->node.key;
  931. avl_delete(&assign_later, &entry->node);
  932. do {
  933. assigned = interface_prefix_assign(&prefix->assignments, c);
  934. } while (!assigned && ++c->length <= 64);
  935. if (!assigned) {
  936. netifd_log_message(L_WARNING, "Failed to assign subprefix "
  937. "of size %hhu for %s\n", c->length, c->name);
  938. free(c);
  939. } else
  940. assigned_any = true;
  941. free(entry);
  942. }
  943. list_for_each_entry(c, &prefix->assignments, head)
  944. if ((iface = vlist_find(&interfaces, c->name, iface, node)))
  945. interface_set_prefix_address(c, prefix, iface, true);
  946. if (!assigned_any)
  947. netifd_log_message(L_WARNING, "You have delegated IPv6-prefixes but haven't assigned them "
  948. "to any interface. Did you forget to set option ip6assign on your lan-interfaces?");
  949. }
  950. void interface_refresh_assignments(bool hint)
  951. {
  952. static bool refresh = false;
  953. if (!hint && refresh) {
  954. struct device_prefix *p;
  955. list_for_each_entry(p, &prefixes, head)
  956. interface_update_prefix_assignments(p, true);
  957. }
  958. refresh = hint;
  959. }
  960. void interface_update_prefix_delegation(struct interface_ip_settings *ip)
  961. {
  962. struct device_prefix *prefix;
  963. vlist_for_each_element(&ip->prefix, prefix, node) {
  964. interface_update_prefix_assignments(prefix, !ip->no_delegation);
  965. if (ip->no_delegation) {
  966. if (prefix->head.next)
  967. list_del(&prefix->head);
  968. } else
  969. list_add(&prefix->head, &prefixes);
  970. }
  971. }
  972. static void
  973. interface_update_prefix(struct vlist_tree *tree,
  974. struct vlist_node *node_new,
  975. struct vlist_node *node_old)
  976. {
  977. struct device_prefix *prefix_old, *prefix_new;
  978. prefix_old = container_of(node_old, struct device_prefix, node);
  979. prefix_new = container_of(node_new, struct device_prefix, node);
  980. struct interface_ip_settings *ip = container_of(tree, struct interface_ip_settings, prefix);
  981. if (tree && (!node_new || !node_old))
  982. ip->iface->updated |= IUF_PREFIX;
  983. struct device_route route;
  984. memset(&route, 0, sizeof(route));
  985. route.flags = DEVADDR_INET6;
  986. route.metric = INT32_MAX;
  987. route.mask = (node_new) ? prefix_new->length : prefix_old->length;
  988. route.addr.in6 = (node_new) ? prefix_new->addr : prefix_old->addr;
  989. struct device_prefix_assignment *c;
  990. struct interface *iface;
  991. if (node_old && node_new) {
  992. /* Move assignments and refresh addresses to update valid times */
  993. list_splice(&prefix_old->assignments, &prefix_new->assignments);
  994. list_for_each_entry(c, &prefix_new->assignments, head)
  995. if ((iface = vlist_find(&interfaces, c->name, iface, node)))
  996. interface_set_prefix_address(c, prefix_new, iface, true);
  997. if (prefix_new->preferred_until != prefix_old->preferred_until ||
  998. prefix_new->valid_until != prefix_old->valid_until)
  999. ip->iface->updated |= IUF_PREFIX;
  1000. } else if (node_new) {
  1001. /* Set null-route to avoid routing loops */
  1002. system_add_route(NULL, &route);
  1003. if (!prefix_new->iface || !prefix_new->iface->proto_ip.no_delegation)
  1004. interface_update_prefix_assignments(prefix_new, true);
  1005. } else if (node_old) {
  1006. /* Remove null-route */
  1007. interface_update_prefix_assignments(prefix_old, false);
  1008. system_del_route(NULL, &route);
  1009. }
  1010. if (node_old) {
  1011. if (prefix_old->head.next)
  1012. list_del(&prefix_old->head);
  1013. free(prefix_old);
  1014. }
  1015. if (node_new && (!prefix_new->iface || !prefix_new->iface->proto_ip.no_delegation))
  1016. list_add(&prefix_new->head, &prefixes);
  1017. }
  1018. struct device_prefix*
  1019. interface_ip_add_device_prefix(struct interface *iface, struct in6_addr *addr,
  1020. uint8_t length, time_t valid_until, time_t preferred_until,
  1021. struct in6_addr *excl_addr, uint8_t excl_length, const char *pclass)
  1022. {
  1023. if (!pclass)
  1024. pclass = (iface) ? iface->name : "local";
  1025. struct device_prefix *prefix = calloc(1, sizeof(*prefix) + strlen(pclass) + 1);
  1026. if (!prefix)
  1027. return NULL;
  1028. prefix->length = length;
  1029. prefix->addr = *addr;
  1030. prefix->preferred_until = preferred_until;
  1031. prefix->valid_until = valid_until;
  1032. prefix->iface = iface;
  1033. INIT_LIST_HEAD(&prefix->assignments);
  1034. if (excl_addr) {
  1035. prefix->excl_addr = *excl_addr;
  1036. prefix->excl_length = excl_length;
  1037. }
  1038. strcpy(prefix->pclass, pclass);
  1039. if (iface)
  1040. vlist_add(&iface->proto_ip.prefix, &prefix->node, &prefix->addr);
  1041. else
  1042. interface_update_prefix(NULL, &prefix->node, NULL);
  1043. return prefix;
  1044. }
  1045. void
  1046. interface_ip_set_ula_prefix(const char *prefix)
  1047. {
  1048. char buf[INET6_ADDRSTRLEN + 4] = {0}, *saveptr;
  1049. if (prefix)
  1050. strncpy(buf, prefix, sizeof(buf) - 1);
  1051. char *prefixaddr = strtok_r(buf, "/", &saveptr);
  1052. struct in6_addr addr;
  1053. if (!prefixaddr || inet_pton(AF_INET6, prefixaddr, &addr) < 1) {
  1054. if (ula_prefix) {
  1055. interface_update_prefix(NULL, NULL, &ula_prefix->node);
  1056. ula_prefix = NULL;
  1057. }
  1058. return;
  1059. }
  1060. int length;
  1061. char *prefixlen = strtok_r(NULL, ",", &saveptr);
  1062. if (!prefixlen || (length = atoi(prefixlen)) < 1 || length > 64)
  1063. return;
  1064. if (!ula_prefix || !IN6_ARE_ADDR_EQUAL(&addr, &ula_prefix->addr) ||
  1065. ula_prefix->length != length) {
  1066. if (ula_prefix)
  1067. interface_update_prefix(NULL, NULL, &ula_prefix->node);
  1068. ula_prefix = interface_ip_add_device_prefix(NULL, &addr, length,
  1069. 0, 0, NULL, 0, NULL);
  1070. }
  1071. }
  1072. static void
  1073. interface_add_dns_server(struct interface_ip_settings *ip, const char *str)
  1074. {
  1075. struct dns_server *s;
  1076. s = calloc(1, sizeof(*s));
  1077. if (!s)
  1078. return;
  1079. s->af = AF_INET;
  1080. if (inet_pton(s->af, str, &s->addr.in))
  1081. goto add;
  1082. s->af = AF_INET6;
  1083. if (inet_pton(s->af, str, &s->addr.in))
  1084. goto add;
  1085. free(s);
  1086. return;
  1087. add:
  1088. D(INTERFACE, "Add IPv%c DNS server: %s\n",
  1089. s->af == AF_INET6 ? '6' : '4', str);
  1090. vlist_simple_add(&ip->dns_servers, &s->node);
  1091. }
  1092. void
  1093. interface_add_dns_server_list(struct interface_ip_settings *ip, struct blob_attr *list)
  1094. {
  1095. struct blob_attr *cur;
  1096. int rem;
  1097. blobmsg_for_each_attr(cur, list, rem) {
  1098. if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
  1099. continue;
  1100. if (!blobmsg_check_attr(cur, false))
  1101. continue;
  1102. interface_add_dns_server(ip, blobmsg_data(cur));
  1103. }
  1104. }
  1105. static void
  1106. interface_add_dns_search_domain(struct interface_ip_settings *ip, const char *str)
  1107. {
  1108. struct dns_search_domain *s;
  1109. int len = strlen(str);
  1110. s = calloc(1, sizeof(*s) + len + 1);
  1111. if (!s)
  1112. return;
  1113. D(INTERFACE, "Add DNS search domain: %s\n", str);
  1114. memcpy(s->name, str, len);
  1115. vlist_simple_add(&ip->dns_search, &s->node);
  1116. }
  1117. void
  1118. interface_add_dns_search_list(struct interface_ip_settings *ip, struct blob_attr *list)
  1119. {
  1120. struct blob_attr *cur;
  1121. int rem;
  1122. blobmsg_for_each_attr(cur, list, rem) {
  1123. if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
  1124. continue;
  1125. if (!blobmsg_check_attr(cur, false))
  1126. continue;
  1127. interface_add_dns_search_domain(ip, blobmsg_data(cur));
  1128. }
  1129. }
  1130. static void
  1131. write_resolv_conf_entries(FILE *f, struct interface_ip_settings *ip, const char *dev)
  1132. {
  1133. struct dns_server *s;
  1134. struct dns_search_domain *d;
  1135. const char *str;
  1136. char buf[INET6_ADDRSTRLEN];
  1137. vlist_simple_for_each_element(&ip->dns_servers, s, node) {
  1138. str = inet_ntop(s->af, &s->addr, buf, sizeof(buf));
  1139. if (!str)
  1140. continue;
  1141. if (s->af == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&s->addr.in6))
  1142. fprintf(f, "nameserver %s%%%s\n", str, dev);
  1143. else
  1144. fprintf(f, "nameserver %s\n", str);
  1145. }
  1146. vlist_simple_for_each_element(&ip->dns_search, d, node) {
  1147. fprintf(f, "search %s\n", d->name);
  1148. }
  1149. }
  1150. /* Sorting of interface resolver entries : */
  1151. /* Primary on interface dns_metric : lowest metric first */
  1152. /* Secondary on interface metric : lowest metric first */
  1153. /* Finally alphabetical order of interface names */
  1154. static int resolv_conf_iface_cmp(const void *k1, const void *k2, void *ptr)
  1155. {
  1156. const struct interface *iface1 = k1, *iface2 = k2;
  1157. if (iface1->dns_metric != iface2->dns_metric)
  1158. return iface1->dns_metric - iface2->dns_metric;
  1159. if (iface1->metric != iface2->metric)
  1160. return iface1->metric - iface2->metric;
  1161. return strcmp(iface1->name, iface2->name);
  1162. }
  1163. static void
  1164. __interface_write_dns_entries(FILE *f, const char *jail)
  1165. {
  1166. struct interface *iface;
  1167. struct {
  1168. struct avl_node node;
  1169. } *entry, *n_entry;
  1170. struct avl_tree resolv_conf_iface_entries;
  1171. avl_init(&resolv_conf_iface_entries, resolv_conf_iface_cmp, false, NULL);
  1172. vlist_for_each_element(&interfaces, iface, node) {
  1173. if (iface->state != IFS_UP)
  1174. continue;
  1175. if (jail && (!iface->jail || strcmp(jail, iface->jail)))
  1176. continue;
  1177. if (vlist_simple_empty(&iface->proto_ip.dns_search) &&
  1178. vlist_simple_empty(&iface->proto_ip.dns_servers) &&
  1179. vlist_simple_empty(&iface->config_ip.dns_search) &&
  1180. vlist_simple_empty(&iface->config_ip.dns_servers))
  1181. continue;
  1182. entry = calloc(1, sizeof(*entry));
  1183. if (!entry)
  1184. continue;
  1185. entry->node.key = iface;
  1186. avl_insert(&resolv_conf_iface_entries, &entry->node);
  1187. }
  1188. avl_for_each_element(&resolv_conf_iface_entries, entry, node) {
  1189. iface = (struct interface *)entry->node.key;
  1190. struct device *dev = iface->l3_dev.dev;
  1191. fprintf(f, "# Interface %s\n", iface->name);
  1192. write_resolv_conf_entries(f, &iface->config_ip, dev->ifname);
  1193. if (!iface->proto_ip.no_dns)
  1194. write_resolv_conf_entries(f, &iface->proto_ip, dev->ifname);
  1195. }
  1196. avl_remove_all_elements(&resolv_conf_iface_entries, entry, node, n_entry)
  1197. free(entry);
  1198. }
  1199. void
  1200. interface_write_resolv_conf(const char *jail)
  1201. {
  1202. size_t plen = (jail ? strlen(jail) + 1 : 0 ) + strlen(resolv_conf) + 1;
  1203. char *path = alloca(plen);
  1204. char *dpath = alloca(plen);
  1205. char *tmppath = alloca(plen + 4);
  1206. FILE *f;
  1207. uint32_t crcold, crcnew;
  1208. if (jail) {
  1209. sprintf(path, "/tmp/resolv.conf-%s.d/resolv.conf.auto", jail);
  1210. strcpy(dpath, path);
  1211. dpath = dirname(dpath);
  1212. mkdir(dpath, 0755);
  1213. } else {
  1214. strcpy(path, resolv_conf);
  1215. }
  1216. sprintf(tmppath, "%s.tmp", path);
  1217. unlink(tmppath);
  1218. f = fopen(tmppath, "w+");
  1219. if (!f) {
  1220. D(INTERFACE, "Failed to open %s for writing\n", path);
  1221. return;
  1222. }
  1223. __interface_write_dns_entries(f, jail);
  1224. fflush(f);
  1225. rewind(f);
  1226. crcnew = crc32_file(f);
  1227. fclose(f);
  1228. crcold = crcnew + 1;
  1229. f = fopen(path, "r");
  1230. if (f) {
  1231. crcold = crc32_file(f);
  1232. fclose(f);
  1233. }
  1234. if (crcold == crcnew) {
  1235. unlink(tmppath);
  1236. } else if (rename(tmppath, path) < 0) {
  1237. D(INTERFACE, "Failed to replace %s\n", path);
  1238. unlink(tmppath);
  1239. }
  1240. }
  1241. void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled)
  1242. {
  1243. struct device_addr *addr;
  1244. struct device_route *route;
  1245. struct device_neighbor *neighbor;
  1246. struct device *dev;
  1247. struct interface *iface;
  1248. ip->enabled = enabled;
  1249. iface = ip->iface;
  1250. dev = iface->l3_dev.dev;
  1251. if (!dev)
  1252. return;
  1253. vlist_for_each_element(&ip->addr, addr, node) {
  1254. bool v6 = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET6) ? true : false;
  1255. if (addr->flags & DEVADDR_EXTERNAL)
  1256. continue;
  1257. if (addr->enabled == enabled)
  1258. continue;
  1259. if (enabled) {
  1260. system_add_address(dev, addr);
  1261. addr->policy_table = (v6) ? iface->ip6table : iface->ip4table;
  1262. if (iface->metric || addr->policy_table)
  1263. interface_handle_subnet_route(iface, addr, true);
  1264. if (addr->policy_table)
  1265. interface_add_addr_rules(addr, true);
  1266. } else {
  1267. interface_handle_subnet_route(iface, addr, false);
  1268. system_del_address(dev, addr);
  1269. if (addr->policy_table)
  1270. interface_add_addr_rules(addr, false);
  1271. }
  1272. addr->enabled = enabled;
  1273. }
  1274. vlist_for_each_element(&ip->route, route, node) {
  1275. bool _enabled = enabled;
  1276. if (route->flags & DEVADDR_EXTERNAL)
  1277. continue;
  1278. if (!enable_route(ip, route))
  1279. _enabled = false;
  1280. if (route->enabled == _enabled)
  1281. continue;
  1282. if (_enabled) {
  1283. interface_set_route_info(ip->iface, route);
  1284. if (system_add_route(dev, route))
  1285. route->failed = true;
  1286. } else
  1287. system_del_route(dev, route);
  1288. route->enabled = _enabled;
  1289. }
  1290. vlist_for_each_element(&ip->neighbor, neighbor, node) {
  1291. if (neighbor->enabled == enabled)
  1292. continue;
  1293. if (enabled) {
  1294. if(system_add_neighbor(dev, neighbor))
  1295. neighbor->failed = true;
  1296. } else
  1297. system_del_neighbor(dev, neighbor);
  1298. neighbor->enabled = enabled;
  1299. }
  1300. struct device_prefix *c;
  1301. struct device_prefix_assignment *a;
  1302. list_for_each_entry(c, &prefixes, head)
  1303. list_for_each_entry(a, &c->assignments, head)
  1304. if (!strcmp(a->name, ip->iface->name))
  1305. interface_set_prefix_address(a, c, ip->iface, enabled);
  1306. if (ip->iface->policy_rules_set != enabled &&
  1307. ip->iface->l3_dev.dev) {
  1308. set_ip_lo_policy(enabled, true, ip->iface);
  1309. set_ip_lo_policy(enabled, false, ip->iface);
  1310. set_ip_source_policy(enabled, true, IPRULE_PRIORITY_REJECT + ip->iface->l3_dev.dev->ifindex,
  1311. NULL, 0, 0, ip->iface, "failed_policy", true);
  1312. ip->iface->policy_rules_set = enabled;
  1313. }
  1314. }
  1315. void
  1316. interface_ip_update_start(struct interface_ip_settings *ip)
  1317. {
  1318. if (ip != &ip->iface->config_ip) {
  1319. vlist_simple_update(&ip->dns_servers);
  1320. vlist_simple_update(&ip->dns_search);
  1321. }
  1322. vlist_update(&ip->route);
  1323. vlist_update(&ip->addr);
  1324. vlist_update(&ip->prefix);
  1325. vlist_update(&ip->neighbor);
  1326. }
  1327. void
  1328. interface_ip_update_complete(struct interface_ip_settings *ip)
  1329. {
  1330. vlist_simple_flush(&ip->dns_servers);
  1331. vlist_simple_flush(&ip->dns_search);
  1332. vlist_flush(&ip->route);
  1333. vlist_flush(&ip->addr);
  1334. vlist_flush(&ip->prefix);
  1335. vlist_flush(&ip->neighbor);
  1336. interface_write_resolv_conf(ip->iface->jail);
  1337. }
  1338. void
  1339. interface_ip_flush(struct interface_ip_settings *ip)
  1340. {
  1341. if (ip == &ip->iface->proto_ip)
  1342. vlist_flush_all(&ip->iface->host_routes);
  1343. vlist_simple_flush_all(&ip->dns_servers);
  1344. vlist_simple_flush_all(&ip->dns_search);
  1345. vlist_flush_all(&ip->route);
  1346. vlist_flush_all(&ip->addr);
  1347. vlist_flush_all(&ip->neighbor);
  1348. vlist_flush_all(&ip->prefix);
  1349. }
  1350. static void
  1351. __interface_ip_init(struct interface_ip_settings *ip, struct interface *iface)
  1352. {
  1353. ip->iface = iface;
  1354. ip->enabled = true;
  1355. vlist_simple_init(&ip->dns_search, struct dns_search_domain, node);
  1356. vlist_simple_init(&ip->dns_servers, struct dns_server, node);
  1357. vlist_init(&ip->route, route_cmp, interface_update_proto_route);
  1358. vlist_init(&ip->neighbor, neighbor_cmp, interface_update_proto_neighbor);
  1359. vlist_init(&ip->addr, addr_cmp, interface_update_proto_addr);
  1360. vlist_init(&ip->prefix, prefix_cmp, interface_update_prefix);
  1361. }
  1362. void
  1363. interface_ip_init(struct interface *iface)
  1364. {
  1365. __interface_ip_init(&iface->proto_ip, iface);
  1366. __interface_ip_init(&iface->config_ip, iface);
  1367. vlist_init(&iface->host_routes, route_cmp, interface_update_host_route);
  1368. }
  1369. static void
  1370. interface_ip_valid_until_handler(struct uloop_timeout *t)
  1371. {
  1372. time_t now = system_get_rtime();
  1373. struct interface *iface;
  1374. vlist_for_each_element(&interfaces, iface, node) {
  1375. if (iface->state != IFS_UP)
  1376. continue;
  1377. struct device_addr *addr, *addrp;
  1378. struct device_route *route, *routep;
  1379. struct device_prefix *pref, *prefp;
  1380. vlist_for_each_element_safe(&iface->proto_ip.addr, addr, node, addrp)
  1381. if (addr->valid_until && addr->valid_until < now)
  1382. vlist_delete(&iface->proto_ip.addr, &addr->node);
  1383. vlist_for_each_element_safe(&iface->proto_ip.route, route, node, routep)
  1384. if (route->valid_until && route->valid_until < now)
  1385. vlist_delete(&iface->proto_ip.route, &route->node);
  1386. vlist_for_each_element_safe(&iface->proto_ip.prefix, pref, node, prefp)
  1387. if (pref->valid_until && pref->valid_until < now)
  1388. vlist_delete(&iface->proto_ip.prefix, &pref->node);
  1389. }
  1390. uloop_timeout_set(t, 1000);
  1391. }
  1392. static void __init
  1393. interface_ip_init_worker(void)
  1394. {
  1395. valid_until_timeout.cb = interface_ip_valid_until_handler;
  1396. uloop_timeout_set(&valid_until_timeout, 1000);
  1397. }