addr.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. /*
  2. * Copyright (c) 2005 Voltaire Inc. All rights reserved.
  3. * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
  4. * Copyright (c) 1999-2005, Mellanox Technologies, Inc. All rights reserved.
  5. * Copyright (c) 2005 Intel Corporation. All rights reserved.
  6. *
  7. * This software is available to you under a choice of one of two
  8. * licenses. You may choose to be licensed under the terms of the GNU
  9. * General Public License (GPL) Version 2, available from the file
  10. * COPYING in the main directory of this source tree, or the
  11. * OpenIB.org BSD license below:
  12. *
  13. * Redistribution and use in source and binary forms, with or
  14. * without modification, are permitted provided that the following
  15. * conditions are met:
  16. *
  17. * - Redistributions of source code must retain the above
  18. * copyright notice, this list of conditions and the following
  19. * disclaimer.
  20. *
  21. * - Redistributions in binary form must reproduce the above
  22. * copyright notice, this list of conditions and the following
  23. * disclaimer in the documentation and/or other materials
  24. * provided with the distribution.
  25. *
  26. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  27. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  28. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  29. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  30. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  31. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  32. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  33. * SOFTWARE.
  34. */
  35. #include <linux/mutex.h>
  36. #include <linux/inetdevice.h>
  37. #include <linux/slab.h>
  38. #include <linux/workqueue.h>
  39. #include <net/arp.h>
  40. #include <net/neighbour.h>
  41. #include <net/route.h>
  42. #include <net/netevent.h>
  43. #include <net/ipv6_stubs.h>
  44. #include <net/ip6_route.h>
  45. #include <rdma/ib_addr.h>
  46. #include <rdma/ib_cache.h>
  47. #include <rdma/ib_sa.h>
  48. #include <rdma/ib.h>
  49. #include <rdma/rdma_netlink.h>
  50. #include <net/netlink.h>
  51. #include "core_priv.h"
  52. struct addr_req {
  53. struct list_head list;
  54. struct sockaddr_storage src_addr;
  55. struct sockaddr_storage dst_addr;
  56. struct rdma_dev_addr *addr;
  57. void *context;
  58. void (*callback)(int status, struct sockaddr *src_addr,
  59. struct rdma_dev_addr *addr, void *context);
  60. unsigned long timeout;
  61. struct delayed_work work;
  62. bool resolve_by_gid_attr; /* Consider gid attr in resolve phase */
  63. int status;
  64. u32 seq;
  65. };
  66. static atomic_t ib_nl_addr_request_seq = ATOMIC_INIT(0);
  67. static DEFINE_SPINLOCK(lock);
  68. static LIST_HEAD(req_list);
  69. static struct workqueue_struct *addr_wq;
  70. static const struct nla_policy ib_nl_addr_policy[LS_NLA_TYPE_MAX] = {
  71. [LS_NLA_TYPE_DGID] = {.type = NLA_BINARY,
  72. .len = sizeof(struct rdma_nla_ls_gid),
  73. .validation_type = NLA_VALIDATE_MIN,
  74. .min = sizeof(struct rdma_nla_ls_gid)},
  75. };
  76. static inline bool ib_nl_is_good_ip_resp(const struct nlmsghdr *nlh)
  77. {
  78. struct nlattr *tb[LS_NLA_TYPE_MAX] = {};
  79. int ret;
  80. if (nlh->nlmsg_flags & RDMA_NL_LS_F_ERR)
  81. return false;
  82. ret = nla_parse_deprecated(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
  83. nlmsg_len(nlh), ib_nl_addr_policy, NULL);
  84. if (ret)
  85. return false;
  86. return true;
  87. }
  88. static void ib_nl_process_good_ip_rsep(const struct nlmsghdr *nlh)
  89. {
  90. const struct nlattr *head, *curr;
  91. union ib_gid gid;
  92. struct addr_req *req;
  93. int len, rem;
  94. int found = 0;
  95. head = (const struct nlattr *)nlmsg_data(nlh);
  96. len = nlmsg_len(nlh);
  97. nla_for_each_attr(curr, head, len, rem) {
  98. if (curr->nla_type == LS_NLA_TYPE_DGID)
  99. memcpy(&gid, nla_data(curr), nla_len(curr));
  100. }
  101. spin_lock_bh(&lock);
  102. list_for_each_entry(req, &req_list, list) {
  103. if (nlh->nlmsg_seq != req->seq)
  104. continue;
  105. /* We set the DGID part, the rest was set earlier */
  106. rdma_addr_set_dgid(req->addr, &gid);
  107. req->status = 0;
  108. found = 1;
  109. break;
  110. }
  111. spin_unlock_bh(&lock);
  112. if (!found)
  113. pr_info("Couldn't find request waiting for DGID: %pI6\n",
  114. &gid);
  115. }
  116. int ib_nl_handle_ip_res_resp(struct sk_buff *skb,
  117. struct nlmsghdr *nlh,
  118. struct netlink_ext_ack *extack)
  119. {
  120. if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
  121. !(NETLINK_CB(skb).sk))
  122. return -EPERM;
  123. if (ib_nl_is_good_ip_resp(nlh))
  124. ib_nl_process_good_ip_rsep(nlh);
  125. return 0;
  126. }
  127. static int ib_nl_ip_send_msg(struct rdma_dev_addr *dev_addr,
  128. const void *daddr,
  129. u32 seq, u16 family)
  130. {
  131. struct sk_buff *skb = NULL;
  132. struct nlmsghdr *nlh;
  133. struct rdma_ls_ip_resolve_header *header;
  134. void *data;
  135. size_t size;
  136. int attrtype;
  137. int len;
  138. if (family == AF_INET) {
  139. size = sizeof(struct in_addr);
  140. attrtype = RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_IPV4;
  141. } else {
  142. size = sizeof(struct in6_addr);
  143. attrtype = RDMA_NLA_F_MANDATORY | LS_NLA_TYPE_IPV6;
  144. }
  145. len = nla_total_size(sizeof(size));
  146. len += NLMSG_ALIGN(sizeof(*header));
  147. skb = nlmsg_new(len, GFP_KERNEL);
  148. if (!skb)
  149. return -ENOMEM;
  150. data = ibnl_put_msg(skb, &nlh, seq, 0, RDMA_NL_LS,
  151. RDMA_NL_LS_OP_IP_RESOLVE, NLM_F_REQUEST);
  152. if (!data) {
  153. nlmsg_free(skb);
  154. return -ENODATA;
  155. }
  156. /* Construct the family header first */
  157. header = skb_put(skb, NLMSG_ALIGN(sizeof(*header)));
  158. header->ifindex = dev_addr->bound_dev_if;
  159. nla_put(skb, attrtype, size, daddr);
  160. /* Repair the nlmsg header length */
  161. nlmsg_end(skb, nlh);
  162. rdma_nl_multicast(&init_net, skb, RDMA_NL_GROUP_LS, GFP_KERNEL);
  163. /* Make the request retry, so when we get the response from userspace
  164. * we will have something.
  165. */
  166. return -ENODATA;
  167. }
  168. int rdma_addr_size(const struct sockaddr *addr)
  169. {
  170. switch (addr->sa_family) {
  171. case AF_INET:
  172. return sizeof(struct sockaddr_in);
  173. case AF_INET6:
  174. return sizeof(struct sockaddr_in6);
  175. case AF_IB:
  176. return sizeof(struct sockaddr_ib);
  177. default:
  178. return 0;
  179. }
  180. }
  181. EXPORT_SYMBOL(rdma_addr_size);
  182. int rdma_addr_size_in6(struct sockaddr_in6 *addr)
  183. {
  184. int ret = rdma_addr_size((struct sockaddr *) addr);
  185. return ret <= sizeof(*addr) ? ret : 0;
  186. }
  187. EXPORT_SYMBOL(rdma_addr_size_in6);
  188. int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr)
  189. {
  190. int ret = rdma_addr_size((struct sockaddr *) addr);
  191. return ret <= sizeof(*addr) ? ret : 0;
  192. }
  193. EXPORT_SYMBOL(rdma_addr_size_kss);
  194. /**
  195. * rdma_copy_src_l2_addr - Copy netdevice source addresses
  196. * @dev_addr: Destination address pointer where to copy the addresses
  197. * @dev: Netdevice whose source addresses to copy
  198. *
  199. * rdma_copy_src_l2_addr() copies source addresses from the specified netdevice.
  200. * This includes unicast address, broadcast address, device type and
  201. * interface index.
  202. */
  203. void rdma_copy_src_l2_addr(struct rdma_dev_addr *dev_addr,
  204. const struct net_device *dev)
  205. {
  206. dev_addr->dev_type = dev->type;
  207. memcpy(dev_addr->src_dev_addr, dev->dev_addr, MAX_ADDR_LEN);
  208. memcpy(dev_addr->broadcast, dev->broadcast, MAX_ADDR_LEN);
  209. dev_addr->bound_dev_if = dev->ifindex;
  210. }
  211. EXPORT_SYMBOL(rdma_copy_src_l2_addr);
  212. static struct net_device *
  213. rdma_find_ndev_for_src_ip_rcu(struct net *net, const struct sockaddr *src_in)
  214. {
  215. struct net_device *dev = NULL;
  216. int ret = -EADDRNOTAVAIL;
  217. switch (src_in->sa_family) {
  218. case AF_INET:
  219. dev = __ip_dev_find(net,
  220. ((const struct sockaddr_in *)src_in)->sin_addr.s_addr,
  221. false);
  222. if (dev)
  223. ret = 0;
  224. break;
  225. #if IS_ENABLED(CONFIG_IPV6)
  226. case AF_INET6:
  227. for_each_netdev_rcu(net, dev) {
  228. if (ipv6_chk_addr(net,
  229. &((const struct sockaddr_in6 *)src_in)->sin6_addr,
  230. dev, 1)) {
  231. ret = 0;
  232. break;
  233. }
  234. }
  235. break;
  236. #endif
  237. }
  238. return ret ? ERR_PTR(ret) : dev;
  239. }
  240. int rdma_translate_ip(const struct sockaddr *addr,
  241. struct rdma_dev_addr *dev_addr)
  242. {
  243. struct net_device *dev;
  244. if (dev_addr->bound_dev_if) {
  245. dev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
  246. if (!dev)
  247. return -ENODEV;
  248. rdma_copy_src_l2_addr(dev_addr, dev);
  249. dev_put(dev);
  250. return 0;
  251. }
  252. rcu_read_lock();
  253. dev = rdma_find_ndev_for_src_ip_rcu(dev_addr->net, addr);
  254. if (!IS_ERR(dev))
  255. rdma_copy_src_l2_addr(dev_addr, dev);
  256. rcu_read_unlock();
  257. return PTR_ERR_OR_ZERO(dev);
  258. }
  259. EXPORT_SYMBOL(rdma_translate_ip);
  260. static void set_timeout(struct addr_req *req, unsigned long time)
  261. {
  262. unsigned long delay;
  263. delay = time - jiffies;
  264. if ((long)delay < 0)
  265. delay = 0;
  266. mod_delayed_work(addr_wq, &req->work, delay);
  267. }
  268. static void queue_req(struct addr_req *req)
  269. {
  270. spin_lock_bh(&lock);
  271. list_add_tail(&req->list, &req_list);
  272. set_timeout(req, req->timeout);
  273. spin_unlock_bh(&lock);
  274. }
  275. static int ib_nl_fetch_ha(struct rdma_dev_addr *dev_addr,
  276. const void *daddr, u32 seq, u16 family)
  277. {
  278. if (!rdma_nl_chk_listeners(RDMA_NL_GROUP_LS))
  279. return -EADDRNOTAVAIL;
  280. return ib_nl_ip_send_msg(dev_addr, daddr, seq, family);
  281. }
  282. static int dst_fetch_ha(const struct dst_entry *dst,
  283. struct rdma_dev_addr *dev_addr,
  284. const void *daddr)
  285. {
  286. struct neighbour *n;
  287. int ret = 0;
  288. n = dst_neigh_lookup(dst, daddr);
  289. if (!n)
  290. return -ENODATA;
  291. if (!(n->nud_state & NUD_VALID)) {
  292. neigh_event_send(n, NULL);
  293. ret = -ENODATA;
  294. } else {
  295. neigh_ha_snapshot(dev_addr->dst_dev_addr, n, dst->dev);
  296. }
  297. neigh_release(n);
  298. return ret;
  299. }
  300. static bool has_gateway(const struct dst_entry *dst, sa_family_t family)
  301. {
  302. if (family == AF_INET)
  303. return dst_rtable(dst)->rt_uses_gateway;
  304. return dst_rt6_info(dst)->rt6i_flags & RTF_GATEWAY;
  305. }
  306. static int fetch_ha(const struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
  307. const struct sockaddr *dst_in, u32 seq)
  308. {
  309. const struct sockaddr_in *dst_in4 =
  310. (const struct sockaddr_in *)dst_in;
  311. const struct sockaddr_in6 *dst_in6 =
  312. (const struct sockaddr_in6 *)dst_in;
  313. const void *daddr = (dst_in->sa_family == AF_INET) ?
  314. (const void *)&dst_in4->sin_addr.s_addr :
  315. (const void *)&dst_in6->sin6_addr;
  316. sa_family_t family = dst_in->sa_family;
  317. might_sleep();
  318. /* If we have a gateway in IB mode then it must be an IB network */
  319. if (has_gateway(dst, family) && dev_addr->network == RDMA_NETWORK_IB)
  320. return ib_nl_fetch_ha(dev_addr, daddr, seq, family);
  321. else
  322. return dst_fetch_ha(dst, dev_addr, daddr);
  323. }
  324. static int addr4_resolve(struct sockaddr *src_sock,
  325. const struct sockaddr *dst_sock,
  326. struct rdma_dev_addr *addr,
  327. struct rtable **prt)
  328. {
  329. struct sockaddr_in *src_in = (struct sockaddr_in *)src_sock;
  330. const struct sockaddr_in *dst_in =
  331. (const struct sockaddr_in *)dst_sock;
  332. __be32 src_ip = src_in->sin_addr.s_addr;
  333. __be32 dst_ip = dst_in->sin_addr.s_addr;
  334. struct rtable *rt;
  335. struct flowi4 fl4;
  336. int ret;
  337. memset(&fl4, 0, sizeof(fl4));
  338. fl4.daddr = dst_ip;
  339. fl4.saddr = src_ip;
  340. fl4.flowi4_oif = addr->bound_dev_if;
  341. rt = ip_route_output_key(addr->net, &fl4);
  342. ret = PTR_ERR_OR_ZERO(rt);
  343. if (ret)
  344. return ret;
  345. src_in->sin_addr.s_addr = fl4.saddr;
  346. addr->hoplimit = ip4_dst_hoplimit(&rt->dst);
  347. *prt = rt;
  348. return 0;
  349. }
  350. #if IS_ENABLED(CONFIG_IPV6)
  351. static int addr6_resolve(struct sockaddr *src_sock,
  352. const struct sockaddr *dst_sock,
  353. struct rdma_dev_addr *addr,
  354. struct dst_entry **pdst)
  355. {
  356. struct sockaddr_in6 *src_in = (struct sockaddr_in6 *)src_sock;
  357. const struct sockaddr_in6 *dst_in =
  358. (const struct sockaddr_in6 *)dst_sock;
  359. struct flowi6 fl6;
  360. struct dst_entry *dst;
  361. memset(&fl6, 0, sizeof fl6);
  362. fl6.daddr = dst_in->sin6_addr;
  363. fl6.saddr = src_in->sin6_addr;
  364. fl6.flowi6_oif = addr->bound_dev_if;
  365. dst = ipv6_stub->ipv6_dst_lookup_flow(addr->net, NULL, &fl6, NULL);
  366. if (IS_ERR(dst))
  367. return PTR_ERR(dst);
  368. if (ipv6_addr_any(&src_in->sin6_addr))
  369. src_in->sin6_addr = fl6.saddr;
  370. addr->hoplimit = ip6_dst_hoplimit(dst);
  371. *pdst = dst;
  372. return 0;
  373. }
  374. #else
  375. static int addr6_resolve(struct sockaddr *src_sock,
  376. const struct sockaddr *dst_sock,
  377. struct rdma_dev_addr *addr,
  378. struct dst_entry **pdst)
  379. {
  380. return -EADDRNOTAVAIL;
  381. }
  382. #endif
  383. static int addr_resolve_neigh(const struct dst_entry *dst,
  384. const struct sockaddr *dst_in,
  385. struct rdma_dev_addr *addr,
  386. unsigned int ndev_flags,
  387. u32 seq)
  388. {
  389. int ret = 0;
  390. if (ndev_flags & IFF_LOOPBACK)
  391. memcpy(addr->dst_dev_addr, addr->src_dev_addr, MAX_ADDR_LEN);
  392. else
  393. ret = fetch_ha(dst, addr, dst_in, seq);
  394. return ret;
  395. }
  396. static int copy_src_l2_addr(struct rdma_dev_addr *dev_addr,
  397. const struct sockaddr *dst_in,
  398. const struct dst_entry *dst,
  399. const struct net_device *ndev)
  400. {
  401. int ret = 0;
  402. if (dst->dev->flags & IFF_LOOPBACK)
  403. ret = rdma_translate_ip(dst_in, dev_addr);
  404. else
  405. rdma_copy_src_l2_addr(dev_addr, dst->dev);
  406. /*
  407. * If there's a gateway and type of device not ARPHRD_INFINIBAND,
  408. * we're definitely in RoCE v2 (as RoCE v1 isn't routable) set the
  409. * network type accordingly.
  410. */
  411. if (has_gateway(dst, dst_in->sa_family) &&
  412. ndev->type != ARPHRD_INFINIBAND)
  413. dev_addr->network = dst_in->sa_family == AF_INET ?
  414. RDMA_NETWORK_IPV4 :
  415. RDMA_NETWORK_IPV6;
  416. else
  417. dev_addr->network = RDMA_NETWORK_IB;
  418. return ret;
  419. }
  420. static int rdma_set_src_addr_rcu(struct rdma_dev_addr *dev_addr,
  421. unsigned int *ndev_flags,
  422. const struct sockaddr *dst_in,
  423. const struct dst_entry *dst)
  424. {
  425. struct net_device *ndev = READ_ONCE(dst->dev);
  426. *ndev_flags = ndev->flags;
  427. /* A physical device must be the RDMA device to use */
  428. if (ndev->flags & IFF_LOOPBACK) {
  429. /*
  430. * RDMA (IB/RoCE, iWarp) doesn't run on lo interface or
  431. * loopback IP address. So if route is resolved to loopback
  432. * interface, translate that to a real ndev based on non
  433. * loopback IP address.
  434. */
  435. ndev = rdma_find_ndev_for_src_ip_rcu(dev_net(ndev), dst_in);
  436. if (IS_ERR(ndev))
  437. return -ENODEV;
  438. }
  439. return copy_src_l2_addr(dev_addr, dst_in, dst, ndev);
  440. }
  441. static int set_addr_netns_by_gid_rcu(struct rdma_dev_addr *addr)
  442. {
  443. struct net_device *ndev;
  444. ndev = rdma_read_gid_attr_ndev_rcu(addr->sgid_attr);
  445. if (IS_ERR(ndev))
  446. return PTR_ERR(ndev);
  447. /*
  448. * Since we are holding the rcu, reading net and ifindex
  449. * are safe without any additional reference; because
  450. * change_net_namespace() in net/core/dev.c does rcu sync
  451. * after it changes the state to IFF_DOWN and before
  452. * updating netdev fields {net, ifindex}.
  453. */
  454. addr->net = dev_net(ndev);
  455. addr->bound_dev_if = ndev->ifindex;
  456. return 0;
  457. }
  458. static void rdma_addr_set_net_defaults(struct rdma_dev_addr *addr)
  459. {
  460. addr->net = &init_net;
  461. addr->bound_dev_if = 0;
  462. }
  463. static int addr_resolve(struct sockaddr *src_in,
  464. const struct sockaddr *dst_in,
  465. struct rdma_dev_addr *addr,
  466. bool resolve_neigh,
  467. bool resolve_by_gid_attr,
  468. u32 seq)
  469. {
  470. struct dst_entry *dst = NULL;
  471. unsigned int ndev_flags = 0;
  472. struct rtable *rt = NULL;
  473. int ret;
  474. if (!addr->net) {
  475. pr_warn_ratelimited("%s: missing namespace\n", __func__);
  476. return -EINVAL;
  477. }
  478. rcu_read_lock();
  479. if (resolve_by_gid_attr) {
  480. if (!addr->sgid_attr) {
  481. rcu_read_unlock();
  482. pr_warn_ratelimited("%s: missing gid_attr\n", __func__);
  483. return -EINVAL;
  484. }
  485. /*
  486. * If the request is for a specific gid attribute of the
  487. * rdma_dev_addr, derive net from the netdevice of the
  488. * GID attribute.
  489. */
  490. ret = set_addr_netns_by_gid_rcu(addr);
  491. if (ret) {
  492. rcu_read_unlock();
  493. return ret;
  494. }
  495. }
  496. if (src_in->sa_family == AF_INET) {
  497. ret = addr4_resolve(src_in, dst_in, addr, &rt);
  498. dst = &rt->dst;
  499. } else {
  500. ret = addr6_resolve(src_in, dst_in, addr, &dst);
  501. }
  502. if (ret) {
  503. rcu_read_unlock();
  504. goto done;
  505. }
  506. ret = rdma_set_src_addr_rcu(addr, &ndev_flags, dst_in, dst);
  507. rcu_read_unlock();
  508. /*
  509. * Resolve neighbor destination address if requested and
  510. * only if src addr translation didn't fail.
  511. */
  512. if (!ret && resolve_neigh)
  513. ret = addr_resolve_neigh(dst, dst_in, addr, ndev_flags, seq);
  514. if (src_in->sa_family == AF_INET)
  515. ip_rt_put(rt);
  516. else
  517. dst_release(dst);
  518. done:
  519. /*
  520. * Clear the addr net to go back to its original state, only if it was
  521. * derived from GID attribute in this context.
  522. */
  523. if (resolve_by_gid_attr)
  524. rdma_addr_set_net_defaults(addr);
  525. return ret;
  526. }
  527. static void process_one_req(struct work_struct *_work)
  528. {
  529. struct addr_req *req;
  530. struct sockaddr *src_in, *dst_in;
  531. req = container_of(_work, struct addr_req, work.work);
  532. if (req->status == -ENODATA) {
  533. src_in = (struct sockaddr *)&req->src_addr;
  534. dst_in = (struct sockaddr *)&req->dst_addr;
  535. req->status = addr_resolve(src_in, dst_in, req->addr,
  536. true, req->resolve_by_gid_attr,
  537. req->seq);
  538. if (req->status && time_after_eq(jiffies, req->timeout)) {
  539. req->status = -ETIMEDOUT;
  540. } else if (req->status == -ENODATA) {
  541. /* requeue the work for retrying again */
  542. spin_lock_bh(&lock);
  543. if (!list_empty(&req->list))
  544. set_timeout(req, req->timeout);
  545. spin_unlock_bh(&lock);
  546. return;
  547. }
  548. }
  549. req->callback(req->status, (struct sockaddr *)&req->src_addr,
  550. req->addr, req->context);
  551. req->callback = NULL;
  552. spin_lock_bh(&lock);
  553. /*
  554. * Although the work will normally have been canceled by the workqueue,
  555. * it can still be requeued as long as it is on the req_list.
  556. */
  557. cancel_delayed_work(&req->work);
  558. if (!list_empty(&req->list)) {
  559. list_del_init(&req->list);
  560. kfree(req);
  561. }
  562. spin_unlock_bh(&lock);
  563. }
  564. int rdma_resolve_ip(struct sockaddr *src_addr, const struct sockaddr *dst_addr,
  565. struct rdma_dev_addr *addr, unsigned long timeout_ms,
  566. void (*callback)(int status, struct sockaddr *src_addr,
  567. struct rdma_dev_addr *addr, void *context),
  568. bool resolve_by_gid_attr, void *context)
  569. {
  570. struct sockaddr *src_in, *dst_in;
  571. struct addr_req *req;
  572. int ret = 0;
  573. req = kzalloc(sizeof *req, GFP_KERNEL);
  574. if (!req)
  575. return -ENOMEM;
  576. src_in = (struct sockaddr *) &req->src_addr;
  577. dst_in = (struct sockaddr *) &req->dst_addr;
  578. if (src_addr) {
  579. if (src_addr->sa_family != dst_addr->sa_family) {
  580. ret = -EINVAL;
  581. goto err;
  582. }
  583. memcpy(src_in, src_addr, rdma_addr_size(src_addr));
  584. } else {
  585. src_in->sa_family = dst_addr->sa_family;
  586. }
  587. memcpy(dst_in, dst_addr, rdma_addr_size(dst_addr));
  588. req->addr = addr;
  589. req->callback = callback;
  590. req->context = context;
  591. req->resolve_by_gid_attr = resolve_by_gid_attr;
  592. INIT_DELAYED_WORK(&req->work, process_one_req);
  593. req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
  594. req->status = addr_resolve(src_in, dst_in, addr, true,
  595. req->resolve_by_gid_attr, req->seq);
  596. switch (req->status) {
  597. case 0:
  598. req->timeout = jiffies;
  599. queue_req(req);
  600. break;
  601. case -ENODATA:
  602. req->timeout = msecs_to_jiffies(timeout_ms) + jiffies;
  603. queue_req(req);
  604. break;
  605. default:
  606. ret = req->status;
  607. goto err;
  608. }
  609. return ret;
  610. err:
  611. kfree(req);
  612. return ret;
  613. }
  614. EXPORT_SYMBOL(rdma_resolve_ip);
  615. int roce_resolve_route_from_path(struct sa_path_rec *rec,
  616. const struct ib_gid_attr *attr)
  617. {
  618. union {
  619. struct sockaddr _sockaddr;
  620. struct sockaddr_in _sockaddr_in;
  621. struct sockaddr_in6 _sockaddr_in6;
  622. } sgid, dgid;
  623. struct rdma_dev_addr dev_addr = {};
  624. int ret;
  625. might_sleep();
  626. if (rec->roce.route_resolved)
  627. return 0;
  628. rdma_gid2ip((struct sockaddr *)&sgid, &rec->sgid);
  629. rdma_gid2ip((struct sockaddr *)&dgid, &rec->dgid);
  630. if (sgid._sockaddr.sa_family != dgid._sockaddr.sa_family)
  631. return -EINVAL;
  632. if (!attr || !attr->ndev)
  633. return -EINVAL;
  634. dev_addr.net = &init_net;
  635. dev_addr.sgid_attr = attr;
  636. ret = addr_resolve((struct sockaddr *)&sgid, (struct sockaddr *)&dgid,
  637. &dev_addr, false, true, 0);
  638. if (ret)
  639. return ret;
  640. if ((dev_addr.network == RDMA_NETWORK_IPV4 ||
  641. dev_addr.network == RDMA_NETWORK_IPV6) &&
  642. rec->rec_type != SA_PATH_REC_TYPE_ROCE_V2)
  643. return -EINVAL;
  644. rec->roce.route_resolved = true;
  645. return 0;
  646. }
  647. /**
  648. * rdma_addr_cancel - Cancel resolve ip request
  649. * @addr: Pointer to address structure given previously
  650. * during rdma_resolve_ip().
  651. * rdma_addr_cancel() is synchronous function which cancels any pending
  652. * request if there is any.
  653. */
  654. void rdma_addr_cancel(struct rdma_dev_addr *addr)
  655. {
  656. struct addr_req *req, *temp_req;
  657. struct addr_req *found = NULL;
  658. spin_lock_bh(&lock);
  659. list_for_each_entry_safe(req, temp_req, &req_list, list) {
  660. if (req->addr == addr) {
  661. /*
  662. * Removing from the list means we take ownership of
  663. * the req
  664. */
  665. list_del_init(&req->list);
  666. found = req;
  667. break;
  668. }
  669. }
  670. spin_unlock_bh(&lock);
  671. if (!found)
  672. return;
  673. /*
  674. * sync canceling the work after removing it from the req_list
  675. * guarentees no work is running and none will be started.
  676. */
  677. cancel_delayed_work_sync(&found->work);
  678. kfree(found);
  679. }
  680. EXPORT_SYMBOL(rdma_addr_cancel);
  681. struct resolve_cb_context {
  682. struct completion comp;
  683. int status;
  684. };
  685. static void resolve_cb(int status, struct sockaddr *src_addr,
  686. struct rdma_dev_addr *addr, void *context)
  687. {
  688. ((struct resolve_cb_context *)context)->status = status;
  689. complete(&((struct resolve_cb_context *)context)->comp);
  690. }
  691. int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
  692. const union ib_gid *dgid,
  693. u8 *dmac, const struct ib_gid_attr *sgid_attr,
  694. int *hoplimit)
  695. {
  696. struct rdma_dev_addr dev_addr;
  697. struct resolve_cb_context ctx;
  698. union {
  699. struct sockaddr_in _sockaddr_in;
  700. struct sockaddr_in6 _sockaddr_in6;
  701. } sgid_addr, dgid_addr;
  702. int ret;
  703. rdma_gid2ip((struct sockaddr *)&sgid_addr, sgid);
  704. rdma_gid2ip((struct sockaddr *)&dgid_addr, dgid);
  705. memset(&dev_addr, 0, sizeof(dev_addr));
  706. dev_addr.net = &init_net;
  707. dev_addr.sgid_attr = sgid_attr;
  708. init_completion(&ctx.comp);
  709. ret = rdma_resolve_ip((struct sockaddr *)&sgid_addr,
  710. (struct sockaddr *)&dgid_addr, &dev_addr, 1000,
  711. resolve_cb, true, &ctx);
  712. if (ret)
  713. return ret;
  714. wait_for_completion(&ctx.comp);
  715. ret = ctx.status;
  716. if (ret)
  717. return ret;
  718. memcpy(dmac, dev_addr.dst_dev_addr, ETH_ALEN);
  719. *hoplimit = dev_addr.hoplimit;
  720. return 0;
  721. }
  722. static int netevent_callback(struct notifier_block *self, unsigned long event,
  723. void *ctx)
  724. {
  725. struct addr_req *req;
  726. if (event == NETEVENT_NEIGH_UPDATE) {
  727. struct neighbour *neigh = ctx;
  728. if (neigh->nud_state & NUD_VALID) {
  729. spin_lock_bh(&lock);
  730. list_for_each_entry(req, &req_list, list)
  731. set_timeout(req, jiffies);
  732. spin_unlock_bh(&lock);
  733. }
  734. }
  735. return 0;
  736. }
  737. static struct notifier_block nb = {
  738. .notifier_call = netevent_callback
  739. };
  740. int addr_init(void)
  741. {
  742. addr_wq = alloc_ordered_workqueue("ib_addr", 0);
  743. if (!addr_wq)
  744. return -ENOMEM;
  745. register_netevent_notifier(&nb);
  746. return 0;
  747. }
  748. void addr_cleanup(void)
  749. {
  750. unregister_netevent_notifier(&nb);
  751. destroy_workqueue(addr_wq);
  752. WARN_ON(!list_empty(&req_list));
  753. }