blob: a84fc11e71302f878b7c502ee5b70404310f2518 [file] [log] [blame]
Karthikeyan Ramasubramanian6a116d62016-09-16 16:05:32 -06001/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/module.h>
14#include <linux/types.h>
15#include <linux/net.h>
16#include <linux/socket.h>
17#include <linux/errno.h>
18#include <linux/mm.h>
19#include <linux/poll.h>
20#include <linux/fcntl.h>
21#include <linux/gfp.h>
22#include <linux/msm_ipc.h>
23#include <linux/sched.h>
24#include <linux/thread_info.h>
25#include <linux/slab.h>
26#include <linux/kmemleak.h>
27#include <linux/ipc_logging.h>
28#include <linux/string.h>
29#include <linux/atomic.h>
30#include <linux/ipc_router.h>
31
32#include <net/sock.h>
33
34#include "ipc_router_private.h"
35#include "ipc_router_security.h"
36
37#define msm_ipc_sk(sk) ((struct msm_ipc_sock *)(sk))
38#define msm_ipc_sk_port(sk) ((struct msm_ipc_port *)(msm_ipc_sk(sk)->port))
39
40#ifndef SIZE_MAX
41#define SIZE_MAX ((size_t)-1)
42#endif
43
44static int sockets_enabled;
45static struct proto msm_ipc_proto;
46static const struct proto_ops msm_ipc_proto_ops;
47static RAW_NOTIFIER_HEAD(ipcrtr_af_init_chain);
48static DEFINE_MUTEX(ipcrtr_af_init_lock);
49
50static struct sk_buff_head *msm_ipc_router_build_msg(struct msghdr *m,
51 size_t total_len)
52{
53 struct sk_buff_head *msg_head;
54 struct sk_buff *msg;
55 int first = 1;
56 int last = 1;
57 size_t data_size = 0;
58 size_t alloc_size, align_size;
59 void *data;
60 size_t total_copied_size = 0, copied_size;
61
62 if (iov_iter_count(&m->msg_iter) == total_len)
63 data_size = total_len;
64
65 if (!data_size)
66 return NULL;
67 align_size = ALIGN_SIZE(data_size);
68
69 msg_head = kmalloc(sizeof(*msg_head), GFP_KERNEL);
70 if (!msg_head) {
71 IPC_RTR_ERR("%s: cannot allocate skb_head\n", __func__);
72 return NULL;
73 }
74 skb_queue_head_init(msg_head);
75
76 while (total_copied_size < total_len) {
77 alloc_size = data_size;
78 if (first)
79 alloc_size += IPC_ROUTER_HDR_SIZE;
80 if (last)
81 alloc_size += align_size;
82
83 msg = alloc_skb(alloc_size, GFP_KERNEL);
84 if (!msg) {
85 if (alloc_size <= (PAGE_SIZE / 2)) {
86 IPC_RTR_ERR("%s: cannot allocated skb\n",
87 __func__);
88 goto msg_build_failure;
89 }
90 data_size = data_size / 2;
91 last = 0;
92 continue;
93 }
94
95 if (first) {
96 skb_reserve(msg, IPC_ROUTER_HDR_SIZE);
97 first = 0;
98 }
99
100 data = skb_put(msg, data_size);
101 copied_size = copy_from_iter(msg->data, data_size,
102 &m->msg_iter);
103 if (copied_size != data_size) {
104 IPC_RTR_ERR("%s: copy_from_iter failed %zu %zu %zu\n",
105 __func__, alloc_size, data_size,
106 copied_size);
107 kfree_skb(msg);
108 goto msg_build_failure;
109 }
110 skb_queue_tail(msg_head, msg);
111 total_copied_size += data_size;
112 data_size = total_len - total_copied_size;
113 last = 1;
114 }
115 return msg_head;
116
117msg_build_failure:
118 while (!skb_queue_empty(msg_head)) {
119 msg = skb_dequeue(msg_head);
120 kfree_skb(msg);
121 }
122 kfree(msg_head);
123 return NULL;
124}
125
126static int msm_ipc_router_extract_msg(struct msghdr *m,
127 struct rr_packet *pkt)
128{
129 struct sockaddr_msm_ipc *addr;
130 struct rr_header_v1 *hdr;
131 struct sk_buff *temp;
132 union rr_control_msg *ctl_msg;
133 int offset = 0, data_len = 0, copy_len, copied_len;
134
135 if (!m || !pkt) {
136 IPC_RTR_ERR("%s: Invalid pointers passed\n", __func__);
137 return -EINVAL;
138 }
139 addr = (struct sockaddr_msm_ipc *)m->msg_name;
140
141 hdr = &pkt->hdr;
142 if (addr && (hdr->type == IPC_ROUTER_CTRL_CMD_RESUME_TX)) {
143 temp = skb_peek(pkt->pkt_fragment_q);
144 ctl_msg = (union rr_control_msg *)(temp->data);
145 addr->family = AF_MSM_IPC;
146 addr->address.addrtype = MSM_IPC_ADDR_ID;
147 addr->address.addr.port_addr.node_id = ctl_msg->cli.node_id;
148 addr->address.addr.port_addr.port_id = ctl_msg->cli.port_id;
149 m->msg_namelen = sizeof(struct sockaddr_msm_ipc);
150 return offset;
151 }
152 if (addr && (hdr->type == IPC_ROUTER_CTRL_CMD_DATA)) {
153 addr->family = AF_MSM_IPC;
154 addr->address.addrtype = MSM_IPC_ADDR_ID;
155 addr->address.addr.port_addr.node_id = hdr->src_node_id;
156 addr->address.addr.port_addr.port_id = hdr->src_port_id;
157 m->msg_namelen = sizeof(struct sockaddr_msm_ipc);
158 }
159
160 data_len = hdr->size;
161 skb_queue_walk(pkt->pkt_fragment_q, temp) {
162 copy_len = data_len < temp->len ? data_len : temp->len;
163 copied_len = copy_to_iter(temp->data, copy_len, &m->msg_iter);
164 if (copy_len != copied_len) {
165 IPC_RTR_ERR("%s: Copy to user failed\n", __func__);
166 return -EFAULT;
167 }
168 offset += copy_len;
169 data_len -= copy_len;
170 }
171 return offset;
172}
173
174static int msm_ipc_router_create(struct net *net,
175 struct socket *sock,
176 int protocol,
177 int kern)
178{
179 struct sock *sk;
180 struct msm_ipc_port *port_ptr;
181
182 if (unlikely(protocol != 0)) {
183 IPC_RTR_ERR("%s: Protocol not supported\n", __func__);
184 return -EPROTONOSUPPORT;
185 }
186
187 switch (sock->type) {
188 case SOCK_DGRAM:
189 break;
190 default:
191 IPC_RTR_ERR("%s: Protocol type not supported\n", __func__);
192 return -EPROTOTYPE;
193 }
194
195 sk = sk_alloc(net, AF_MSM_IPC, GFP_KERNEL, &msm_ipc_proto, kern);
196 if (!sk) {
197 IPC_RTR_ERR("%s: sk_alloc failed\n", __func__);
198 return -ENOMEM;
199 }
200
201 sock->ops = &msm_ipc_proto_ops;
202 sock_init_data(sock, sk);
203 sk->sk_data_ready = NULL;
204 sk->sk_write_space = ipc_router_dummy_write_space;
205 sk->sk_rcvtimeo = DEFAULT_RCV_TIMEO;
206 sk->sk_sndtimeo = DEFAULT_SND_TIMEO;
207
208 port_ptr = msm_ipc_router_create_raw_port(sk, NULL, NULL);
209 if (!port_ptr) {
210 IPC_RTR_ERR("%s: port_ptr alloc failed\n", __func__);
211 sock_put(sk);
212 sock->sk = NULL;
213 return -ENOMEM;
214 }
215
216 port_ptr->check_send_permissions = msm_ipc_check_send_permissions;
217 msm_ipc_sk(sk)->port = port_ptr;
218 msm_ipc_sk(sk)->default_node_vote_info = NULL;
219
220 return 0;
221}
222
223int msm_ipc_router_bind(struct socket *sock, struct sockaddr *uaddr,
224 int uaddr_len)
225{
226 struct sockaddr_msm_ipc *addr = (struct sockaddr_msm_ipc *)uaddr;
227 struct sock *sk = sock->sk;
228 struct msm_ipc_port *port_ptr;
229 int ret;
230
231 if (!sk)
232 return -EINVAL;
233
234 if (!check_permissions()) {
235 IPC_RTR_ERR("%s: %s Do not have permissions\n",
236 __func__, current->comm);
237 return -EPERM;
238 }
239
240 if (!uaddr_len) {
241 IPC_RTR_ERR("%s: Invalid address length\n", __func__);
242 return -EINVAL;
243 }
244
245 if (addr->family != AF_MSM_IPC) {
246 IPC_RTR_ERR("%s: Address family is incorrect\n", __func__);
247 return -EAFNOSUPPORT;
248 }
249
250 if (addr->address.addrtype != MSM_IPC_ADDR_NAME) {
251 IPC_RTR_ERR("%s: Address type is incorrect\n", __func__);
252 return -EINVAL;
253 }
254
255 port_ptr = msm_ipc_sk_port(sk);
256 if (!port_ptr)
257 return -ENODEV;
258
259 if (!msm_ipc_sk(sk)->default_node_vote_info)
260 msm_ipc_sk(sk)->default_node_vote_info =
261 msm_ipc_load_default_node();
262 lock_sock(sk);
263
264 ret = msm_ipc_router_register_server(port_ptr, &addr->address);
265
266 release_sock(sk);
267 return ret;
268}
269
270static int ipc_router_connect(struct socket *sock, struct sockaddr *uaddr,
271 int uaddr_len, int flags)
272{
273 struct sockaddr_msm_ipc *addr = (struct sockaddr_msm_ipc *)uaddr;
274 struct sock *sk = sock->sk;
275 struct msm_ipc_port *port_ptr;
276 int ret;
277
278 if (!sk)
279 return -EINVAL;
280
281 if (uaddr_len <= 0) {
282 IPC_RTR_ERR("%s: Invalid address length\n", __func__);
283 return -EINVAL;
284 }
285
286 if (!addr) {
287 IPC_RTR_ERR("%s: Invalid address\n", __func__);
288 return -EINVAL;
289 }
290
291 if (addr->family != AF_MSM_IPC) {
292 IPC_RTR_ERR("%s: Address family is incorrect\n", __func__);
293 return -EAFNOSUPPORT;
294 }
295
296 port_ptr = msm_ipc_sk_port(sk);
297 if (!port_ptr)
298 return -ENODEV;
299
300 lock_sock(sk);
301 ret = ipc_router_set_conn(port_ptr, &addr->address);
302 release_sock(sk);
303 return ret;
304}
305
306static int msm_ipc_router_sendmsg(struct socket *sock,
307 struct msghdr *m, size_t total_len)
308{
309 struct sock *sk = sock->sk;
310 struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
311 struct sockaddr_msm_ipc *dest = (struct sockaddr_msm_ipc *)m->msg_name;
312 struct sk_buff_head *msg;
313 int ret;
314 struct msm_ipc_addr dest_addr = {0};
315 long timeout;
316
317 if (dest) {
318 if (m->msg_namelen < sizeof(*dest) ||
319 dest->family != AF_MSM_IPC)
320 return -EINVAL;
321 memcpy(&dest_addr, &dest->address, sizeof(dest_addr));
322 } else {
323 if (port_ptr->conn_status == NOT_CONNECTED)
324 return -EDESTADDRREQ;
325 if (port_ptr->conn_status < CONNECTION_RESET)
326 return -ENETRESET;
327 memcpy(&dest_addr.addr.port_addr, &port_ptr->dest_addr,
328 sizeof(struct msm_ipc_port_addr));
329 dest_addr.addrtype = MSM_IPC_ADDR_ID;
330 }
331
332 if (total_len > MAX_IPC_PKT_SIZE)
333 return -EINVAL;
334
335 lock_sock(sk);
336 timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
337 msg = msm_ipc_router_build_msg(m, total_len);
338 if (!msg) {
339 IPC_RTR_ERR("%s: Msg build failure\n", __func__);
340 ret = -ENOMEM;
341 goto out_sendmsg;
342 }
343 kmemleak_not_leak(msg);
344
345 if (port_ptr->type == CLIENT_PORT)
346 wait_for_irsc_completion();
347 ret = msm_ipc_router_send_to(port_ptr, msg, &dest_addr, timeout);
348 if (ret != total_len) {
349 if (ret < 0) {
350 if (ret != -EAGAIN)
351 IPC_RTR_ERR("%s: Send_to failure %d\n",
352 __func__, ret);
353 msm_ipc_router_free_skb(msg);
354 } else if (ret >= 0) {
355 ret = -EFAULT;
356 }
357 }
358
359out_sendmsg:
360 release_sock(sk);
361 return ret;
362}
363
364static int msm_ipc_router_recvmsg(struct socket *sock,
365 struct msghdr *m, size_t buf_len, int flags)
366{
367 struct sock *sk = sock->sk;
368 struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
369 struct rr_packet *pkt;
370 long timeout;
371 int ret;
372
373 lock_sock(sk);
374 if (!buf_len) {
375 if (flags & MSG_PEEK)
376 ret = msm_ipc_router_get_curr_pkt_size(port_ptr);
377 else
378 ret = -EINVAL;
379 release_sock(sk);
380 return ret;
381 }
382 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
383
384 ret = msm_ipc_router_rx_data_wait(port_ptr, timeout);
385 if (ret) {
386 release_sock(sk);
387 if (ret == -ENOMSG)
388 m->msg_namelen = 0;
389 return ret;
390 }
391
392 ret = msm_ipc_router_read(port_ptr, &pkt, buf_len);
393 if (ret <= 0 || !pkt) {
394 release_sock(sk);
395 return ret;
396 }
397
398 ret = msm_ipc_router_extract_msg(m, pkt);
399 release_pkt(pkt);
400 release_sock(sk);
401 return ret;
402}
403
404static int msm_ipc_router_ioctl(struct socket *sock,
405 unsigned int cmd, unsigned long arg)
406{
407 struct sock *sk = sock->sk;
408 struct msm_ipc_port *port_ptr;
409 struct server_lookup_args server_arg;
410 struct msm_ipc_server_info *srv_info = NULL;
411 unsigned int n;
412 size_t srv_info_sz = 0;
413 int ret;
414
415 if (!sk)
416 return -EINVAL;
417
418 lock_sock(sk);
419 port_ptr = msm_ipc_sk_port(sock->sk);
420 if (!port_ptr) {
421 release_sock(sk);
422 return -EINVAL;
423 }
424
425 switch (cmd) {
426 case IPC_ROUTER_IOCTL_GET_VERSION:
427 n = IPC_ROUTER_V1;
428 ret = put_user(n, (unsigned int *)arg);
429 break;
430
431 case IPC_ROUTER_IOCTL_GET_MTU:
432 n = (MAX_IPC_PKT_SIZE - IPC_ROUTER_HDR_SIZE);
433 ret = put_user(n, (unsigned int *)arg);
434 break;
435
436 case IPC_ROUTER_IOCTL_GET_CURR_PKT_SIZE:
437 ret = msm_ipc_router_get_curr_pkt_size(port_ptr);
438 break;
439
440 case IPC_ROUTER_IOCTL_LOOKUP_SERVER:
441 if (!msm_ipc_sk(sk)->default_node_vote_info)
442 msm_ipc_sk(sk)->default_node_vote_info =
443 msm_ipc_load_default_node();
444
445 ret = copy_from_user(&server_arg, (void *)arg,
446 sizeof(server_arg));
447 if (ret) {
448 ret = -EFAULT;
449 break;
450 }
451
452 if (server_arg.num_entries_in_array < 0) {
453 ret = -EINVAL;
454 break;
455 }
456 if (server_arg.num_entries_in_array) {
457 if (server_arg.num_entries_in_array >
458 (SIZE_MAX / sizeof(*srv_info))) {
459 IPC_RTR_ERR("%s: Integer Overflow %zu * %d\n",
460 __func__, sizeof(*srv_info),
461 server_arg.num_entries_in_array);
462 ret = -EINVAL;
463 break;
464 }
465 srv_info_sz = server_arg.num_entries_in_array *
466 sizeof(*srv_info);
467 srv_info = kmalloc(srv_info_sz, GFP_KERNEL);
468 if (!srv_info) {
469 ret = -ENOMEM;
470 break;
471 }
472 }
473 ret = msm_ipc_router_lookup_server_name
474 (&server_arg.port_name, srv_info,
475 server_arg.num_entries_in_array,
476 server_arg.lookup_mask);
477 if (ret < 0) {
478 IPC_RTR_ERR("%s: Server not found\n", __func__);
479 ret = -ENODEV;
480 kfree(srv_info);
481 break;
482 }
483 server_arg.num_entries_found = ret;
484
485 ret = copy_to_user((void *)arg, &server_arg,
486 sizeof(server_arg));
487
488 n = min(server_arg.num_entries_found,
489 server_arg.num_entries_in_array);
490
491 if (ret == 0 && n) {
492 ret = copy_to_user((void *)(arg + sizeof(server_arg)),
493 srv_info, n * sizeof(*srv_info));
494 }
495
496 if (ret)
497 ret = -EFAULT;
498 kfree(srv_info);
499 break;
500
501 case IPC_ROUTER_IOCTL_BIND_CONTROL_PORT:
502 ret = msm_ipc_router_bind_control_port(port_ptr);
503 break;
504
505 case IPC_ROUTER_IOCTL_CONFIG_SEC_RULES:
506 ret = msm_ipc_config_sec_rules((void *)arg);
507 if (ret != -EPERM)
508 port_ptr->type = IRSC_PORT;
509 break;
510
511 default:
512 ret = -EINVAL;
513 }
514 release_sock(sk);
515 return ret;
516}
517
518static unsigned int msm_ipc_router_poll(struct file *file, struct socket *sock,
519 poll_table *wait)
520{
521 struct sock *sk = sock->sk;
522 struct msm_ipc_port *port_ptr;
523 u32 mask = 0;
524
525 if (!sk)
526 return -EINVAL;
527
528 port_ptr = msm_ipc_sk_port(sk);
529 if (!port_ptr)
530 return -EINVAL;
531
532 poll_wait(file, &port_ptr->port_rx_wait_q, wait);
533
534 if (!list_empty(&port_ptr->port_rx_q))
535 mask |= (POLLRDNORM | POLLIN);
536
537 if (port_ptr->conn_status == CONNECTION_RESET)
538 mask |= (POLLHUP | POLLERR);
539
540 return mask;
541}
542
543static int msm_ipc_router_close(struct socket *sock)
544{
545 struct sock *sk = sock->sk;
546 struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk);
547 int ret;
548
549 lock_sock(sk);
550 ret = msm_ipc_router_close_port(port_ptr);
551 msm_ipc_unload_default_node(msm_ipc_sk(sk)->default_node_vote_info);
552 release_sock(sk);
553 sock_put(sk);
554 sock->sk = NULL;
555
556 return ret;
557}
558
559/**
560 * register_ipcrtr_af_init_notifier() - Register for ipc router socket
561 * address family initialization callback
562 * @nb: Notifier block which will be notified when address family is
563 * initialized.
564 *
565 * Return: 0 on success, standard error code otherwise.
566 */
567int register_ipcrtr_af_init_notifier(struct notifier_block *nb)
568{
569 int ret;
570
571 if (!nb)
572 return -EINVAL;
573 mutex_lock(&ipcrtr_af_init_lock);
574 if (sockets_enabled)
575 nb->notifier_call(nb, IPCRTR_AF_INIT, NULL);
576 ret = raw_notifier_chain_register(&ipcrtr_af_init_chain, nb);
577 mutex_unlock(&ipcrtr_af_init_lock);
578 return ret;
579}
580EXPORT_SYMBOL(register_ipcrtr_af_init_notifier);
581
582/**
583 * unregister_ipcrtr_af_init_notifier() - Unregister for ipc router socket
584 * address family initialization callback
585 * @nb: Notifier block which will be notified once address family is
586 * initialized.
587 *
588 * Return: 0 on success, standard error code otherwise.
589 */
590int unregister_ipcrtr_af_init_notifier(struct notifier_block *nb)
591{
592 int ret;
593
594 if (!nb)
595 return -EINVAL;
596 ret = raw_notifier_chain_unregister(&ipcrtr_af_init_chain, nb);
597 return ret;
598}
599EXPORT_SYMBOL(unregister_ipcrtr_af_init_notifier);
600
601static const struct net_proto_family msm_ipc_family_ops = {
602 .owner = THIS_MODULE,
603 .family = AF_MSM_IPC,
604 .create = msm_ipc_router_create
605};
606
607static const struct proto_ops msm_ipc_proto_ops = {
608 .family = AF_MSM_IPC,
609 .owner = THIS_MODULE,
610 .release = msm_ipc_router_close,
611 .bind = msm_ipc_router_bind,
612 .connect = ipc_router_connect,
613 .socketpair = sock_no_socketpair,
614 .accept = sock_no_accept,
615 .getname = sock_no_getname,
616 .poll = msm_ipc_router_poll,
617 .ioctl = msm_ipc_router_ioctl,
618#ifdef CONFIG_COMPAT
619 .compat_ioctl = msm_ipc_router_ioctl,
620#endif
621 .listen = sock_no_listen,
622 .shutdown = sock_no_shutdown,
623 .setsockopt = sock_no_setsockopt,
624 .getsockopt = sock_no_getsockopt,
625#ifdef CONFIG_COMPAT
626 .compat_setsockopt = sock_no_setsockopt,
627 .compat_getsockopt = sock_no_getsockopt,
628#endif
629 .sendmsg = msm_ipc_router_sendmsg,
630 .recvmsg = msm_ipc_router_recvmsg,
631 .mmap = sock_no_mmap,
632 .sendpage = sock_no_sendpage,
633};
634
635static struct proto msm_ipc_proto = {
636 .name = "MSM_IPC",
637 .owner = THIS_MODULE,
638 .obj_size = sizeof(struct msm_ipc_sock),
639};
640
641int msm_ipc_router_init_sockets(void)
642{
643 int ret;
644
645 ret = proto_register(&msm_ipc_proto, 1);
646 if (ret) {
647 IPC_RTR_ERR("%s: Failed to register MSM_IPC protocol type\n",
648 __func__);
649 goto out_init_sockets;
650 }
651
652 ret = sock_register(&msm_ipc_family_ops);
653 if (ret) {
654 IPC_RTR_ERR("%s: Failed to register MSM_IPC socket type\n",
655 __func__);
656 proto_unregister(&msm_ipc_proto);
657 goto out_init_sockets;
658 }
659
660 mutex_lock(&ipcrtr_af_init_lock);
661 sockets_enabled = 1;
662 raw_notifier_call_chain(&ipcrtr_af_init_chain,
663 IPCRTR_AF_INIT, NULL);
664 mutex_unlock(&ipcrtr_af_init_lock);
665out_init_sockets:
666 return ret;
667}
668
669void msm_ipc_router_exit_sockets(void)
670{
671 if (!sockets_enabled)
672 return;
673
674 sock_unregister(msm_ipc_family_ops.family);
675 proto_unregister(&msm_ipc_proto);
676 mutex_lock(&ipcrtr_af_init_lock);
677 sockets_enabled = 0;
678 raw_notifier_call_chain(&ipcrtr_af_init_chain,
679 IPCRTR_AF_DEINIT, NULL);
680 mutex_unlock(&ipcrtr_af_init_lock);
681}