af_mctp.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Management Component Transport Protocol (MCTP)
  4. *
  5. * Copyright (c) 2021 Code Construct
  6. * Copyright (c) 2021 Google
  7. */
  8. #include <linux/compat.h>
  9. #include <linux/if_arp.h>
  10. #include <linux/net.h>
  11. #include <linux/mctp.h>
  12. #include <linux/module.h>
  13. #include <linux/socket.h>
  14. #include <net/mctp.h>
  15. #include <net/mctpdevice.h>
  16. #include <net/sock.h>
  17. #define CREATE_TRACE_POINTS
  18. #include <trace/events/mctp.h>
  19. /* socket implementation */
  20. static void mctp_sk_expire_keys(struct timer_list *timer);
  21. static int mctp_release(struct socket *sock)
  22. {
  23. struct sock *sk = sock->sk;
  24. if (sk) {
  25. sock->sk = NULL;
  26. sk->sk_prot->close(sk, 0);
  27. }
  28. return 0;
  29. }
  30. /* Generic sockaddr checks, padding checks only so far */
  31. static bool mctp_sockaddr_is_ok(const struct sockaddr_mctp *addr)
  32. {
  33. return !addr->__smctp_pad0 && !addr->__smctp_pad1;
  34. }
  35. static bool mctp_sockaddr_ext_is_ok(const struct sockaddr_mctp_ext *addr)
  36. {
  37. return !addr->__smctp_pad0[0] &&
  38. !addr->__smctp_pad0[1] &&
  39. !addr->__smctp_pad0[2];
  40. }
  41. static int mctp_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
  42. {
  43. struct sock *sk = sock->sk;
  44. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  45. struct sockaddr_mctp *smctp;
  46. int rc;
  47. if (addrlen < sizeof(*smctp))
  48. return -EINVAL;
  49. if (addr->sa_family != AF_MCTP)
  50. return -EAFNOSUPPORT;
  51. if (!capable(CAP_NET_BIND_SERVICE))
  52. return -EACCES;
  53. /* it's a valid sockaddr for MCTP, cast and do protocol checks */
  54. smctp = (struct sockaddr_mctp *)addr;
  55. if (!mctp_sockaddr_is_ok(smctp))
  56. return -EINVAL;
  57. lock_sock(sk);
  58. if (sk_hashed(sk)) {
  59. rc = -EADDRINUSE;
  60. goto out_release;
  61. }
  62. msk->bind_net = smctp->smctp_network;
  63. msk->bind_addr = smctp->smctp_addr.s_addr;
  64. msk->bind_type = smctp->smctp_type & 0x7f; /* ignore the IC bit */
  65. rc = sk->sk_prot->hash(sk);
  66. out_release:
  67. release_sock(sk);
  68. return rc;
  69. }
  70. static int mctp_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
  71. {
  72. DECLARE_SOCKADDR(struct sockaddr_mctp *, addr, msg->msg_name);
  73. int rc, addrlen = msg->msg_namelen;
  74. struct sock *sk = sock->sk;
  75. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  76. struct mctp_skb_cb *cb;
  77. struct mctp_route *rt;
  78. struct sk_buff *skb = NULL;
  79. int hlen;
  80. if (addr) {
  81. const u8 tagbits = MCTP_TAG_MASK | MCTP_TAG_OWNER |
  82. MCTP_TAG_PREALLOC;
  83. if (addrlen < sizeof(struct sockaddr_mctp))
  84. return -EINVAL;
  85. if (addr->smctp_family != AF_MCTP)
  86. return -EINVAL;
  87. if (!mctp_sockaddr_is_ok(addr))
  88. return -EINVAL;
  89. if (addr->smctp_tag & ~tagbits)
  90. return -EINVAL;
  91. /* can't preallocate a non-owned tag */
  92. if (addr->smctp_tag & MCTP_TAG_PREALLOC &&
  93. !(addr->smctp_tag & MCTP_TAG_OWNER))
  94. return -EINVAL;
  95. } else {
  96. /* TODO: connect()ed sockets */
  97. return -EDESTADDRREQ;
  98. }
  99. if (!capable(CAP_NET_RAW))
  100. return -EACCES;
  101. if (addr->smctp_network == MCTP_NET_ANY)
  102. addr->smctp_network = mctp_default_net(sock_net(sk));
  103. /* direct addressing */
  104. if (msk->addr_ext && addrlen >= sizeof(struct sockaddr_mctp_ext)) {
  105. DECLARE_SOCKADDR(struct sockaddr_mctp_ext *,
  106. extaddr, msg->msg_name);
  107. struct net_device *dev;
  108. rc = -EINVAL;
  109. rcu_read_lock();
  110. dev = dev_get_by_index_rcu(sock_net(sk), extaddr->smctp_ifindex);
  111. /* check for correct halen */
  112. if (dev && extaddr->smctp_halen == dev->addr_len) {
  113. hlen = LL_RESERVED_SPACE(dev) + sizeof(struct mctp_hdr);
  114. rc = 0;
  115. }
  116. rcu_read_unlock();
  117. if (rc)
  118. goto err_free;
  119. rt = NULL;
  120. } else {
  121. rt = mctp_route_lookup(sock_net(sk), addr->smctp_network,
  122. addr->smctp_addr.s_addr);
  123. if (!rt) {
  124. rc = -EHOSTUNREACH;
  125. goto err_free;
  126. }
  127. hlen = LL_RESERVED_SPACE(rt->dev->dev) + sizeof(struct mctp_hdr);
  128. }
  129. skb = sock_alloc_send_skb(sk, hlen + 1 + len,
  130. msg->msg_flags & MSG_DONTWAIT, &rc);
  131. if (!skb)
  132. return rc;
  133. skb_reserve(skb, hlen);
  134. /* set type as fist byte in payload */
  135. *(u8 *)skb_put(skb, 1) = addr->smctp_type;
  136. rc = memcpy_from_msg((void *)skb_put(skb, len), msg, len);
  137. if (rc < 0)
  138. goto err_free;
  139. /* set up cb */
  140. cb = __mctp_cb(skb);
  141. cb->net = addr->smctp_network;
  142. if (!rt) {
  143. /* fill extended address in cb */
  144. DECLARE_SOCKADDR(struct sockaddr_mctp_ext *,
  145. extaddr, msg->msg_name);
  146. if (!mctp_sockaddr_ext_is_ok(extaddr) ||
  147. extaddr->smctp_halen > sizeof(cb->haddr)) {
  148. rc = -EINVAL;
  149. goto err_free;
  150. }
  151. cb->ifindex = extaddr->smctp_ifindex;
  152. /* smctp_halen is checked above */
  153. cb->halen = extaddr->smctp_halen;
  154. memcpy(cb->haddr, extaddr->smctp_haddr, cb->halen);
  155. }
  156. rc = mctp_local_output(sk, rt, skb, addr->smctp_addr.s_addr,
  157. addr->smctp_tag);
  158. return rc ? : len;
  159. err_free:
  160. kfree_skb(skb);
  161. return rc;
  162. }
  163. static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
  164. int flags)
  165. {
  166. DECLARE_SOCKADDR(struct sockaddr_mctp *, addr, msg->msg_name);
  167. struct sock *sk = sock->sk;
  168. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  169. struct sk_buff *skb;
  170. size_t msglen;
  171. u8 type;
  172. int rc;
  173. if (flags & ~(MSG_DONTWAIT | MSG_TRUNC | MSG_PEEK))
  174. return -EOPNOTSUPP;
  175. skb = skb_recv_datagram(sk, flags, &rc);
  176. if (!skb)
  177. return rc;
  178. if (!skb->len) {
  179. rc = 0;
  180. goto out_free;
  181. }
  182. /* extract message type, remove from data */
  183. type = *((u8 *)skb->data);
  184. msglen = skb->len - 1;
  185. if (len < msglen)
  186. msg->msg_flags |= MSG_TRUNC;
  187. else
  188. len = msglen;
  189. rc = skb_copy_datagram_msg(skb, 1, msg, len);
  190. if (rc < 0)
  191. goto out_free;
  192. sock_recv_cmsgs(msg, sk, skb);
  193. if (addr) {
  194. struct mctp_skb_cb *cb = mctp_cb(skb);
  195. /* TODO: expand mctp_skb_cb for header fields? */
  196. struct mctp_hdr *hdr = mctp_hdr(skb);
  197. addr = msg->msg_name;
  198. addr->smctp_family = AF_MCTP;
  199. addr->__smctp_pad0 = 0;
  200. addr->smctp_network = cb->net;
  201. addr->smctp_addr.s_addr = hdr->src;
  202. addr->smctp_type = type;
  203. addr->smctp_tag = hdr->flags_seq_tag &
  204. (MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO);
  205. addr->__smctp_pad1 = 0;
  206. msg->msg_namelen = sizeof(*addr);
  207. if (msk->addr_ext) {
  208. DECLARE_SOCKADDR(struct sockaddr_mctp_ext *, ae,
  209. msg->msg_name);
  210. msg->msg_namelen = sizeof(*ae);
  211. ae->smctp_ifindex = cb->ifindex;
  212. ae->smctp_halen = cb->halen;
  213. memset(ae->__smctp_pad0, 0x0, sizeof(ae->__smctp_pad0));
  214. memset(ae->smctp_haddr, 0x0, sizeof(ae->smctp_haddr));
  215. memcpy(ae->smctp_haddr, cb->haddr, cb->halen);
  216. }
  217. }
  218. rc = len;
  219. if (flags & MSG_TRUNC)
  220. rc = msglen;
  221. out_free:
  222. skb_free_datagram(sk, skb);
  223. return rc;
  224. }
  225. /* We're done with the key; invalidate, stop reassembly, and remove from lists.
  226. */
  227. static void __mctp_key_remove(struct mctp_sk_key *key, struct net *net,
  228. unsigned long flags, unsigned long reason)
  229. __releases(&key->lock)
  230. __must_hold(&net->mctp.keys_lock)
  231. {
  232. struct sk_buff *skb;
  233. trace_mctp_key_release(key, reason);
  234. skb = key->reasm_head;
  235. key->reasm_head = NULL;
  236. key->reasm_dead = true;
  237. key->valid = false;
  238. mctp_dev_release_key(key->dev, key);
  239. spin_unlock_irqrestore(&key->lock, flags);
  240. if (!hlist_unhashed(&key->hlist)) {
  241. hlist_del_init(&key->hlist);
  242. hlist_del_init(&key->sklist);
  243. /* unref for the lists */
  244. mctp_key_unref(key);
  245. }
  246. kfree_skb(skb);
  247. }
  248. static int mctp_setsockopt(struct socket *sock, int level, int optname,
  249. sockptr_t optval, unsigned int optlen)
  250. {
  251. struct mctp_sock *msk = container_of(sock->sk, struct mctp_sock, sk);
  252. int val;
  253. if (level != SOL_MCTP)
  254. return -EINVAL;
  255. if (optname == MCTP_OPT_ADDR_EXT) {
  256. if (optlen != sizeof(int))
  257. return -EINVAL;
  258. if (copy_from_sockptr(&val, optval, sizeof(int)))
  259. return -EFAULT;
  260. msk->addr_ext = val;
  261. return 0;
  262. }
  263. return -ENOPROTOOPT;
  264. }
  265. static int mctp_getsockopt(struct socket *sock, int level, int optname,
  266. char __user *optval, int __user *optlen)
  267. {
  268. struct mctp_sock *msk = container_of(sock->sk, struct mctp_sock, sk);
  269. int len, val;
  270. if (level != SOL_MCTP)
  271. return -EINVAL;
  272. if (get_user(len, optlen))
  273. return -EFAULT;
  274. if (optname == MCTP_OPT_ADDR_EXT) {
  275. if (len != sizeof(int))
  276. return -EINVAL;
  277. val = !!msk->addr_ext;
  278. if (copy_to_user(optval, &val, len))
  279. return -EFAULT;
  280. return 0;
  281. }
  282. return -ENOPROTOOPT;
  283. }
  284. /* helpers for reading/writing the tag ioc, handling compatibility across the
  285. * two versions, and some basic API error checking
  286. */
  287. static int mctp_ioctl_tag_copy_from_user(unsigned long arg,
  288. struct mctp_ioc_tag_ctl2 *ctl,
  289. bool tagv2)
  290. {
  291. struct mctp_ioc_tag_ctl ctl_compat;
  292. unsigned long size;
  293. void *ptr;
  294. int rc;
  295. if (tagv2) {
  296. size = sizeof(*ctl);
  297. ptr = ctl;
  298. } else {
  299. size = sizeof(ctl_compat);
  300. ptr = &ctl_compat;
  301. }
  302. rc = copy_from_user(ptr, (void __user *)arg, size);
  303. if (rc)
  304. return -EFAULT;
  305. if (!tagv2) {
  306. /* compat, using defaults for new fields */
  307. ctl->net = MCTP_INITIAL_DEFAULT_NET;
  308. ctl->peer_addr = ctl_compat.peer_addr;
  309. ctl->local_addr = MCTP_ADDR_ANY;
  310. ctl->flags = ctl_compat.flags;
  311. ctl->tag = ctl_compat.tag;
  312. }
  313. if (ctl->flags)
  314. return -EINVAL;
  315. if (ctl->local_addr != MCTP_ADDR_ANY &&
  316. ctl->local_addr != MCTP_ADDR_NULL)
  317. return -EINVAL;
  318. return 0;
  319. }
  320. static int mctp_ioctl_tag_copy_to_user(unsigned long arg,
  321. struct mctp_ioc_tag_ctl2 *ctl,
  322. bool tagv2)
  323. {
  324. struct mctp_ioc_tag_ctl ctl_compat;
  325. unsigned long size;
  326. void *ptr;
  327. int rc;
  328. if (tagv2) {
  329. ptr = ctl;
  330. size = sizeof(*ctl);
  331. } else {
  332. ctl_compat.peer_addr = ctl->peer_addr;
  333. ctl_compat.tag = ctl->tag;
  334. ctl_compat.flags = ctl->flags;
  335. ptr = &ctl_compat;
  336. size = sizeof(ctl_compat);
  337. }
  338. rc = copy_to_user((void __user *)arg, ptr, size);
  339. if (rc)
  340. return -EFAULT;
  341. return 0;
  342. }
  343. static int mctp_ioctl_alloctag(struct mctp_sock *msk, bool tagv2,
  344. unsigned long arg)
  345. {
  346. struct net *net = sock_net(&msk->sk);
  347. struct mctp_sk_key *key = NULL;
  348. struct mctp_ioc_tag_ctl2 ctl;
  349. unsigned long flags;
  350. u8 tag;
  351. int rc;
  352. rc = mctp_ioctl_tag_copy_from_user(arg, &ctl, tagv2);
  353. if (rc)
  354. return rc;
  355. if (ctl.tag)
  356. return -EINVAL;
  357. key = mctp_alloc_local_tag(msk, ctl.net, MCTP_ADDR_ANY,
  358. ctl.peer_addr, true, &tag);
  359. if (IS_ERR(key))
  360. return PTR_ERR(key);
  361. ctl.tag = tag | MCTP_TAG_OWNER | MCTP_TAG_PREALLOC;
  362. rc = mctp_ioctl_tag_copy_to_user(arg, &ctl, tagv2);
  363. if (rc) {
  364. unsigned long fl2;
  365. /* Unwind our key allocation: the keys list lock needs to be
  366. * taken before the individual key locks, and we need a valid
  367. * flags value (fl2) to pass to __mctp_key_remove, hence the
  368. * second spin_lock_irqsave() rather than a plain spin_lock().
  369. */
  370. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  371. spin_lock_irqsave(&key->lock, fl2);
  372. __mctp_key_remove(key, net, fl2, MCTP_TRACE_KEY_DROPPED);
  373. mctp_key_unref(key);
  374. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  375. return rc;
  376. }
  377. mctp_key_unref(key);
  378. return 0;
  379. }
  380. static int mctp_ioctl_droptag(struct mctp_sock *msk, bool tagv2,
  381. unsigned long arg)
  382. {
  383. struct net *net = sock_net(&msk->sk);
  384. struct mctp_ioc_tag_ctl2 ctl;
  385. unsigned long flags, fl2;
  386. struct mctp_sk_key *key;
  387. struct hlist_node *tmp;
  388. int rc;
  389. u8 tag;
  390. rc = mctp_ioctl_tag_copy_from_user(arg, &ctl, tagv2);
  391. if (rc)
  392. return rc;
  393. /* Must be a local tag, TO set, preallocated */
  394. if ((ctl.tag & ~MCTP_TAG_MASK) != (MCTP_TAG_OWNER | MCTP_TAG_PREALLOC))
  395. return -EINVAL;
  396. tag = ctl.tag & MCTP_TAG_MASK;
  397. rc = -EINVAL;
  398. if (ctl.peer_addr == MCTP_ADDR_NULL)
  399. ctl.peer_addr = MCTP_ADDR_ANY;
  400. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  401. hlist_for_each_entry_safe(key, tmp, &msk->keys, sklist) {
  402. /* we do an irqsave here, even though we know the irq state,
  403. * so we have the flags to pass to __mctp_key_remove
  404. */
  405. spin_lock_irqsave(&key->lock, fl2);
  406. if (key->manual_alloc &&
  407. ctl.net == key->net &&
  408. ctl.peer_addr == key->peer_addr &&
  409. tag == key->tag) {
  410. __mctp_key_remove(key, net, fl2,
  411. MCTP_TRACE_KEY_DROPPED);
  412. rc = 0;
  413. } else {
  414. spin_unlock_irqrestore(&key->lock, fl2);
  415. }
  416. }
  417. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  418. return rc;
  419. }
  420. static int mctp_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  421. {
  422. struct mctp_sock *msk = container_of(sock->sk, struct mctp_sock, sk);
  423. bool tagv2 = false;
  424. switch (cmd) {
  425. case SIOCMCTPALLOCTAG2:
  426. case SIOCMCTPALLOCTAG:
  427. tagv2 = cmd == SIOCMCTPALLOCTAG2;
  428. return mctp_ioctl_alloctag(msk, tagv2, arg);
  429. case SIOCMCTPDROPTAG:
  430. case SIOCMCTPDROPTAG2:
  431. tagv2 = cmd == SIOCMCTPDROPTAG2;
  432. return mctp_ioctl_droptag(msk, tagv2, arg);
  433. }
  434. return -EINVAL;
  435. }
  436. #ifdef CONFIG_COMPAT
  437. static int mctp_compat_ioctl(struct socket *sock, unsigned int cmd,
  438. unsigned long arg)
  439. {
  440. void __user *argp = compat_ptr(arg);
  441. switch (cmd) {
  442. /* These have compatible ptr layouts */
  443. case SIOCMCTPALLOCTAG:
  444. case SIOCMCTPDROPTAG:
  445. return mctp_ioctl(sock, cmd, (unsigned long)argp);
  446. }
  447. return -ENOIOCTLCMD;
  448. }
  449. #endif
  450. static const struct proto_ops mctp_dgram_ops = {
  451. .family = PF_MCTP,
  452. .release = mctp_release,
  453. .bind = mctp_bind,
  454. .connect = sock_no_connect,
  455. .socketpair = sock_no_socketpair,
  456. .accept = sock_no_accept,
  457. .getname = sock_no_getname,
  458. .poll = datagram_poll,
  459. .ioctl = mctp_ioctl,
  460. .gettstamp = sock_gettstamp,
  461. .listen = sock_no_listen,
  462. .shutdown = sock_no_shutdown,
  463. .setsockopt = mctp_setsockopt,
  464. .getsockopt = mctp_getsockopt,
  465. .sendmsg = mctp_sendmsg,
  466. .recvmsg = mctp_recvmsg,
  467. .mmap = sock_no_mmap,
  468. #ifdef CONFIG_COMPAT
  469. .compat_ioctl = mctp_compat_ioctl,
  470. #endif
  471. };
  472. static void mctp_sk_expire_keys(struct timer_list *timer)
  473. {
  474. struct mctp_sock *msk = container_of(timer, struct mctp_sock,
  475. key_expiry);
  476. struct net *net = sock_net(&msk->sk);
  477. unsigned long next_expiry, flags, fl2;
  478. struct mctp_sk_key *key;
  479. struct hlist_node *tmp;
  480. bool next_expiry_valid = false;
  481. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  482. hlist_for_each_entry_safe(key, tmp, &msk->keys, sklist) {
  483. /* don't expire. manual_alloc is immutable, no locking
  484. * required.
  485. */
  486. if (key->manual_alloc)
  487. continue;
  488. spin_lock_irqsave(&key->lock, fl2);
  489. if (!time_after_eq(key->expiry, jiffies)) {
  490. __mctp_key_remove(key, net, fl2,
  491. MCTP_TRACE_KEY_TIMEOUT);
  492. continue;
  493. }
  494. if (next_expiry_valid) {
  495. if (time_before(key->expiry, next_expiry))
  496. next_expiry = key->expiry;
  497. } else {
  498. next_expiry = key->expiry;
  499. next_expiry_valid = true;
  500. }
  501. spin_unlock_irqrestore(&key->lock, fl2);
  502. }
  503. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  504. if (next_expiry_valid)
  505. mod_timer(timer, next_expiry);
  506. }
  507. static int mctp_sk_init(struct sock *sk)
  508. {
  509. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  510. INIT_HLIST_HEAD(&msk->keys);
  511. timer_setup(&msk->key_expiry, mctp_sk_expire_keys, 0);
  512. return 0;
  513. }
  514. static void mctp_sk_close(struct sock *sk, long timeout)
  515. {
  516. sk_common_release(sk);
  517. }
  518. static int mctp_sk_hash(struct sock *sk)
  519. {
  520. struct net *net = sock_net(sk);
  521. struct sock *existing;
  522. struct mctp_sock *msk;
  523. int rc;
  524. msk = container_of(sk, struct mctp_sock, sk);
  525. /* Bind lookup runs under RCU, remain live during that. */
  526. sock_set_flag(sk, SOCK_RCU_FREE);
  527. mutex_lock(&net->mctp.bind_lock);
  528. /* Prevent duplicate binds. */
  529. sk_for_each(existing, &net->mctp.binds) {
  530. struct mctp_sock *mex =
  531. container_of(existing, struct mctp_sock, sk);
  532. if (mex->bind_type == msk->bind_type &&
  533. mex->bind_addr == msk->bind_addr &&
  534. mex->bind_net == msk->bind_net) {
  535. rc = -EADDRINUSE;
  536. goto out;
  537. }
  538. }
  539. sk_add_node_rcu(sk, &net->mctp.binds);
  540. rc = 0;
  541. out:
  542. mutex_unlock(&net->mctp.bind_lock);
  543. return rc;
  544. }
  545. static void mctp_sk_unhash(struct sock *sk)
  546. {
  547. struct mctp_sock *msk = container_of(sk, struct mctp_sock, sk);
  548. struct net *net = sock_net(sk);
  549. unsigned long flags, fl2;
  550. struct mctp_sk_key *key;
  551. struct hlist_node *tmp;
  552. /* remove from any type-based binds */
  553. mutex_lock(&net->mctp.bind_lock);
  554. sk_del_node_init_rcu(sk);
  555. mutex_unlock(&net->mctp.bind_lock);
  556. /* remove tag allocations */
  557. spin_lock_irqsave(&net->mctp.keys_lock, flags);
  558. hlist_for_each_entry_safe(key, tmp, &msk->keys, sklist) {
  559. spin_lock_irqsave(&key->lock, fl2);
  560. __mctp_key_remove(key, net, fl2, MCTP_TRACE_KEY_CLOSED);
  561. }
  562. sock_set_flag(sk, SOCK_DEAD);
  563. spin_unlock_irqrestore(&net->mctp.keys_lock, flags);
  564. /* Since there are no more tag allocations (we have removed all of the
  565. * keys), stop any pending expiry events. the timer cannot be re-queued
  566. * as the sk is no longer observable
  567. */
  568. del_timer_sync(&msk->key_expiry);
  569. }
  570. static void mctp_sk_destruct(struct sock *sk)
  571. {
  572. skb_queue_purge(&sk->sk_receive_queue);
  573. }
  574. static struct proto mctp_proto = {
  575. .name = "MCTP",
  576. .owner = THIS_MODULE,
  577. .obj_size = sizeof(struct mctp_sock),
  578. .init = mctp_sk_init,
  579. .close = mctp_sk_close,
  580. .hash = mctp_sk_hash,
  581. .unhash = mctp_sk_unhash,
  582. };
  583. static int mctp_pf_create(struct net *net, struct socket *sock,
  584. int protocol, int kern)
  585. {
  586. const struct proto_ops *ops;
  587. struct proto *proto;
  588. struct sock *sk;
  589. int rc;
  590. if (protocol)
  591. return -EPROTONOSUPPORT;
  592. /* only datagram sockets are supported */
  593. if (sock->type != SOCK_DGRAM)
  594. return -ESOCKTNOSUPPORT;
  595. proto = &mctp_proto;
  596. ops = &mctp_dgram_ops;
  597. sock->state = SS_UNCONNECTED;
  598. sock->ops = ops;
  599. sk = sk_alloc(net, PF_MCTP, GFP_KERNEL, proto, kern);
  600. if (!sk)
  601. return -ENOMEM;
  602. sock_init_data(sock, sk);
  603. sk->sk_destruct = mctp_sk_destruct;
  604. rc = 0;
  605. if (sk->sk_prot->init)
  606. rc = sk->sk_prot->init(sk);
  607. if (rc)
  608. goto err_sk_put;
  609. return 0;
  610. err_sk_put:
  611. sock_orphan(sk);
  612. sock_put(sk);
  613. return rc;
  614. }
  615. static struct net_proto_family mctp_pf = {
  616. .family = PF_MCTP,
  617. .create = mctp_pf_create,
  618. .owner = THIS_MODULE,
  619. };
  620. static __init int mctp_init(void)
  621. {
  622. int rc;
  623. /* ensure our uapi tag definitions match the header format */
  624. BUILD_BUG_ON(MCTP_TAG_OWNER != MCTP_HDR_FLAG_TO);
  625. BUILD_BUG_ON(MCTP_TAG_MASK != MCTP_HDR_TAG_MASK);
  626. pr_info("mctp: management component transport protocol core\n");
  627. rc = sock_register(&mctp_pf);
  628. if (rc)
  629. return rc;
  630. rc = proto_register(&mctp_proto, 0);
  631. if (rc)
  632. goto err_unreg_sock;
  633. rc = mctp_routes_init();
  634. if (rc)
  635. goto err_unreg_proto;
  636. rc = mctp_neigh_init();
  637. if (rc)
  638. goto err_unreg_routes;
  639. rc = mctp_device_init();
  640. if (rc)
  641. goto err_unreg_neigh;
  642. return 0;
  643. err_unreg_neigh:
  644. mctp_neigh_exit();
  645. err_unreg_routes:
  646. mctp_routes_exit();
  647. err_unreg_proto:
  648. proto_unregister(&mctp_proto);
  649. err_unreg_sock:
  650. sock_unregister(PF_MCTP);
  651. return rc;
  652. }
  653. static __exit void mctp_exit(void)
  654. {
  655. mctp_device_exit();
  656. mctp_neigh_exit();
  657. mctp_routes_exit();
  658. proto_unregister(&mctp_proto);
  659. sock_unregister(PF_MCTP);
  660. }
  661. subsys_initcall(mctp_init);
  662. module_exit(mctp_exit);
  663. MODULE_DESCRIPTION("MCTP core");
  664. MODULE_AUTHOR("Jeremy Kerr <jk@codeconstruct.com.au>");
  665. MODULE_ALIAS_NETPROTO(PF_MCTP);