rpmsg_proto.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. /*
  2. * AF_RPMSG: Remote processor messaging sockets
  3. *
  4. * Copyright (C) 2011-2017 Texas Instruments Incorporated - http://www.ti.com/
  5. *
  6. * Ohad Ben-Cohen <ohad@wizery.com>
  7. * Robert Tivy <rtivy@ti.com>
  8. * G Anthony <a0783926@ti.com>
  9. * Suman Anna <s-anna@ti.com>
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * version 2 as published by the Free Software Foundation.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. */
  20. #define pr_fmt(fmt) "%s: " fmt, __func__
  21. #include <linux/kernel.h>
  22. #include <linux/module.h>
  23. #include <linux/device.h>
  24. #include <linux/types.h>
  25. #include <linux/list.h>
  26. #include <linux/errno.h>
  27. #include <linux/skbuff.h>
  28. #include <linux/err.h>
  29. #include <linux/mutex.h>
  30. #include <linux/rpmsg.h>
  31. #include <linux/radix-tree.h>
  32. #include <linux/remoteproc.h>
  33. #include <linux/rpmsg/virtio_rpmsg.h>
  34. #include <net/sock.h>
  35. #include <uapi/linux/rpmsg_socket.h>
  36. #define RPMSG_CB(skb) (*(struct sockaddr_rpmsg *)&((skb)->cb))
  37. /* Maximum buffer size supported by virtio rpmsg transport.
  38. * Must match value as in drivers/rpmsg/virtio_rpmsg_bus.c
  39. */
  40. #define RPMSG_BUF_SIZE (512)
  41. struct rpmsg_socket {
  42. struct sock sk;
  43. struct rpmsg_device *rpdev;
  44. struct rpmsg_endpoint *endpt;
  45. int rproc_id;
  46. struct list_head elem;
  47. };
  48. /* Connection and socket states */
  49. enum {
  50. RPMSG_CONNECTED = 1,
  51. RPMSG_OPEN,
  52. RPMSG_LISTENING,
  53. RPMSG_CLOSED,
  54. RPMSG_ERROR,
  55. };
  56. /* A single-level radix-tree-based scheme is used to maintain the rpmsg
  57. * channels we're exposing to userland. The radix tree maps a rproc index
  58. * id to its published rpmsg-proto channel. Only a single rpmsg device is
  59. * supported at the moment from each remote processor. This can be easily
  60. * scaled to multiple devices using unique destination addresses but this
  61. *_will_ require additional semantic changes on bind() and connect().
  62. */
  63. static RADIX_TREE(rpmsg_channels, GFP_KERNEL);
  64. /* Synchronization of access to the tree is achieved using a mutex,
  65. * because we're using non-atomic radix tree allocations.
  66. */
  67. static DEFINE_MUTEX(rpmsg_channels_lock);
  68. static int rpmsg_sock_cb(struct rpmsg_device *rpdev, void *data, int len,
  69. void *priv, u32 src);
  70. static struct proto rpmsg_proto = {
  71. .name = "RPMSG",
  72. .owner = THIS_MODULE,
  73. .obj_size = sizeof(struct rpmsg_socket),
  74. };
  75. /* Retrieve the rproc instance so that it can be used for retrieving
  76. * the processor id associated with the rpmsg channel.
  77. */
  78. static struct rproc *rpdev_to_rproc(struct rpmsg_device *rpdev)
  79. {
  80. struct virtio_device *vdev;
  81. vdev = virtio_rpmsg_get_vdev(rpdev);
  82. if (!vdev)
  83. return NULL;
  84. return rproc_vdev_to_rproc_safe(vdev);
  85. }
  86. /* Retrieve the rproc id. The rproc id _relies_ on aliases being defined
  87. * in the DT blob for each of the remoteproc devices, and is essentially
  88. * the alias id. These are assumed to match to be fixed for a particular
  89. * SoC, and this provides a means to have a fixed interface to identify
  90. * a remote processor.
  91. */
  92. static int rpmsg_sock_get_proc_id(struct rpmsg_device *rpdev)
  93. {
  94. struct rproc *rproc = rpdev_to_rproc(rpdev);
  95. int id;
  96. if (!rproc) {
  97. WARN_ON(1);
  98. return -EINVAL;
  99. }
  100. id = rproc_get_alias_id(rproc);
  101. WARN_ON(id < 0);
  102. return id;
  103. }
  104. static int rpmsg_sock_connect(struct socket *sock, struct sockaddr *addr,
  105. int alen, int flags)
  106. {
  107. struct sock *sk = sock->sk;
  108. struct rpmsg_socket *rpsk;
  109. struct sockaddr_rpmsg *sa;
  110. int err = 0;
  111. struct rpmsg_device *rpdev;
  112. if (sk->sk_state != RPMSG_OPEN)
  113. return -EBADFD;
  114. if (sk->sk_type != SOCK_SEQPACKET)
  115. return -EINVAL;
  116. if (!addr || addr->sa_family != AF_RPMSG)
  117. return -EINVAL;
  118. if (alen < sizeof(*sa))
  119. return -EINVAL;
  120. sa = (struct sockaddr_rpmsg *)addr;
  121. mutex_lock(&rpmsg_channels_lock);
  122. lock_sock(sk);
  123. rpsk = container_of(sk, struct rpmsg_socket, sk);
  124. /* find the set of channels exposed by this remote processor */
  125. rpdev = radix_tree_lookup(&rpmsg_channels, sa->vproc_id);
  126. if (!rpdev) {
  127. err = -EINVAL;
  128. goto out;
  129. }
  130. rpsk->rproc_id = sa->vproc_id;
  131. rpsk->rpdev = rpdev;
  132. /* bind this socket with its parent rpmsg device */
  133. list_add_tail(&rpsk->elem, rpdev->ept->priv);
  134. /* XXX take care of disconnection state too */
  135. sk->sk_state = RPMSG_CONNECTED;
  136. out:
  137. release_sock(sk);
  138. mutex_unlock(&rpmsg_channels_lock);
  139. return err;
  140. }
  141. static int rpmsg_sock_sendmsg(struct socket *sock, struct msghdr *msg,
  142. size_t len)
  143. {
  144. struct sock *sk = sock->sk;
  145. struct rpmsg_socket *rpsk;
  146. char payload[RPMSG_BUF_SIZE];/* todo: sane payload length methodology */
  147. int err;
  148. /* XXX check for sock_error as well ? */
  149. /* XXX handle noblock ? */
  150. if (msg->msg_flags & MSG_OOB)
  151. return -EOPNOTSUPP;
  152. /* no payload ? */
  153. if (!msg->msg_iter.iov->iov_base)
  154. return -EINVAL;
  155. /* make sure the length is valid for copying into kernel buffer */
  156. if (len > RPMSG_BUF_SIZE - sizeof(struct rpmsg_hdr))
  157. return -EMSGSIZE;
  158. lock_sock(sk);
  159. /* we don't support Tx on errored-out sockets */
  160. if (sk->sk_state == RPMSG_ERROR) {
  161. release_sock(sk);
  162. return -ESHUTDOWN;
  163. }
  164. /* we don't support loopback at this point */
  165. if (sk->sk_state != RPMSG_CONNECTED) {
  166. release_sock(sk);
  167. return -ENOTCONN;
  168. }
  169. rpsk = container_of(sk, struct rpmsg_socket, sk);
  170. /* XXX for now, ignore the peer address. later use it
  171. * with rpmsg_sendto, but only if user is root
  172. */
  173. err = memcpy_from_msg(payload, msg, len);
  174. if (err)
  175. goto out;
  176. err = rpmsg_send(rpsk->rpdev->ept, payload, len);
  177. if (err)
  178. pr_err("rpmsg_send failed: %d\n", err);
  179. out:
  180. release_sock(sk);
  181. return err;
  182. }
  183. static int rpmsg_sock_recvmsg(struct socket *sock, struct msghdr *msg,
  184. size_t len, int flags)
  185. {
  186. struct sock *sk = sock->sk;
  187. struct sockaddr_rpmsg *sa;
  188. struct sk_buff *skb;
  189. int noblock = flags & MSG_DONTWAIT;
  190. int ret;
  191. if (flags & MSG_OOB) {
  192. pr_err("MSG_OOB: %d\n", EOPNOTSUPP);
  193. return -EOPNOTSUPP;
  194. }
  195. /* return failure on errored-out Rx sockets */
  196. lock_sock(sk);
  197. if (sk->sk_state == RPMSG_ERROR) {
  198. release_sock(sk);
  199. return -ENOLINK;
  200. }
  201. release_sock(sk);
  202. msg->msg_namelen = 0;
  203. skb = skb_recv_datagram(sk, flags, noblock, &ret);
  204. if (!skb) {
  205. /* check for shutdown ? */
  206. pr_err("skb_recv_datagram: %d\n", ret);
  207. return ret;
  208. }
  209. if (msg->msg_name) {
  210. msg->msg_namelen = sizeof(*sa);
  211. sa = (struct sockaddr_rpmsg *)msg->msg_name;
  212. sa->vproc_id = RPMSG_CB(skb).vproc_id;
  213. sa->addr = RPMSG_CB(skb).addr;
  214. sa->family = AF_RPMSG;
  215. }
  216. if (len > skb->len) {
  217. len = skb->len;
  218. } else if (len < skb->len) {
  219. pr_warn("user buffer is too small\n");
  220. /* XXX truncate or error ? */
  221. msg->msg_flags |= MSG_TRUNC;
  222. }
  223. ret = skb_copy_datagram_msg(skb, 0, msg, len);
  224. if (ret) {
  225. pr_err("error copying skb data: %d\n", ret);
  226. goto out_free;
  227. }
  228. ret = len;
  229. out_free:
  230. skb_free_datagram(sk, skb);
  231. return ret;
  232. }
  233. static unsigned int rpmsg_sock_poll(struct file *file, struct socket *sock,
  234. poll_table *wait)
  235. {
  236. struct sock *sk = sock->sk;
  237. unsigned int mask = 0;
  238. poll_wait(file, sk_sleep(sk), wait);
  239. /* exceptional events? */
  240. if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
  241. mask |= POLLERR;
  242. if (sk->sk_state == RPMSG_ERROR)
  243. mask |= POLLERR;
  244. if (sk->sk_shutdown & RCV_SHUTDOWN)
  245. mask |= POLLRDHUP;
  246. if (sk->sk_shutdown == SHUTDOWN_MASK)
  247. mask |= POLLHUP;
  248. /* readable? */
  249. if (!skb_queue_empty(&sk->sk_receive_queue) ||
  250. (sk->sk_shutdown & RCV_SHUTDOWN))
  251. mask |= POLLIN | POLLRDNORM;
  252. if (sk->sk_state == RPMSG_CLOSED)
  253. mask |= POLLHUP;
  254. /* XXX is writable ?
  255. * this depends on the destination processor.
  256. * if loopback: we're writable unless no memory
  257. * if to remote: we need enabled rpmsg buffer or user supplied bufs
  258. * for now, let's always be writable.
  259. */
  260. mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
  261. return mask;
  262. }
  263. /* return bound socket address information, either local or remote
  264. * note: len is just an output parameter, doesn't carry any input value
  265. */
  266. static int rpmsg_sock_getname(struct socket *sock, struct sockaddr *addr,
  267. int *len, int peer)
  268. {
  269. struct sock *sk = sock->sk;
  270. struct rpmsg_socket *rpsk;
  271. struct rpmsg_device *rpdev;
  272. struct sockaddr_rpmsg *sa;
  273. int ret = 0;
  274. rpsk = container_of(sk, struct rpmsg_socket, sk);
  275. lock_sock(sk);
  276. rpdev = rpsk->rpdev;
  277. if (!rpdev) {
  278. ret = peer ? -ENOTCONN : -EINVAL;
  279. goto out;
  280. }
  281. addr->sa_family = AF_RPMSG;
  282. sa = (struct sockaddr_rpmsg *)addr;
  283. *len = sizeof(*sa);
  284. if (peer) {
  285. sa->vproc_id = rpsk->rproc_id;
  286. sa->addr = rpdev->dst;
  287. } else {
  288. sa->vproc_id = RPMSG_LOCALHOST;
  289. sa->addr = rpsk->endpt ? rpsk->endpt->addr : rpsk->rpdev->src;
  290. }
  291. out:
  292. release_sock(sk);
  293. return ret;
  294. }
  295. static int rpmsg_sock_release(struct socket *sock)
  296. {
  297. struct sock *sk = sock->sk;
  298. struct rpmsg_socket *rpsk = container_of(sk, struct rpmsg_socket, sk);
  299. struct rpmsg_endpoint *endpt;
  300. if (!sk)
  301. return 0;
  302. if (sk->sk_state == RPMSG_OPEN)
  303. goto out;
  304. lock_sock(sk);
  305. if (sk->sk_state != RPMSG_ERROR) {
  306. rpsk->rpdev = NULL;
  307. list_del(&rpsk->elem);
  308. endpt = rpsk->endpt;
  309. rpsk->endpt = NULL;
  310. release_sock(sk);
  311. if (endpt)
  312. rpmsg_destroy_ept(endpt);
  313. goto out;
  314. }
  315. release_sock(sk);
  316. out:
  317. sock_put(sock->sk);
  318. return 0;
  319. }
  320. /* Notes:
  321. * - calling connect after bind isn't currently supported (is it even needed?).
  322. * - userspace arguments to bind aren't intuitive: one needs to provide
  323. * the vproc id of the remote processor that the channel needs to be shared
  324. * with, and the -local- source address the channel is to be bound with
  325. */
  326. static int
  327. rpmsg_sock_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
  328. {
  329. struct sock *sk = sock->sk;
  330. struct rpmsg_socket *rpsk = container_of(sk, struct rpmsg_socket, sk);
  331. struct rpmsg_device *rpdev;
  332. struct rpmsg_endpoint *endpt;
  333. struct rpmsg_channel_info chinfo = {};
  334. struct sockaddr_rpmsg *sa = (struct sockaddr_rpmsg *)uaddr;
  335. int ret = 0;
  336. if (sock->state == SS_CONNECTED)
  337. return -EINVAL;
  338. if (addr_len != sizeof(*sa))
  339. return -EINVAL;
  340. if (sa->family != AF_RPMSG)
  341. return -EINVAL;
  342. if (rpsk->endpt)
  343. return -EBUSY;
  344. if (sk->sk_state != RPMSG_OPEN)
  345. return -EINVAL;
  346. mutex_lock(&rpmsg_channels_lock);
  347. rpdev = radix_tree_lookup(&rpmsg_channels, sa->vproc_id);
  348. if (!rpdev) {
  349. ret = -EINVAL;
  350. goto out;
  351. }
  352. /* bind this socket with a receiving endpoint */
  353. chinfo.src = sa->addr;
  354. chinfo.dst = RPMSG_ADDR_ANY;
  355. endpt = rpmsg_create_ept(rpdev, rpmsg_sock_cb, sk, chinfo);
  356. if (!endpt) {
  357. ret = -EINVAL;
  358. goto out;
  359. }
  360. lock_sock(sk);
  361. rpsk->rpdev = rpdev;
  362. rpsk->endpt = endpt;
  363. rpsk->rproc_id = sa->vproc_id;
  364. /* bind this socket with its parent rpmsg device */
  365. list_add_tail(&rpsk->elem, rpdev->ept->priv);
  366. sk->sk_state = RPMSG_LISTENING;
  367. release_sock(sk);
  368. out:
  369. mutex_unlock(&rpmsg_channels_lock);
  370. return ret;
  371. }
  372. static const struct proto_ops rpmsg_sock_ops = {
  373. .family = PF_RPMSG,
  374. .owner = THIS_MODULE,
  375. .release = rpmsg_sock_release,
  376. .connect = rpmsg_sock_connect,
  377. .getname = rpmsg_sock_getname,
  378. .sendmsg = rpmsg_sock_sendmsg,
  379. .recvmsg = rpmsg_sock_recvmsg,
  380. .poll = rpmsg_sock_poll,
  381. .bind = rpmsg_sock_bind,
  382. .listen = sock_no_listen,
  383. .accept = sock_no_accept,
  384. .ioctl = sock_no_ioctl,
  385. .mmap = sock_no_mmap,
  386. .socketpair = sock_no_socketpair,
  387. .shutdown = sock_no_shutdown,
  388. .setsockopt = sock_no_setsockopt,
  389. .getsockopt = sock_no_getsockopt
  390. };
  391. static void rpmsg_sock_destruct(struct sock *sk)
  392. {
  393. }
  394. static int rpmsg_sock_create(struct net *net, struct socket *sock, int proto,
  395. int kern)
  396. {
  397. struct sock *sk;
  398. struct rpmsg_socket *rpsk;
  399. if (sock->type != SOCK_SEQPACKET)
  400. return -ESOCKTNOSUPPORT;
  401. if (proto != 0)
  402. return -EPROTONOSUPPORT;
  403. sk = sk_alloc(net, PF_RPMSG, GFP_KERNEL, &rpmsg_proto, kern);
  404. if (!sk)
  405. return -ENOMEM;
  406. sock->state = SS_UNCONNECTED;
  407. sock->ops = &rpmsg_sock_ops;
  408. sock_init_data(sock, sk);
  409. sk->sk_destruct = rpmsg_sock_destruct;
  410. sk->sk_protocol = proto;
  411. sk->sk_state = RPMSG_OPEN;
  412. rpsk = container_of(sk, struct rpmsg_socket, sk);
  413. INIT_LIST_HEAD(&rpsk->elem);
  414. /* use RPMSG_LOCALHOST to serve as an invalid value */
  415. rpsk->rproc_id = RPMSG_LOCALHOST;
  416. return 0;
  417. }
  418. static const struct net_proto_family rpmsg_proto_family = {
  419. .family = PF_RPMSG,
  420. .create = rpmsg_sock_create,
  421. .owner = THIS_MODULE,
  422. };
  423. static int __rpmsg_sock_cb(struct device *dev, int from_vproc_id, void *data,
  424. int len, struct sock *sk, u32 src)
  425. {
  426. struct rpmsg_socket *rpsk = container_of(sk, struct rpmsg_socket, sk);
  427. struct sk_buff *skb;
  428. int ret;
  429. #if defined(CONFIG_DYNAMIC_DEBUG)
  430. dynamic_hex_dump("rpmsg_proto Rx: ", DUMP_PREFIX_NONE, 16, 1, data,
  431. len, true);
  432. #endif
  433. lock_sock(sk);
  434. switch (sk->sk_state) {
  435. case RPMSG_CONNECTED:
  436. if (rpsk->rpdev->dst != src)
  437. dev_warn(dev, "unexpected source address: %d\n", src);
  438. break;
  439. case RPMSG_LISTENING:
  440. /* When an inbound message is received while we're listening,
  441. * we implicitly become connected
  442. */
  443. sk->sk_state = RPMSG_CONNECTED;
  444. rpsk->rpdev->dst = src;
  445. break;
  446. default:
  447. dev_warn(dev, "unexpected inbound message (from %d)\n", src);
  448. break;
  449. }
  450. skb = sock_alloc_send_skb(sk, len, 1, &ret);
  451. if (!skb) {
  452. dev_err(dev, "sock_alloc_send_skb failed: %d\n", ret);
  453. ret = -ENOMEM;
  454. goto out;
  455. }
  456. RPMSG_CB(skb).vproc_id = from_vproc_id;
  457. RPMSG_CB(skb).addr = src;
  458. RPMSG_CB(skb).family = AF_RPMSG;
  459. memcpy(skb_put(skb, len), data, len);
  460. ret = sock_queue_rcv_skb(sk, skb);
  461. if (ret) {
  462. dev_err(dev, "sock_queue_rcv_skb failed: %d\n", ret);
  463. kfree_skb(skb);
  464. }
  465. out:
  466. release_sock(sk);
  467. return ret;
  468. }
  469. static int rpmsg_sock_cb(struct rpmsg_device *rpdev, void *data, int len,
  470. void *priv, u32 src)
  471. {
  472. int id = rpmsg_sock_get_proc_id(rpdev);
  473. return __rpmsg_sock_cb(&rpdev->dev, id, data, len, priv, src);
  474. }
  475. static int rpmsg_proto_cb(struct rpmsg_device *rpdev, void *data, int len,
  476. void *priv, u32 src)
  477. {
  478. dev_err(&rpdev->dev, "rpmsg_proto device not designed to receive any messages\n");
  479. return 0;
  480. }
  481. static int rpmsg_proto_probe(struct rpmsg_device *rpdev)
  482. {
  483. struct device *dev = &rpdev->dev;
  484. int ret, dst = rpdev->dst, id;
  485. struct rpmsg_device *vrp_dev;
  486. struct list_head *sock_list = NULL;
  487. if (WARN_ON(dst == RPMSG_ADDR_ANY))
  488. return -EINVAL;
  489. id = rpmsg_sock_get_proc_id(rpdev);
  490. mutex_lock(&rpmsg_channels_lock);
  491. /* are we exposing a rpmsg proto device for this remote processor yet?
  492. * If not, associate id/device for later lookup in rpmsg_sock_bind().
  493. * Multiple devices per remote processor are not supported.
  494. */
  495. vrp_dev = radix_tree_lookup(&rpmsg_channels, id);
  496. if (!vrp_dev) {
  497. ret = radix_tree_insert(&rpmsg_channels, id, rpdev);
  498. if (ret) {
  499. dev_err(dev, "radix_tree_insert failed: %d\n", ret);
  500. goto out;
  501. }
  502. } else {
  503. ret = -ENODEV;
  504. dev_err(dev, "multiple rpmsg-proto devices from the same rproc is not supported.\n");
  505. goto out;
  506. }
  507. /* reuse the rpdev endpoint's private field for storing the list of
  508. * all connected and bound sockets on this rpmsg device.
  509. */
  510. WARN_ON(!!rpdev->ept->priv);
  511. sock_list = kzalloc(sizeof(*sock_list), GFP_KERNEL);
  512. if (!sock_list) {
  513. dev_err(dev, "failed to allocate list_head\n");
  514. radix_tree_delete(&rpmsg_channels, id);
  515. ret = -ENOMEM;
  516. goto out;
  517. }
  518. INIT_LIST_HEAD(sock_list);
  519. rpdev->ept->priv = sock_list;
  520. out:
  521. mutex_unlock(&rpmsg_channels_lock);
  522. return ret;
  523. }
  524. static void rpmsg_proto_remove(struct rpmsg_device *rpdev)
  525. {
  526. struct device *dev = &rpdev->dev;
  527. int id, dst = rpdev->dst;
  528. struct rpmsg_device *vrp_dev;
  529. struct list_head *sk_list;
  530. struct rpmsg_socket *rpsk, *tmp;
  531. struct rpmsg_endpoint *endpt = NULL;
  532. if (dst == RPMSG_ADDR_ANY)
  533. return;
  534. id = rpmsg_sock_get_proc_id(rpdev);
  535. mutex_lock(&rpmsg_channels_lock);
  536. vrp_dev = radix_tree_lookup(&rpmsg_channels, id);
  537. if (!vrp_dev) {
  538. dev_err(dev, "can't find rpmsg device for rproc %d\n", id);
  539. goto out;
  540. }
  541. if (vrp_dev != rpdev)
  542. dev_err(dev, "can't match the stored rpdev for rproc %d\n", id);
  543. if (!radix_tree_delete(&rpmsg_channels, id))
  544. dev_err(dev, "failed to delete rpdev for rproc %d\n", id);
  545. /* mark all associated sockets invalid and remove them from the
  546. * rpdev's list. Destroy the endpoints for bound sockets as the
  547. * parent rpdev will not exist until the socket's release()
  548. */
  549. sk_list = rpdev->ept->priv;
  550. list_for_each_entry_safe(rpsk, tmp, sk_list, elem) {
  551. lock_sock(&rpsk->sk);
  552. if (rpsk->rpdev) {
  553. rpsk->rpdev = NULL;
  554. rpsk->sk.sk_state = RPMSG_ERROR;
  555. list_del(&rpsk->elem);
  556. endpt = rpsk->endpt;
  557. rpsk->endpt = NULL;
  558. }
  559. release_sock(&rpsk->sk);
  560. if (endpt) {
  561. rpmsg_destroy_ept(endpt);
  562. rpsk->sk.sk_error_report(&rpsk->sk);
  563. }
  564. }
  565. kfree(sk_list);
  566. rpdev->ept->priv = NULL;
  567. out:
  568. mutex_unlock(&rpmsg_channels_lock);
  569. }
  570. static struct rpmsg_device_id rpmsg_proto_id_table[] = {
  571. { .name = "rpmsg-proto" },
  572. { },
  573. };
  574. MODULE_DEVICE_TABLE(rpmsg, rpmsg_proto_id_table);
  575. static struct rpmsg_driver rpmsg_proto_driver = {
  576. .drv.name = KBUILD_MODNAME,
  577. .id_table = rpmsg_proto_id_table,
  578. .probe = rpmsg_proto_probe,
  579. .callback = rpmsg_proto_cb,
  580. .remove = rpmsg_proto_remove,
  581. };
  582. static int __init rpmsg_proto_init(void)
  583. {
  584. int ret;
  585. ret = proto_register(&rpmsg_proto, 0);
  586. if (ret) {
  587. pr_err("proto_register failed: %d\n", ret);
  588. return ret;
  589. }
  590. ret = sock_register(&rpmsg_proto_family);
  591. if (ret) {
  592. pr_err("sock_register failed: %d\n", ret);
  593. goto proto_unreg;
  594. }
  595. ret = register_rpmsg_driver(&rpmsg_proto_driver);
  596. if (ret) {
  597. pr_err("register_rpmsg_driver failed: %d\n", ret);
  598. goto sock_unreg;
  599. }
  600. return 0;
  601. sock_unreg:
  602. sock_unregister(PF_RPMSG);
  603. proto_unreg:
  604. proto_unregister(&rpmsg_proto);
  605. return ret;
  606. }
  607. static void __exit rpmsg_proto_exit(void)
  608. {
  609. unregister_rpmsg_driver(&rpmsg_proto_driver);
  610. sock_unregister(PF_RPMSG);
  611. proto_unregister(&rpmsg_proto);
  612. }
  613. module_init(rpmsg_proto_init);
  614. module_exit(rpmsg_proto_exit);
  615. MODULE_DESCRIPTION("Remote processor messaging protocol");
  616. MODULE_LICENSE("GPL v2");
  617. MODULE_ALIAS("rpmsg:rpmsg-proto");
  618. MODULE_ALIAS_NETPROTO(AF_RPMSG);