system-linux.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. /*
  2. * netifd - network interface daemon
  3. * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
  4. * Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
  5. * Copyright (C) 2013 Steven Barth <steven@midlink.org>
  6. * Copyright (C) 2014 Gioacchino Mazzurco <gio@eigenlab.org>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2
  10. * as published by the Free Software Foundation
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. */
  17. #define _GNU_SOURCE
  18. #include <sys/socket.h>
  19. #include <sys/ioctl.h>
  20. #include <sys/stat.h>
  21. #include <sys/syscall.h>
  22. #include <net/if.h>
  23. #include <net/if_arp.h>
  24. #include <arpa/inet.h>
  25. #include <netinet/in.h>
  26. #include <linux/rtnetlink.h>
  27. #include <linux/sockios.h>
  28. #include <linux/ip.h>
  29. #include <linux/if_link.h>
  30. #include <linux/if_vlan.h>
  31. #include <linux/if_bridge.h>
  32. #include <linux/if_tunnel.h>
  33. #include <linux/ip6_tunnel.h>
  34. #include <linux/ethtool.h>
  35. #include <linux/fib_rules.h>
  36. #include <linux/version.h>
  37. #ifndef RTN_FAILED_POLICY
  38. #define RTN_FAILED_POLICY 12
  39. #endif
  40. #include <string.h>
  41. #include <fcntl.h>
  42. #include <glob.h>
  43. #include <time.h>
  44. #include <netlink/msg.h>
  45. #include <netlink/attr.h>
  46. #include <netlink/socket.h>
  47. #include <libubox/uloop.h>
  48. #include "netifd.h"
  49. #include "device.h"
  50. #include "system.h"
  51. struct event_socket {
  52. struct uloop_fd uloop;
  53. struct nl_sock *sock;
  54. int bufsize;
  55. };
  56. static int sock_ioctl = -1;
  57. static struct nl_sock *sock_rtnl = NULL;
  58. static int cb_rtnl_event(struct nl_msg *msg, void *arg);
  59. static void handle_hotplug_event(struct uloop_fd *u, unsigned int events);
  60. static char dev_buf[256];
  61. static void
  62. handler_nl_event(struct uloop_fd *u, unsigned int events)
  63. {
  64. struct event_socket *ev = container_of(u, struct event_socket, uloop);
  65. int err;
  66. socklen_t errlen = sizeof(err);
  67. if (!u->error) {
  68. nl_recvmsgs_default(ev->sock);
  69. return;
  70. }
  71. if (getsockopt(u->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen))
  72. goto abort;
  73. switch(err) {
  74. case ENOBUFS:
  75. // Increase rx buffer size on netlink socket
  76. ev->bufsize *= 2;
  77. if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
  78. goto abort;
  79. // Request full dump since some info got dropped
  80. struct rtgenmsg msg = { .rtgen_family = AF_UNSPEC };
  81. nl_send_simple(ev->sock, RTM_GETLINK, NLM_F_DUMP, &msg, sizeof(msg));
  82. break;
  83. default:
  84. goto abort;
  85. }
  86. u->error = false;
  87. return;
  88. abort:
  89. uloop_fd_delete(&ev->uloop);
  90. return;
  91. }
  92. static struct nl_sock *
  93. create_socket(int protocol, int groups)
  94. {
  95. struct nl_sock *sock;
  96. sock = nl_socket_alloc();
  97. if (!sock)
  98. return NULL;
  99. if (groups)
  100. nl_join_groups(sock, groups);
  101. if (nl_connect(sock, protocol))
  102. return NULL;
  103. return sock;
  104. }
  105. static bool
  106. create_raw_event_socket(struct event_socket *ev, int protocol, int groups,
  107. uloop_fd_handler cb, int flags)
  108. {
  109. ev->sock = create_socket(protocol, groups);
  110. if (!ev->sock)
  111. return false;
  112. ev->uloop.fd = nl_socket_get_fd(ev->sock);
  113. ev->uloop.cb = cb;
  114. if (uloop_fd_add(&ev->uloop, ULOOP_READ|flags))
  115. return false;
  116. return true;
  117. }
  118. static bool
  119. create_event_socket(struct event_socket *ev, int protocol,
  120. int (*cb)(struct nl_msg *msg, void *arg))
  121. {
  122. if (!create_raw_event_socket(ev, protocol, 0, handler_nl_event, ULOOP_ERROR_CB))
  123. return false;
  124. // Install the valid custom callback handler
  125. nl_socket_modify_cb(ev->sock, NL_CB_VALID, NL_CB_CUSTOM, cb, NULL);
  126. // Disable sequence number checking on event sockets
  127. nl_socket_disable_seq_check(ev->sock);
  128. // Increase rx buffer size to 65K on event sockets
  129. ev->bufsize = 65535;
  130. if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
  131. return false;
  132. return true;
  133. }
  134. static bool
  135. system_rtn_aton(const char *src, unsigned int *dst)
  136. {
  137. char *e;
  138. unsigned int n;
  139. if (!strcmp(src, "local"))
  140. n = RTN_LOCAL;
  141. else if (!strcmp(src, "nat"))
  142. n = RTN_NAT;
  143. else if (!strcmp(src, "broadcast"))
  144. n = RTN_BROADCAST;
  145. else if (!strcmp(src, "anycast"))
  146. n = RTN_ANYCAST;
  147. else if (!strcmp(src, "multicast"))
  148. n = RTN_MULTICAST;
  149. else if (!strcmp(src, "prohibit"))
  150. n = RTN_PROHIBIT;
  151. else if (!strcmp(src, "unreachable"))
  152. n = RTN_UNREACHABLE;
  153. else if (!strcmp(src, "blackhole"))
  154. n = RTN_BLACKHOLE;
  155. else if (!strcmp(src, "xresolve"))
  156. n = RTN_XRESOLVE;
  157. else if (!strcmp(src, "unicast"))
  158. n = RTN_UNICAST;
  159. else if (!strcmp(src, "throw"))
  160. n = RTN_THROW;
  161. else if (!strcmp(src, "failed_policy"))
  162. n = RTN_FAILED_POLICY;
  163. else {
  164. n = strtoul(src, &e, 0);
  165. if (!e || *e || e == src || n > 255)
  166. return false;
  167. }
  168. *dst = n;
  169. return true;
  170. }
  171. int system_init(void)
  172. {
  173. static struct event_socket rtnl_event;
  174. static struct event_socket hotplug_event;
  175. sock_ioctl = socket(AF_LOCAL, SOCK_DGRAM, 0);
  176. system_fd_set_cloexec(sock_ioctl);
  177. // Prepare socket for routing / address control
  178. sock_rtnl = create_socket(NETLINK_ROUTE, 0);
  179. if (!sock_rtnl)
  180. return -1;
  181. if (!create_event_socket(&rtnl_event, NETLINK_ROUTE, cb_rtnl_event))
  182. return -1;
  183. if (!create_raw_event_socket(&hotplug_event, NETLINK_KOBJECT_UEVENT, 1,
  184. handle_hotplug_event, 0))
  185. return -1;
  186. // Receive network link events form kernel
  187. nl_socket_add_membership(rtnl_event.sock, RTNLGRP_LINK);
  188. return 0;
  189. }
  190. static void system_set_sysctl(const char *path, const char *val)
  191. {
  192. int fd;
  193. fd = open(path, O_WRONLY);
  194. if (fd < 0)
  195. return;
  196. if (write(fd, val, strlen(val))) {}
  197. close(fd);
  198. }
  199. static void system_set_dev_sysctl(const char *path, const char *device, const char *val)
  200. {
  201. snprintf(dev_buf, sizeof(dev_buf), path, device);
  202. system_set_sysctl(dev_buf, val);
  203. }
  204. static void system_set_disable_ipv6(struct device *dev, const char *val)
  205. {
  206. system_set_dev_sysctl("/proc/sys/net/ipv6/conf/%s/disable_ipv6", dev->ifname, val);
  207. }
  208. static int system_get_sysctl(const char *path, char *buf, const size_t buf_sz)
  209. {
  210. int fd = -1, ret = -1;
  211. fd = open(path, O_RDONLY);
  212. if (fd < 0)
  213. goto out;
  214. ssize_t len = read(fd, buf, buf_sz - 1);
  215. if (len < 0)
  216. goto out;
  217. ret = buf[len] = 0;
  218. out:
  219. if (fd >= 0)
  220. close(fd);
  221. return ret;
  222. }
  223. static int
  224. system_get_dev_sysctl(const char *path, const char *device, char *buf, const size_t buf_sz)
  225. {
  226. snprintf(dev_buf, sizeof(dev_buf), path, device);
  227. return system_get_sysctl(dev_buf, buf, buf_sz);
  228. }
  229. static int system_get_disable_ipv6(struct device *dev, char *buf, const size_t buf_sz)
  230. {
  231. return system_get_dev_sysctl("/proc/sys/net/ipv6/conf/%s/disable_ipv6",
  232. dev->ifname, buf, buf_sz);
  233. }
  234. #ifndef IFF_LOWER_UP
  235. #define IFF_LOWER_UP 0x10000
  236. #endif
  237. // Evaluate netlink messages
  238. static int cb_rtnl_event(struct nl_msg *msg, void *arg)
  239. {
  240. struct nlmsghdr *nh = nlmsg_hdr(msg);
  241. struct ifinfomsg *ifi = NLMSG_DATA(nh);
  242. struct nlattr *nla[__IFLA_MAX];
  243. if (nh->nlmsg_type != RTM_NEWLINK)
  244. goto out;
  245. nlmsg_parse(nh, sizeof(*ifi), nla, __IFLA_MAX - 1, NULL);
  246. if (!nla[IFLA_IFNAME])
  247. goto out;
  248. struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false);
  249. if (!dev)
  250. goto out;
  251. device_set_ifindex(dev, ifi->ifi_index);
  252. device_set_link(dev, ifi->ifi_flags & IFF_LOWER_UP ? true : false);
  253. out:
  254. return 0;
  255. }
  256. static void
  257. handle_hotplug_msg(char *data, int size)
  258. {
  259. const char *subsystem = NULL, *interface = NULL;
  260. char *cur, *end, *sep;
  261. struct device *dev;
  262. int skip;
  263. bool add;
  264. if (!strncmp(data, "add@", 4))
  265. add = true;
  266. else if (!strncmp(data, "remove@", 7))
  267. add = false;
  268. else
  269. return;
  270. skip = strlen(data) + 1;
  271. end = data + size;
  272. for (cur = data + skip; cur < end; cur += skip) {
  273. skip = strlen(cur) + 1;
  274. sep = strchr(cur, '=');
  275. if (!sep)
  276. continue;
  277. *sep = 0;
  278. if (!strcmp(cur, "INTERFACE"))
  279. interface = sep + 1;
  280. else if (!strcmp(cur, "SUBSYSTEM")) {
  281. subsystem = sep + 1;
  282. if (strcmp(subsystem, "net") != 0)
  283. return;
  284. }
  285. if (subsystem && interface)
  286. goto found;
  287. }
  288. return;
  289. found:
  290. dev = device_get(interface, false);
  291. if (!dev)
  292. return;
  293. if (dev->type != &simple_device_type)
  294. return;
  295. if (add && system_if_force_external(dev->ifname))
  296. return;
  297. device_set_present(dev, add);
  298. }
  299. static void
  300. handle_hotplug_event(struct uloop_fd *u, unsigned int events)
  301. {
  302. struct event_socket *ev = container_of(u, struct event_socket, uloop);
  303. struct sockaddr_nl nla;
  304. unsigned char *buf = NULL;
  305. int size;
  306. while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
  307. if (nla.nl_pid == 0)
  308. handle_hotplug_msg((char *) buf, size);
  309. free(buf);
  310. }
  311. }
  312. static int system_rtnl_call(struct nl_msg *msg)
  313. {
  314. int ret;
  315. ret = nl_send_auto_complete(sock_rtnl, msg);
  316. nlmsg_free(msg);
  317. if (ret < 0)
  318. return ret;
  319. return nl_wait_for_ack(sock_rtnl);
  320. }
  321. int system_bridge_delbr(struct device *bridge)
  322. {
  323. return ioctl(sock_ioctl, SIOCBRDELBR, bridge->ifname);
  324. }
  325. static int system_bridge_if(const char *bridge, struct device *dev, int cmd, void *data)
  326. {
  327. struct ifreq ifr;
  328. memset(&ifr, 0, sizeof(ifr));
  329. if (dev)
  330. ifr.ifr_ifindex = dev->ifindex;
  331. else
  332. ifr.ifr_data = data;
  333. strncpy(ifr.ifr_name, bridge, sizeof(ifr.ifr_name));
  334. return ioctl(sock_ioctl, cmd, &ifr);
  335. }
  336. static bool system_is_bridge(const char *name, char *buf, int buflen)
  337. {
  338. struct stat st;
  339. snprintf(buf, buflen, "/sys/devices/virtual/net/%s/bridge", name);
  340. if (stat(buf, &st) < 0)
  341. return false;
  342. return true;
  343. }
  344. static char *system_get_bridge(const char *name, char *buf, int buflen)
  345. {
  346. char *path;
  347. ssize_t len;
  348. glob_t gl;
  349. snprintf(buf, buflen, "/sys/devices/virtual/net/*/brif/%s/bridge", name);
  350. if (glob(buf, GLOB_NOSORT, NULL, &gl) < 0)
  351. return NULL;
  352. if (gl.gl_pathc == 0)
  353. return NULL;
  354. len = readlink(gl.gl_pathv[0], buf, buflen);
  355. if (len < 0)
  356. return NULL;
  357. buf[len] = 0;
  358. path = strrchr(buf, '/');
  359. if (!path)
  360. return NULL;
  361. return path + 1;
  362. }
  363. static void system_bridge_set_wireless(const char *bridge, const char *dev)
  364. {
  365. snprintf(dev_buf, sizeof(dev_buf),
  366. "/sys/devices/virtual/net/%s/brif/%s/multicast_to_unicast",
  367. bridge, dev);
  368. system_set_sysctl(dev_buf, "1");
  369. }
  370. int system_bridge_addif(struct device *bridge, struct device *dev)
  371. {
  372. char *oldbr;
  373. int ret = 0;
  374. oldbr = system_get_bridge(dev->ifname, dev_buf, sizeof(dev_buf));
  375. if (!oldbr || strcmp(oldbr, bridge->ifname) != 0)
  376. ret = system_bridge_if(bridge->ifname, dev, SIOCBRADDIF, NULL);
  377. if (dev->wireless)
  378. system_bridge_set_wireless(bridge->ifname, dev->ifname);
  379. return ret;
  380. }
  381. int system_bridge_delif(struct device *bridge, struct device *dev)
  382. {
  383. return system_bridge_if(bridge->ifname, dev, SIOCBRDELIF, NULL);
  384. }
  385. static int system_if_resolve(struct device *dev)
  386. {
  387. struct ifreq ifr;
  388. strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
  389. if (!ioctl(sock_ioctl, SIOCGIFINDEX, &ifr))
  390. return ifr.ifr_ifindex;
  391. else
  392. return 0;
  393. }
  394. static int system_if_flags(const char *ifname, unsigned add, unsigned rem)
  395. {
  396. struct ifreq ifr;
  397. memset(&ifr, 0, sizeof(ifr));
  398. strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
  399. ioctl(sock_ioctl, SIOCGIFFLAGS, &ifr);
  400. ifr.ifr_flags |= add;
  401. ifr.ifr_flags &= ~rem;
  402. return ioctl(sock_ioctl, SIOCSIFFLAGS, &ifr);
  403. }
  404. struct clear_data {
  405. struct nl_msg *msg;
  406. struct device *dev;
  407. int type;
  408. int size;
  409. int af;
  410. };
  411. static bool check_ifaddr(struct nlmsghdr *hdr, int ifindex)
  412. {
  413. struct ifaddrmsg *ifa = NLMSG_DATA(hdr);
  414. return ifa->ifa_index == ifindex;
  415. }
  416. static bool check_route(struct nlmsghdr *hdr, int ifindex)
  417. {
  418. struct rtmsg *r = NLMSG_DATA(hdr);
  419. struct nlattr *tb[__RTA_MAX];
  420. if (r->rtm_protocol == RTPROT_KERNEL &&
  421. r->rtm_family == AF_INET6)
  422. return false;
  423. nlmsg_parse(hdr, sizeof(struct rtmsg), tb, __RTA_MAX - 1, NULL);
  424. if (!tb[RTA_OIF])
  425. return false;
  426. return *(int *)RTA_DATA(tb[RTA_OIF]) == ifindex;
  427. }
  428. static bool check_rule(struct nlmsghdr *hdr, int ifindex)
  429. {
  430. return true;
  431. }
  432. static int cb_clear_event(struct nl_msg *msg, void *arg)
  433. {
  434. struct clear_data *clr = arg;
  435. struct nlmsghdr *hdr = nlmsg_hdr(msg);
  436. bool (*cb)(struct nlmsghdr *, int ifindex);
  437. int type;
  438. switch(clr->type) {
  439. case RTM_GETADDR:
  440. type = RTM_DELADDR;
  441. if (hdr->nlmsg_type != RTM_NEWADDR)
  442. return NL_SKIP;
  443. cb = check_ifaddr;
  444. break;
  445. case RTM_GETROUTE:
  446. type = RTM_DELROUTE;
  447. if (hdr->nlmsg_type != RTM_NEWROUTE)
  448. return NL_SKIP;
  449. cb = check_route;
  450. break;
  451. case RTM_GETRULE:
  452. type = RTM_DELRULE;
  453. if (hdr->nlmsg_type != RTM_NEWRULE)
  454. return NL_SKIP;
  455. cb = check_rule;
  456. break;
  457. default:
  458. return NL_SKIP;
  459. }
  460. if (!cb(hdr, clr->dev ? clr->dev->ifindex : 0))
  461. return NL_SKIP;
  462. if (type == RTM_DELRULE)
  463. D(SYSTEM, "Remove a rule\n");
  464. else
  465. D(SYSTEM, "Remove %s from device %s\n",
  466. type == RTM_DELADDR ? "an address" : "a route",
  467. clr->dev->ifname);
  468. memcpy(nlmsg_hdr(clr->msg), hdr, hdr->nlmsg_len);
  469. hdr = nlmsg_hdr(clr->msg);
  470. hdr->nlmsg_type = type;
  471. hdr->nlmsg_flags = NLM_F_REQUEST;
  472. nl_socket_disable_auto_ack(sock_rtnl);
  473. nl_send_auto_complete(sock_rtnl, clr->msg);
  474. nl_socket_enable_auto_ack(sock_rtnl);
  475. return NL_SKIP;
  476. }
  477. static int
  478. cb_finish_event(struct nl_msg *msg, void *arg)
  479. {
  480. int *pending = arg;
  481. *pending = 0;
  482. return NL_STOP;
  483. }
  484. static int
  485. error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
  486. {
  487. int *pending = arg;
  488. *pending = err->error;
  489. return NL_STOP;
  490. }
  491. static void
  492. system_if_clear_entries(struct device *dev, int type, int af)
  493. {
  494. struct clear_data clr;
  495. struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
  496. struct rtmsg rtm = {
  497. .rtm_family = af,
  498. .rtm_flags = RTM_F_CLONED,
  499. };
  500. int flags = NLM_F_DUMP;
  501. int pending = 1;
  502. clr.af = af;
  503. clr.dev = dev;
  504. clr.type = type;
  505. switch (type) {
  506. case RTM_GETADDR:
  507. case RTM_GETRULE:
  508. clr.size = sizeof(struct rtgenmsg);
  509. break;
  510. case RTM_GETROUTE:
  511. clr.size = sizeof(struct rtmsg);
  512. break;
  513. default:
  514. return;
  515. }
  516. if (!cb)
  517. return;
  518. clr.msg = nlmsg_alloc_simple(type, flags);
  519. if (!clr.msg)
  520. goto out;
  521. nlmsg_append(clr.msg, &rtm, clr.size, 0);
  522. nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_clear_event, &clr);
  523. nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_finish_event, &pending);
  524. nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &pending);
  525. nl_send_auto_complete(sock_rtnl, clr.msg);
  526. while (pending > 0)
  527. nl_recvmsgs(sock_rtnl, cb);
  528. nlmsg_free(clr.msg);
  529. out:
  530. nl_cb_put(cb);
  531. }
  532. /*
  533. * Clear bridge (membership) state and bring down device
  534. */
  535. void system_if_clear_state(struct device *dev)
  536. {
  537. static char buf[256];
  538. char *bridge;
  539. device_set_ifindex(dev, system_if_resolve(dev));
  540. if (dev->external || !dev->ifindex)
  541. return;
  542. system_if_flags(dev->ifname, 0, IFF_UP);
  543. if (system_is_bridge(dev->ifname, buf, sizeof(buf))) {
  544. D(SYSTEM, "Delete existing bridge named '%s'\n", dev->ifname);
  545. system_bridge_delbr(dev);
  546. return;
  547. }
  548. bridge = system_get_bridge(dev->ifname, buf, sizeof(buf));
  549. if (bridge) {
  550. D(SYSTEM, "Remove device '%s' from bridge '%s'\n", dev->ifname, bridge);
  551. system_bridge_if(bridge, dev, SIOCBRDELIF, NULL);
  552. }
  553. system_if_clear_entries(dev, RTM_GETROUTE, AF_INET);
  554. system_if_clear_entries(dev, RTM_GETADDR, AF_INET);
  555. system_if_clear_entries(dev, RTM_GETROUTE, AF_INET6);
  556. system_if_clear_entries(dev, RTM_GETADDR, AF_INET6);
  557. system_set_disable_ipv6(dev, "0");
  558. }
  559. static inline unsigned long
  560. sec_to_jiffies(int val)
  561. {
  562. return (unsigned long) val * 100;
  563. }
  564. int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg)
  565. {
  566. unsigned long args[4] = {};
  567. if (ioctl(sock_ioctl, SIOCBRADDBR, bridge->ifname) < 0)
  568. return -1;
  569. args[0] = BRCTL_SET_BRIDGE_STP_STATE;
  570. args[1] = !!cfg->stp;
  571. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  572. args[0] = BRCTL_SET_BRIDGE_FORWARD_DELAY;
  573. args[1] = sec_to_jiffies(cfg->forward_delay);
  574. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  575. system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_snooping",
  576. bridge->ifname, cfg->igmp_snoop ? "1" : "0");
  577. system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_querier",
  578. bridge->ifname, cfg->igmp_snoop ? "1" : "0");
  579. args[0] = BRCTL_SET_BRIDGE_PRIORITY;
  580. args[1] = cfg->priority;
  581. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  582. if (cfg->flags & BRIDGE_OPT_AGEING_TIME) {
  583. args[0] = BRCTL_SET_AGEING_TIME;
  584. args[1] = sec_to_jiffies(cfg->ageing_time);
  585. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  586. }
  587. if (cfg->flags & BRIDGE_OPT_HELLO_TIME) {
  588. args[0] = BRCTL_SET_BRIDGE_HELLO_TIME;
  589. args[1] = sec_to_jiffies(cfg->hello_time);
  590. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  591. }
  592. if (cfg->flags & BRIDGE_OPT_MAX_AGE) {
  593. args[0] = BRCTL_SET_BRIDGE_MAX_AGE;
  594. args[1] = sec_to_jiffies(cfg->max_age);
  595. system_bridge_if(bridge->ifname, NULL, SIOCDEVPRIVATE, &args);
  596. }
  597. return 0;
  598. }
  599. int system_macvlan_add(struct device *macvlan, struct device *dev, struct macvlan_config *cfg)
  600. {
  601. struct nl_msg *msg;
  602. struct nlattr *linkinfo, *data;
  603. struct ifinfomsg iim = { .ifi_family = AF_UNSPEC, };
  604. int ifindex = system_if_resolve(dev);
  605. int i, rv;
  606. static const struct {
  607. const char *name;
  608. enum macvlan_mode val;
  609. } modes[] = {
  610. { "private", MACVLAN_MODE_PRIVATE },
  611. { "vepa", MACVLAN_MODE_VEPA },
  612. { "bridge", MACVLAN_MODE_BRIDGE },
  613. { "passthru", MACVLAN_MODE_PASSTHRU },
  614. };
  615. if (ifindex == 0)
  616. return -ENOENT;
  617. msg = nlmsg_alloc_simple(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL);
  618. if (!msg)
  619. return -1;
  620. nlmsg_append(msg, &iim, sizeof(iim), 0);
  621. if (cfg->flags & MACVLAN_OPT_MACADDR)
  622. nla_put(msg, IFLA_ADDRESS, sizeof(cfg->macaddr), cfg->macaddr);
  623. nla_put_string(msg, IFLA_IFNAME, macvlan->ifname);
  624. nla_put_u32(msg, IFLA_LINK, ifindex);
  625. if (!(linkinfo = nla_nest_start(msg, IFLA_LINKINFO)))
  626. goto nla_put_failure;
  627. nla_put_string(msg, IFLA_INFO_KIND, "macvlan");
  628. if (!(data = nla_nest_start(msg, IFLA_INFO_DATA)))
  629. goto nla_put_failure;
  630. if (cfg->mode) {
  631. for (i = 0; i < ARRAY_SIZE(modes); i++) {
  632. if (strcmp(cfg->mode, modes[i].name) != 0)
  633. continue;
  634. nla_put_u32(msg, IFLA_MACVLAN_MODE, modes[i].val);
  635. break;
  636. }
  637. }
  638. nla_nest_end(msg, data);
  639. nla_nest_end(msg, linkinfo);
  640. rv = system_rtnl_call(msg);
  641. if (rv)
  642. D(SYSTEM, "Error adding macvlan '%s' over '%s': %d\n", macvlan->ifname, dev->ifname, rv);
  643. return rv;
  644. nla_put_failure:
  645. nlmsg_free(msg);
  646. return -ENOMEM;
  647. }
  648. static int system_link_del(const char *ifname)
  649. {
  650. struct nl_msg *msg;
  651. struct ifinfomsg iim = {
  652. .ifi_family = AF_UNSPEC,
  653. .ifi_index = 0,
  654. };
  655. msg = nlmsg_alloc_simple(RTM_DELLINK, NLM_F_REQUEST);
  656. if (!msg)
  657. return -1;
  658. nlmsg_append(msg, &iim, sizeof(iim), 0);
  659. nla_put_string(msg, IFLA_IFNAME, ifname);
  660. return system_rtnl_call(msg);
  661. }
  662. int system_macvlan_del(struct device *macvlan)
  663. {
  664. return system_link_del(macvlan->ifname);
  665. }
  666. static int system_vlan(struct device *dev, int id)
  667. {
  668. struct vlan_ioctl_args ifr = {
  669. .cmd = SET_VLAN_NAME_TYPE_CMD,
  670. .u.name_type = VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD,
  671. };
  672. ioctl(sock_ioctl, SIOCSIFVLAN, &ifr);
  673. if (id < 0) {
  674. ifr.cmd = DEL_VLAN_CMD;
  675. ifr.u.VID = 0;
  676. } else {
  677. ifr.cmd = ADD_VLAN_CMD;
  678. ifr.u.VID = id;
  679. }
  680. strncpy(ifr.device1, dev->ifname, sizeof(ifr.device1));
  681. return ioctl(sock_ioctl, SIOCSIFVLAN, &ifr);
  682. }
  683. int system_vlan_add(struct device *dev, int id)
  684. {
  685. return system_vlan(dev, id);
  686. }
  687. int system_vlan_del(struct device *dev)
  688. {
  689. return system_vlan(dev, -1);
  690. }
  691. int system_vlandev_add(struct device *vlandev, struct device *dev, struct vlandev_config *cfg)
  692. {
  693. struct nl_msg *msg;
  694. struct nlattr *linkinfo, *data;
  695. struct ifinfomsg iim = { .ifi_family = AF_UNSPEC };
  696. int ifindex = system_if_resolve(dev);
  697. int rv;
  698. if (ifindex == 0)
  699. return -ENOENT;
  700. msg = nlmsg_alloc_simple(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL);
  701. if (!msg)
  702. return -1;
  703. nlmsg_append(msg, &iim, sizeof(iim), 0);
  704. nla_put_string(msg, IFLA_IFNAME, vlandev->ifname);
  705. nla_put_u32(msg, IFLA_LINK, ifindex);
  706. if (!(linkinfo = nla_nest_start(msg, IFLA_LINKINFO)))
  707. goto nla_put_failure;
  708. nla_put_string(msg, IFLA_INFO_KIND, "vlan");
  709. if (!(data = nla_nest_start(msg, IFLA_INFO_DATA)))
  710. goto nla_put_failure;
  711. nla_put_u16(msg, IFLA_VLAN_ID, cfg->vid);
  712. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
  713. nla_put_u16(msg, IFLA_VLAN_PROTOCOL, htons(cfg->proto));
  714. #else
  715. if(cfg->proto == VLAN_PROTO_8021AD)
  716. netifd_log_message(L_WARNING, "%s Your kernel is older than linux 3.10.0, 802.1ad is not supported defaulting to 802.1q", vlandev->type->name);
  717. #endif
  718. nla_nest_end(msg, data);
  719. nla_nest_end(msg, linkinfo);
  720. rv = system_rtnl_call(msg);
  721. if (rv)
  722. D(SYSTEM, "Error adding vlandev '%s' over '%s': %d\n", vlandev->ifname, dev->ifname, rv);
  723. return rv;
  724. nla_put_failure:
  725. nlmsg_free(msg);
  726. return -ENOMEM;
  727. }
  728. int system_vlandev_del(struct device *vlandev)
  729. {
  730. return system_link_del(vlandev->ifname);
  731. }
  732. static void
  733. system_if_get_settings(struct device *dev, struct device_settings *s)
  734. {
  735. struct ifreq ifr;
  736. char buf[10];
  737. memset(&ifr, 0, sizeof(ifr));
  738. strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
  739. if (ioctl(sock_ioctl, SIOCGIFMTU, &ifr) == 0) {
  740. s->mtu = ifr.ifr_mtu;
  741. s->flags |= DEV_OPT_MTU;
  742. }
  743. if (ioctl(sock_ioctl, SIOCGIFTXQLEN, &ifr) == 0) {
  744. s->txqueuelen = ifr.ifr_qlen;
  745. s->flags |= DEV_OPT_TXQUEUELEN;
  746. }
  747. if (ioctl(sock_ioctl, SIOCGIFHWADDR, &ifr) == 0) {
  748. memcpy(s->macaddr, &ifr.ifr_hwaddr.sa_data, sizeof(s->macaddr));
  749. s->flags |= DEV_OPT_MACADDR;
  750. }
  751. if (!system_get_disable_ipv6(dev, buf, sizeof(buf))) {
  752. s->ipv6 = !strtoul(buf, NULL, 0);
  753. s->flags |= DEV_OPT_IPV6;
  754. }
  755. if (ioctl(sock_ioctl, SIOCGIFFLAGS, &ifr) == 0) {
  756. s->promisc = ifr.ifr_flags & IFF_PROMISC;
  757. s->flags |= DEV_OPT_PROMISC;
  758. }
  759. }
  760. void
  761. system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned int apply_mask)
  762. {
  763. struct ifreq ifr;
  764. if (!apply_mask)
  765. return;
  766. memset(&ifr, 0, sizeof(ifr));
  767. strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
  768. if (s->flags & DEV_OPT_MTU & apply_mask) {
  769. ifr.ifr_mtu = s->mtu;
  770. if (ioctl(sock_ioctl, SIOCSIFMTU, &ifr) < 0)
  771. s->flags &= ~DEV_OPT_MTU;
  772. }
  773. if (s->flags & DEV_OPT_TXQUEUELEN & apply_mask) {
  774. ifr.ifr_qlen = s->txqueuelen;
  775. if (ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr) < 0)
  776. s->flags &= ~DEV_OPT_TXQUEUELEN;
  777. }
  778. if ((s->flags & DEV_OPT_MACADDR & apply_mask) && !dev->external) {
  779. ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
  780. memcpy(&ifr.ifr_hwaddr.sa_data, s->macaddr, sizeof(s->macaddr));
  781. if (ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr) < 0)
  782. s->flags &= ~DEV_OPT_MACADDR;
  783. }
  784. if (s->flags & DEV_OPT_IPV6 & apply_mask)
  785. system_set_disable_ipv6(dev, s->ipv6 ? "0" : "1");
  786. if (s->flags & DEV_OPT_PROMISC & apply_mask) {
  787. if (system_if_flags(dev->ifname, s->promisc ? IFF_PROMISC : 0,
  788. !s->promisc ? IFF_PROMISC : 0) < 0)
  789. s->flags &= ~DEV_OPT_PROMISC;
  790. }
  791. }
  792. int system_if_up(struct device *dev)
  793. {
  794. system_if_get_settings(dev, &dev->orig_settings);
  795. system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
  796. device_set_ifindex(dev, system_if_resolve(dev));
  797. return system_if_flags(dev->ifname, IFF_UP, 0);
  798. }
  799. int system_if_down(struct device *dev)
  800. {
  801. int ret = system_if_flags(dev->ifname, 0, IFF_UP);
  802. dev->orig_settings.flags &= dev->settings.flags;
  803. system_if_apply_settings(dev, &dev->orig_settings, dev->orig_settings.flags);
  804. return ret;
  805. }
  806. struct if_check_data {
  807. struct device *dev;
  808. int pending;
  809. int ret;
  810. };
  811. static int cb_if_check_valid(struct nl_msg *msg, void *arg)
  812. {
  813. struct nlmsghdr *nh = nlmsg_hdr(msg);
  814. struct ifinfomsg *ifi = NLMSG_DATA(nh);
  815. struct if_check_data *chk = (struct if_check_data *)arg;
  816. if (nh->nlmsg_type != RTM_NEWLINK)
  817. return NL_SKIP;
  818. device_set_present(chk->dev, ifi->ifi_index > 0 ? true : false);
  819. device_set_link(chk->dev, ifi->ifi_flags & IFF_LOWER_UP ? true : false);
  820. return NL_OK;
  821. }
  822. static int cb_if_check_ack(struct nl_msg *msg, void *arg)
  823. {
  824. struct if_check_data *chk = (struct if_check_data *)arg;
  825. chk->pending = 0;
  826. return NL_STOP;
  827. }
  828. static int cb_if_check_error(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
  829. {
  830. struct if_check_data *chk = (struct if_check_data *)arg;
  831. device_set_present(chk->dev, false);
  832. device_set_link(chk->dev, false);
  833. chk->pending = err->error;
  834. return NL_STOP;
  835. }
  836. int system_if_check(struct device *dev)
  837. {
  838. struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
  839. struct nl_msg *msg;
  840. struct ifinfomsg ifi = {
  841. .ifi_family = AF_UNSPEC,
  842. .ifi_index = 0,
  843. };
  844. struct if_check_data chk = {
  845. .dev = dev,
  846. .pending = 1,
  847. };
  848. int ret = 1;
  849. msg = nlmsg_alloc_simple(RTM_GETLINK, 0);
  850. if (!msg || nlmsg_append(msg, &ifi, sizeof(ifi), 0) ||
  851. nla_put_string(msg, IFLA_IFNAME, dev->ifname))
  852. goto out;
  853. nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_if_check_valid, &chk);
  854. nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, cb_if_check_ack, &chk);
  855. nl_cb_err(cb, NL_CB_CUSTOM, cb_if_check_error, &chk);
  856. nl_send_auto_complete(sock_rtnl, msg);
  857. while (chk.pending > 0)
  858. nl_recvmsgs(sock_rtnl, cb);
  859. nlmsg_free(msg);
  860. ret = chk.pending;
  861. out:
  862. nl_cb_put(cb);
  863. return ret;
  864. }
  865. struct device *
  866. system_if_get_parent(struct device *dev)
  867. {
  868. char buf[64], *devname;
  869. int ifindex, iflink, len;
  870. FILE *f;
  871. snprintf(buf, sizeof(buf), "/sys/class/net/%s/iflink", dev->ifname);
  872. f = fopen(buf, "r");
  873. if (!f)
  874. return NULL;
  875. len = fread(buf, 1, sizeof(buf) - 1, f);
  876. fclose(f);
  877. if (len <= 0)
  878. return NULL;
  879. buf[len] = 0;
  880. iflink = strtoul(buf, NULL, 0);
  881. ifindex = system_if_resolve(dev);
  882. if (!iflink || iflink == ifindex)
  883. return NULL;
  884. devname = if_indextoname(iflink, buf);
  885. if (!devname)
  886. return NULL;
  887. return device_get(devname, true);
  888. }
  889. static bool
  890. read_string_file(int dir_fd, const char *file, char *buf, int len)
  891. {
  892. bool ret = false;
  893. char *c;
  894. int fd;
  895. fd = openat(dir_fd, file, O_RDONLY);
  896. if (fd < 0)
  897. return false;
  898. retry:
  899. len = read(fd, buf, len - 1);
  900. if (len < 0) {
  901. if (errno == EINTR)
  902. goto retry;
  903. } else if (len > 0) {
  904. buf[len] = 0;
  905. c = strchr(buf, '\n');
  906. if (c)
  907. *c = 0;
  908. ret = true;
  909. }
  910. close(fd);
  911. return ret;
  912. }
  913. static bool
  914. read_uint64_file(int dir_fd, const char *file, uint64_t *val)
  915. {
  916. char buf[64];
  917. bool ret = false;
  918. ret = read_string_file(dir_fd, file, buf, sizeof(buf));
  919. if (ret)
  920. *val = strtoull(buf, NULL, 0);
  921. return ret;
  922. }
  923. /* Assume advertised flags == supported flags */
  924. static const struct {
  925. uint32_t mask;
  926. const char *name;
  927. } ethtool_link_modes[] = {
  928. { ADVERTISED_10baseT_Half, "10H" },
  929. { ADVERTISED_10baseT_Full, "10F" },
  930. { ADVERTISED_100baseT_Half, "100H" },
  931. { ADVERTISED_100baseT_Full, "100F" },
  932. { ADVERTISED_1000baseT_Half, "1000H" },
  933. { ADVERTISED_1000baseT_Full, "1000F" },
  934. };
  935. static void system_add_link_modes(struct blob_buf *b, __u32 mask)
  936. {
  937. int i;
  938. for (i = 0; i < ARRAY_SIZE(ethtool_link_modes); i++) {
  939. if (mask & ethtool_link_modes[i].mask)
  940. blobmsg_add_string(b, NULL, ethtool_link_modes[i].name);
  941. }
  942. }
  943. bool
  944. system_if_force_external(const char *ifname)
  945. {
  946. char buf[64];
  947. struct stat s;
  948. snprintf(buf, sizeof(buf), "/sys/class/net/%s/phy80211", ifname);
  949. return stat(buf, &s) == 0;
  950. }
  951. int
  952. system_if_dump_info(struct device *dev, struct blob_buf *b)
  953. {
  954. struct ethtool_cmd ecmd;
  955. struct ifreq ifr;
  956. char buf[64], *s;
  957. void *c;
  958. int dir_fd;
  959. snprintf(buf, sizeof(buf), "/sys/class/net/%s", dev->ifname);
  960. dir_fd = open(buf, O_DIRECTORY);
  961. memset(&ecmd, 0, sizeof(ecmd));
  962. memset(&ifr, 0, sizeof(ifr));
  963. strcpy(ifr.ifr_name, dev->ifname);
  964. ifr.ifr_data = (caddr_t) &ecmd;
  965. ecmd.cmd = ETHTOOL_GSET;
  966. if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) == 0) {
  967. c = blobmsg_open_array(b, "link-advertising");
  968. system_add_link_modes(b, ecmd.advertising);
  969. blobmsg_close_array(b, c);
  970. c = blobmsg_open_array(b, "link-supported");
  971. system_add_link_modes(b, ecmd.supported);
  972. blobmsg_close_array(b, c);
  973. s = blobmsg_alloc_string_buffer(b, "speed", 8);
  974. snprintf(s, 8, "%d%c", ethtool_cmd_speed(&ecmd),
  975. ecmd.duplex == DUPLEX_HALF ? 'H' : 'F');
  976. blobmsg_add_string_buffer(b);
  977. }
  978. close(dir_fd);
  979. return 0;
  980. }
  981. int
  982. system_if_dump_stats(struct device *dev, struct blob_buf *b)
  983. {
  984. const char *const counters[] = {
  985. "collisions", "rx_frame_errors", "tx_compressed",
  986. "multicast", "rx_length_errors", "tx_dropped",
  987. "rx_bytes", "rx_missed_errors", "tx_errors",
  988. "rx_compressed", "rx_over_errors", "tx_fifo_errors",
  989. "rx_crc_errors", "rx_packets", "tx_heartbeat_errors",
  990. "rx_dropped", "tx_aborted_errors", "tx_packets",
  991. "rx_errors", "tx_bytes", "tx_window_errors",
  992. "rx_fifo_errors", "tx_carrier_errors",
  993. };
  994. char buf[64];
  995. int stats_dir;
  996. int i;
  997. uint64_t val = 0;
  998. snprintf(buf, sizeof(buf), "/sys/class/net/%s/statistics", dev->ifname);
  999. stats_dir = open(buf, O_DIRECTORY);
  1000. if (stats_dir < 0)
  1001. return -1;
  1002. for (i = 0; i < ARRAY_SIZE(counters); i++)
  1003. if (read_uint64_file(stats_dir, counters[i], &val))
  1004. blobmsg_add_u64(b, counters[i], val);
  1005. close(stats_dir);
  1006. return 0;
  1007. }
  1008. static int system_addr(struct device *dev, struct device_addr *addr, int cmd)
  1009. {
  1010. bool v4 = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4);
  1011. int alen = v4 ? 4 : 16;
  1012. unsigned int flags = 0;
  1013. struct ifaddrmsg ifa = {
  1014. .ifa_family = (alen == 4) ? AF_INET : AF_INET6,
  1015. .ifa_prefixlen = addr->mask,
  1016. .ifa_index = dev->ifindex,
  1017. };
  1018. struct nl_msg *msg;
  1019. if (cmd == RTM_NEWADDR)
  1020. flags |= NLM_F_CREATE | NLM_F_REPLACE;
  1021. msg = nlmsg_alloc_simple(cmd, flags);
  1022. if (!msg)
  1023. return -1;
  1024. nlmsg_append(msg, &ifa, sizeof(ifa), 0);
  1025. nla_put(msg, IFA_LOCAL, alen, &addr->addr);
  1026. if (v4) {
  1027. if (addr->broadcast)
  1028. nla_put_u32(msg, IFA_BROADCAST, addr->broadcast);
  1029. if (addr->point_to_point)
  1030. nla_put_u32(msg, IFA_ADDRESS, addr->point_to_point);
  1031. } else {
  1032. time_t now = system_get_rtime();
  1033. struct ifa_cacheinfo cinfo = {0xffffffffU, 0xffffffffU, 0, 0};
  1034. if (addr->preferred_until) {
  1035. int64_t preferred = addr->preferred_until - now;
  1036. if (preferred < 0)
  1037. preferred = 0;
  1038. else if (preferred > UINT32_MAX)
  1039. preferred = UINT32_MAX;
  1040. cinfo.ifa_prefered = preferred;
  1041. }
  1042. if (addr->valid_until) {
  1043. int64_t valid = addr->valid_until - now;
  1044. if (valid <= 0)
  1045. return -1;
  1046. else if (valid > UINT32_MAX)
  1047. valid = UINT32_MAX;
  1048. cinfo.ifa_valid = valid;
  1049. }
  1050. nla_put(msg, IFA_CACHEINFO, sizeof(cinfo), &cinfo);
  1051. }
  1052. return system_rtnl_call(msg);
  1053. }
  1054. int system_add_address(struct device *dev, struct device_addr *addr)
  1055. {
  1056. return system_addr(dev, addr, RTM_NEWADDR);
  1057. }
  1058. int system_del_address(struct device *dev, struct device_addr *addr)
  1059. {
  1060. return system_addr(dev, addr, RTM_DELADDR);
  1061. }
  1062. static int system_rt(struct device *dev, struct device_route *route, int cmd)
  1063. {
  1064. int alen = ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET4) ? 4 : 16;
  1065. bool have_gw;
  1066. unsigned int flags = 0;
  1067. if (alen == 4)
  1068. have_gw = !!route->nexthop.in.s_addr;
  1069. else
  1070. have_gw = route->nexthop.in6.s6_addr32[0] ||
  1071. route->nexthop.in6.s6_addr32[1] ||
  1072. route->nexthop.in6.s6_addr32[2] ||
  1073. route->nexthop.in6.s6_addr32[3];
  1074. unsigned int table = (route->flags & (DEVROUTE_TABLE | DEVROUTE_SRCTABLE))
  1075. ? route->table : RT_TABLE_MAIN;
  1076. struct rtmsg rtm = {
  1077. .rtm_family = (alen == 4) ? AF_INET : AF_INET6,
  1078. .rtm_dst_len = route->mask,
  1079. .rtm_src_len = route->sourcemask,
  1080. .rtm_table = (table < 256) ? table : RT_TABLE_UNSPEC,
  1081. .rtm_protocol = (route->flags & DEVADDR_KERNEL) ? RTPROT_KERNEL : RTPROT_STATIC,
  1082. .rtm_scope = RT_SCOPE_NOWHERE,
  1083. .rtm_type = (cmd == RTM_DELROUTE) ? 0: RTN_UNICAST,
  1084. .rtm_flags = (route->flags & DEVROUTE_ONLINK) ? RTNH_F_ONLINK : 0,
  1085. };
  1086. struct nl_msg *msg;
  1087. if (cmd == RTM_NEWROUTE) {
  1088. flags |= NLM_F_CREATE | NLM_F_REPLACE;
  1089. if (!dev) { // Add null-route
  1090. rtm.rtm_scope = RT_SCOPE_UNIVERSE;
  1091. rtm.rtm_type = RTN_UNREACHABLE;
  1092. }
  1093. else
  1094. rtm.rtm_scope = (have_gw) ? RT_SCOPE_UNIVERSE : RT_SCOPE_LINK;
  1095. }
  1096. if (route->flags & DEVROUTE_TYPE) {
  1097. rtm.rtm_type = route->type;
  1098. if (!(route->flags & (DEVROUTE_TABLE | DEVROUTE_SRCTABLE))) {
  1099. if (rtm.rtm_type == RTN_LOCAL || rtm.rtm_type == RTN_BROADCAST ||
  1100. rtm.rtm_type == RTN_NAT || rtm.rtm_type == RTN_ANYCAST)
  1101. rtm.rtm_table = RT_TABLE_LOCAL;
  1102. }
  1103. if (rtm.rtm_type == RTN_LOCAL || rtm.rtm_type == RTN_NAT)
  1104. rtm.rtm_scope = RT_SCOPE_HOST;
  1105. else if (rtm.rtm_type == RTN_BROADCAST || rtm.rtm_type == RTN_MULTICAST ||
  1106. rtm.rtm_type == RTN_ANYCAST)
  1107. rtm.rtm_scope = RT_SCOPE_LINK;
  1108. }
  1109. msg = nlmsg_alloc_simple(cmd, flags);
  1110. if (!msg)
  1111. return -1;
  1112. nlmsg_append(msg, &rtm, sizeof(rtm), 0);
  1113. if (route->mask)
  1114. nla_put(msg, RTA_DST, alen, &route->addr);
  1115. if (route->sourcemask)
  1116. nla_put(msg, RTA_SRC, alen, &route->source);
  1117. if (route->metric > 0)
  1118. nla_put_u32(msg, RTA_PRIORITY, route->metric);
  1119. if (have_gw)
  1120. nla_put(msg, RTA_GATEWAY, alen, &route->nexthop);
  1121. if (dev)
  1122. nla_put_u32(msg, RTA_OIF, dev->ifindex);
  1123. if (table >= 256)
  1124. nla_put_u32(msg, RTA_TABLE, table);
  1125. if (route->flags & DEVROUTE_MTU) {
  1126. struct nlattr *metrics;
  1127. if (!(metrics = nla_nest_start(msg, RTA_METRICS)))
  1128. goto nla_put_failure;
  1129. nla_put_u32(msg, RTAX_MTU, route->mtu);
  1130. nla_nest_end(msg, metrics);
  1131. }
  1132. return system_rtnl_call(msg);
  1133. nla_put_failure:
  1134. nlmsg_free(msg);
  1135. return -ENOMEM;
  1136. }
  1137. int system_add_route(struct device *dev, struct device_route *route)
  1138. {
  1139. return system_rt(dev, route, RTM_NEWROUTE);
  1140. }
  1141. int system_del_route(struct device *dev, struct device_route *route)
  1142. {
  1143. return system_rt(dev, route, RTM_DELROUTE);
  1144. }
  1145. int system_flush_routes(void)
  1146. {
  1147. const char *names[] = {
  1148. "/proc/sys/net/ipv4/route/flush",
  1149. "/proc/sys/net/ipv6/route/flush"
  1150. };
  1151. int fd, i;
  1152. for (i = 0; i < ARRAY_SIZE(names); i++) {
  1153. fd = open(names[i], O_WRONLY);
  1154. if (fd < 0)
  1155. continue;
  1156. if (write(fd, "-1", 2)) {}
  1157. close(fd);
  1158. }
  1159. return 0;
  1160. }
  1161. bool system_resolve_rt_type(const char *type, unsigned int *id)
  1162. {
  1163. return system_rtn_aton(type, id);
  1164. }
  1165. bool system_resolve_rt_table(const char *name, unsigned int *id)
  1166. {
  1167. FILE *f;
  1168. char *e, buf[128];
  1169. unsigned int n, table = RT_TABLE_UNSPEC;
  1170. /* first try to parse table as number */
  1171. if ((n = strtoul(name, &e, 0)) > 0 && !*e)
  1172. table = n;
  1173. /* handle well known aliases */
  1174. else if (!strcmp(name, "default"))
  1175. table = RT_TABLE_DEFAULT;
  1176. else if (!strcmp(name, "main"))
  1177. table = RT_TABLE_MAIN;
  1178. else if (!strcmp(name, "local"))
  1179. table = RT_TABLE_LOCAL;
  1180. /* try to look up name in /etc/iproute2/rt_tables */
  1181. else if ((f = fopen("/etc/iproute2/rt_tables", "r")) != NULL)
  1182. {
  1183. while (fgets(buf, sizeof(buf) - 1, f) != NULL)
  1184. {
  1185. if ((e = strtok(buf, " \t\n")) == NULL || *e == '#')
  1186. continue;
  1187. n = strtoul(e, NULL, 10);
  1188. e = strtok(NULL, " \t\n");
  1189. if (e && !strcmp(e, name))
  1190. {
  1191. table = n;
  1192. break;
  1193. }
  1194. }
  1195. fclose(f);
  1196. }
  1197. if (table == RT_TABLE_UNSPEC)
  1198. return false;
  1199. *id = table;
  1200. return true;
  1201. }
  1202. bool system_is_default_rt_table(unsigned int id)
  1203. {
  1204. return (id == RT_TABLE_MAIN);
  1205. }
  1206. static int system_iprule(struct iprule *rule, int cmd)
  1207. {
  1208. int alen = ((rule->flags & IPRULE_FAMILY) == IPRULE_INET4) ? 4 : 16;
  1209. struct nl_msg *msg;
  1210. struct rtmsg rtm = {
  1211. .rtm_family = (alen == 4) ? AF_INET : AF_INET6,
  1212. .rtm_protocol = RTPROT_STATIC,
  1213. .rtm_scope = RT_SCOPE_UNIVERSE,
  1214. .rtm_table = RT_TABLE_UNSPEC,
  1215. .rtm_type = RTN_UNSPEC,
  1216. .rtm_flags = 0,
  1217. };
  1218. if (cmd == RTM_NEWRULE) {
  1219. rtm.rtm_type = RTN_UNICAST;
  1220. rtm.rtm_flags |= NLM_F_REPLACE | NLM_F_EXCL;
  1221. }
  1222. if (rule->invert)
  1223. rtm.rtm_flags |= FIB_RULE_INVERT;
  1224. if (rule->flags & IPRULE_SRC)
  1225. rtm.rtm_src_len = rule->src_mask;
  1226. if (rule->flags & IPRULE_DEST)
  1227. rtm.rtm_dst_len = rule->dest_mask;
  1228. if (rule->flags & IPRULE_TOS)
  1229. rtm.rtm_tos = rule->tos;
  1230. if (rule->flags & IPRULE_LOOKUP) {
  1231. if (rule->lookup < 256)
  1232. rtm.rtm_table = rule->lookup;
  1233. }
  1234. if (rule->flags & IPRULE_ACTION)
  1235. rtm.rtm_type = rule->action;
  1236. else if (rule->flags & IPRULE_GOTO)
  1237. rtm.rtm_type = FR_ACT_GOTO;
  1238. else if (!(rule->flags & (IPRULE_LOOKUP | IPRULE_ACTION | IPRULE_GOTO)))
  1239. rtm.rtm_type = FR_ACT_NOP;
  1240. msg = nlmsg_alloc_simple(cmd, NLM_F_REQUEST);
  1241. if (!msg)
  1242. return -1;
  1243. nlmsg_append(msg, &rtm, sizeof(rtm), 0);
  1244. if (rule->flags & IPRULE_IN)
  1245. nla_put(msg, FRA_IFNAME, strlen(rule->in_dev) + 1, rule->in_dev);
  1246. if (rule->flags & IPRULE_OUT)
  1247. nla_put(msg, FRA_OIFNAME, strlen(rule->out_dev) + 1, rule->out_dev);
  1248. if (rule->flags & IPRULE_SRC)
  1249. nla_put(msg, FRA_SRC, alen, &rule->src_addr);
  1250. if (rule->flags & IPRULE_DEST)
  1251. nla_put(msg, FRA_DST, alen, &rule->dest_addr);
  1252. if (rule->flags & IPRULE_PRIORITY)
  1253. nla_put_u32(msg, FRA_PRIORITY, rule->priority);
  1254. else if (cmd == RTM_NEWRULE)
  1255. nla_put_u32(msg, FRA_PRIORITY, rule->order);
  1256. if (rule->flags & IPRULE_FWMARK)
  1257. nla_put_u32(msg, FRA_FWMARK, rule->fwmark);
  1258. if (rule->flags & IPRULE_FWMASK)
  1259. nla_put_u32(msg, FRA_FWMASK, rule->fwmask);
  1260. if (rule->flags & IPRULE_LOOKUP) {
  1261. if (rule->lookup >= 256)
  1262. nla_put_u32(msg, FRA_TABLE, rule->lookup);
  1263. }
  1264. if (rule->flags & IPRULE_GOTO)
  1265. nla_put_u32(msg, FRA_GOTO, rule->gotoid);
  1266. return system_rtnl_call(msg);
  1267. }
  1268. int system_add_iprule(struct iprule *rule)
  1269. {
  1270. return system_iprule(rule, RTM_NEWRULE);
  1271. }
  1272. int system_del_iprule(struct iprule *rule)
  1273. {
  1274. return system_iprule(rule, RTM_DELRULE);
  1275. }
  1276. int system_flush_iprules(void)
  1277. {
  1278. int rv = 0;
  1279. struct iprule rule;
  1280. system_if_clear_entries(NULL, RTM_GETRULE, AF_INET);
  1281. system_if_clear_entries(NULL, RTM_GETRULE, AF_INET6);
  1282. memset(&rule, 0, sizeof(rule));
  1283. rule.flags = IPRULE_INET4 | IPRULE_PRIORITY | IPRULE_LOOKUP;
  1284. rule.priority = 0;
  1285. rule.lookup = RT_TABLE_LOCAL;
  1286. rv |= system_iprule(&rule, RTM_NEWRULE);
  1287. rule.priority = 32766;
  1288. rule.lookup = RT_TABLE_MAIN;
  1289. rv |= system_iprule(&rule, RTM_NEWRULE);
  1290. rule.priority = 32767;
  1291. rule.lookup = RT_TABLE_DEFAULT;
  1292. rv |= system_iprule(&rule, RTM_NEWRULE);
  1293. rule.flags = IPRULE_INET6 | IPRULE_PRIORITY | IPRULE_LOOKUP;
  1294. rule.priority = 0;
  1295. rule.lookup = RT_TABLE_LOCAL;
  1296. rv |= system_iprule(&rule, RTM_NEWRULE);
  1297. rule.priority = 32766;
  1298. rule.lookup = RT_TABLE_MAIN;
  1299. rv |= system_iprule(&rule, RTM_NEWRULE);
  1300. return rv;
  1301. }
  1302. bool system_resolve_iprule_action(const char *action, unsigned int *id)
  1303. {
  1304. return system_rtn_aton(action, id);
  1305. }
  1306. time_t system_get_rtime(void)
  1307. {
  1308. struct timespec ts;
  1309. struct timeval tv;
  1310. if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts) == 0)
  1311. return ts.tv_sec;
  1312. if (gettimeofday(&tv, NULL) == 0)
  1313. return tv.tv_sec;
  1314. return 0;
  1315. }
  1316. #ifndef IP_DF
  1317. #define IP_DF 0x4000
  1318. #endif
  1319. static int tunnel_ioctl(const char *name, int cmd, void *p)
  1320. {
  1321. struct ifreq ifr;
  1322. memset(&ifr, 0, sizeof(ifr));
  1323. strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
  1324. ifr.ifr_ifru.ifru_data = p;
  1325. return ioctl(sock_ioctl, cmd, &ifr);
  1326. }
  1327. #ifdef IFLA_IPTUN_MAX
  1328. #define IP6_FLOWINFO_TCLASS htonl(0x0FF00000)
  1329. static int system_add_gre_tunnel(const char *name, const char *kind,
  1330. const unsigned int link, struct blob_attr **tb, bool v6)
  1331. {
  1332. struct nl_msg *nlm;
  1333. struct ifinfomsg ifi = { .ifi_family = AF_UNSPEC, };
  1334. struct blob_attr *cur;
  1335. uint32_t ikey = 0, okey = 0, flags = 0, flowinfo = 0;
  1336. uint16_t iflags = 0, oflags = 0;
  1337. uint8_t tos = 0;
  1338. int ret = 0, ttl = 64;
  1339. nlm = nlmsg_alloc_simple(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE);
  1340. if (!nlm)
  1341. return -1;
  1342. nlmsg_append(nlm, &ifi, sizeof(ifi), 0);
  1343. nla_put_string(nlm, IFLA_IFNAME, name);
  1344. struct nlattr *linkinfo = nla_nest_start(nlm, IFLA_LINKINFO);
  1345. if (!linkinfo) {
  1346. ret = -ENOMEM;
  1347. goto failure;
  1348. }
  1349. nla_put_string(nlm, IFLA_INFO_KIND, kind);
  1350. struct nlattr *infodata = nla_nest_start(nlm, IFLA_INFO_DATA);
  1351. if (!infodata) {
  1352. ret = -ENOMEM;
  1353. goto failure;
  1354. }
  1355. if (link)
  1356. nla_put_u32(nlm, IFLA_GRE_LINK, link);
  1357. if ((cur = tb[TUNNEL_ATTR_TTL]))
  1358. ttl = blobmsg_get_u32(cur);
  1359. nla_put_u8(nlm, IFLA_GRE_TTL, ttl);
  1360. if ((cur = tb[TUNNEL_ATTR_TOS])) {
  1361. char *str = blobmsg_get_string(cur);
  1362. if (strcmp(str, "inherit")) {
  1363. unsigned uval;
  1364. char *e;
  1365. uval = strtoul(str, &e, 16);
  1366. if (e == str || *e || uval > 255) {
  1367. ret = -EINVAL;
  1368. goto failure;
  1369. }
  1370. if (v6)
  1371. flowinfo |= htonl(uval << 20) & IP6_FLOWINFO_TCLASS;
  1372. else
  1373. tos = uval;
  1374. } else {
  1375. if (v6)
  1376. flags |= IP6_TNL_F_USE_ORIG_TCLASS;
  1377. else
  1378. tos = 1;
  1379. }
  1380. }
  1381. if ((cur = tb[TUNNEL_ATTR_INFO]) && (blobmsg_type(cur) == BLOBMSG_TYPE_STRING)) {
  1382. uint8_t icsum, ocsum, iseqno, oseqno;
  1383. if (sscanf(blobmsg_get_string(cur), "%u,%u,%hhu,%hhu,%hhu,%hhu",
  1384. &ikey, &okey, &icsum, &ocsum, &iseqno, &oseqno) < 6) {
  1385. ret = -EINVAL;
  1386. goto failure;
  1387. }
  1388. if (ikey)
  1389. iflags |= GRE_KEY;
  1390. if (okey)
  1391. oflags |= GRE_KEY;
  1392. if (icsum)
  1393. iflags |= GRE_CSUM;
  1394. if (ocsum)
  1395. oflags |= GRE_CSUM;
  1396. if (iseqno)
  1397. iflags |= GRE_SEQ;
  1398. if (oseqno)
  1399. oflags |= GRE_SEQ;
  1400. }
  1401. if (v6) {
  1402. struct in6_addr in6buf;
  1403. if ((cur = tb[TUNNEL_ATTR_LOCAL])) {
  1404. if (inet_pton(AF_INET6, blobmsg_data(cur), &in6buf) < 1) {
  1405. ret = -EINVAL;
  1406. goto failure;
  1407. }
  1408. nla_put(nlm, IFLA_GRE_LOCAL, sizeof(in6buf), &in6buf);
  1409. }
  1410. if ((cur = tb[TUNNEL_ATTR_REMOTE])) {
  1411. if (inet_pton(AF_INET6, blobmsg_data(cur), &in6buf) < 1) {
  1412. ret = -EINVAL;
  1413. goto failure;
  1414. }
  1415. nla_put(nlm, IFLA_GRE_REMOTE, sizeof(in6buf), &in6buf);
  1416. }
  1417. nla_put_u8(nlm, IFLA_GRE_ENCAP_LIMIT, 4);
  1418. if (flowinfo)
  1419. nla_put_u32(nlm, IFLA_GRE_FLOWINFO, flowinfo);
  1420. if (flags)
  1421. nla_put_u32(nlm, IFLA_GRE_FLAGS, flags);
  1422. } else {
  1423. struct in_addr inbuf;
  1424. bool set_df = true;
  1425. if ((cur = tb[TUNNEL_ATTR_LOCAL])) {
  1426. if (inet_pton(AF_INET, blobmsg_data(cur), &inbuf) < 1) {
  1427. ret = -EINVAL;
  1428. goto failure;
  1429. }
  1430. nla_put(nlm, IFLA_GRE_LOCAL, sizeof(inbuf), &inbuf);
  1431. }
  1432. if ((cur = tb[TUNNEL_ATTR_REMOTE])) {
  1433. if (inet_pton(AF_INET, blobmsg_data(cur), &inbuf) < 1) {
  1434. ret = -EINVAL;
  1435. goto failure;
  1436. }
  1437. nla_put(nlm, IFLA_GRE_REMOTE, sizeof(inbuf), &inbuf);
  1438. if (IN_MULTICAST(ntohl(inbuf.s_addr))) {
  1439. if (!okey) {
  1440. okey = inbuf.s_addr;
  1441. oflags |= GRE_KEY;
  1442. }
  1443. if (!ikey) {
  1444. ikey = inbuf.s_addr;
  1445. iflags |= GRE_KEY;
  1446. }
  1447. }
  1448. }
  1449. if ((cur = tb[TUNNEL_ATTR_DF]))
  1450. set_df = blobmsg_get_bool(cur);
  1451. nla_put_u8(nlm, IFLA_GRE_PMTUDISC, set_df ? 1 : 0);
  1452. nla_put_u8(nlm, IFLA_GRE_TOS, tos);
  1453. }
  1454. if (oflags)
  1455. nla_put_u16(nlm, IFLA_GRE_OFLAGS, oflags);
  1456. if (iflags)
  1457. nla_put_u16(nlm, IFLA_GRE_IFLAGS, iflags);
  1458. if (okey)
  1459. nla_put_u32(nlm, IFLA_GRE_OKEY, okey);
  1460. if (ikey)
  1461. nla_put_u32(nlm, IFLA_GRE_IKEY, ikey);
  1462. nla_nest_end(nlm, infodata);
  1463. nla_nest_end(nlm, linkinfo);
  1464. return system_rtnl_call(nlm);
  1465. failure:
  1466. nlmsg_free(nlm);
  1467. return ret;
  1468. }
  1469. #endif
  1470. static int __system_del_ip_tunnel(const char *name, struct blob_attr **tb)
  1471. {
  1472. struct blob_attr *cur;
  1473. const char *str;
  1474. if (!(cur = tb[TUNNEL_ATTR_TYPE]))
  1475. return -EINVAL;
  1476. str = blobmsg_data(cur);
  1477. if (!strcmp(str, "greip") || !strcmp(str, "gretapip") ||
  1478. !strcmp(str, "greip6") || !strcmp(str, "gretapip6"))
  1479. return system_link_del(name);
  1480. else
  1481. return tunnel_ioctl(name, SIOCDELTUNNEL, NULL);
  1482. }
  1483. int system_del_ip_tunnel(const char *name, struct blob_attr *attr)
  1484. {
  1485. struct blob_attr *tb[__TUNNEL_ATTR_MAX];
  1486. blobmsg_parse(tunnel_attr_list.params, __TUNNEL_ATTR_MAX, tb,
  1487. blob_data(attr), blob_len(attr));
  1488. return __system_del_ip_tunnel(name, tb);
  1489. }
  1490. int system_update_ipv6_mtu(struct device *dev, int mtu)
  1491. {
  1492. int ret = -1;
  1493. char buf[64];
  1494. snprintf(buf, sizeof(buf), "/proc/sys/net/ipv6/conf/%s/mtu",
  1495. dev->ifname);
  1496. int fd = open(buf, O_RDWR);
  1497. ssize_t len = read(fd, buf, sizeof(buf) - 1);
  1498. if (len < 0)
  1499. goto out;
  1500. buf[len] = 0;
  1501. ret = atoi(buf);
  1502. if (!mtu || ret <= mtu)
  1503. goto out;
  1504. lseek(fd, 0, SEEK_SET);
  1505. if (write(fd, buf, snprintf(buf, sizeof(buf), "%i", mtu)) <= 0)
  1506. ret = -1;
  1507. out:
  1508. close(fd);
  1509. return ret;
  1510. }
  1511. int system_add_ip_tunnel(const char *name, struct blob_attr *attr)
  1512. {
  1513. struct blob_attr *tb[__TUNNEL_ATTR_MAX];
  1514. struct blob_attr *cur;
  1515. bool set_df = true;
  1516. const char *str;
  1517. blobmsg_parse(tunnel_attr_list.params, __TUNNEL_ATTR_MAX, tb,
  1518. blob_data(attr), blob_len(attr));
  1519. __system_del_ip_tunnel(name, tb);
  1520. if (!(cur = tb[TUNNEL_ATTR_TYPE]))
  1521. return -EINVAL;
  1522. str = blobmsg_data(cur);
  1523. if ((cur = tb[TUNNEL_ATTR_DF]))
  1524. set_df = blobmsg_get_bool(cur);
  1525. unsigned int ttl = 0;
  1526. if ((cur = tb[TUNNEL_ATTR_TTL])) {
  1527. ttl = blobmsg_get_u32(cur);
  1528. if (ttl > 255 || (!set_df && ttl))
  1529. return -EINVAL;
  1530. }
  1531. unsigned int link = 0;
  1532. if ((cur = tb[TUNNEL_ATTR_LINK])) {
  1533. struct interface *iface = vlist_find(&interfaces, blobmsg_data(cur), iface, node);
  1534. if (!iface)
  1535. return -EINVAL;
  1536. if (iface->l3_dev.dev)
  1537. link = iface->l3_dev.dev->ifindex;
  1538. }
  1539. if (!strcmp(str, "sit")) {
  1540. struct ip_tunnel_parm p = {
  1541. .link = link,
  1542. .iph = {
  1543. .version = 4,
  1544. .ihl = 5,
  1545. .frag_off = set_df ? htons(IP_DF) : 0,
  1546. .protocol = IPPROTO_IPV6,
  1547. .ttl = ttl
  1548. }
  1549. };
  1550. if ((cur = tb[TUNNEL_ATTR_LOCAL]) &&
  1551. inet_pton(AF_INET, blobmsg_data(cur), &p.iph.saddr) < 1)
  1552. return -EINVAL;
  1553. if ((cur = tb[TUNNEL_ATTR_REMOTE]) &&
  1554. inet_pton(AF_INET, blobmsg_data(cur), &p.iph.daddr) < 1)
  1555. return -EINVAL;
  1556. strncpy(p.name, name, sizeof(p.name));
  1557. if (tunnel_ioctl("sit0", SIOCADDTUNNEL, &p) < 0)
  1558. return -1;
  1559. #ifdef SIOCADD6RD
  1560. if ((cur = tb[TUNNEL_ATTR_6RD_PREFIX])) {
  1561. unsigned int mask;
  1562. struct ip_tunnel_6rd p6;
  1563. memset(&p6, 0, sizeof(p6));
  1564. if (!parse_ip_and_netmask(AF_INET6, blobmsg_data(cur),
  1565. &p6.prefix, &mask) || mask > 128)
  1566. return -EINVAL;
  1567. p6.prefixlen = mask;
  1568. if ((cur = tb[TUNNEL_ATTR_6RD_RELAY_PREFIX])) {
  1569. if (!parse_ip_and_netmask(AF_INET, blobmsg_data(cur),
  1570. &p6.relay_prefix, &mask) || mask > 32)
  1571. return -EINVAL;
  1572. p6.relay_prefixlen = mask;
  1573. }
  1574. if (tunnel_ioctl(name, SIOCADD6RD, &p6) < 0) {
  1575. __system_del_ip_tunnel(name, tb);
  1576. return -1;
  1577. }
  1578. }
  1579. #endif
  1580. #ifdef IFLA_IPTUN_MAX
  1581. } else if (!strcmp(str, "ipip6")) {
  1582. struct nl_msg *nlm = nlmsg_alloc_simple(RTM_NEWLINK,
  1583. NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE);
  1584. struct ifinfomsg ifi = { .ifi_family = AF_UNSPEC };
  1585. int ret = 0;
  1586. if (!nlm)
  1587. return -1;
  1588. nlmsg_append(nlm, &ifi, sizeof(ifi), 0);
  1589. nla_put_string(nlm, IFLA_IFNAME, name);
  1590. if (link)
  1591. nla_put_u32(nlm, IFLA_LINK, link);
  1592. struct nlattr *linkinfo = nla_nest_start(nlm, IFLA_LINKINFO);
  1593. if (!linkinfo) {
  1594. ret = -ENOMEM;
  1595. goto failure;
  1596. }
  1597. nla_put_string(nlm, IFLA_INFO_KIND, "ip6tnl");
  1598. struct nlattr *infodata = nla_nest_start(nlm, IFLA_INFO_DATA);
  1599. if (!infodata) {
  1600. ret = -ENOMEM;
  1601. goto failure;
  1602. }
  1603. if (link)
  1604. nla_put_u32(nlm, IFLA_IPTUN_LINK, link);
  1605. nla_put_u8(nlm, IFLA_IPTUN_PROTO, IPPROTO_IPIP);
  1606. nla_put_u8(nlm, IFLA_IPTUN_TTL, (ttl) ? ttl : 64);
  1607. nla_put_u8(nlm, IFLA_IPTUN_ENCAP_LIMIT, 4);
  1608. struct in6_addr in6buf;
  1609. if ((cur = tb[TUNNEL_ATTR_LOCAL])) {
  1610. if (inet_pton(AF_INET6, blobmsg_data(cur), &in6buf) < 1) {
  1611. ret = -EINVAL;
  1612. goto failure;
  1613. }
  1614. nla_put(nlm, IFLA_IPTUN_LOCAL, sizeof(in6buf), &in6buf);
  1615. }
  1616. if ((cur = tb[TUNNEL_ATTR_REMOTE])) {
  1617. if (inet_pton(AF_INET6, blobmsg_data(cur), &in6buf) < 1) {
  1618. ret = -EINVAL;
  1619. goto failure;
  1620. }
  1621. nla_put(nlm, IFLA_IPTUN_REMOTE, sizeof(in6buf), &in6buf);
  1622. }
  1623. #ifdef IFLA_IPTUN_FMR_MAX
  1624. if ((cur = tb[TUNNEL_ATTR_FMRS])) {
  1625. struct nlattr *fmrs = nla_nest_start(nlm, IFLA_IPTUN_FMRS);
  1626. struct blob_attr *fmr;
  1627. unsigned rem, fmrcnt = 0;
  1628. blobmsg_for_each_attr(fmr, cur, rem) {
  1629. if (blobmsg_type(fmr) != BLOBMSG_TYPE_STRING)
  1630. continue;
  1631. unsigned ip4len, ip6len, ealen, offset = 6;
  1632. char ip6buf[48];
  1633. char ip4buf[16];
  1634. if (sscanf(blobmsg_get_string(fmr), "%47[^/]/%u,%15[^/]/%u,%u,%u",
  1635. ip6buf, &ip6len, ip4buf, &ip4len, &ealen, &offset) < 5) {
  1636. ret = -EINVAL;
  1637. goto failure;
  1638. }
  1639. struct in6_addr ip6prefix;
  1640. struct in_addr ip4prefix;
  1641. if (inet_pton(AF_INET6, ip6buf, &ip6prefix) != 1 ||
  1642. inet_pton(AF_INET, ip4buf, &ip4prefix) != 1) {
  1643. ret = -EINVAL;
  1644. goto failure;
  1645. }
  1646. struct nlattr *rule = nla_nest_start(nlm, ++fmrcnt);
  1647. nla_put(nlm, IFLA_IPTUN_FMR_IP6_PREFIX, sizeof(ip6prefix), &ip6prefix);
  1648. nla_put(nlm, IFLA_IPTUN_FMR_IP4_PREFIX, sizeof(ip4prefix), &ip4prefix);
  1649. nla_put_u8(nlm, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, ip6len);
  1650. nla_put_u8(nlm, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, ip4len);
  1651. nla_put_u8(nlm, IFLA_IPTUN_FMR_EA_LEN, ealen);
  1652. nla_put_u8(nlm, IFLA_IPTUN_FMR_OFFSET, offset);
  1653. nla_nest_end(nlm, rule);
  1654. }
  1655. nla_nest_end(nlm, fmrs);
  1656. }
  1657. #endif
  1658. nla_nest_end(nlm, infodata);
  1659. nla_nest_end(nlm, linkinfo);
  1660. return system_rtnl_call(nlm);
  1661. failure:
  1662. nlmsg_free(nlm);
  1663. return ret;
  1664. } else if (!strcmp(str, "greip")) {
  1665. return system_add_gre_tunnel(name, "gre", link, tb, false);
  1666. } else if (!strcmp(str, "gretapip")) {
  1667. return system_add_gre_tunnel(name, "gretap", link, tb, false);
  1668. } else if (!strcmp(str, "greip6")) {
  1669. return system_add_gre_tunnel(name, "ip6gre", link, tb, true);
  1670. } else if (!strcmp(str, "gretapip6")) {
  1671. return system_add_gre_tunnel(name, "ip6gretap", link, tb, true);
  1672. #endif
  1673. }
  1674. else
  1675. return -EINVAL;
  1676. return 0;
  1677. }