xref: /linux/net/qrtr/ns.c (revision 544d85de4dc22c01badfd8cefa59829ce35c4858)
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 
8 #include <linux/module.h>
9 #include <linux/qrtr.h>
10 #include <linux/workqueue.h>
11 #include <net/sock.h>
12 
13 #include "qrtr.h"
14 
15 #include <trace/events/sock.h>
16 #define CREATE_TRACE_POINTS
17 #include <trace/events/qrtr.h>
18 
19 static DEFINE_XARRAY(nodes);
20 
21 static struct {
22 	struct socket *sock;
23 	struct sockaddr_qrtr bcast_sq;
24 	struct list_head lookups;
25 	u32 lookup_count;
26 	struct workqueue_struct *workqueue;
27 	struct work_struct work;
28 	void (*saved_data_ready)(struct sock *sk);
29 	int local_node;
30 } qrtr_ns;
31 
32 static const char * const qrtr_ctrl_pkt_strings[] = {
33 	[QRTR_TYPE_HELLO]	= "hello",
34 	[QRTR_TYPE_BYE]		= "bye",
35 	[QRTR_TYPE_NEW_SERVER]	= "new-server",
36 	[QRTR_TYPE_DEL_SERVER]	= "del-server",
37 	[QRTR_TYPE_DEL_CLIENT]	= "del-client",
38 	[QRTR_TYPE_RESUME_TX]	= "resume-tx",
39 	[QRTR_TYPE_EXIT]	= "exit",
40 	[QRTR_TYPE_PING]	= "ping",
41 	[QRTR_TYPE_NEW_LOOKUP]	= "new-lookup",
42 	[QRTR_TYPE_DEL_LOOKUP]	= "del-lookup",
43 };
44 
45 struct qrtr_server_filter {
46 	unsigned int service;
47 	unsigned int instance;
48 	unsigned int ifilter;
49 };
50 
51 struct qrtr_lookup {
52 	unsigned int service;
53 	unsigned int instance;
54 
55 	struct sockaddr_qrtr sq;
56 	struct list_head li;
57 };
58 
59 struct qrtr_server {
60 	unsigned int service;
61 	unsigned int instance;
62 
63 	unsigned int node;
64 	unsigned int port;
65 
66 	struct list_head qli;
67 };
68 
69 struct qrtr_node {
70 	unsigned int id;
71 	struct xarray servers;
72 	u32 server_count;
73 };
74 
75 /* Max nodes, server, lookup limits are chosen based on the current platform
76  * requirements. If the requirement changes in the future, these values can be
77  * increased.
78  */
79 #define QRTR_NS_MAX_NODES   512
80 #define QRTR_NS_MAX_SERVERS 256
81 #define QRTR_NS_MAX_LOOKUPS 128
82 
83 static u16 node_count;
84 
85 static struct qrtr_node *node_get(unsigned int node_id)
86 {
87 	struct qrtr_node *node;
88 
89 	node = xa_load(&nodes, node_id);
90 	if (node)
91 		return node;
92 
93 	if (node_count >= QRTR_NS_MAX_NODES) {
94 		pr_err_ratelimited("QRTR clients exceed max node limit!\n");
95 		return NULL;
96 	}
97 
98 	/* If node didn't exist, allocate and insert it to the tree */
99 	node = kzalloc_obj(*node);
100 	if (!node)
101 		return NULL;
102 
103 	node->id = node_id;
104 	xa_init(&node->servers);
105 
106 	if (xa_store(&nodes, node_id, node, GFP_KERNEL)) {
107 		kfree(node);
108 		return NULL;
109 	}
110 
111 	node_count++;
112 
113 	return node;
114 }
115 
116 static int server_match(const struct qrtr_server *srv,
117 			const struct qrtr_server_filter *f)
118 {
119 	unsigned int ifilter = f->ifilter;
120 
121 	if (f->service != 0 && srv->service != f->service)
122 		return 0;
123 	if (!ifilter && f->instance)
124 		ifilter = ~0;
125 
126 	return (srv->instance & ifilter) == f->instance;
127 }
128 
129 static int service_announce_new(struct sockaddr_qrtr *dest,
130 				struct qrtr_server *srv)
131 {
132 	struct qrtr_ctrl_pkt pkt;
133 	struct msghdr msg = { };
134 	struct kvec iv;
135 
136 	trace_qrtr_ns_service_announce_new(srv->service, srv->instance,
137 					   srv->node, srv->port);
138 
139 	iv.iov_base = &pkt;
140 	iv.iov_len = sizeof(pkt);
141 
142 	memset(&pkt, 0, sizeof(pkt));
143 	pkt.cmd = cpu_to_le32(QRTR_TYPE_NEW_SERVER);
144 	pkt.server.service = cpu_to_le32(srv->service);
145 	pkt.server.instance = cpu_to_le32(srv->instance);
146 	pkt.server.node = cpu_to_le32(srv->node);
147 	pkt.server.port = cpu_to_le32(srv->port);
148 
149 	msg.msg_name = (struct sockaddr *)dest;
150 	msg.msg_namelen = sizeof(*dest);
151 
152 	return kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
153 }
154 
155 static void service_announce_del(struct sockaddr_qrtr *dest,
156 				 struct qrtr_server *srv)
157 {
158 	struct qrtr_ctrl_pkt pkt;
159 	struct msghdr msg = { };
160 	struct kvec iv;
161 	int ret;
162 
163 	trace_qrtr_ns_service_announce_del(srv->service, srv->instance,
164 					   srv->node, srv->port);
165 
166 	iv.iov_base = &pkt;
167 	iv.iov_len = sizeof(pkt);
168 
169 	memset(&pkt, 0, sizeof(pkt));
170 	pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_SERVER);
171 	pkt.server.service = cpu_to_le32(srv->service);
172 	pkt.server.instance = cpu_to_le32(srv->instance);
173 	pkt.server.node = cpu_to_le32(srv->node);
174 	pkt.server.port = cpu_to_le32(srv->port);
175 
176 	msg.msg_name = (struct sockaddr *)dest;
177 	msg.msg_namelen = sizeof(*dest);
178 
179 	ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
180 	if (ret < 0 && ret != -ENODEV)
181 		pr_err("failed to announce del service\n");
182 
183 	return;
184 }
185 
186 static void lookup_notify(struct sockaddr_qrtr *to, struct qrtr_server *srv,
187 			  bool new)
188 {
189 	struct qrtr_ctrl_pkt pkt;
190 	struct msghdr msg = { };
191 	struct kvec iv;
192 	int ret;
193 
194 	iv.iov_base = &pkt;
195 	iv.iov_len = sizeof(pkt);
196 
197 	memset(&pkt, 0, sizeof(pkt));
198 	pkt.cmd = new ? cpu_to_le32(QRTR_TYPE_NEW_SERVER) :
199 			cpu_to_le32(QRTR_TYPE_DEL_SERVER);
200 	if (srv) {
201 		pkt.server.service = cpu_to_le32(srv->service);
202 		pkt.server.instance = cpu_to_le32(srv->instance);
203 		pkt.server.node = cpu_to_le32(srv->node);
204 		pkt.server.port = cpu_to_le32(srv->port);
205 	}
206 
207 	msg.msg_name = (struct sockaddr *)to;
208 	msg.msg_namelen = sizeof(*to);
209 
210 	ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
211 	if (ret < 0 && ret != -ENODEV)
212 		pr_err("failed to send lookup notification\n");
213 }
214 
215 /* Announce the list of servers registered on the local node */
216 static int announce_servers(struct sockaddr_qrtr *sq)
217 {
218 	struct qrtr_server *srv;
219 	struct qrtr_node *node;
220 	unsigned long index;
221 	int ret;
222 
223 	node = node_get(qrtr_ns.local_node);
224 	if (!node)
225 		return 0;
226 
227 	/* Announce the list of servers registered in this node */
228 	xa_for_each(&node->servers, index, srv) {
229 		ret = service_announce_new(sq, srv);
230 		if (ret < 0) {
231 			if (ret == -ENODEV)
232 				continue;
233 
234 			pr_err("failed to announce new service\n");
235 			return ret;
236 		}
237 	}
238 	return 0;
239 }
240 
241 static struct qrtr_server *server_add(unsigned int service,
242 				      unsigned int instance,
243 				      unsigned int node_id,
244 				      unsigned int port)
245 {
246 	struct qrtr_server *srv;
247 	struct qrtr_server *old;
248 	struct qrtr_node *node;
249 
250 	if (!service || !port)
251 		return NULL;
252 
253 	node = node_get(node_id);
254 	if (!node)
255 		return NULL;
256 
257 	/* Make sure the new servers per port are capped at the maximum value */
258 	old = xa_load(&node->servers, port);
259 	if (!old && node->server_count >= QRTR_NS_MAX_SERVERS) {
260 		pr_err_ratelimited("QRTR client node %u exceeds max server limit!\n", node_id);
261 		return NULL;
262 	}
263 
264 	srv = kzalloc_obj(*srv);
265 	if (!srv)
266 		return NULL;
267 
268 	srv->service = service;
269 	srv->instance = instance;
270 	srv->node = node_id;
271 	srv->port = port;
272 
273 	/* Delete the old server on the same port */
274 	old = xa_store(&node->servers, port, srv, GFP_KERNEL);
275 	if (old) {
276 		if (xa_is_err(old)) {
277 			pr_err("failed to add server [0x%x:0x%x] ret:%d\n",
278 			       srv->service, srv->instance, xa_err(old));
279 			goto err;
280 		} else {
281 			kfree(old);
282 		}
283 	} else {
284 		node->server_count++;
285 	}
286 
287 	trace_qrtr_ns_server_add(srv->service, srv->instance,
288 				 srv->node, srv->port);
289 
290 	return srv;
291 
292 err:
293 	kfree(srv);
294 	return NULL;
295 }
296 
297 static int server_del(struct qrtr_node *node, unsigned int port, bool bcast)
298 {
299 	struct qrtr_lookup *lookup;
300 	struct qrtr_server *srv;
301 	struct list_head *li;
302 
303 	srv = xa_load(&node->servers, port);
304 	if (!srv)
305 		return -ENOENT;
306 
307 	xa_erase(&node->servers, port);
308 
309 	/* Broadcast the removal of local servers */
310 	if (srv->node == qrtr_ns.local_node && bcast)
311 		service_announce_del(&qrtr_ns.bcast_sq, srv);
312 
313 	/* Announce the service's disappearance to observers */
314 	list_for_each(li, &qrtr_ns.lookups) {
315 		lookup = container_of(li, struct qrtr_lookup, li);
316 		if (lookup->service && lookup->service != srv->service)
317 			continue;
318 		if (lookup->instance && lookup->instance != srv->instance)
319 			continue;
320 
321 		lookup_notify(&lookup->sq, srv, false);
322 	}
323 
324 	kfree(srv);
325 	node->server_count--;
326 
327 	return 0;
328 }
329 
330 static int ctrl_cmd_hello(struct sockaddr_qrtr *sq)
331 {
332 	return announce_servers(sq);
333 }
334 
335 static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
336 {
337 	struct qrtr_node *local_node;
338 	struct qrtr_ctrl_pkt pkt;
339 	struct qrtr_server *srv;
340 	struct sockaddr_qrtr sq;
341 	struct msghdr msg = { };
342 	struct qrtr_node *node;
343 	unsigned long index;
344 	struct kvec iv;
345 	int ret = 0;
346 
347 	iv.iov_base = &pkt;
348 	iv.iov_len = sizeof(pkt);
349 
350 	node = node_get(from->sq_node);
351 	if (!node)
352 		return 0;
353 
354 	/* Advertise removal of this client to all servers of remote node */
355 	xa_for_each(&node->servers, index, srv)
356 		server_del(node, srv->port, true);
357 
358 	/* Advertise the removal of this client to all local servers */
359 	local_node = node_get(qrtr_ns.local_node);
360 	if (!local_node) {
361 		ret = 0;
362 		goto delete_node;
363 	}
364 
365 	memset(&pkt, 0, sizeof(pkt));
366 	pkt.cmd = cpu_to_le32(QRTR_TYPE_BYE);
367 	pkt.client.node = cpu_to_le32(from->sq_node);
368 
369 	xa_for_each(&local_node->servers, index, srv) {
370 		sq.sq_family = AF_QIPCRTR;
371 		sq.sq_node = srv->node;
372 		sq.sq_port = srv->port;
373 
374 		msg.msg_name = (struct sockaddr *)&sq;
375 		msg.msg_namelen = sizeof(sq);
376 
377 		ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
378 		if (ret < 0 && ret != -ENODEV) {
379 			pr_err("failed to send bye cmd\n");
380 			goto delete_node;
381 		}
382 	}
383 
384 	/* Ignore -ENODEV */
385 	ret = 0;
386 
387 delete_node:
388 	xa_erase(&nodes, from->sq_node);
389 	kfree(node);
390 	node_count--;
391 
392 	return ret;
393 }
394 
395 static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,
396 			       unsigned int node_id, unsigned int port)
397 {
398 	struct qrtr_node *local_node;
399 	struct qrtr_lookup *lookup;
400 	struct qrtr_ctrl_pkt pkt;
401 	struct msghdr msg = { };
402 	struct qrtr_server *srv;
403 	struct sockaddr_qrtr sq;
404 	struct qrtr_node *node;
405 	struct list_head *tmp;
406 	struct list_head *li;
407 	unsigned long index;
408 	struct kvec iv;
409 	int ret;
410 
411 	iv.iov_base = &pkt;
412 	iv.iov_len = sizeof(pkt);
413 
414 	/* Don't accept spoofed messages */
415 	if (from->sq_node != node_id)
416 		return -EINVAL;
417 
418 	/* Local DEL_CLIENT messages comes from the port being closed */
419 	if (from->sq_node == qrtr_ns.local_node && from->sq_port != port)
420 		return -EINVAL;
421 
422 	/* Remove any lookups by this client */
423 	list_for_each_safe(li, tmp, &qrtr_ns.lookups) {
424 		lookup = container_of(li, struct qrtr_lookup, li);
425 		if (lookup->sq.sq_node != node_id)
426 			continue;
427 		if (lookup->sq.sq_port != port)
428 			continue;
429 
430 		list_del(&lookup->li);
431 		kfree(lookup);
432 		qrtr_ns.lookup_count--;
433 	}
434 
435 	/* Remove the server belonging to this port but don't broadcast
436 	 * DEL_SERVER. Neighbours would've already removed the server belonging
437 	 * to this port due to the DEL_CLIENT broadcast from qrtr_port_remove().
438 	 */
439 	node = node_get(node_id);
440 	if (node)
441 		server_del(node, port, false);
442 
443 	/* Advertise the removal of this client to all local servers */
444 	local_node = node_get(qrtr_ns.local_node);
445 	if (!local_node)
446 		return 0;
447 
448 	memset(&pkt, 0, sizeof(pkt));
449 	pkt.cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
450 	pkt.client.node = cpu_to_le32(node_id);
451 	pkt.client.port = cpu_to_le32(port);
452 
453 	xa_for_each(&local_node->servers, index, srv) {
454 		sq.sq_family = AF_QIPCRTR;
455 		sq.sq_node = srv->node;
456 		sq.sq_port = srv->port;
457 
458 		msg.msg_name = (struct sockaddr *)&sq;
459 		msg.msg_namelen = sizeof(sq);
460 
461 		ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
462 		if (ret < 0 && ret != -ENODEV) {
463 			pr_err("failed to send del client cmd\n");
464 			return ret;
465 		}
466 	}
467 	return 0;
468 }
469 
470 static int ctrl_cmd_new_server(struct sockaddr_qrtr *from,
471 			       unsigned int service, unsigned int instance,
472 			       unsigned int node_id, unsigned int port)
473 {
474 	struct qrtr_lookup *lookup;
475 	struct qrtr_server *srv;
476 	struct list_head *li;
477 	int ret = 0;
478 
479 	/* Ignore specified node and port for local servers */
480 	if (from->sq_node == qrtr_ns.local_node) {
481 		node_id = from->sq_node;
482 		port = from->sq_port;
483 	}
484 
485 	srv = server_add(service, instance, node_id, port);
486 	if (!srv)
487 		return -EINVAL;
488 
489 	if (srv->node == qrtr_ns.local_node) {
490 		ret = service_announce_new(&qrtr_ns.bcast_sq, srv);
491 		if (ret < 0) {
492 			pr_err("failed to announce new service\n");
493 			return ret;
494 		}
495 	}
496 
497 	/* Notify any potential lookups about the new server */
498 	list_for_each(li, &qrtr_ns.lookups) {
499 		lookup = container_of(li, struct qrtr_lookup, li);
500 		if (lookup->service && lookup->service != service)
501 			continue;
502 		if (lookup->instance && lookup->instance != instance)
503 			continue;
504 
505 		lookup_notify(&lookup->sq, srv, true);
506 	}
507 
508 	return ret;
509 }
510 
511 static int ctrl_cmd_del_server(struct sockaddr_qrtr *from,
512 			       unsigned int service, unsigned int instance,
513 			       unsigned int node_id, unsigned int port)
514 {
515 	struct qrtr_node *node;
516 
517 	/* Ignore specified node and port for local servers*/
518 	if (from->sq_node == qrtr_ns.local_node) {
519 		node_id = from->sq_node;
520 		port = from->sq_port;
521 	}
522 
523 	/* Local servers may only unregister themselves */
524 	if (from->sq_node == qrtr_ns.local_node && from->sq_port != port)
525 		return -EINVAL;
526 
527 	node = node_get(node_id);
528 	if (!node)
529 		return -ENOENT;
530 
531 	server_del(node, port, true);
532 
533 	return 0;
534 }
535 
536 static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from,
537 			       unsigned int service, unsigned int instance)
538 {
539 	struct qrtr_server_filter filter;
540 	struct qrtr_lookup *lookup;
541 	struct qrtr_server *srv;
542 	struct qrtr_node *node;
543 	unsigned long node_idx;
544 	unsigned long srv_idx;
545 
546 	/* Accept only local observers */
547 	if (from->sq_node != qrtr_ns.local_node)
548 		return -EINVAL;
549 
550 	if (qrtr_ns.lookup_count >= QRTR_NS_MAX_LOOKUPS) {
551 		pr_err_ratelimited("QRTR client node exceeds max lookup limit!\n");
552 		return -ENOSPC;
553 	}
554 
555 	lookup = kzalloc_obj(*lookup);
556 	if (!lookup)
557 		return -ENOMEM;
558 
559 	lookup->sq = *from;
560 	lookup->service = service;
561 	lookup->instance = instance;
562 	list_add_tail(&lookup->li, &qrtr_ns.lookups);
563 	qrtr_ns.lookup_count++;
564 
565 	memset(&filter, 0, sizeof(filter));
566 	filter.service = service;
567 	filter.instance = instance;
568 
569 	xa_for_each(&nodes, node_idx, node) {
570 		xa_for_each(&node->servers, srv_idx, srv) {
571 			if (!server_match(srv, &filter))
572 				continue;
573 
574 			lookup_notify(from, srv, true);
575 		}
576 	}
577 
578 	/* Empty notification, to indicate end of listing */
579 	lookup_notify(from, NULL, true);
580 
581 	return 0;
582 }
583 
584 static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from,
585 				unsigned int service, unsigned int instance)
586 {
587 	struct qrtr_lookup *lookup;
588 	struct list_head *tmp;
589 	struct list_head *li;
590 
591 	list_for_each_safe(li, tmp, &qrtr_ns.lookups) {
592 		lookup = container_of(li, struct qrtr_lookup, li);
593 		if (lookup->sq.sq_node != from->sq_node)
594 			continue;
595 		if (lookup->sq.sq_port != from->sq_port)
596 			continue;
597 		if (lookup->service != service)
598 			continue;
599 		if (lookup->instance && lookup->instance != instance)
600 			continue;
601 
602 		list_del(&lookup->li);
603 		kfree(lookup);
604 		qrtr_ns.lookup_count--;
605 	}
606 }
607 
608 static void qrtr_ns_worker(struct work_struct *work)
609 {
610 	const struct qrtr_ctrl_pkt *pkt;
611 	size_t recv_buf_size = 4096;
612 	struct sockaddr_qrtr sq;
613 	struct msghdr msg = { };
614 	unsigned int cmd;
615 	ssize_t msglen;
616 	void *recv_buf;
617 	struct kvec iv;
618 	int ret;
619 
620 	msg.msg_name = (struct sockaddr *)&sq;
621 	msg.msg_namelen = sizeof(sq);
622 
623 	recv_buf = kzalloc(recv_buf_size, GFP_KERNEL);
624 	if (!recv_buf)
625 		return;
626 
627 	for (;;) {
628 		iv.iov_base = recv_buf;
629 		iv.iov_len = recv_buf_size;
630 
631 		msglen = kernel_recvmsg(qrtr_ns.sock, &msg, &iv, 1,
632 					iv.iov_len, MSG_DONTWAIT);
633 
634 		if (msglen == -EAGAIN)
635 			break;
636 
637 		if (msglen < 0) {
638 			pr_err("error receiving packet: %zd\n", msglen);
639 			break;
640 		}
641 
642 		pkt = recv_buf;
643 		cmd = le32_to_cpu(pkt->cmd);
644 		if (cmd < ARRAY_SIZE(qrtr_ctrl_pkt_strings) &&
645 		    qrtr_ctrl_pkt_strings[cmd])
646 			trace_qrtr_ns_message(qrtr_ctrl_pkt_strings[cmd],
647 					      sq.sq_node, sq.sq_port);
648 
649 		ret = 0;
650 		switch (cmd) {
651 		case QRTR_TYPE_HELLO:
652 			ret = ctrl_cmd_hello(&sq);
653 			break;
654 		case QRTR_TYPE_BYE:
655 			ret = ctrl_cmd_bye(&sq);
656 			break;
657 		case QRTR_TYPE_DEL_CLIENT:
658 			ret = ctrl_cmd_del_client(&sq,
659 					le32_to_cpu(pkt->client.node),
660 					le32_to_cpu(pkt->client.port));
661 			break;
662 		case QRTR_TYPE_NEW_SERVER:
663 			ret = ctrl_cmd_new_server(&sq,
664 					le32_to_cpu(pkt->server.service),
665 					le32_to_cpu(pkt->server.instance),
666 					le32_to_cpu(pkt->server.node),
667 					le32_to_cpu(pkt->server.port));
668 			break;
669 		case QRTR_TYPE_DEL_SERVER:
670 			ret = ctrl_cmd_del_server(&sq,
671 					 le32_to_cpu(pkt->server.service),
672 					 le32_to_cpu(pkt->server.instance),
673 					 le32_to_cpu(pkt->server.node),
674 					 le32_to_cpu(pkt->server.port));
675 			break;
676 		case QRTR_TYPE_EXIT:
677 		case QRTR_TYPE_PING:
678 		case QRTR_TYPE_RESUME_TX:
679 			break;
680 		case QRTR_TYPE_NEW_LOOKUP:
681 			ret = ctrl_cmd_new_lookup(&sq,
682 					 le32_to_cpu(pkt->server.service),
683 					 le32_to_cpu(pkt->server.instance));
684 			break;
685 		case QRTR_TYPE_DEL_LOOKUP:
686 			ctrl_cmd_del_lookup(&sq,
687 				    le32_to_cpu(pkt->server.service),
688 				    le32_to_cpu(pkt->server.instance));
689 			break;
690 		}
691 
692 		if (ret < 0)
693 			pr_err_ratelimited("failed while handling packet from %d:%d",
694 			       sq.sq_node, sq.sq_port);
695 	}
696 
697 	kfree(recv_buf);
698 }
699 
700 static void qrtr_ns_data_ready(struct sock *sk)
701 {
702 	trace_sk_data_ready(sk);
703 
704 	queue_work(qrtr_ns.workqueue, &qrtr_ns.work);
705 }
706 
707 int qrtr_ns_init(void)
708 {
709 	struct sockaddr_qrtr sq;
710 	int ret;
711 
712 	INIT_LIST_HEAD(&qrtr_ns.lookups);
713 	INIT_WORK(&qrtr_ns.work, qrtr_ns_worker);
714 
715 	ret = sock_create_kern(&init_net, AF_QIPCRTR, SOCK_DGRAM,
716 			       PF_QIPCRTR, &qrtr_ns.sock);
717 	if (ret < 0)
718 		return ret;
719 
720 	ret = kernel_getsockname(qrtr_ns.sock, (struct sockaddr *)&sq);
721 	if (ret < 0) {
722 		pr_err("failed to get socket name\n");
723 		goto err_sock;
724 	}
725 
726 	qrtr_ns.workqueue = alloc_ordered_workqueue("qrtr_ns_handler", 0);
727 	if (!qrtr_ns.workqueue) {
728 		ret = -ENOMEM;
729 		goto err_sock;
730 	}
731 
732 	qrtr_ns.saved_data_ready = qrtr_ns.sock->sk->sk_data_ready;
733 	qrtr_ns.sock->sk->sk_data_ready = qrtr_ns_data_ready;
734 
735 	sq.sq_port = QRTR_PORT_CTRL;
736 	qrtr_ns.local_node = sq.sq_node;
737 
738 	ret = kernel_bind(qrtr_ns.sock, (struct sockaddr_unsized *)&sq, sizeof(sq));
739 	if (ret < 0) {
740 		pr_err("failed to bind to socket\n");
741 		goto err_wq;
742 	}
743 
744 	qrtr_ns.bcast_sq.sq_family = AF_QIPCRTR;
745 	qrtr_ns.bcast_sq.sq_node = QRTR_NODE_BCAST;
746 	qrtr_ns.bcast_sq.sq_port = QRTR_PORT_CTRL;
747 
748 	/* As the qrtr ns socket owner and creator is the same module, we have
749 	 * to decrease the qrtr module reference count to guarantee that it
750 	 * remains zero after the ns socket is created, otherwise, executing
751 	 * "rmmod" command is unable to make the qrtr module deleted after the
752 	 *  qrtr module is inserted successfully.
753 	 *
754 	 * However, the reference count is increased twice in
755 	 * sock_create_kern(): one is to increase the reference count of owner
756 	 * of qrtr socket's proto_ops struct; another is to increment the
757 	 * reference count of owner of qrtr proto struct. Therefore, we must
758 	 * decrement the module reference count twice to ensure that it keeps
759 	 * zero after server's listening socket is created. Of course, we
760 	 * must bump the module reference count twice as well before the socket
761 	 * is closed.
762 	 */
763 	module_put(qrtr_ns.sock->ops->owner);
764 	module_put(qrtr_ns.sock->sk->sk_prot_creator->owner);
765 
766 	return 0;
767 
768 err_wq:
769 	write_lock_bh(&qrtr_ns.sock->sk->sk_callback_lock);
770 	qrtr_ns.sock->sk->sk_data_ready = qrtr_ns.saved_data_ready;
771 	write_unlock_bh(&qrtr_ns.sock->sk->sk_callback_lock);
772 
773 	destroy_workqueue(qrtr_ns.workqueue);
774 err_sock:
775 	sock_release(qrtr_ns.sock);
776 	return ret;
777 }
778 EXPORT_SYMBOL_GPL(qrtr_ns_init);
779 
780 void qrtr_ns_remove(void)
781 {
782 	write_lock_bh(&qrtr_ns.sock->sk->sk_callback_lock);
783 	qrtr_ns.sock->sk->sk_data_ready = qrtr_ns.saved_data_ready;
784 	write_unlock_bh(&qrtr_ns.sock->sk->sk_callback_lock);
785 
786 	cancel_work_sync(&qrtr_ns.work);
787 	synchronize_net();
788 	destroy_workqueue(qrtr_ns.workqueue);
789 
790 	/* sock_release() expects the two references that were put during
791 	 * qrtr_ns_init(). This function is only called during module remove,
792 	 * so try_stop_module() has already set the refcnt to 0. Use
793 	 * __module_get() instead of try_module_get() to successfully take two
794 	 * references.
795 	 */
796 	__module_get(qrtr_ns.sock->ops->owner);
797 	__module_get(qrtr_ns.sock->sk->sk_prot_creator->owner);
798 	sock_release(qrtr_ns.sock);
799 }
800 EXPORT_SYMBOL_GPL(qrtr_ns_remove);
801 
802 MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
803 MODULE_DESCRIPTION("Qualcomm IPC Router Nameservice");
804 MODULE_LICENSE("Dual BSD/GPL");
805