route.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Management Component Transport Protocol (MCTP) - routing
  4. * implementation.
  5. *
  6. * This is currently based on a simple routing table, with no dst cache. The
  7. * number of routes should stay fairly small, so the lookup cost is small.
  8. *
  9. * Copyright (c) 2021 Code Construct
  10. * Copyright (c) 2021 Google
  11. */
  12. #include <linux/idr.h>
  13. #include <linux/kconfig.h>
  14. #include <linux/mctp.h>
  15. #include <linux/netdevice.h>
  16. #include <linux/rtnetlink.h>
  17. #include <linux/skbuff.h>
  18. #include <uapi/linux/if_arp.h>
  19. #include <net/mctp.h>
  20. #include <net/mctpdevice.h>
  21. #include <net/netlink.h>
  22. #include <net/sock.h>
  23. #include <trace/events/mctp.h>
  24. static const unsigned int mctp_message_maxlen = 64 * 1024;
  25. static const unsigned long mctp_key_lifetime = 6 * CONFIG_HZ;
  26. static void mctp_flow_prepare_output(struct sk_buff *skb, struct mctp_dev *dev);
  27. /* route output callbacks */
  28. static int mctp_route_discard(struct mctp_route *route, struct sk_buff *skb)
  29. {
  30. kfree_skb(skb);
  31. return 0;
  32. }
  33. static struct mctp_sock *mctp_lookup_bind(struct net *net, struct sk_buff *skb)
  34. {
  35. struct mctp_skb_cb *cb = mctp_cb(skb);
  36. struct mctp_hdr *mh;
  37. struct sock *sk;
  38. u8 type;
  39. WARN_ON(!rcu_read_lock_held());
  40. /* TODO: look up in skb->cb? */
  41. mh = mctp_hdr(skb);
  42. if (!skb_headlen(skb))
  43. return NULL;
  44. type = (*(u8 *)skb->data) & 0x7f;
  45. sk_for_each_rcu(sk, &net->mctp.binds) {
  46. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  47. if (msk->bind_net != MCTP_NET_ANY && msk->bind_net != cb->net)
  48. continue;
  49. if (msk->bind_type != type)
  50. continue;
  51. if (!mctp_address_matches(msk->bind_addr, mh->dest))
  52. continue;
  53. return msk;
  54. }
  55. return NULL;
  56. }
  57. static bool mctp_key_match(struct mctp_sk_key *key, mctp_eid_t local,
  58. mctp_eid_t peer, u8 tag)
  59. {
  60. if (!mctp_address_matches(key->local_addr, local))
  61. return false;
  62. if (key->peer_addr != peer)
  63. return false;
  64. if (key->tag != tag)
  65. return false;
  66. return true;
  67. }
  68. /* returns a key (with key->lock held, and refcounted), or NULL if no such
  69. * key exists.
  70. */
  71. static struct mctp_sk_key *mctp_lookup_key(struct net *net, struct sk_buff *skb,
  72. mctp_eid_t peer,
  73. unsigned long *irqflags)
  74. __acquires(&key->lock)
  75. {
  76. struct mctp_sk_key *key, *ret;
  77. unsigned long flags;
  78. struct mctp_hdr *mh;
  79. u8 tag;
  80. mh = mctp_hdr(skb);
  81. tag = mh->flags_seq_tag & (MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO);
  82. ret = NULL;
  83. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  84. hlist_for_each_entry(key, &net->mctp.keys, hlist) {
  85. if (!mctp_key_match(key, mh->dest, peer, tag))
  86. continue;
  87. spin_lock(&key->lock);
  88. if (key->valid) {
  89. refcount_inc(&key->refs);
  90. ret = key;
  91. break;
  92. }
  93. spin_unlock(&key->lock);
  94. }
  95. if (ret) {
  96. spin_unlock(&net->mctp.keys_lock);
  97. *irqflags = flags;
  98. } else {
  99. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  100. }
  101. return ret;
  102. }
  103. static struct mctp_sk_key *mctp_key_alloc(struct mctp_sock *msk,
  104. mctp_eid_t local, mctp_eid_t peer,
  105. u8 tag, gfp_t gfp)
  106. {
  107. struct mctp_sk_key *key;
  108. key = kzalloc(sizeof(*key), gfp);
  109. if (!key)
  110. return NULL;
  111. key->peer_addr = peer;
  112. key->local_addr = local;
  113. key->tag = tag;
  114. key->sk = &msk->sk;
  115. key->valid = true;
  116. spin_lock_init(&key->lock);
  117. refcount_set(&key->refs, 1);
  118. sock_hold(key->sk);
  119. return key;
  120. }
  121. void mctp_key_unref(struct mctp_sk_key *key)
  122. {
  123. unsigned long flags;
  124. if (!refcount_dec_and_test(&key->refs))
  125. return;
  126. /* even though no refs exist here, the lock allows us to stay
  127. * consistent with the locking requirement of mctp_dev_release_key
  128. */
  129. spin_lock_irqsave(&key->lock, flags);
  130. mctp_dev_release_key(key->dev, key);
  131. spin_unlock_irqrestore(&key->lock, flags);
  132. sock_put(key->sk);
  133. kfree(key);
  134. }
  135. static int mctp_key_add(struct mctp_sk_key *key, struct mctp_sock *msk)
  136. {
  137. struct net *net = sock_net(&msk->sk);
  138. struct mctp_sk_key *tmp;
  139. unsigned long flags;
  140. int rc = 0;
  141. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  142. if (sock_flag(&msk->sk, SOCK_DEAD)) {
  143. rc = -EINVAL;
  144. goto out_unlock;
  145. }
  146. hlist_for_each_entry(tmp, &net->mctp.keys, hlist) {
  147. if (mctp_key_match(tmp, key->local_addr, key->peer_addr,
  148. key->tag)) {
  149. spin_lock(&tmp->lock);
  150. if (tmp->valid)
  151. rc = -EEXIST;
  152. spin_unlock(&tmp->lock);
  153. if (rc)
  154. break;
  155. }
  156. }
  157. if (!rc) {
  158. refcount_inc(&key->refs);
  159. key->expiry = jiffies + mctp_key_lifetime;
  160. timer_reduce(&msk->key_expiry, key->expiry);
  161. hlist_add_head(&key->hlist, &net->mctp.keys);
  162. hlist_add_head(&key->sklist, &msk->keys);
  163. }
  164. out_unlock:
  165. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  166. return rc;
  167. }
  168. /* Helper for mctp_route_input().
  169. * We're done with the key; unlock and unref the key.
  170. * For the usual case of automatic expiry we remove the key from lists.
  171. * In the case that manual allocation is set on a key we release the lock
  172. * and local ref, reset reassembly, but don't remove from lists.
  173. */
  174. static void __mctp_key_done_in(struct mctp_sk_key *key, struct net *net,
  175. unsigned long flags, unsigned long reason)
  176. __releases(&key->lock)
  177. {
  178. struct sk_buff *skb;
  179. trace_mctp_key_release(key, reason);
  180. skb = key->reasm_head;
  181. key->reasm_head = NULL;
  182. if (!key->manual_alloc) {
  183. key->reasm_dead = true;
  184. key->valid = false;
  185. mctp_dev_release_key(key->dev, key);
  186. }
  187. spin_unlock_irqrestore(&key->lock, flags);
  188. if (!key->manual_alloc) {
  189. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  190. if (!hlist_unhashed(&key->hlist)) {
  191. hlist_del_init(&key->hlist);
  192. hlist_del_init(&key->sklist);
  193. mctp_key_unref(key);
  194. }
  195. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  196. }
  197. /* and one for the local reference */
  198. mctp_key_unref(key);
  199. kfree_skb(skb);
  200. }
  201. #ifdef CONFIG_MCTP_FLOWS
  202. static void mctp_skb_set_flow(struct sk_buff *skb, struct mctp_sk_key *key)
  203. {
  204. struct mctp_flow *flow;
  205. flow = skb_ext_add(skb, SKB_EXT_MCTP);
  206. if (!flow)
  207. return;
  208. refcount_inc(&key->refs);
  209. flow->key = key;
  210. }
  211. static void mctp_flow_prepare_output(struct sk_buff *skb, struct mctp_dev *dev)
  212. {
  213. struct mctp_sk_key *key;
  214. struct mctp_flow *flow;
  215. flow = skb_ext_find(skb, SKB_EXT_MCTP);
  216. if (!flow)
  217. return;
  218. key = flow->key;
  219. if (WARN_ON(key->dev && key->dev != dev))
  220. return;
  221. mctp_dev_set_key(dev, key);
  222. }
  223. #else
  224. static void mctp_skb_set_flow(struct sk_buff *skb, struct mctp_sk_key *key) {}
  225. static void mctp_flow_prepare_output(struct sk_buff *skb, struct mctp_dev *dev) {}
  226. #endif
  227. static int mctp_frag_queue(struct mctp_sk_key *key, struct sk_buff *skb)
  228. {
  229. struct mctp_hdr *hdr = mctp_hdr(skb);
  230. u8 exp_seq, this_seq;
  231. this_seq = (hdr->flags_seq_tag >> MCTP_HDR_SEQ_SHIFT)
  232. & MCTP_HDR_SEQ_MASK;
  233. if (!key->reasm_head) {
  234. key->reasm_head = skb;
  235. key->reasm_tailp = &(skb_shinfo(skb)->frag_list);
  236. key->last_seq = this_seq;
  237. return 0;
  238. }
  239. exp_seq = (key->last_seq + 1) & MCTP_HDR_SEQ_MASK;
  240. if (this_seq != exp_seq)
  241. return -EINVAL;
  242. if (key->reasm_head->len + skb->len > mctp_message_maxlen)
  243. return -EINVAL;
  244. skb->next = NULL;
  245. skb->sk = NULL;
  246. *key->reasm_tailp = skb;
  247. key->reasm_tailp = &skb->next;
  248. key->last_seq = this_seq;
  249. key->reasm_head->data_len += skb->len;
  250. key->reasm_head->len += skb->len;
  251. key->reasm_head->truesize += skb->truesize;
  252. return 0;
  253. }
  254. static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
  255. {
  256. struct mctp_sk_key *key, *any_key = NULL;
  257. struct net *net = dev_net(skb->dev);
  258. struct mctp_sock *msk;
  259. struct mctp_hdr *mh;
  260. unsigned long f;
  261. u8 tag, flags;
  262. int rc;
  263. msk = NULL;
  264. rc = -EINVAL;
  265. /* we may be receiving a locally-routed packet; drop source sk
  266. * accounting
  267. */
  268. skb_orphan(skb);
  269. /* ensure we have enough data for a header and a type */
  270. if (skb->len < sizeof(struct mctp_hdr) + 1)
  271. goto out;
  272. /* grab header, advance data ptr */
  273. mh = mctp_hdr(skb);
  274. skb_pull(skb, sizeof(struct mctp_hdr));
  275. if (mh->ver != 1)
  276. goto out;
  277. flags = mh->flags_seq_tag & (MCTP_HDR_FLAG_SOM | MCTP_HDR_FLAG_EOM);
  278. tag = mh->flags_seq_tag & (MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO);
  279. rcu_read_lock();
  280. /* lookup socket / reasm context, exactly matching (src,dest,tag).
  281. * we hold a ref on the key, and key->lock held.
  282. */
  283. key = mctp_lookup_key(net, skb, mh->src, &f);
  284. if (flags & MCTP_HDR_FLAG_SOM) {
  285. if (key) {
  286. msk = container_of(key->sk, struct mctp_sock, sk);
  287. } else {
  288. /* first response to a broadcast? do a more general
  289. * key lookup to find the socket, but don't use this
  290. * key for reassembly - we'll create a more specific
  291. * one for future packets if required (ie, !EOM).
  292. */
  293. any_key = mctp_lookup_key(net, skb, MCTP_ADDR_ANY, &f);
  294. if (any_key) {
  295. msk = container_of(any_key->sk,
  296. struct mctp_sock, sk);
  297. spin_unlock_irqrestore(&any_key->lock, f);
  298. }
  299. }
  300. if (!key && !msk && (tag & MCTP_HDR_FLAG_TO))
  301. msk = mctp_lookup_bind(net, skb);
  302. if (!msk) {
  303. rc = -ENOENT;
  304. goto out_unlock;
  305. }
  306. /* single-packet message? deliver to socket, clean up any
  307. * pending key.
  308. */
  309. if (flags & MCTP_HDR_FLAG_EOM) {
  310. sock_queue_rcv_skb(&msk->sk, skb);
  311. if (key) {
  312. /* we've hit a pending reassembly; not much we
  313. * can do but drop it
  314. */
  315. __mctp_key_done_in(key, net, f,
  316. MCTP_TRACE_KEY_REPLIED);
  317. key = NULL;
  318. }
  319. rc = 0;
  320. goto out_unlock;
  321. }
  322. /* broadcast response or a bind() - create a key for further
  323. * packets for this message
  324. */
  325. if (!key) {
  326. key = mctp_key_alloc(msk, mh->dest, mh->src,
  327. tag, GFP_ATOMIC);
  328. if (!key) {
  329. rc = -ENOMEM;
  330. goto out_unlock;
  331. }
  332. /* we can queue without the key lock here, as the
  333. * key isn't observable yet
  334. */
  335. mctp_frag_queue(key, skb);
  336. /* if the key_add fails, we've raced with another
  337. * SOM packet with the same src, dest and tag. There's
  338. * no way to distinguish future packets, so all we
  339. * can do is drop; we'll free the skb on exit from
  340. * this function.
  341. */
  342. rc = mctp_key_add(key, msk);
  343. if (!rc)
  344. trace_mctp_key_acquire(key);
  345. /* we don't need to release key->lock on exit, so
  346. * clean up here and suppress the unlock via
  347. * setting to NULL
  348. */
  349. mctp_key_unref(key);
  350. key = NULL;
  351. } else {
  352. if (key->reasm_head || key->reasm_dead) {
  353. /* duplicate start? drop everything */
  354. __mctp_key_done_in(key, net, f,
  355. MCTP_TRACE_KEY_INVALIDATED);
  356. rc = -EEXIST;
  357. key = NULL;
  358. } else {
  359. rc = mctp_frag_queue(key, skb);
  360. }
  361. }
  362. } else if (key) {
  363. /* this packet continues a previous message; reassemble
  364. * using the message-specific key
  365. */
  366. /* we need to be continuing an existing reassembly... */
  367. if (!key->reasm_head)
  368. rc = -EINVAL;
  369. else
  370. rc = mctp_frag_queue(key, skb);
  371. /* end of message? deliver to socket, and we're done with
  372. * the reassembly/response key
  373. */
  374. if (!rc && flags & MCTP_HDR_FLAG_EOM) {
  375. sock_queue_rcv_skb(key->sk, key->reasm_head);
  376. key->reasm_head = NULL;
  377. __mctp_key_done_in(key, net, f, MCTP_TRACE_KEY_REPLIED);
  378. key = NULL;
  379. }
  380. } else {
  381. /* not a start, no matching key */
  382. rc = -ENOENT;
  383. }
  384. out_unlock:
  385. rcu_read_unlock();
  386. if (key) {
  387. spin_unlock_irqrestore(&key->lock, f);
  388. mctp_key_unref(key);
  389. }
  390. if (any_key)
  391. mctp_key_unref(any_key);
  392. out:
  393. if (rc)
  394. kfree_skb(skb);
  395. return rc;
  396. }
  397. static unsigned int mctp_route_mtu(struct mctp_route *rt)
  398. {
  399. return rt->mtu ?: READ_ONCE(rt->dev->dev->mtu);
  400. }
  401. static int mctp_route_output(struct mctp_route *route, struct sk_buff *skb)
  402. {
  403. struct mctp_skb_cb *cb = mctp_cb(skb);
  404. struct mctp_hdr *hdr = mctp_hdr(skb);
  405. char daddr_buf[MAX_ADDR_LEN];
  406. char *daddr = NULL;
  407. unsigned int mtu;
  408. int rc;
  409. skb->protocol = htons(ETH_P_MCTP);
  410. mtu = READ_ONCE(skb->dev->mtu);
  411. if (skb->len > mtu) {
  412. kfree_skb(skb);
  413. return -EMSGSIZE;
  414. }
  415. if (cb->ifindex) {
  416. /* direct route; use the hwaddr we stashed in sendmsg */
  417. if (cb->halen != skb->dev->addr_len) {
  418. /* sanity check, sendmsg should have already caught this */
  419. kfree_skb(skb);
  420. return -EMSGSIZE;
  421. }
  422. daddr = cb->haddr;
  423. } else {
  424. /* If lookup fails let the device handle daddr==NULL */
  425. if (mctp_neigh_lookup(route->dev, hdr->dest, daddr_buf) == 0)
  426. daddr = daddr_buf;
  427. }
  428. rc = dev_hard_header(skb, skb->dev, ntohs(skb->protocol),
  429. daddr, skb->dev->dev_addr, skb->len);
  430. if (rc < 0) {
  431. kfree_skb(skb);
  432. return -EHOSTUNREACH;
  433. }
  434. mctp_flow_prepare_output(skb, route->dev);
  435. rc = dev_queue_xmit(skb);
  436. if (rc)
  437. rc = net_xmit_errno(rc);
  438. return rc;
  439. }
  440. /* route alloc/release */
  441. static void mctp_route_release(struct mctp_route *rt)
  442. {
  443. if (refcount_dec_and_test(&rt->refs)) {
  444. mctp_dev_put(rt->dev);
  445. kfree_rcu(rt, rcu);
  446. }
  447. }
  448. /* returns a route with the refcount at 1 */
  449. static struct mctp_route *mctp_route_alloc(void)
  450. {
  451. struct mctp_route *rt;
  452. rt = kzalloc(sizeof(*rt), GFP_KERNEL);
  453. if (!rt)
  454. return NULL;
  455. INIT_LIST_HEAD(&rt->list);
  456. refcount_set(&rt->refs, 1);
  457. rt->output = mctp_route_discard;
  458. return rt;
  459. }
  460. unsigned int mctp_default_net(struct net *net)
  461. {
  462. return READ_ONCE(net->mctp.default_net);
  463. }
  464. int mctp_default_net_set(struct net *net, unsigned int index)
  465. {
  466. if (index == 0)
  467. return -EINVAL;
  468. WRITE_ONCE(net->mctp.default_net, index);
  469. return 0;
  470. }
  471. /* tag management */
  472. static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key,
  473. struct mctp_sock *msk)
  474. {
  475. struct netns_mctp *mns = &net->mctp;
  476. lockdep_assert_held(&mns->keys_lock);
  477. key->expiry = jiffies + mctp_key_lifetime;
  478. timer_reduce(&msk->key_expiry, key->expiry);
  479. /* we hold the net->key_lock here, allowing updates to both
  480. * then net and sk
  481. */
  482. hlist_add_head_rcu(&key->hlist, &mns->keys);
  483. hlist_add_head_rcu(&key->sklist, &msk->keys);
  484. refcount_inc(&key->refs);
  485. }
  486. /* Allocate a locally-owned tag value for (saddr, daddr), and reserve
  487. * it for the socket msk
  488. */
  489. struct mctp_sk_key *mctp_alloc_local_tag(struct mctp_sock *msk,
  490. mctp_eid_t daddr, mctp_eid_t saddr,
  491. bool manual, u8 *tagp)
  492. {
  493. struct net *net = sock_net(&msk->sk);
  494. struct netns_mctp *mns = &net->mctp;
  495. struct mctp_sk_key *key, *tmp;
  496. unsigned long flags;
  497. u8 tagbits;
  498. /* for NULL destination EIDs, we may get a response from any peer */
  499. if (daddr == MCTP_ADDR_NULL)
  500. daddr = MCTP_ADDR_ANY;
  501. /* be optimistic, alloc now */
  502. key = mctp_key_alloc(msk, saddr, daddr, 0, GFP_KERNEL);
  503. if (!key)
  504. return ERR_PTR(-ENOMEM);
  505. /* 8 possible tag values */
  506. tagbits = 0xff;
  507. spin_lock_irqsave(&mns->keys_lock, flags);
  508. /* Walk through the existing keys, looking for potential conflicting
  509. * tags. If we find a conflict, clear that bit from tagbits
  510. */
  511. hlist_for_each_entry(tmp, &mns->keys, hlist) {
  512. /* We can check the lookup fields (*_addr, tag) without the
  513. * lock held, they don't change over the lifetime of the key.
  514. */
  515. /* if we don't own the tag, it can't conflict */
  516. if (tmp->tag & MCTP_HDR_FLAG_TO)
  517. continue;
  518. if (!(mctp_address_matches(tmp->peer_addr, daddr) &&
  519. mctp_address_matches(tmp->local_addr, saddr)))
  520. continue;
  521. spin_lock(&tmp->lock);
  522. /* key must still be valid. If we find a match, clear the
  523. * potential tag value
  524. */
  525. if (tmp->valid)
  526. tagbits &= ~(1 << tmp->tag);
  527. spin_unlock(&tmp->lock);
  528. if (!tagbits)
  529. break;
  530. }
  531. if (tagbits) {
  532. key->tag = __ffs(tagbits);
  533. mctp_reserve_tag(net, key, msk);
  534. trace_mctp_key_acquire(key);
  535. key->manual_alloc = manual;
  536. *tagp = key->tag;
  537. }
  538. spin_unlock_irqrestore(&mns->keys_lock, flags);
  539. if (!tagbits) {
  540. kfree(key);
  541. return ERR_PTR(-EBUSY);
  542. }
  543. return key;
  544. }
  545. static struct mctp_sk_key *mctp_lookup_prealloc_tag(struct mctp_sock *msk,
  546. mctp_eid_t daddr,
  547. u8 req_tag, u8 *tagp)
  548. {
  549. struct net *net = sock_net(&msk->sk);
  550. struct netns_mctp *mns = &net->mctp;
  551. struct mctp_sk_key *key, *tmp;
  552. unsigned long flags;
  553. req_tag &= ~(MCTP_TAG_PREALLOC | MCTP_TAG_OWNER);
  554. key = NULL;
  555. spin_lock_irqsave(&mns->keys_lock, flags);
  556. hlist_for_each_entry(tmp, &mns->keys, hlist) {
  557. if (tmp->tag != req_tag)
  558. continue;
  559. if (!mctp_address_matches(tmp->peer_addr, daddr))
  560. continue;
  561. if (!tmp->manual_alloc)
  562. continue;
  563. spin_lock(&tmp->lock);
  564. if (tmp->valid) {
  565. key = tmp;
  566. refcount_inc(&key->refs);
  567. spin_unlock(&tmp->lock);
  568. break;
  569. }
  570. spin_unlock(&tmp->lock);
  571. }
  572. spin_unlock_irqrestore(&mns->keys_lock, flags);
  573. if (!key)
  574. return ERR_PTR(-ENOENT);
  575. if (tagp)
  576. *tagp = key->tag;
  577. return key;
  578. }
  579. /* routing lookups */
  580. static bool mctp_rt_match_eid(struct mctp_route *rt,
  581. unsigned int net, mctp_eid_t eid)
  582. {
  583. return READ_ONCE(rt->dev->net) == net &&
  584. rt->min <= eid && rt->max >= eid;
  585. }
  586. /* compares match, used for duplicate prevention */
  587. static bool mctp_rt_compare_exact(struct mctp_route *rt1,
  588. struct mctp_route *rt2)
  589. {
  590. ASSERT_RTNL();
  591. return rt1->dev->net == rt2->dev->net &&
  592. rt1->min == rt2->min &&
  593. rt1->max == rt2->max;
  594. }
  595. struct mctp_route *mctp_route_lookup(struct net *net, unsigned int dnet,
  596. mctp_eid_t daddr)
  597. {
  598. struct mctp_route *tmp, *rt = NULL;
  599. rcu_read_lock();
  600. list_for_each_entry_rcu(tmp, &net->mctp.routes, list) {
  601. /* TODO: add metrics */
  602. if (mctp_rt_match_eid(tmp, dnet, daddr)) {
  603. if (refcount_inc_not_zero(&tmp->refs)) {
  604. rt = tmp;
  605. break;
  606. }
  607. }
  608. }
  609. rcu_read_unlock();
  610. return rt;
  611. }
  612. static struct mctp_route *mctp_route_lookup_null(struct net *net,
  613. struct net_device *dev)
  614. {
  615. struct mctp_route *tmp, *rt = NULL;
  616. rcu_read_lock();
  617. list_for_each_entry_rcu(tmp, &net->mctp.routes, list) {
  618. if (tmp->dev->dev == dev && tmp->type == RTN_LOCAL &&
  619. refcount_inc_not_zero(&tmp->refs)) {
  620. rt = tmp;
  621. break;
  622. }
  623. }
  624. rcu_read_unlock();
  625. return rt;
  626. }
  627. static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,
  628. unsigned int mtu, u8 tag)
  629. {
  630. const unsigned int hlen = sizeof(struct mctp_hdr);
  631. struct mctp_hdr *hdr, *hdr2;
  632. unsigned int pos, size, headroom;
  633. struct sk_buff *skb2;
  634. int rc;
  635. u8 seq;
  636. hdr = mctp_hdr(skb);
  637. seq = 0;
  638. rc = 0;
  639. if (mtu < hlen + 1) {
  640. kfree_skb(skb);
  641. return -EMSGSIZE;
  642. }
  643. /* keep same headroom as the original skb */
  644. headroom = skb_headroom(skb);
  645. /* we've got the header */
  646. skb_pull(skb, hlen);
  647. for (pos = 0; pos < skb->len;) {
  648. /* size of message payload */
  649. size = min(mtu - hlen, skb->len - pos);
  650. skb2 = alloc_skb(headroom + hlen + size, GFP_KERNEL);
  651. if (!skb2) {
  652. rc = -ENOMEM;
  653. break;
  654. }
  655. /* generic skb copy */
  656. skb2->protocol = skb->protocol;
  657. skb2->priority = skb->priority;
  658. skb2->dev = skb->dev;
  659. memcpy(skb2->cb, skb->cb, sizeof(skb2->cb));
  660. if (skb->sk)
  661. skb_set_owner_w(skb2, skb->sk);
  662. /* establish packet */
  663. skb_reserve(skb2, headroom);
  664. skb_reset_network_header(skb2);
  665. skb_put(skb2, hlen + size);
  666. skb2->transport_header = skb2->network_header + hlen;
  667. /* copy header fields, calculate SOM/EOM flags & seq */
  668. hdr2 = mctp_hdr(skb2);
  669. hdr2->ver = hdr->ver;
  670. hdr2->dest = hdr->dest;
  671. hdr2->src = hdr->src;
  672. hdr2->flags_seq_tag = tag &
  673. (MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO);
  674. if (pos == 0)
  675. hdr2->flags_seq_tag |= MCTP_HDR_FLAG_SOM;
  676. if (pos + size == skb->len)
  677. hdr2->flags_seq_tag |= MCTP_HDR_FLAG_EOM;
  678. hdr2->flags_seq_tag |= seq << MCTP_HDR_SEQ_SHIFT;
  679. /* copy message payload */
  680. skb_copy_bits(skb, pos, skb_transport_header(skb2), size);
  681. /* do route */
  682. rc = rt->output(rt, skb2);
  683. if (rc)
  684. break;
  685. seq = (seq + 1) & MCTP_HDR_SEQ_MASK;
  686. pos += size;
  687. }
  688. consume_skb(skb);
  689. return rc;
  690. }
  691. int mctp_local_output(struct sock *sk, struct mctp_route *rt,
  692. struct sk_buff *skb, mctp_eid_t daddr, u8 req_tag)
  693. {
  694. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  695. struct mctp_skb_cb *cb = mctp_cb(skb);
  696. struct mctp_route tmp_rt = {0};
  697. struct mctp_sk_key *key;
  698. struct mctp_hdr *hdr;
  699. unsigned long flags;
  700. unsigned int mtu;
  701. mctp_eid_t saddr;
  702. bool ext_rt;
  703. int rc;
  704. u8 tag;
  705. rc = -ENODEV;
  706. if (rt) {
  707. ext_rt = false;
  708. if (WARN_ON(!rt->dev))
  709. goto out_release;
  710. } else if (cb->ifindex) {
  711. struct net_device *dev;
  712. ext_rt = true;
  713. rt = &tmp_rt;
  714. rcu_read_lock();
  715. dev = dev_get_by_index_rcu(sock_net(sk), cb->ifindex);
  716. if (!dev) {
  717. rcu_read_unlock();
  718. return rc;
  719. }
  720. rt->dev = __mctp_dev_get(dev);
  721. rcu_read_unlock();
  722. if (!rt->dev)
  723. goto out_release;
  724. /* establish temporary route - we set up enough to keep
  725. * mctp_route_output happy
  726. */
  727. rt->output = mctp_route_output;
  728. rt->mtu = 0;
  729. } else {
  730. return -EINVAL;
  731. }
  732. spin_lock_irqsave(&rt->dev->addrs_lock, flags);
  733. if (rt->dev->num_addrs == 0) {
  734. rc = -EHOSTUNREACH;
  735. } else {
  736. /* use the outbound interface's first address as our source */
  737. saddr = rt->dev->addrs[0];
  738. rc = 0;
  739. }
  740. spin_unlock_irqrestore(&rt->dev->addrs_lock, flags);
  741. if (rc)
  742. goto out_release;
  743. if (req_tag & MCTP_TAG_OWNER) {
  744. if (req_tag & MCTP_TAG_PREALLOC)
  745. key = mctp_lookup_prealloc_tag(msk, daddr,
  746. req_tag, &tag);
  747. else
  748. key = mctp_alloc_local_tag(msk, daddr, saddr,
  749. false, &tag);
  750. if (IS_ERR(key)) {
  751. rc = PTR_ERR(key);
  752. goto out_release;
  753. }
  754. mctp_skb_set_flow(skb, key);
  755. /* done with the key in this scope */
  756. mctp_key_unref(key);
  757. tag |= MCTP_HDR_FLAG_TO;
  758. } else {
  759. key = NULL;
  760. tag = req_tag & MCTP_TAG_MASK;
  761. }
  762. skb->protocol = htons(ETH_P_MCTP);
  763. skb->priority = 0;
  764. skb_reset_transport_header(skb);
  765. skb_push(skb, sizeof(struct mctp_hdr));
  766. skb_reset_network_header(skb);
  767. skb->dev = rt->dev->dev;
  768. /* cb->net will have been set on initial ingress */
  769. cb->src = saddr;
  770. /* set up common header fields */
  771. hdr = mctp_hdr(skb);
  772. hdr->ver = 1;
  773. hdr->dest = daddr;
  774. hdr->src = saddr;
  775. mtu = mctp_route_mtu(rt);
  776. if (skb->len + sizeof(struct mctp_hdr) <= mtu) {
  777. hdr->flags_seq_tag = MCTP_HDR_FLAG_SOM |
  778. MCTP_HDR_FLAG_EOM | tag;
  779. rc = rt->output(rt, skb);
  780. } else {
  781. rc = mctp_do_fragment_route(rt, skb, mtu, tag);
  782. }
  783. out_release:
  784. if (!ext_rt)
  785. mctp_route_release(rt);
  786. mctp_dev_put(tmp_rt.dev);
  787. return rc;
  788. }
  789. /* route management */
  790. static int mctp_route_add(struct mctp_dev *mdev, mctp_eid_t daddr_start,
  791. unsigned int daddr_extent, unsigned int mtu,
  792. unsigned char type)
  793. {
  794. int (*rtfn)(struct mctp_route *rt, struct sk_buff *skb);
  795. struct net *net = dev_net(mdev->dev);
  796. struct mctp_route *rt, *ert;
  797. if (!mctp_address_unicast(daddr_start))
  798. return -EINVAL;
  799. if (daddr_extent > 0xff || daddr_start + daddr_extent >= 255)
  800. return -EINVAL;
  801. switch (type) {
  802. case RTN_LOCAL:
  803. rtfn = mctp_route_input;
  804. break;
  805. case RTN_UNICAST:
  806. rtfn = mctp_route_output;
  807. break;
  808. default:
  809. return -EINVAL;
  810. }
  811. rt = mctp_route_alloc();
  812. if (!rt)
  813. return -ENOMEM;
  814. rt->min = daddr_start;
  815. rt->max = daddr_start + daddr_extent;
  816. rt->mtu = mtu;
  817. rt->dev = mdev;
  818. mctp_dev_hold(rt->dev);
  819. rt->type = type;
  820. rt->output = rtfn;
  821. ASSERT_RTNL();
  822. /* Prevent duplicate identical routes. */
  823. list_for_each_entry(ert, &net->mctp.routes, list) {
  824. if (mctp_rt_compare_exact(rt, ert)) {
  825. mctp_route_release(rt);
  826. return -EEXIST;
  827. }
  828. }
  829. list_add_rcu(&rt->list, &net->mctp.routes);
  830. return 0;
  831. }
  832. static int mctp_route_remove(struct mctp_dev *mdev, mctp_eid_t daddr_start,
  833. unsigned int daddr_extent, unsigned char type)
  834. {
  835. struct net *net = dev_net(mdev->dev);
  836. struct mctp_route *rt, *tmp;
  837. mctp_eid_t daddr_end;
  838. bool dropped;
  839. if (daddr_extent > 0xff || daddr_start + daddr_extent >= 255)
  840. return -EINVAL;
  841. daddr_end = daddr_start + daddr_extent;
  842. dropped = false;
  843. ASSERT_RTNL();
  844. list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) {
  845. if (rt->dev == mdev &&
  846. rt->min == daddr_start && rt->max == daddr_end &&
  847. rt->type == type) {
  848. list_del_rcu(&rt->list);
  849. /* TODO: immediate RTM_DELROUTE */
  850. mctp_route_release(rt);
  851. dropped = true;
  852. }
  853. }
  854. return dropped ? 0 : -ENOENT;
  855. }
  856. int mctp_route_add_local(struct mctp_dev *mdev, mctp_eid_t addr)
  857. {
  858. return mctp_route_add(mdev, addr, 0, 0, RTN_LOCAL);
  859. }
  860. int mctp_route_remove_local(struct mctp_dev *mdev, mctp_eid_t addr)
  861. {
  862. return mctp_route_remove(mdev, addr, 0, RTN_LOCAL);
  863. }
  864. /* removes all entries for a given device */
  865. void mctp_route_remove_dev(struct mctp_dev *mdev)
  866. {
  867. struct net *net = dev_net(mdev->dev);
  868. struct mctp_route *rt, *tmp;
  869. ASSERT_RTNL();
  870. list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) {
  871. if (rt->dev == mdev) {
  872. list_del_rcu(&rt->list);
  873. /* TODO: immediate RTM_DELROUTE */
  874. mctp_route_release(rt);
  875. }
  876. }
  877. }
  878. /* Incoming packet-handling */
  879. static int mctp_pkttype_receive(struct sk_buff *skb, struct net_device *dev,
  880. struct packet_type *pt,
  881. struct net_device *orig_dev)
  882. {
  883. struct net *net = dev_net(dev);
  884. struct mctp_dev *mdev;
  885. struct mctp_skb_cb *cb;
  886. struct mctp_route *rt;
  887. struct mctp_hdr *mh;
  888. rcu_read_lock();
  889. mdev = __mctp_dev_get(dev);
  890. rcu_read_unlock();
  891. if (!mdev) {
  892. /* basic non-data sanity checks */
  893. goto err_drop;
  894. }
  895. if (!pskb_may_pull(skb, sizeof(struct mctp_hdr)))
  896. goto err_drop;
  897. skb_reset_transport_header(skb);
  898. skb_reset_network_header(skb);
  899. /* We have enough for a header; decode and route */
  900. mh = mctp_hdr(skb);
  901. if (mh->ver < MCTP_VER_MIN || mh->ver > MCTP_VER_MAX)
  902. goto err_drop;
  903. /* source must be valid unicast or null; drop reserved ranges and
  904. * broadcast
  905. */
  906. if (!(mctp_address_unicast(mh->src) || mctp_address_null(mh->src)))
  907. goto err_drop;
  908. /* dest address: as above, but allow broadcast */
  909. if (!(mctp_address_unicast(mh->dest) || mctp_address_null(mh->dest) ||
  910. mctp_address_broadcast(mh->dest)))
  911. goto err_drop;
  912. /* MCTP drivers must populate halen/haddr */
  913. if (dev->type == ARPHRD_MCTP) {
  914. cb = mctp_cb(skb);
  915. } else {
  916. cb = __mctp_cb(skb);
  917. cb->halen = 0;
  918. }
  919. cb->net = READ_ONCE(mdev->net);
  920. cb->ifindex = dev->ifindex;
  921. rt = mctp_route_lookup(net, cb->net, mh->dest);
  922. /* NULL EID, but addressed to our physical address */
  923. if (!rt && mh->dest == MCTP_ADDR_NULL && skb->pkt_type == PACKET_HOST)
  924. rt = mctp_route_lookup_null(net, dev);
  925. if (!rt)
  926. goto err_drop;
  927. rt->output(rt, skb);
  928. mctp_route_release(rt);
  929. mctp_dev_put(mdev);
  930. return NET_RX_SUCCESS;
  931. err_drop:
  932. kfree_skb(skb);
  933. mctp_dev_put(mdev);
  934. return NET_RX_DROP;
  935. }
  936. static struct packet_type mctp_packet_type = {
  937. .type = cpu_to_be16(ETH_P_MCTP),
  938. .func = mctp_pkttype_receive,
  939. };
  940. /* netlink interface */
  941. static const struct nla_policy rta_mctp_policy[RTA_MAX + 1] = {
  942. [RTA_DST] = { .type = NLA_U8 },
  943. [RTA_METRICS] = { .type = NLA_NESTED },
  944. [RTA_OIF] = { .type = NLA_U32 },
  945. };
  946. /* Common part for RTM_NEWROUTE and RTM_DELROUTE parsing.
  947. * tb must hold RTA_MAX+1 elements.
  948. */
  949. static int mctp_route_nlparse(struct sk_buff *skb, struct nlmsghdr *nlh,
  950. struct netlink_ext_ack *extack,
  951. struct nlattr **tb, struct rtmsg **rtm,
  952. struct mctp_dev **mdev, mctp_eid_t *daddr_start)
  953. {
  954. struct net *net = sock_net(skb->sk);
  955. struct net_device *dev;
  956. unsigned int ifindex;
  957. int rc;
  958. rc = nlmsg_parse(nlh, sizeof(struct rtmsg), tb, RTA_MAX,
  959. rta_mctp_policy, extack);
  960. if (rc < 0) {
  961. NL_SET_ERR_MSG(extack, "incorrect format");
  962. return rc;
  963. }
  964. if (!tb[RTA_DST]) {
  965. NL_SET_ERR_MSG(extack, "dst EID missing");
  966. return -EINVAL;
  967. }
  968. *daddr_start = nla_get_u8(tb[RTA_DST]);
  969. if (!tb[RTA_OIF]) {
  970. NL_SET_ERR_MSG(extack, "ifindex missing");
  971. return -EINVAL;
  972. }
  973. ifindex = nla_get_u32(tb[RTA_OIF]);
  974. *rtm = nlmsg_data(nlh);
  975. if ((*rtm)->rtm_family != AF_MCTP) {
  976. NL_SET_ERR_MSG(extack, "route family must be AF_MCTP");
  977. return -EINVAL;
  978. }
  979. dev = __dev_get_by_index(net, ifindex);
  980. if (!dev) {
  981. NL_SET_ERR_MSG(extack, "bad ifindex");
  982. return -ENODEV;
  983. }
  984. *mdev = mctp_dev_get_rtnl(dev);
  985. if (!*mdev)
  986. return -ENODEV;
  987. if (dev->flags & IFF_LOOPBACK) {
  988. NL_SET_ERR_MSG(extack, "no routes to loopback");
  989. return -EINVAL;
  990. }
  991. return 0;
  992. }
  993. static const struct nla_policy rta_metrics_policy[RTAX_MAX + 1] = {
  994. [RTAX_MTU] = { .type = NLA_U32 },
  995. };
  996. static int mctp_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
  997. struct netlink_ext_ack *extack)
  998. {
  999. struct nlattr *tb[RTA_MAX + 1];
  1000. struct nlattr *tbx[RTAX_MAX + 1];
  1001. mctp_eid_t daddr_start;
  1002. struct mctp_dev *mdev;
  1003. struct rtmsg *rtm;
  1004. unsigned int mtu;
  1005. int rc;
  1006. rc = mctp_route_nlparse(skb, nlh, extack, tb,
  1007. &rtm, &mdev, &daddr_start);
  1008. if (rc < 0)
  1009. return rc;
  1010. if (rtm->rtm_type != RTN_UNICAST) {
  1011. NL_SET_ERR_MSG(extack, "rtm_type must be RTN_UNICAST");
  1012. return -EINVAL;
  1013. }
  1014. mtu = 0;
  1015. if (tb[RTA_METRICS]) {
  1016. rc = nla_parse_nested(tbx, RTAX_MAX, tb[RTA_METRICS],
  1017. rta_metrics_policy, NULL);
  1018. if (rc < 0)
  1019. return rc;
  1020. if (tbx[RTAX_MTU])
  1021. mtu = nla_get_u32(tbx[RTAX_MTU]);
  1022. }
  1023. if (rtm->rtm_type != RTN_UNICAST)
  1024. return -EINVAL;
  1025. rc = mctp_route_add(mdev, daddr_start, rtm->rtm_dst_len, mtu,
  1026. rtm->rtm_type);
  1027. return rc;
  1028. }
  1029. static int mctp_delroute(struct sk_buff *skb, struct nlmsghdr *nlh,
  1030. struct netlink_ext_ack *extack)
  1031. {
  1032. struct nlattr *tb[RTA_MAX + 1];
  1033. mctp_eid_t daddr_start;
  1034. struct mctp_dev *mdev;
  1035. struct rtmsg *rtm;
  1036. int rc;
  1037. rc = mctp_route_nlparse(skb, nlh, extack, tb,
  1038. &rtm, &mdev, &daddr_start);
  1039. if (rc < 0)
  1040. return rc;
  1041. /* we only have unicast routes */
  1042. if (rtm->rtm_type != RTN_UNICAST)
  1043. return -EINVAL;
  1044. rc = mctp_route_remove(mdev, daddr_start, rtm->rtm_dst_len, RTN_UNICAST);
  1045. return rc;
  1046. }
  1047. static int mctp_fill_rtinfo(struct sk_buff *skb, struct mctp_route *rt,
  1048. u32 portid, u32 seq, int event, unsigned int flags)
  1049. {
  1050. struct nlmsghdr *nlh;
  1051. struct rtmsg *hdr;
  1052. void *metrics;
  1053. nlh = nlmsg_put(skb, portid, seq, event, sizeof(*hdr), flags);
  1054. if (!nlh)
  1055. return -EMSGSIZE;
  1056. hdr = nlmsg_data(nlh);
  1057. hdr->rtm_family = AF_MCTP;
  1058. /* we use the _len fields as a number of EIDs, rather than
  1059. * a number of bits in the address
  1060. */
  1061. hdr->rtm_dst_len = rt->max - rt->min;
  1062. hdr->rtm_src_len = 0;
  1063. hdr->rtm_tos = 0;
  1064. hdr->rtm_table = RT_TABLE_DEFAULT;
  1065. hdr->rtm_protocol = RTPROT_STATIC; /* everything is user-defined */
  1066. hdr->rtm_scope = RT_SCOPE_LINK; /* TODO: scope in mctp_route? */
  1067. hdr->rtm_type = rt->type;
  1068. if (nla_put_u8(skb, RTA_DST, rt->min))
  1069. goto cancel;
  1070. metrics = nla_nest_start_noflag(skb, RTA_METRICS);
  1071. if (!metrics)
  1072. goto cancel;
  1073. if (rt->mtu) {
  1074. if (nla_put_u32(skb, RTAX_MTU, rt->mtu))
  1075. goto cancel;
  1076. }
  1077. nla_nest_end(skb, metrics);
  1078. if (rt->dev) {
  1079. if (nla_put_u32(skb, RTA_OIF, rt->dev->dev->ifindex))
  1080. goto cancel;
  1081. }
  1082. /* TODO: conditional neighbour physaddr? */
  1083. nlmsg_end(skb, nlh);
  1084. return 0;
  1085. cancel:
  1086. nlmsg_cancel(skb, nlh);
  1087. return -EMSGSIZE;
  1088. }
  1089. static int mctp_dump_rtinfo(struct sk_buff *skb, struct netlink_callback *cb)
  1090. {
  1091. struct net *net = sock_net(skb->sk);
  1092. struct mctp_route *rt;
  1093. int s_idx, idx;
  1094. /* TODO: allow filtering on route data, possibly under
  1095. * cb->strict_check
  1096. */
  1097. /* TODO: change to struct overlay */
  1098. s_idx = cb->args[0];
  1099. idx = 0;
  1100. rcu_read_lock();
  1101. list_for_each_entry_rcu(rt, &net->mctp.routes, list) {
  1102. if (idx++ < s_idx)
  1103. continue;
  1104. if (mctp_fill_rtinfo(skb, rt,
  1105. NETLINK_CB(cb->skb).portid,
  1106. cb->nlh->nlmsg_seq,
  1107. RTM_NEWROUTE, NLM_F_MULTI) < 0)
  1108. break;
  1109. }
  1110. rcu_read_unlock();
  1111. cb->args[0] = idx;
  1112. return skb->len;
  1113. }
  1114. /* net namespace implementation */
  1115. static int __net_init mctp_routes_net_init(struct net *net)
  1116. {
  1117. struct netns_mctp *ns = &net->mctp;
  1118. INIT_LIST_HEAD(&ns->routes);
  1119. INIT_HLIST_HEAD(&ns->binds);
  1120. mutex_init(&ns->bind_lock);
  1121. INIT_HLIST_HEAD(&ns->keys);
  1122. spin_lock_init(&ns->keys_lock);
  1123. WARN_ON(mctp_default_net_set(net, MCTP_INITIAL_DEFAULT_NET));
  1124. return 0;
  1125. }
  1126. static void __net_exit mctp_routes_net_exit(struct net *net)
  1127. {
  1128. struct mctp_route *rt;
  1129. rcu_read_lock();
  1130. list_for_each_entry_rcu(rt, &net->mctp.routes, list)
  1131. mctp_route_release(rt);
  1132. rcu_read_unlock();
  1133. }
  1134. static struct pernet_operations mctp_net_ops = {
  1135. .init = mctp_routes_net_init,
  1136. .exit = mctp_routes_net_exit,
  1137. };
  1138. int __init mctp_routes_init(void)
  1139. {
  1140. dev_add_pack(&mctp_packet_type);
  1141. rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_GETROUTE,
  1142. NULL, mctp_dump_rtinfo, 0);
  1143. rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_NEWROUTE,
  1144. mctp_newroute, NULL, 0);
  1145. rtnl_register_module(THIS_MODULE, PF_MCTP, RTM_DELROUTE,
  1146. mctp_delroute, NULL, 0);
  1147. return register_pernet_subsys(&mctp_net_ops);
  1148. }
  1149. void mctp_routes_exit(void)
  1150. {
  1151. unregister_pernet_subsys(&mctp_net_ops);
  1152. rtnl_unregister(PF_MCTP, RTM_DELROUTE);
  1153. rtnl_unregister(PF_MCTP, RTM_NEWROUTE);
  1154. rtnl_unregister(PF_MCTP, RTM_GETROUTE);
  1155. dev_remove_pack(&mctp_packet_type);
  1156. }
  1157. #if IS_ENABLED(CONFIG_MCTP_TEST)
  1158. #include "test/route-test.c"
  1159. #endif