addr.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  1. /*
  2. * lib/route/addr.c Addresses
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation version 2.1
  7. * of the License.
  8. *
  9. * Copyright (c) 2003-2012 Thomas Graf <tgraf@suug.ch>
  10. * Copyright (c) 2003-2006 Baruch Even <baruch@ev-en.org>,
  11. * Mediatrix Telecom, inc. <ericb@mediatrix.com>
  12. */
  13. /**
  14. * @ingroup rtnl
  15. * @defgroup rtaddr Addresses
  16. * @brief
  17. *
  18. * @note The maximum size of an address label is IFNAMSIZ.
  19. *
  20. * @note The address may not contain a prefix length if the peer address
  21. * has been specified already.
  22. *
  23. * @par 1) Address Addition
  24. * @code
  25. * // Allocate an empty address object to be filled out with the attributes
  26. * // of the new address.
  27. * struct rtnl_addr *addr = rtnl_addr_alloc();
  28. *
  29. * // Fill out the mandatory attributes of the new address. Setting the
  30. * // local address will automatically set the address family and the
  31. * // prefix length to the correct values.
  32. * rtnl_addr_set_ifindex(addr, ifindex);
  33. * rtnl_addr_set_local(addr, local_addr);
  34. *
  35. * // The label of the address can be specified, currently only supported
  36. * // by IPv4 and DECnet.
  37. * rtnl_addr_set_label(addr, "mylabel");
  38. *
  39. * // The peer address can be specified if necessary, in either case a peer
  40. * // address will be sent to the kernel in order to fullfil the interface
  41. * // requirements. If none is set, it will equal the local address.
  42. * // Note: Real peer addresses are only supported by IPv4 for now.
  43. * rtnl_addr_set_peer(addr, peer_addr);
  44. *
  45. * // In case you want to have the address have a scope other than global
  46. * // it may be overwritten using rtnl_addr_set_scope(). The scope currently
  47. * // cannot be set for IPv6 addresses.
  48. * rtnl_addr_set_scope(addr, rtnl_str2scope("site"));
  49. *
  50. * // Broadcast address may be specified using the relevant
  51. * // functions, the address family will be verified if one of the other
  52. * // addresses has been set already. Currently only works for IPv4.
  53. * rtnl_addr_set_broadcast(addr, broadcast_addr);
  54. *
  55. * // Build the netlink message and send it to the kernel, the operation will
  56. * // block until the operation has been completed. Alternatively the required
  57. * // netlink message can be built using rtnl_addr_build_add_request() to be
  58. * // sent out using nl_send_auto_complete().
  59. * rtnl_addr_add(sk, addr, 0);
  60. *
  61. * // Free the memory
  62. * rtnl_addr_put(addr);
  63. * @endcode
  64. *
  65. * @par 2) Address Deletion
  66. * @code
  67. * // Allocate an empty address object to be filled out with the attributes
  68. * // matching the address to be deleted. Alternatively a fully equipped
  69. * // address object out of a cache can be used instead.
  70. * struct rtnl_addr *addr = rtnl_addr_alloc();
  71. *
  72. * // The only mandatory parameter besides the address family is the interface
  73. * // index the address is on, i.e. leaving out all other parameters will
  74. * // result in all addresses of the specified address family interface tuple
  75. * // to be deleted.
  76. * rtnl_addr_set_ifindex(addr, ifindex);
  77. *
  78. * // Specyfing the address family manually is only required if neither the
  79. * // local nor peer address have been specified.
  80. * rtnl_addr_set_family(addr, AF_INET);
  81. *
  82. * // Specyfing the local address is optional but the best choice to delete
  83. * // specific addresses.
  84. * rtnl_addr_set_local(addr, local_addr);
  85. *
  86. * // The label of the address can be specified, currently only supported
  87. * // by IPv4 and DECnet.
  88. * rtnl_addr_set_label(addr, "mylabel");
  89. *
  90. * // The peer address can be specified if necessary, in either case a peer
  91. * // address will be sent to the kernel in order to fullfil the interface
  92. * // requirements. If none is set, it will equal the local address.
  93. * // Note: Real peer addresses are only supported by IPv4 for now.
  94. * rtnl_addr_set_peer(addr, peer_addr);
  95. *
  96. * // Build the netlink message and send it to the kernel, the operation will
  97. * // block until the operation has been completed. Alternatively the required
  98. * // netlink message can be built using rtnl_addr_build_delete_request()
  99. * // to be sent out using nl_send_auto_complete().
  100. * rtnl_addr_delete(sk, addr, 0);
  101. *
  102. * // Free the memory
  103. * rtnl_addr_put(addr);
  104. * @endcode
  105. * @{
  106. */
  107. #include <netlink-private/netlink.h>
  108. #include <netlink/netlink.h>
  109. #include <netlink/route/rtnl.h>
  110. #include <netlink/route/addr.h>
  111. #include <netlink/route/route.h>
  112. #include <netlink/route/link.h>
  113. #include <netlink/utils.h>
  114. /** @cond SKIP */
  115. #define ADDR_ATTR_FAMILY 0x0001
  116. #define ADDR_ATTR_PREFIXLEN 0x0002
  117. #define ADDR_ATTR_FLAGS 0x0004
  118. #define ADDR_ATTR_SCOPE 0x0008
  119. #define ADDR_ATTR_IFINDEX 0x0010
  120. #define ADDR_ATTR_LABEL 0x0020
  121. #define ADDR_ATTR_CACHEINFO 0x0040
  122. #define ADDR_ATTR_PEER 0x0080
  123. #define ADDR_ATTR_LOCAL 0x0100
  124. #define ADDR_ATTR_BROADCAST 0x0200
  125. #define ADDR_ATTR_MULTICAST 0x0400
  126. #define ADDR_ATTR_ANYCAST 0x0800
  127. static struct nl_cache_ops rtnl_addr_ops;
  128. static struct nl_object_ops addr_obj_ops;
  129. /** @endcond */
  130. static void addr_constructor(struct nl_object *obj)
  131. {
  132. struct rtnl_addr *addr = nl_object_priv(obj);
  133. addr->a_scope = RT_SCOPE_NOWHERE;
  134. }
  135. static void addr_free_data(struct nl_object *obj)
  136. {
  137. struct rtnl_addr *addr = nl_object_priv(obj);
  138. if (!addr)
  139. return;
  140. nl_addr_put(addr->a_peer);
  141. nl_addr_put(addr->a_local);
  142. nl_addr_put(addr->a_bcast);
  143. nl_addr_put(addr->a_multicast);
  144. nl_addr_put(addr->a_anycast);
  145. rtnl_link_put(addr->a_link);
  146. }
  147. static int addr_clone(struct nl_object *_dst, struct nl_object *_src)
  148. {
  149. struct rtnl_addr *dst = nl_object_priv(_dst);
  150. struct rtnl_addr *src = nl_object_priv(_src);
  151. if (src->a_link) {
  152. nl_object_get(OBJ_CAST(src->a_link));
  153. dst->a_link = src->a_link;
  154. }
  155. if (src->a_peer)
  156. if (!(dst->a_peer = nl_addr_clone(src->a_peer)))
  157. return -NLE_NOMEM;
  158. if (src->a_local)
  159. if (!(dst->a_local = nl_addr_clone(src->a_local)))
  160. return -NLE_NOMEM;
  161. if (src->a_bcast)
  162. if (!(dst->a_bcast = nl_addr_clone(src->a_bcast)))
  163. return -NLE_NOMEM;
  164. if (src->a_multicast)
  165. if (!(dst->a_multicast = nl_addr_clone(src->a_multicast)))
  166. return -NLE_NOMEM;
  167. if (src->a_anycast)
  168. if (!(dst->a_anycast = nl_addr_clone(src->a_anycast)))
  169. return -NLE_NOMEM;
  170. return 0;
  171. }
  172. static struct nla_policy addr_policy[IFA_MAX+1] = {
  173. [IFA_LABEL] = { .type = NLA_STRING,
  174. .maxlen = IFNAMSIZ },
  175. [IFA_CACHEINFO] = { .minlen = sizeof(struct ifa_cacheinfo) },
  176. };
  177. static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
  178. struct nlmsghdr *nlh, struct nl_parser_param *pp)
  179. {
  180. struct rtnl_addr *addr;
  181. struct ifaddrmsg *ifa;
  182. struct nlattr *tb[IFA_MAX+1];
  183. int err, family;
  184. struct nl_cache *link_cache;
  185. struct nl_addr *plen_addr = NULL;
  186. addr = rtnl_addr_alloc();
  187. if (!addr)
  188. return -NLE_NOMEM;
  189. addr->ce_msgtype = nlh->nlmsg_type;
  190. err = nlmsg_parse(nlh, sizeof(*ifa), tb, IFA_MAX, addr_policy);
  191. if (err < 0)
  192. goto errout;
  193. ifa = nlmsg_data(nlh);
  194. addr->a_family = family = ifa->ifa_family;
  195. addr->a_prefixlen = ifa->ifa_prefixlen;
  196. addr->a_scope = ifa->ifa_scope;
  197. addr->a_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) :
  198. ifa->ifa_flags;
  199. addr->a_ifindex = ifa->ifa_index;
  200. addr->ce_mask = (ADDR_ATTR_FAMILY | ADDR_ATTR_PREFIXLEN |
  201. ADDR_ATTR_FLAGS | ADDR_ATTR_SCOPE | ADDR_ATTR_IFINDEX);
  202. if (tb[IFA_LABEL]) {
  203. nla_strlcpy(addr->a_label, tb[IFA_LABEL], IFNAMSIZ);
  204. addr->ce_mask |= ADDR_ATTR_LABEL;
  205. }
  206. /* IPv6 only */
  207. if (tb[IFA_CACHEINFO]) {
  208. struct ifa_cacheinfo *ca;
  209. ca = nla_data(tb[IFA_CACHEINFO]);
  210. addr->a_cacheinfo.aci_prefered = ca->ifa_prefered;
  211. addr->a_cacheinfo.aci_valid = ca->ifa_valid;
  212. addr->a_cacheinfo.aci_cstamp = ca->cstamp;
  213. addr->a_cacheinfo.aci_tstamp = ca->tstamp;
  214. addr->ce_mask |= ADDR_ATTR_CACHEINFO;
  215. }
  216. if (tb[IFA_LOCAL]) {
  217. addr->a_local = nl_addr_alloc_attr(tb[IFA_LOCAL], family);
  218. if (!addr->a_local)
  219. goto errout_nomem;
  220. addr->ce_mask |= ADDR_ATTR_LOCAL;
  221. plen_addr = addr->a_local;
  222. }
  223. if (tb[IFA_ADDRESS]) {
  224. struct nl_addr *a;
  225. a = nl_addr_alloc_attr(tb[IFA_ADDRESS], family);
  226. if (!a)
  227. goto errout_nomem;
  228. /* IPv6 sends the local address as IFA_ADDRESS with
  229. * no IFA_LOCAL, IPv4 sends both IFA_LOCAL and IFA_ADDRESS
  230. * with IFA_ADDRESS being the peer address if they differ */
  231. if (!tb[IFA_LOCAL] || !nl_addr_cmp(a, addr->a_local)) {
  232. nl_addr_put(addr->a_local);
  233. addr->a_local = a;
  234. addr->ce_mask |= ADDR_ATTR_LOCAL;
  235. } else {
  236. addr->a_peer = a;
  237. addr->ce_mask |= ADDR_ATTR_PEER;
  238. }
  239. plen_addr = a;
  240. }
  241. if (plen_addr)
  242. nl_addr_set_prefixlen(plen_addr, addr->a_prefixlen);
  243. /* IPv4 only */
  244. if (tb[IFA_BROADCAST]) {
  245. addr->a_bcast = nl_addr_alloc_attr(tb[IFA_BROADCAST], family);
  246. if (!addr->a_bcast)
  247. goto errout_nomem;
  248. addr->ce_mask |= ADDR_ATTR_BROADCAST;
  249. }
  250. /* IPv6 only */
  251. if (tb[IFA_MULTICAST]) {
  252. addr->a_multicast = nl_addr_alloc_attr(tb[IFA_MULTICAST],
  253. family);
  254. if (!addr->a_multicast)
  255. goto errout_nomem;
  256. addr->ce_mask |= ADDR_ATTR_MULTICAST;
  257. }
  258. /* IPv6 only */
  259. if (tb[IFA_ANYCAST]) {
  260. addr->a_anycast = nl_addr_alloc_attr(tb[IFA_ANYCAST],
  261. family);
  262. if (!addr->a_anycast)
  263. goto errout_nomem;
  264. addr->ce_mask |= ADDR_ATTR_ANYCAST;
  265. }
  266. if ((link_cache = __nl_cache_mngt_require("route/link"))) {
  267. struct rtnl_link *link;
  268. if ((link = rtnl_link_get(link_cache, addr->a_ifindex))) {
  269. rtnl_addr_set_link(addr, link);
  270. /* rtnl_addr_set_link incs refcnt */
  271. rtnl_link_put(link);
  272. }
  273. }
  274. err = pp->pp_cb((struct nl_object *) addr, pp);
  275. errout:
  276. rtnl_addr_put(addr);
  277. return err;
  278. errout_nomem:
  279. err = -NLE_NOMEM;
  280. goto errout;
  281. }
  282. static int addr_request_update(struct nl_cache *cache, struct nl_sock *sk)
  283. {
  284. return nl_rtgen_request(sk, RTM_GETADDR, AF_UNSPEC, NLM_F_DUMP);
  285. }
  286. static void addr_dump_line(struct nl_object *obj, struct nl_dump_params *p)
  287. {
  288. struct rtnl_addr *addr = (struct rtnl_addr *) obj;
  289. struct nl_cache *link_cache;
  290. char buf[128];
  291. link_cache = nl_cache_mngt_require_safe("route/link");
  292. if (addr->ce_mask & ADDR_ATTR_LOCAL)
  293. nl_dump_line(p, "%s",
  294. nl_addr2str(addr->a_local, buf, sizeof(buf)));
  295. else
  296. nl_dump_line(p, "none");
  297. if (addr->ce_mask & ADDR_ATTR_PEER)
  298. nl_dump(p, " peer %s",
  299. nl_addr2str(addr->a_peer, buf, sizeof(buf)));
  300. nl_dump(p, " %s ", nl_af2str(addr->a_family, buf, sizeof(buf)));
  301. if (link_cache)
  302. nl_dump(p, "dev %s ",
  303. rtnl_link_i2name(link_cache, addr->a_ifindex,
  304. buf, sizeof(buf)));
  305. else
  306. nl_dump(p, "dev %d ", addr->a_ifindex);
  307. nl_dump(p, "scope %s",
  308. rtnl_scope2str(addr->a_scope, buf, sizeof(buf)));
  309. rtnl_addr_flags2str(addr->a_flags, buf, sizeof(buf));
  310. if (buf[0])
  311. nl_dump(p, " <%s>", buf);
  312. nl_dump(p, "\n");
  313. if (link_cache)
  314. nl_cache_put(link_cache);
  315. }
  316. static void addr_dump_details(struct nl_object *obj, struct nl_dump_params *p)
  317. {
  318. struct rtnl_addr *addr = (struct rtnl_addr *) obj;
  319. char buf[128];
  320. addr_dump_line(obj, p);
  321. if (addr->ce_mask & (ADDR_ATTR_LABEL | ADDR_ATTR_BROADCAST |
  322. ADDR_ATTR_MULTICAST)) {
  323. nl_dump_line(p, " ");
  324. if (addr->ce_mask & ADDR_ATTR_LABEL)
  325. nl_dump(p, " label %s", addr->a_label);
  326. if (addr->ce_mask & ADDR_ATTR_BROADCAST)
  327. nl_dump(p, " broadcast %s",
  328. nl_addr2str(addr->a_bcast, buf, sizeof(buf)));
  329. if (addr->ce_mask & ADDR_ATTR_MULTICAST)
  330. nl_dump(p, " multicast %s",
  331. nl_addr2str(addr->a_multicast, buf,
  332. sizeof(buf)));
  333. if (addr->ce_mask & ADDR_ATTR_ANYCAST)
  334. nl_dump(p, " anycast %s",
  335. nl_addr2str(addr->a_anycast, buf,
  336. sizeof(buf)));
  337. nl_dump(p, "\n");
  338. }
  339. if (addr->ce_mask & ADDR_ATTR_CACHEINFO) {
  340. struct rtnl_addr_cacheinfo *ci = &addr->a_cacheinfo;
  341. nl_dump_line(p, " valid-lifetime %s",
  342. ci->aci_valid == 0xFFFFFFFFU ? "forever" :
  343. nl_msec2str(ci->aci_valid * 1000,
  344. buf, sizeof(buf)));
  345. nl_dump(p, " preferred-lifetime %s\n",
  346. ci->aci_prefered == 0xFFFFFFFFU ? "forever" :
  347. nl_msec2str(ci->aci_prefered * 1000,
  348. buf, sizeof(buf)));
  349. nl_dump_line(p, " created boot-time+%s ",
  350. nl_msec2str(addr->a_cacheinfo.aci_cstamp * 10,
  351. buf, sizeof(buf)));
  352. nl_dump(p, "last-updated boot-time+%s\n",
  353. nl_msec2str(addr->a_cacheinfo.aci_tstamp * 10,
  354. buf, sizeof(buf)));
  355. }
  356. }
  357. static void addr_dump_stats(struct nl_object *obj, struct nl_dump_params *p)
  358. {
  359. addr_dump_details(obj, p);
  360. }
  361. static int addr_compare(struct nl_object *_a, struct nl_object *_b,
  362. uint32_t attrs, int flags)
  363. {
  364. struct rtnl_addr *a = (struct rtnl_addr *) _a;
  365. struct rtnl_addr *b = (struct rtnl_addr *) _b;
  366. int diff = 0;
  367. #define ADDR_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ADDR_ATTR_##ATTR, a, b, EXPR)
  368. diff |= ADDR_DIFF(IFINDEX, a->a_ifindex != b->a_ifindex);
  369. diff |= ADDR_DIFF(FAMILY, a->a_family != b->a_family);
  370. diff |= ADDR_DIFF(SCOPE, a->a_scope != b->a_scope);
  371. diff |= ADDR_DIFF(LABEL, strcmp(a->a_label, b->a_label));
  372. diff |= ADDR_DIFF(PEER, nl_addr_cmp(a->a_peer, b->a_peer));
  373. diff |= ADDR_DIFF(LOCAL, nl_addr_cmp(a->a_local, b->a_local));
  374. diff |= ADDR_DIFF(MULTICAST, nl_addr_cmp(a->a_multicast,
  375. b->a_multicast));
  376. diff |= ADDR_DIFF(BROADCAST, nl_addr_cmp(a->a_bcast, b->a_bcast));
  377. diff |= ADDR_DIFF(ANYCAST, nl_addr_cmp(a->a_anycast, b->a_anycast));
  378. if (flags & LOOSE_COMPARISON)
  379. diff |= ADDR_DIFF(FLAGS,
  380. (a->a_flags ^ b->a_flags) & b->a_flag_mask);
  381. else
  382. diff |= ADDR_DIFF(FLAGS, a->a_flags != b->a_flags);
  383. #undef ADDR_DIFF
  384. return diff;
  385. }
  386. static const struct trans_tbl addr_attrs[] = {
  387. __ADD(ADDR_ATTR_FAMILY, family)
  388. __ADD(ADDR_ATTR_PREFIXLEN, prefixlen)
  389. __ADD(ADDR_ATTR_FLAGS, flags)
  390. __ADD(ADDR_ATTR_SCOPE, scope)
  391. __ADD(ADDR_ATTR_IFINDEX, ifindex)
  392. __ADD(ADDR_ATTR_LABEL, label)
  393. __ADD(ADDR_ATTR_CACHEINFO, cacheinfo)
  394. __ADD(ADDR_ATTR_PEER, peer)
  395. __ADD(ADDR_ATTR_LOCAL, local)
  396. __ADD(ADDR_ATTR_BROADCAST, broadcast)
  397. __ADD(ADDR_ATTR_MULTICAST, multicast)
  398. };
  399. static char *addr_attrs2str(int attrs, char *buf, size_t len)
  400. {
  401. return __flags2str(attrs, buf, len, addr_attrs,
  402. ARRAY_SIZE(addr_attrs));
  403. }
  404. /**
  405. * @name Allocation/Freeing
  406. * @{
  407. */
  408. struct rtnl_addr *rtnl_addr_alloc(void)
  409. {
  410. return (struct rtnl_addr *) nl_object_alloc(&addr_obj_ops);
  411. }
  412. void rtnl_addr_put(struct rtnl_addr *addr)
  413. {
  414. nl_object_put((struct nl_object *) addr);
  415. }
  416. /** @} */
  417. /**
  418. * @name Cache Management
  419. * @{
  420. */
  421. int rtnl_addr_alloc_cache(struct nl_sock *sk, struct nl_cache **result)
  422. {
  423. return nl_cache_alloc_and_fill(&rtnl_addr_ops, sk, result);
  424. }
  425. /**
  426. * Search address in cache
  427. * @arg cache Address cache
  428. * @arg ifindex Interface index of address
  429. * @arg addr Local address part
  430. *
  431. * Searches address cache previously allocated with rtnl_addr_alloc_cache()
  432. * for an address with a matching local address.
  433. *
  434. * The reference counter is incremented before returning the address, therefore
  435. * the reference must be given back with rtnl_addr_put() after usage.
  436. *
  437. * @return Address object or NULL if no match was found.
  438. */
  439. struct rtnl_addr *rtnl_addr_get(struct nl_cache *cache, int ifindex,
  440. struct nl_addr *addr)
  441. {
  442. struct rtnl_addr *a;
  443. if (cache->c_ops != &rtnl_addr_ops)
  444. return NULL;
  445. nl_list_for_each_entry(a, &cache->c_items, ce_list) {
  446. if (ifindex && a->a_ifindex != ifindex)
  447. continue;
  448. if (a->ce_mask & ADDR_ATTR_LOCAL &&
  449. !nl_addr_cmp(a->a_local, addr)) {
  450. nl_object_get((struct nl_object *) a);
  451. return a;
  452. }
  453. }
  454. return NULL;
  455. }
  456. /** @} */
  457. static int build_addr_msg(struct rtnl_addr *tmpl, int cmd, int flags,
  458. struct nl_msg **result)
  459. {
  460. struct nl_msg *msg;
  461. struct ifaddrmsg am = {
  462. .ifa_family = tmpl->a_family,
  463. .ifa_index = tmpl->a_ifindex,
  464. .ifa_prefixlen = tmpl->a_prefixlen,
  465. .ifa_flags = tmpl->a_flags,
  466. };
  467. if (tmpl->ce_mask & ADDR_ATTR_SCOPE)
  468. am.ifa_scope = tmpl->a_scope;
  469. else {
  470. /* compatibility hack */
  471. if (tmpl->a_family == AF_INET &&
  472. tmpl->ce_mask & ADDR_ATTR_LOCAL &&
  473. *((char *) nl_addr_get_binary_addr(tmpl->a_local)) == 127)
  474. am.ifa_scope = RT_SCOPE_HOST;
  475. else
  476. am.ifa_scope = RT_SCOPE_UNIVERSE;
  477. }
  478. msg = nlmsg_alloc_simple(cmd, flags);
  479. if (!msg)
  480. return -NLE_NOMEM;
  481. if (nlmsg_append(msg, &am, sizeof(am), NLMSG_ALIGNTO) < 0)
  482. goto nla_put_failure;
  483. if (tmpl->ce_mask & ADDR_ATTR_LOCAL)
  484. NLA_PUT_ADDR(msg, IFA_LOCAL, tmpl->a_local);
  485. if (tmpl->ce_mask & ADDR_ATTR_PEER)
  486. NLA_PUT_ADDR(msg, IFA_ADDRESS, tmpl->a_peer);
  487. else if (tmpl->ce_mask & ADDR_ATTR_LOCAL)
  488. NLA_PUT_ADDR(msg, IFA_ADDRESS, tmpl->a_local);
  489. if (tmpl->ce_mask & ADDR_ATTR_LABEL)
  490. NLA_PUT_STRING(msg, IFA_LABEL, tmpl->a_label);
  491. if (tmpl->ce_mask & ADDR_ATTR_BROADCAST)
  492. NLA_PUT_ADDR(msg, IFA_BROADCAST, tmpl->a_bcast);
  493. if (tmpl->ce_mask & ADDR_ATTR_CACHEINFO) {
  494. struct ifa_cacheinfo ca = {
  495. .ifa_valid = tmpl->a_cacheinfo.aci_valid,
  496. .ifa_prefered = tmpl->a_cacheinfo.aci_prefered,
  497. };
  498. NLA_PUT(msg, IFA_CACHEINFO, sizeof(ca), &ca);
  499. }
  500. if (tmpl->a_flags & ~0xFF) {
  501. /* only set the IFA_FLAGS attribute, if they actually contain additional
  502. * flags that are not already set to am.ifa_flags.
  503. *
  504. * Older kernels refuse RTM_NEWADDR and RTM_NEWROUTE messages with EINVAL
  505. * if they contain unknown netlink attributes. See net/core/rtnetlink.c, which
  506. * was fixed by kernel commit 661d2967b3f1b34eeaa7e212e7b9bbe8ee072b59.
  507. *
  508. * With this workaround, libnl will function correctly with older kernels,
  509. * unless there is a new libnl user that wants to set these flags. In this
  510. * case it's up to the user to workaround this issue. */
  511. NLA_PUT_U32(msg, IFA_FLAGS, tmpl->a_flags);
  512. }
  513. *result = msg;
  514. return 0;
  515. nla_put_failure:
  516. nlmsg_free(msg);
  517. return -NLE_MSGSIZE;
  518. }
  519. /**
  520. * @name Addition
  521. * @{
  522. */
  523. /**
  524. * Build netlink request message to request addition of new address
  525. * @arg addr Address object representing the new address.
  526. * @arg flags Additional netlink message flags.
  527. * @arg result Pointer to store resulting message.
  528. *
  529. * Builds a new netlink message requesting the addition of a new
  530. * address. The netlink message header isn't fully equipped with
  531. * all relevant fields and must thus be sent out via nl_send_auto_complete()
  532. * or supplemented as needed.
  533. *
  534. * Minimal required attributes:
  535. * - interface index (rtnl_addr_set_ifindex())
  536. * - local address (rtnl_addr_set_local())
  537. *
  538. * The scope will default to universe except for loopback addresses in
  539. * which case a host scope is used if not specified otherwise.
  540. *
  541. * @note Free the memory after usage using nlmsg_free().
  542. *
  543. * @return 0 on success or a negative error code.
  544. */
  545. int rtnl_addr_build_add_request(struct rtnl_addr *addr, int flags,
  546. struct nl_msg **result)
  547. {
  548. uint32_t required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY |
  549. ADDR_ATTR_PREFIXLEN | ADDR_ATTR_LOCAL;
  550. if ((addr->ce_mask & required) != required)
  551. return -NLE_MISSING_ATTR;
  552. return build_addr_msg(addr, RTM_NEWADDR, NLM_F_CREATE | flags, result);
  553. }
  554. /**
  555. * Request addition of new address
  556. * @arg sk Netlink socket.
  557. * @arg addr Address object representing the new address.
  558. * @arg flags Additional netlink message flags.
  559. *
  560. * Builds a netlink message by calling rtnl_addr_build_add_request(),
  561. * sends the request to the kernel and waits for the next ACK to be
  562. * received and thus blocks until the request has been fullfilled.
  563. *
  564. * @see rtnl_addr_build_add_request()
  565. *
  566. * @return 0 on sucess or a negative error if an error occured.
  567. */
  568. int rtnl_addr_add(struct nl_sock *sk, struct rtnl_addr *addr, int flags)
  569. {
  570. struct nl_msg *msg;
  571. int err;
  572. if ((err = rtnl_addr_build_add_request(addr, flags, &msg)) < 0)
  573. return err;
  574. err = nl_send_auto_complete(sk, msg);
  575. nlmsg_free(msg);
  576. if (err < 0)
  577. return err;
  578. return wait_for_ack(sk);
  579. }
  580. /** @} */
  581. /**
  582. * @name Deletion
  583. * @{
  584. */
  585. /**
  586. * Build a netlink request message to request deletion of an address
  587. * @arg addr Address object to be deleteted.
  588. * @arg flags Additional netlink message flags.
  589. * @arg result Pointer to store resulting message.
  590. *
  591. * Builds a new netlink message requesting a deletion of an address.
  592. * The netlink message header isn't fully equipped with all relevant
  593. * fields and must thus be sent out via nl_send_auto_complete()
  594. * or supplemented as needed.
  595. *
  596. * Minimal required attributes:
  597. * - interface index (rtnl_addr_set_ifindex())
  598. * - address family (rtnl_addr_set_family())
  599. *
  600. * Optional attributes:
  601. * - local address (rtnl_addr_set_local())
  602. * - label (rtnl_addr_set_label(), IPv4/DECnet only)
  603. * - peer address (rtnl_addr_set_peer(), IPv4 only)
  604. *
  605. * @note Free the memory after usage using nlmsg_free().
  606. *
  607. * @return 0 on success or a negative error code.
  608. */
  609. int rtnl_addr_build_delete_request(struct rtnl_addr *addr, int flags,
  610. struct nl_msg **result)
  611. {
  612. uint32_t required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY;
  613. if ((addr->ce_mask & required) != required)
  614. return -NLE_MISSING_ATTR;
  615. return build_addr_msg(addr, RTM_DELADDR, flags, result);
  616. }
  617. /**
  618. * Request deletion of an address
  619. * @arg sk Netlink socket.
  620. * @arg addr Address object to be deleted.
  621. * @arg flags Additional netlink message flags.
  622. *
  623. * Builds a netlink message by calling rtnl_addr_build_delete_request(),
  624. * sends the request to the kernel and waits for the next ACK to be
  625. * received and thus blocks until the request has been fullfilled.
  626. *
  627. * @see rtnl_addr_build_delete_request();
  628. *
  629. * @return 0 on sucess or a negative error if an error occured.
  630. */
  631. int rtnl_addr_delete(struct nl_sock *sk, struct rtnl_addr *addr, int flags)
  632. {
  633. struct nl_msg *msg;
  634. int err;
  635. if ((err = rtnl_addr_build_delete_request(addr, flags, &msg)) < 0)
  636. return err;
  637. err = nl_send_auto_complete(sk, msg);
  638. nlmsg_free(msg);
  639. if (err < 0)
  640. return err;
  641. return wait_for_ack(sk);
  642. }
  643. /** @} */
  644. /**
  645. * @name Attributes
  646. * @{
  647. */
  648. int rtnl_addr_set_label(struct rtnl_addr *addr, const char *label)
  649. {
  650. if (strlen(label) > sizeof(addr->a_label) - 1)
  651. return -NLE_RANGE;
  652. strcpy(addr->a_label, label);
  653. addr->ce_mask |= ADDR_ATTR_LABEL;
  654. return 0;
  655. }
  656. char *rtnl_addr_get_label(struct rtnl_addr *addr)
  657. {
  658. if (addr->ce_mask & ADDR_ATTR_LABEL)
  659. return addr->a_label;
  660. else
  661. return NULL;
  662. }
  663. void rtnl_addr_set_ifindex(struct rtnl_addr *addr, int ifindex)
  664. {
  665. addr->a_ifindex = ifindex;
  666. addr->ce_mask |= ADDR_ATTR_IFINDEX;
  667. }
  668. int rtnl_addr_get_ifindex(struct rtnl_addr *addr)
  669. {
  670. return addr->a_ifindex;
  671. }
  672. void rtnl_addr_set_link(struct rtnl_addr *addr, struct rtnl_link *link)
  673. {
  674. rtnl_link_put(addr->a_link);
  675. if (!link)
  676. return;
  677. nl_object_get(OBJ_CAST(link));
  678. addr->a_link = link;
  679. addr->a_ifindex = link->l_index;
  680. addr->ce_mask |= ADDR_ATTR_IFINDEX;
  681. }
  682. struct rtnl_link *rtnl_addr_get_link(struct rtnl_addr *addr)
  683. {
  684. if (addr->a_link) {
  685. nl_object_get(OBJ_CAST(addr->a_link));
  686. return addr->a_link;
  687. }
  688. return NULL;
  689. }
  690. void rtnl_addr_set_family(struct rtnl_addr *addr, int family)
  691. {
  692. addr->a_family = family;
  693. addr->ce_mask |= ADDR_ATTR_FAMILY;
  694. }
  695. int rtnl_addr_get_family(struct rtnl_addr *addr)
  696. {
  697. return addr->a_family;
  698. }
  699. /**
  700. * Set the prefix length / netmask
  701. * @arg addr Address
  702. * @arg prefixlen Length of prefix (netmask)
  703. *
  704. * Modifies the length of the prefix. If the address object contains a peer
  705. * address the prefix length will apply to it, otherwise the prefix length
  706. * will apply to the local address of the address.
  707. *
  708. * If the address object contains a peer or local address the corresponding
  709. * `struct nl_addr` will be updated with the new prefix length.
  710. *
  711. * @note Specifying a length of 0 will remove the prefix length alltogether.
  712. *
  713. * @see rtnl_addr_get_prefixlen()
  714. */
  715. void rtnl_addr_set_prefixlen(struct rtnl_addr *addr, int prefixlen)
  716. {
  717. addr->a_prefixlen = prefixlen;
  718. if (prefixlen)
  719. addr->ce_mask |= ADDR_ATTR_PREFIXLEN;
  720. else
  721. addr->ce_mask &= ~ADDR_ATTR_PREFIXLEN;
  722. /*
  723. * The prefix length always applies to the peer address if
  724. * a peer address is present.
  725. */
  726. if (addr->a_peer)
  727. nl_addr_set_prefixlen(addr->a_peer, prefixlen);
  728. else if (addr->a_local)
  729. nl_addr_set_prefixlen(addr->a_local, prefixlen);
  730. }
  731. int rtnl_addr_get_prefixlen(struct rtnl_addr *addr)
  732. {
  733. return addr->a_prefixlen;
  734. }
  735. void rtnl_addr_set_scope(struct rtnl_addr *addr, int scope)
  736. {
  737. addr->a_scope = scope;
  738. addr->ce_mask |= ADDR_ATTR_SCOPE;
  739. }
  740. int rtnl_addr_get_scope(struct rtnl_addr *addr)
  741. {
  742. return addr->a_scope;
  743. }
  744. void rtnl_addr_set_flags(struct rtnl_addr *addr, unsigned int flags)
  745. {
  746. addr->a_flag_mask |= flags;
  747. addr->a_flags |= flags;
  748. addr->ce_mask |= ADDR_ATTR_FLAGS;
  749. }
  750. void rtnl_addr_unset_flags(struct rtnl_addr *addr, unsigned int flags)
  751. {
  752. addr->a_flag_mask |= flags;
  753. addr->a_flags &= ~flags;
  754. addr->ce_mask |= ADDR_ATTR_FLAGS;
  755. }
  756. unsigned int rtnl_addr_get_flags(struct rtnl_addr *addr)
  757. {
  758. return addr->a_flags;
  759. }
  760. static inline int __assign_addr(struct rtnl_addr *addr, struct nl_addr **pos,
  761. struct nl_addr *new, int flag)
  762. {
  763. if (new) {
  764. if (addr->ce_mask & ADDR_ATTR_FAMILY) {
  765. if (new->a_family != addr->a_family)
  766. return -NLE_AF_MISMATCH;
  767. } else
  768. addr->a_family = new->a_family;
  769. if (*pos)
  770. nl_addr_put(*pos);
  771. *pos = nl_addr_get(new);
  772. addr->ce_mask |= (flag | ADDR_ATTR_FAMILY);
  773. } else {
  774. if (*pos)
  775. nl_addr_put(*pos);
  776. *pos = NULL;
  777. addr->ce_mask &= ~flag;
  778. }
  779. return 0;
  780. }
  781. int rtnl_addr_set_local(struct rtnl_addr *addr, struct nl_addr *local)
  782. {
  783. int err;
  784. /* Prohibit local address with prefix length if peer address is present */
  785. if ((addr->ce_mask & ADDR_ATTR_PEER) && local &&
  786. nl_addr_get_prefixlen(local))
  787. return -NLE_INVAL;
  788. err = __assign_addr(addr, &addr->a_local, local, ADDR_ATTR_LOCAL);
  789. if (err < 0)
  790. return err;
  791. /* Never overwrite the prefix length if a peer address is present */
  792. if (!(addr->ce_mask & ADDR_ATTR_PEER))
  793. rtnl_addr_set_prefixlen(addr, local ? nl_addr_get_prefixlen(local) : 0);
  794. return 0;
  795. }
  796. struct nl_addr *rtnl_addr_get_local(struct rtnl_addr *addr)
  797. {
  798. return addr->a_local;
  799. }
  800. int rtnl_addr_set_peer(struct rtnl_addr *addr, struct nl_addr *peer)
  801. {
  802. int err;
  803. if (peer && peer->a_family != AF_INET)
  804. return -NLE_AF_NOSUPPORT;
  805. err = __assign_addr(addr, &addr->a_peer, peer, ADDR_ATTR_PEER);
  806. if (err < 0)
  807. return err;
  808. rtnl_addr_set_prefixlen(addr, peer ? nl_addr_get_prefixlen(peer) : 0);
  809. return 0;
  810. }
  811. struct nl_addr *rtnl_addr_get_peer(struct rtnl_addr *addr)
  812. {
  813. return addr->a_peer;
  814. }
  815. int rtnl_addr_set_broadcast(struct rtnl_addr *addr, struct nl_addr *bcast)
  816. {
  817. if (bcast && bcast->a_family != AF_INET)
  818. return -NLE_AF_NOSUPPORT;
  819. return __assign_addr(addr, &addr->a_bcast, bcast, ADDR_ATTR_BROADCAST);
  820. }
  821. struct nl_addr *rtnl_addr_get_broadcast(struct rtnl_addr *addr)
  822. {
  823. return addr->a_bcast;
  824. }
  825. int rtnl_addr_set_multicast(struct rtnl_addr *addr, struct nl_addr *multicast)
  826. {
  827. if (multicast && multicast->a_family != AF_INET6)
  828. return -NLE_AF_NOSUPPORT;
  829. return __assign_addr(addr, &addr->a_multicast, multicast,
  830. ADDR_ATTR_MULTICAST);
  831. }
  832. struct nl_addr *rtnl_addr_get_multicast(struct rtnl_addr *addr)
  833. {
  834. return addr->a_multicast;
  835. }
  836. int rtnl_addr_set_anycast(struct rtnl_addr *addr, struct nl_addr *anycast)
  837. {
  838. if (anycast && anycast->a_family != AF_INET6)
  839. return -NLE_AF_NOSUPPORT;
  840. return __assign_addr(addr, &addr->a_anycast, anycast,
  841. ADDR_ATTR_ANYCAST);
  842. }
  843. struct nl_addr *rtnl_addr_get_anycast(struct rtnl_addr *addr)
  844. {
  845. return addr->a_anycast;
  846. }
  847. uint32_t rtnl_addr_get_valid_lifetime(struct rtnl_addr *addr)
  848. {
  849. if (addr->ce_mask & ADDR_ATTR_CACHEINFO)
  850. return addr->a_cacheinfo.aci_valid;
  851. else
  852. return 0xFFFFFFFFU;
  853. }
  854. void rtnl_addr_set_valid_lifetime(struct rtnl_addr *addr, uint32_t lifetime)
  855. {
  856. addr->a_cacheinfo.aci_valid = lifetime;
  857. addr->ce_mask |= ADDR_ATTR_CACHEINFO;
  858. }
  859. uint32_t rtnl_addr_get_preferred_lifetime(struct rtnl_addr *addr)
  860. {
  861. if (addr->ce_mask & ADDR_ATTR_CACHEINFO)
  862. return addr->a_cacheinfo.aci_prefered;
  863. else
  864. return 0xFFFFFFFFU;
  865. }
  866. void rtnl_addr_set_preferred_lifetime(struct rtnl_addr *addr, uint32_t lifetime)
  867. {
  868. addr->a_cacheinfo.aci_prefered = lifetime;
  869. addr->ce_mask |= ADDR_ATTR_CACHEINFO;
  870. }
  871. uint32_t rtnl_addr_get_create_time(struct rtnl_addr *addr)
  872. {
  873. return addr->a_cacheinfo.aci_cstamp;
  874. }
  875. uint32_t rtnl_addr_get_last_update_time(struct rtnl_addr *addr)
  876. {
  877. return addr->a_cacheinfo.aci_tstamp;
  878. }
  879. /** @} */
  880. /**
  881. * @name Flags Translations
  882. * @{
  883. */
  884. static const struct trans_tbl addr_flags[] = {
  885. __ADD(IFA_F_SECONDARY, secondary)
  886. __ADD(IFA_F_NODAD, nodad)
  887. __ADD(IFA_F_OPTIMISTIC, optimistic)
  888. __ADD(IFA_F_HOMEADDRESS, homeaddress)
  889. __ADD(IFA_F_DEPRECATED, deprecated)
  890. __ADD(IFA_F_TENTATIVE, tentative)
  891. __ADD(IFA_F_PERMANENT, permanent)
  892. __ADD(IFA_F_MANAGETEMPADDR, mngtmpaddr)
  893. __ADD(IFA_F_NOPREFIXROUTE, noprefixroute)
  894. };
  895. char *rtnl_addr_flags2str(int flags, char *buf, size_t size)
  896. {
  897. return __flags2str(flags, buf, size, addr_flags,
  898. ARRAY_SIZE(addr_flags));
  899. }
  900. int rtnl_addr_str2flags(const char *name)
  901. {
  902. return __str2flags(name, addr_flags, ARRAY_SIZE(addr_flags));
  903. }
  904. /** @} */
  905. static struct nl_object_ops addr_obj_ops = {
  906. .oo_name = "route/addr",
  907. .oo_size = sizeof(struct rtnl_addr),
  908. .oo_constructor = addr_constructor,
  909. .oo_free_data = addr_free_data,
  910. .oo_clone = addr_clone,
  911. .oo_dump = {
  912. [NL_DUMP_LINE] = addr_dump_line,
  913. [NL_DUMP_DETAILS] = addr_dump_details,
  914. [NL_DUMP_STATS] = addr_dump_stats,
  915. },
  916. .oo_compare = addr_compare,
  917. .oo_attrs2str = addr_attrs2str,
  918. .oo_id_attrs = (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX |
  919. ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN),
  920. };
  921. static struct nl_af_group addr_groups[] = {
  922. { AF_INET, RTNLGRP_IPV4_IFADDR },
  923. { AF_INET6, RTNLGRP_IPV6_IFADDR },
  924. { END_OF_GROUP_LIST },
  925. };
  926. static struct nl_cache_ops rtnl_addr_ops = {
  927. .co_name = "route/addr",
  928. .co_hdrsize = sizeof(struct ifaddrmsg),
  929. .co_msgtypes = {
  930. { RTM_NEWADDR, NL_ACT_NEW, "new" },
  931. { RTM_DELADDR, NL_ACT_DEL, "del" },
  932. { RTM_GETADDR, NL_ACT_GET, "get" },
  933. END_OF_MSGTYPES_LIST,
  934. },
  935. .co_protocol = NETLINK_ROUTE,
  936. .co_groups = addr_groups,
  937. .co_request_update = addr_request_update,
  938. .co_msg_parser = addr_msg_parser,
  939. .co_obj_ops = &addr_obj_ops,
  940. };
  941. static void __init addr_init(void)
  942. {
  943. nl_cache_mngt_register(&rtnl_addr_ops);
  944. }
  945. static void __exit addr_exit(void)
  946. {
  947. nl_cache_mngt_unregister(&rtnl_addr_ops);
  948. }
  949. /** @} */