ns.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /*
  3. * Copyright (c) 2015, Sony Mobile Communications Inc.
  4. * Copyright (c) 2013, The Linux Foundation. All rights reserved.
  5. * Copyright (c) 2020, Linaro Ltd.
  6. */
  7. #include <linux/module.h>
  8. #include <linux/qrtr.h>
  9. #include <linux/workqueue.h>
  10. #include <net/sock.h>
  11. #include "qrtr.h"
  12. #include <trace/events/sock.h>
  13. #define CREATE_TRACE_POINTS
  14. #include <trace/events/qrtr.h>
  15. static DEFINE_XARRAY(nodes);
  16. static struct {
  17. struct socket *sock;
  18. struct sockaddr_qrtr bcast_sq;
  19. struct list_head lookups;
  20. struct workqueue_struct *workqueue;
  21. struct work_struct work;
  22. int local_node;
  23. } qrtr_ns;
  24. static const char * const qrtr_ctrl_pkt_strings[] = {
  25. [QRTR_TYPE_HELLO] = "hello",
  26. [QRTR_TYPE_BYE] = "bye",
  27. [QRTR_TYPE_NEW_SERVER] = "new-server",
  28. [QRTR_TYPE_DEL_SERVER] = "del-server",
  29. [QRTR_TYPE_DEL_CLIENT] = "del-client",
  30. [QRTR_TYPE_RESUME_TX] = "resume-tx",
  31. [QRTR_TYPE_EXIT] = "exit",
  32. [QRTR_TYPE_PING] = "ping",
  33. [QRTR_TYPE_NEW_LOOKUP] = "new-lookup",
  34. [QRTR_TYPE_DEL_LOOKUP] = "del-lookup",
  35. };
  36. struct qrtr_server_filter {
  37. unsigned int service;
  38. unsigned int instance;
  39. unsigned int ifilter;
  40. };
  41. struct qrtr_lookup {
  42. unsigned int service;
  43. unsigned int instance;
  44. struct sockaddr_qrtr sq;
  45. struct list_head li;
  46. };
  47. struct qrtr_server {
  48. unsigned int service;
  49. unsigned int instance;
  50. unsigned int node;
  51. unsigned int port;
  52. struct list_head qli;
  53. };
  54. struct qrtr_node {
  55. unsigned int id;
  56. struct xarray servers;
  57. };
  58. static struct qrtr_node *node_get(unsigned int node_id)
  59. {
  60. struct qrtr_node *node;
  61. node = xa_load(&nodes, node_id);
  62. if (node)
  63. return node;
  64. /* If node didn't exist, allocate and insert it to the tree */
  65. node = kzalloc(sizeof(*node), GFP_KERNEL);
  66. if (!node)
  67. return NULL;
  68. node->id = node_id;
  69. xa_init(&node->servers);
  70. if (xa_store(&nodes, node_id, node, GFP_KERNEL)) {
  71. kfree(node);
  72. return NULL;
  73. }
  74. return node;
  75. }
  76. static int server_match(const struct qrtr_server *srv,
  77. const struct qrtr_server_filter *f)
  78. {
  79. unsigned int ifilter = f->ifilter;
  80. if (f->service != 0 && srv->service != f->service)
  81. return 0;
  82. if (!ifilter && f->instance)
  83. ifilter = ~0;
  84. return (srv->instance & ifilter) == f->instance;
  85. }
  86. static int service_announce_new(struct sockaddr_qrtr *dest,
  87. struct qrtr_server *srv)
  88. {
  89. struct qrtr_ctrl_pkt pkt;
  90. struct msghdr msg = { };
  91. struct kvec iv;
  92. trace_qrtr_ns_service_announce_new(srv->service, srv->instance,
  93. srv->node, srv->port);
  94. iv.iov_base = &pkt;
  95. iv.iov_len = sizeof(pkt);
  96. memset(&pkt, 0, sizeof(pkt));
  97. pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_SERVER);
  98. pkt.server.service = cpu_to_le32(srv->service);
  99. pkt.server.instance = cpu_to_le32(srv->instance);
  100. pkt.server.node = cpu_to_le32(srv->node);
  101. pkt.server.port = cpu_to_le32(srv->port);
  102. msg.msg_name = (struct sockaddr *)dest;
  103. msg.msg_namelen = sizeof(*dest);
  104. return kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  105. }
  106. static void service_announce_del(struct sockaddr_qrtr *dest,
  107. struct qrtr_server *srv)
  108. {
  109. struct qrtr_ctrl_pkt pkt;
  110. struct msghdr msg = { };
  111. struct kvec iv;
  112. int ret;
  113. trace_qrtr_ns_service_announce_del(srv->service, srv->instance,
  114. srv->node, srv->port);
  115. iv.iov_base = &pkt;
  116. iv.iov_len = sizeof(pkt);
  117. memset(&pkt, 0, sizeof(pkt));
  118. pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_SERVER);
  119. pkt.server.service = cpu_to_le32(srv->service);
  120. pkt.server.instance = cpu_to_le32(srv->instance);
  121. pkt.server.node = cpu_to_le32(srv->node);
  122. pkt.server.port = cpu_to_le32(srv->port);
  123. msg.msg_name = (struct sockaddr *)dest;
  124. msg.msg_namelen = sizeof(*dest);
  125. ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  126. if (ret < 0 && ret != -ENODEV)
  127. pr_err("failed to announce del service\n");
  128. return;
  129. }
  130. static void lookup_notify(struct sockaddr_qrtr *to, struct qrtr_server *srv,
  131. bool new)
  132. {
  133. struct qrtr_ctrl_pkt pkt;
  134. struct msghdr msg = { };
  135. struct kvec iv;
  136. int ret;
  137. iv.iov_base = &pkt;
  138. iv.iov_len = sizeof(pkt);
  139. memset(&pkt, 0, sizeof(pkt));
  140. pkt.cmd = new ? cpu_to_le32(QRTR_TYPE_NEW_SERVER) :
  141. cpu_to_le32(QRTR_TYPE_DEL_SERVER);
  142. if (srv) {
  143. pkt.server.service = cpu_to_le32(srv->service);
  144. pkt.server.instance = cpu_to_le32(srv->instance);
  145. pkt.server.node = cpu_to_le32(srv->node);
  146. pkt.server.port = cpu_to_le32(srv->port);
  147. }
  148. msg.msg_name = (struct sockaddr *)to;
  149. msg.msg_namelen = sizeof(*to);
  150. ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  151. if (ret < 0 && ret != -ENODEV)
  152. pr_err("failed to send lookup notification\n");
  153. }
  154. static int announce_servers(struct sockaddr_qrtr *sq)
  155. {
  156. struct qrtr_server *srv;
  157. struct qrtr_node *node;
  158. unsigned long index;
  159. int ret;
  160. node = node_get(qrtr_ns.local_node);
  161. if (!node)
  162. return 0;
  163. /* Announce the list of servers registered in this node */
  164. xa_for_each(&node->servers, index, srv) {
  165. ret = service_announce_new(sq, srv);
  166. if (ret < 0) {
  167. if (ret == -ENODEV)
  168. continue;
  169. pr_err("failed to announce new service\n");
  170. return ret;
  171. }
  172. }
  173. return 0;
  174. }
  175. static struct qrtr_server *server_add(unsigned int service,
  176. unsigned int instance,
  177. unsigned int node_id,
  178. unsigned int port)
  179. {
  180. struct qrtr_server *srv;
  181. struct qrtr_server *old;
  182. struct qrtr_node *node;
  183. if (!service || !port)
  184. return NULL;
  185. srv = kzalloc(sizeof(*srv), GFP_KERNEL);
  186. if (!srv)
  187. return NULL;
  188. srv->service = service;
  189. srv->instance = instance;
  190. srv->node = node_id;
  191. srv->port = port;
  192. node = node_get(node_id);
  193. if (!node)
  194. goto err;
  195. /* Delete the old server on the same port */
  196. old = xa_store(&node->servers, port, srv, GFP_KERNEL);
  197. if (old) {
  198. if (xa_is_err(old)) {
  199. pr_err("failed to add server [0x%x:0x%x] ret:%d\n",
  200. srv->service, srv->instance, xa_err(old));
  201. goto err;
  202. } else {
  203. kfree(old);
  204. }
  205. }
  206. trace_qrtr_ns_server_add(srv->service, srv->instance,
  207. srv->node, srv->port);
  208. return srv;
  209. err:
  210. kfree(srv);
  211. return NULL;
  212. }
  213. static int server_del(struct qrtr_node *node, unsigned int port, bool bcast)
  214. {
  215. struct qrtr_lookup *lookup;
  216. struct qrtr_server *srv;
  217. struct list_head *li;
  218. srv = xa_load(&node->servers, port);
  219. if (!srv)
  220. return -ENOENT;
  221. xa_erase(&node->servers, port);
  222. /* Broadcast the removal of local servers */
  223. if (srv->node == qrtr_ns.local_node && bcast)
  224. service_announce_del(&qrtr_ns.bcast_sq, srv);
  225. /* Announce the service's disappearance to observers */
  226. list_for_each(li, &qrtr_ns.lookups) {
  227. lookup = container_of(li, struct qrtr_lookup, li);
  228. if (lookup->service && lookup->service != srv->service)
  229. continue;
  230. if (lookup->instance && lookup->instance != srv->instance)
  231. continue;
  232. lookup_notify(&lookup->sq, srv, false);
  233. }
  234. kfree(srv);
  235. return 0;
  236. }
  237. static int say_hello(struct sockaddr_qrtr *dest)
  238. {
  239. struct qrtr_ctrl_pkt pkt;
  240. struct msghdr msg = { };
  241. struct kvec iv;
  242. int ret;
  243. iv.iov_base = &pkt;
  244. iv.iov_len = sizeof(pkt);
  245. memset(&pkt, 0, sizeof(pkt));
  246. pkt.cmd = cpu_to_le32(QRTR_TYPE_HELLO);
  247. msg.msg_name = (struct sockaddr *)dest;
  248. msg.msg_namelen = sizeof(*dest);
  249. ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  250. if (ret < 0)
  251. pr_err("failed to send hello msg\n");
  252. return ret;
  253. }
  254. /* Announce the list of servers registered on the local node */
  255. static int ctrl_cmd_hello(struct sockaddr_qrtr *sq)
  256. {
  257. int ret;
  258. ret = say_hello(sq);
  259. if (ret < 0)
  260. return ret;
  261. return announce_servers(sq);
  262. }
  263. static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
  264. {
  265. struct qrtr_node *local_node;
  266. struct qrtr_ctrl_pkt pkt;
  267. struct qrtr_server *srv;
  268. struct sockaddr_qrtr sq;
  269. struct msghdr msg = { };
  270. struct qrtr_node *node;
  271. unsigned long index;
  272. struct kvec iv;
  273. int ret;
  274. iv.iov_base = &pkt;
  275. iv.iov_len = sizeof(pkt);
  276. node = node_get(from->sq_node);
  277. if (!node)
  278. return 0;
  279. /* Advertise removal of this client to all servers of remote node */
  280. xa_for_each(&node->servers, index, srv)
  281. server_del(node, srv->port, true);
  282. /* Advertise the removal of this client to all local servers */
  283. local_node = node_get(qrtr_ns.local_node);
  284. if (!local_node)
  285. return 0;
  286. memset(&pkt, 0, sizeof(pkt));
  287. pkt.cmd = cpu_to_le32(QRTR_TYPE_BYE);
  288. pkt.client.node = cpu_to_le32(from->sq_node);
  289. xa_for_each(&local_node->servers, index, srv) {
  290. sq.sq_family = AF_QIPCRTR;
  291. sq.sq_node = srv->node;
  292. sq.sq_port = srv->port;
  293. msg.msg_name = (struct sockaddr *)&sq;
  294. msg.msg_namelen = sizeof(sq);
  295. ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  296. if (ret < 0 && ret != -ENODEV) {
  297. pr_err("failed to send bye cmd\n");
  298. return ret;
  299. }
  300. }
  301. return 0;
  302. }
  303. static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,
  304. unsigned int node_id, unsigned int port)
  305. {
  306. struct qrtr_node *local_node;
  307. struct qrtr_lookup *lookup;
  308. struct qrtr_ctrl_pkt pkt;
  309. struct msghdr msg = { };
  310. struct qrtr_server *srv;
  311. struct sockaddr_qrtr sq;
  312. struct qrtr_node *node;
  313. struct list_head *tmp;
  314. struct list_head *li;
  315. unsigned long index;
  316. struct kvec iv;
  317. int ret;
  318. iv.iov_base = &pkt;
  319. iv.iov_len = sizeof(pkt);
  320. /* Don't accept spoofed messages */
  321. if (from->sq_node != node_id)
  322. return -EINVAL;
  323. /* Local DEL_CLIENT messages comes from the port being closed */
  324. if (from->sq_node == qrtr_ns.local_node && from->sq_port != port)
  325. return -EINVAL;
  326. /* Remove any lookups by this client */
  327. list_for_each_safe(li, tmp, &qrtr_ns.lookups) {
  328. lookup = container_of(li, struct qrtr_lookup, li);
  329. if (lookup->sq.sq_node != node_id)
  330. continue;
  331. if (lookup->sq.sq_port != port)
  332. continue;
  333. list_del(&lookup->li);
  334. kfree(lookup);
  335. }
  336. /* Remove the server belonging to this port but don't broadcast
  337. * DEL_SERVER. Neighbours would've already removed the server belonging
  338. * to this port due to the DEL_CLIENT broadcast from qrtr_port_remove().
  339. */
  340. node = node_get(node_id);
  341. if (node)
  342. server_del(node, port, false);
  343. /* Advertise the removal of this client to all local servers */
  344. local_node = node_get(qrtr_ns.local_node);
  345. if (!local_node)
  346. return 0;
  347. memset(&pkt, 0, sizeof(pkt));
  348. pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
  349. pkt.client.node = cpu_to_le32(node_id);
  350. pkt.client.port = cpu_to_le32(port);
  351. xa_for_each(&local_node->servers, index, srv) {
  352. sq.sq_family = AF_QIPCRTR;
  353. sq.sq_node = srv->node;
  354. sq.sq_port = srv->port;
  355. msg.msg_name = (struct sockaddr *)&sq;
  356. msg.msg_namelen = sizeof(sq);
  357. ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
  358. if (ret < 0 && ret != -ENODEV) {
  359. pr_err("failed to send del client cmd\n");
  360. return ret;
  361. }
  362. }
  363. return 0;
  364. }
  365. static int ctrl_cmd_new_server(struct sockaddr_qrtr *from,
  366. unsigned int service, unsigned int instance,
  367. unsigned int node_id, unsigned int port)
  368. {
  369. struct qrtr_lookup *lookup;
  370. struct qrtr_server *srv;
  371. struct list_head *li;
  372. int ret = 0;
  373. /* Ignore specified node and port for local servers */
  374. if (from->sq_node == qrtr_ns.local_node) {
  375. node_id = from->sq_node;
  376. port = from->sq_port;
  377. }
  378. srv = server_add(service, instance, node_id, port);
  379. if (!srv)
  380. return -EINVAL;
  381. if (srv->node == qrtr_ns.local_node) {
  382. ret = service_announce_new(&qrtr_ns.bcast_sq, srv);
  383. if (ret < 0) {
  384. pr_err("failed to announce new service\n");
  385. return ret;
  386. }
  387. }
  388. /* Notify any potential lookups about the new server */
  389. list_for_each(li, &qrtr_ns.lookups) {
  390. lookup = container_of(li, struct qrtr_lookup, li);
  391. if (lookup->service && lookup->service != service)
  392. continue;
  393. if (lookup->instance && lookup->instance != instance)
  394. continue;
  395. lookup_notify(&lookup->sq, srv, true);
  396. }
  397. return ret;
  398. }
  399. static int ctrl_cmd_del_server(struct sockaddr_qrtr *from,
  400. unsigned int service, unsigned int instance,
  401. unsigned int node_id, unsigned int port)
  402. {
  403. struct qrtr_node *node;
  404. /* Ignore specified node and port for local servers*/
  405. if (from->sq_node == qrtr_ns.local_node) {
  406. node_id = from->sq_node;
  407. port = from->sq_port;
  408. }
  409. /* Local servers may only unregister themselves */
  410. if (from->sq_node == qrtr_ns.local_node && from->sq_port != port)
  411. return -EINVAL;
  412. node = node_get(node_id);
  413. if (!node)
  414. return -ENOENT;
  415. server_del(node, port, true);
  416. return 0;
  417. }
  418. static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from,
  419. unsigned int service, unsigned int instance)
  420. {
  421. struct qrtr_server_filter filter;
  422. struct qrtr_lookup *lookup;
  423. struct qrtr_server *srv;
  424. struct qrtr_node *node;
  425. unsigned long node_idx;
  426. unsigned long srv_idx;
  427. /* Accept only local observers */
  428. if (from->sq_node != qrtr_ns.local_node)
  429. return -EINVAL;
  430. lookup = kzalloc(sizeof(*lookup), GFP_KERNEL);
  431. if (!lookup)
  432. return -ENOMEM;
  433. lookup->sq = *from;
  434. lookup->service = service;
  435. lookup->instance = instance;
  436. list_add_tail(&lookup->li, &qrtr_ns.lookups);
  437. memset(&filter, 0, sizeof(filter));
  438. filter.service = service;
  439. filter.instance = instance;
  440. xa_for_each(&nodes, node_idx, node) {
  441. xa_for_each(&node->servers, srv_idx, srv) {
  442. if (!server_match(srv, &filter))
  443. continue;
  444. lookup_notify(from, srv, true);
  445. }
  446. }
  447. /* Empty notification, to indicate end of listing */
  448. lookup_notify(from, NULL, true);
  449. return 0;
  450. }
  451. static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from,
  452. unsigned int service, unsigned int instance)
  453. {
  454. struct qrtr_lookup *lookup;
  455. struct list_head *tmp;
  456. struct list_head *li;
  457. list_for_each_safe(li, tmp, &qrtr_ns.lookups) {
  458. lookup = container_of(li, struct qrtr_lookup, li);
  459. if (lookup->sq.sq_node != from->sq_node)
  460. continue;
  461. if (lookup->sq.sq_port != from->sq_port)
  462. continue;
  463. if (lookup->service != service)
  464. continue;
  465. if (lookup->instance && lookup->instance != instance)
  466. continue;
  467. list_del(&lookup->li);
  468. kfree(lookup);
  469. }
  470. }
  471. static void qrtr_ns_worker(struct work_struct *work)
  472. {
  473. const struct qrtr_ctrl_pkt *pkt;
  474. size_t recv_buf_size = 4096;
  475. struct sockaddr_qrtr sq;
  476. struct msghdr msg = { };
  477. unsigned int cmd;
  478. ssize_t msglen;
  479. void *recv_buf;
  480. struct kvec iv;
  481. int ret;
  482. msg.msg_name = (struct sockaddr *)&sq;
  483. msg.msg_namelen = sizeof(sq);
  484. recv_buf = kzalloc(recv_buf_size, GFP_KERNEL);
  485. if (!recv_buf)
  486. return;
  487. for (;;) {
  488. iv.iov_base = recv_buf;
  489. iv.iov_len = recv_buf_size;
  490. msglen = kernel_recvmsg(qrtr_ns.sock, &msg, &iv, 1,
  491. iv.iov_len, MSG_DONTWAIT);
  492. if (msglen == -EAGAIN)
  493. break;
  494. if (msglen < 0) {
  495. pr_err("error receiving packet: %zd\n", msglen);
  496. break;
  497. }
  498. pkt = recv_buf;
  499. cmd = le32_to_cpu(pkt->cmd);
  500. if (cmd < ARRAY_SIZE(qrtr_ctrl_pkt_strings) &&
  501. qrtr_ctrl_pkt_strings[cmd])
  502. trace_qrtr_ns_message(qrtr_ctrl_pkt_strings[cmd],
  503. sq.sq_node, sq.sq_port);
  504. ret = 0;
  505. switch (cmd) {
  506. case QRTR_TYPE_HELLO:
  507. ret = ctrl_cmd_hello(&sq);
  508. break;
  509. case QRTR_TYPE_BYE:
  510. ret = ctrl_cmd_bye(&sq);
  511. break;
  512. case QRTR_TYPE_DEL_CLIENT:
  513. ret = ctrl_cmd_del_client(&sq,
  514. le32_to_cpu(pkt->client.node),
  515. le32_to_cpu(pkt->client.port));
  516. break;
  517. case QRTR_TYPE_NEW_SERVER:
  518. ret = ctrl_cmd_new_server(&sq,
  519. le32_to_cpu(pkt->server.service),
  520. le32_to_cpu(pkt->server.instance),
  521. le32_to_cpu(pkt->server.node),
  522. le32_to_cpu(pkt->server.port));
  523. break;
  524. case QRTR_TYPE_DEL_SERVER:
  525. ret = ctrl_cmd_del_server(&sq,
  526. le32_to_cpu(pkt->server.service),
  527. le32_to_cpu(pkt->server.instance),
  528. le32_to_cpu(pkt->server.node),
  529. le32_to_cpu(pkt->server.port));
  530. break;
  531. case QRTR_TYPE_EXIT:
  532. case QRTR_TYPE_PING:
  533. case QRTR_TYPE_RESUME_TX:
  534. break;
  535. case QRTR_TYPE_NEW_LOOKUP:
  536. ret = ctrl_cmd_new_lookup(&sq,
  537. le32_to_cpu(pkt->server.service),
  538. le32_to_cpu(pkt->server.instance));
  539. break;
  540. case QRTR_TYPE_DEL_LOOKUP:
  541. ctrl_cmd_del_lookup(&sq,
  542. le32_to_cpu(pkt->server.service),
  543. le32_to_cpu(pkt->server.instance));
  544. break;
  545. }
  546. if (ret < 0)
  547. pr_err("failed while handling packet from %d:%d",
  548. sq.sq_node, sq.sq_port);
  549. }
  550. kfree(recv_buf);
  551. }
  552. static void qrtr_ns_data_ready(struct sock *sk)
  553. {
  554. trace_sk_data_ready(sk);
  555. queue_work(qrtr_ns.workqueue, &qrtr_ns.work);
  556. }
  557. int qrtr_ns_init(void)
  558. {
  559. struct sockaddr_qrtr sq;
  560. int ret;
  561. INIT_LIST_HEAD(&qrtr_ns.lookups);
  562. INIT_WORK(&qrtr_ns.work, qrtr_ns_worker);
  563. ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM,
  564. PF_QIPCRTR, &qrtr_ns.sock);
  565. if (ret < 0)
  566. return ret;
  567. ret = kernel_getsockname(qrtr_ns.sock, (struct sockaddr *)&sq);
  568. if (ret < 0) {
  569. pr_err("failed to get socket name\n");
  570. goto err_sock;
  571. }
  572. qrtr_ns.workqueue = alloc_ordered_workqueue("qrtr_ns_handler", 0);
  573. if (!qrtr_ns.workqueue) {
  574. ret = -ENOMEM;
  575. goto err_sock;
  576. }
  577. qrtr_ns.sock->sk->sk_data_ready = qrtr_ns_data_ready;
  578. sq.sq_port = QRTR_PORT_CTRL;
  579. qrtr_ns.local_node = sq.sq_node;
  580. ret = kernel_bind(qrtr_ns.sock, (struct sockaddr *)&sq, sizeof(sq));
  581. if (ret < 0) {
  582. pr_err("failed to bind to socket\n");
  583. goto err_wq;
  584. }
  585. qrtr_ns.bcast_sq.sq_family = AF_QIPCRTR;
  586. qrtr_ns.bcast_sq.sq_node = QRTR_NODE_BCAST;
  587. qrtr_ns.bcast_sq.sq_port = QRTR_PORT_CTRL;
  588. ret = say_hello(&qrtr_ns.bcast_sq);
  589. if (ret < 0)
  590. goto err_wq;
  591. /* As the qrtr ns socket owner and creator is the same module, we have
  592. * to decrease the qrtr module reference count to guarantee that it
  593. * remains zero after the ns socket is created, otherwise, executing
  594. * "rmmod" command is unable to make the qrtr module deleted after the
  595. * qrtr module is inserted successfully.
  596. *
  597. * However, the reference count is increased twice in
  598. * sock_create_kern(): one is to increase the reference count of owner
  599. * of qrtr socket's proto_ops struct; another is to increment the
  600. * reference count of owner of qrtr proto struct. Therefore, we must
  601. * decrement the module reference count twice to ensure that it keeps
  602. * zero after server's listening socket is created. Of course, we
  603. * must bump the module reference count twice as well before the socket
  604. * is closed.
  605. */
  606. module_put(qrtr_ns.sock->ops->owner);
  607. module_put(qrtr_ns.sock->sk->sk_prot_creator->owner);
  608. return 0;
  609. err_wq:
  610. destroy_workqueue(qrtr_ns.workqueue);
  611. err_sock:
  612. sock_release(qrtr_ns.sock);
  613. return ret;
  614. }
  615. EXPORT_SYMBOL_GPL(qrtr_ns_init);
  616. void qrtr_ns_remove(void)
  617. {
  618. cancel_work_sync(&qrtr_ns.work);
  619. destroy_workqueue(qrtr_ns.workqueue);
  620. /* sock_release() expects the two references that were put during
  621. * qrtr_ns_init(). This function is only called during module remove,
  622. * so try_stop_module() has already set the refcnt to 0. Use
  623. * __module_get() instead of try_module_get() to successfully take two
  624. * references.
  625. */
  626. __module_get(qrtr_ns.sock->ops->owner);
  627. __module_get(qrtr_ns.sock->sk->sk_prot_creator->owner);
  628. sock_release(qrtr_ns.sock);
  629. }
  630. EXPORT_SYMBOL_GPL(qrtr_ns_remove);
  631. MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
  632. MODULE_DESCRIPTION("Qualcomm IPC Router Nameservice");
  633. MODULE_LICENSE("Dual BSD/GPL");