~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/qrtr/qrtr.c

Version: ~ [ linux-5.11-rc3 ] ~ [ linux-5.10.7 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.89 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.167 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.215 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.251 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.251 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright (c) 2015, Sony Mobile Communications Inc.
  3  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
  4  *
  5  * This program is free software; you can redistribute it and/or modify
  6  * it under the terms of the GNU General Public License version 2 and
  7  * only version 2 as published by the Free Software Foundation.
  8  *
  9  * This program is distributed in the hope that it will be useful,
 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12  * GNU General Public License for more details.
 13  */
 14 #include <linux/module.h>
 15 #include <linux/netlink.h>
 16 #include <linux/qrtr.h>
 17 #include <linux/termios.h>      /* For TIOCINQ/OUTQ */
 18 
 19 #include <net/sock.h>
 20 
 21 #include "qrtr.h"
 22 
 23 #define QRTR_PROTO_VER_1 1
 24 #define QRTR_PROTO_VER_2 3
 25 
 26 /* auto-bind range */
 27 #define QRTR_MIN_EPH_SOCKET 0x4000
 28 #define QRTR_MAX_EPH_SOCKET 0x7fff
 29 
 30 /**
 31  * struct qrtr_hdr_v1 - (I|R)PCrouter packet header version 1
 32  * @version: protocol version
 33  * @type: packet type; one of QRTR_TYPE_*
 34  * @src_node_id: source node
 35  * @src_port_id: source port
 36  * @confirm_rx: boolean; whether a resume-tx packet should be send in reply
 37  * @size: length of packet, excluding this header
 38  * @dst_node_id: destination node
 39  * @dst_port_id: destination port
 40  */
 41 struct qrtr_hdr_v1 {
 42         __le32 version;
 43         __le32 type;
 44         __le32 src_node_id;
 45         __le32 src_port_id;
 46         __le32 confirm_rx;
 47         __le32 size;
 48         __le32 dst_node_id;
 49         __le32 dst_port_id;
 50 } __packed;
 51 
 52 /**
 53  * struct qrtr_hdr_v2 - (I|R)PCrouter packet header later versions
 54  * @version: protocol version
 55  * @type: packet type; one of QRTR_TYPE_*
 56  * @flags: bitmask of QRTR_FLAGS_*
 57  * @optlen: length of optional header data
 58  * @size: length of packet, excluding this header and optlen
 59  * @src_node_id: source node
 60  * @src_port_id: source port
 61  * @dst_node_id: destination node
 62  * @dst_port_id: destination port
 63  */
 64 struct qrtr_hdr_v2 {
 65         u8 version;
 66         u8 type;
 67         u8 flags;
 68         u8 optlen;
 69         __le32 size;
 70         __le16 src_node_id;
 71         __le16 src_port_id;
 72         __le16 dst_node_id;
 73         __le16 dst_port_id;
 74 };
 75 
 76 #define QRTR_FLAGS_CONFIRM_RX   BIT(0)
 77 
 78 struct qrtr_cb {
 79         u32 src_node;
 80         u32 src_port;
 81         u32 dst_node;
 82         u32 dst_port;
 83 
 84         u8 type;
 85         u8 confirm_rx;
 86 };
 87 
 88 #define QRTR_HDR_MAX_SIZE max_t(size_t, sizeof(struct qrtr_hdr_v1), \
 89                                         sizeof(struct qrtr_hdr_v2))
 90 
 91 struct qrtr_sock {
 92         /* WARNING: sk must be the first member */
 93         struct sock sk;
 94         struct sockaddr_qrtr us;
 95         struct sockaddr_qrtr peer;
 96 };
 97 
 98 static inline struct qrtr_sock *qrtr_sk(struct sock *sk)
 99 {
100         BUILD_BUG_ON(offsetof(struct qrtr_sock, sk) != 0);
101         return container_of(sk, struct qrtr_sock, sk);
102 }
103 
104 static unsigned int qrtr_local_nid = -1;
105 
106 /* for node ids */
107 static RADIX_TREE(qrtr_nodes, GFP_KERNEL);
108 /* broadcast list */
109 static LIST_HEAD(qrtr_all_nodes);
110 /* lock for qrtr_nodes, qrtr_all_nodes and node reference */
111 static DEFINE_MUTEX(qrtr_node_lock);
112 
113 /* local port allocation management */
114 static DEFINE_IDR(qrtr_ports);
115 static DEFINE_MUTEX(qrtr_port_lock);
116 
117 /**
118  * struct qrtr_node - endpoint node
119  * @ep_lock: lock for endpoint management and callbacks
120  * @ep: endpoint
121  * @ref: reference count for node
122  * @nid: node id
123  * @rx_queue: receive queue
124  * @work: scheduled work struct for recv work
125  * @item: list item for broadcast list
126  */
127 struct qrtr_node {
128         struct mutex ep_lock;
129         struct qrtr_endpoint *ep;
130         struct kref ref;
131         unsigned int nid;
132 
133         struct sk_buff_head rx_queue;
134         struct work_struct work;
135         struct list_head item;
136 };
137 
138 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
139                               int type, struct sockaddr_qrtr *from,
140                               struct sockaddr_qrtr *to);
141 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
142                               int type, struct sockaddr_qrtr *from,
143                               struct sockaddr_qrtr *to);
144 
145 /* Release node resources and free the node.
146  *
147  * Do not call directly, use qrtr_node_release.  To be used with
148  * kref_put_mutex.  As such, the node mutex is expected to be locked on call.
149  */
150 static void __qrtr_node_release(struct kref *kref)
151 {
152         struct qrtr_node *node = container_of(kref, struct qrtr_node, ref);
153 
154         if (node->nid != QRTR_EP_NID_AUTO)
155                 radix_tree_delete(&qrtr_nodes, node->nid);
156 
157         list_del(&node->item);
158         mutex_unlock(&qrtr_node_lock);
159 
160         skb_queue_purge(&node->rx_queue);
161         kfree(node);
162 }
163 
164 /* Increment reference to node. */
165 static struct qrtr_node *qrtr_node_acquire(struct qrtr_node *node)
166 {
167         if (node)
168                 kref_get(&node->ref);
169         return node;
170 }
171 
172 /* Decrement reference to node and release as necessary. */
173 static void qrtr_node_release(struct qrtr_node *node)
174 {
175         if (!node)
176                 return;
177         kref_put_mutex(&node->ref, __qrtr_node_release, &qrtr_node_lock);
178 }
179 
180 /* Pass an outgoing packet socket buffer to the endpoint driver. */
181 static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
182                              int type, struct sockaddr_qrtr *from,
183                              struct sockaddr_qrtr *to)
184 {
185         struct qrtr_hdr_v1 *hdr;
186         size_t len = skb->len;
187         int rc = -ENODEV;
188 
189         hdr = skb_push(skb, sizeof(*hdr));
190         hdr->version = cpu_to_le32(QRTR_PROTO_VER_1);
191         hdr->type = cpu_to_le32(type);
192         hdr->src_node_id = cpu_to_le32(from->sq_node);
193         hdr->src_port_id = cpu_to_le32(from->sq_port);
194         if (to->sq_port == QRTR_PORT_CTRL) {
195                 hdr->dst_node_id = cpu_to_le32(node->nid);
196                 hdr->dst_port_id = cpu_to_le32(QRTR_NODE_BCAST);
197         } else {
198                 hdr->dst_node_id = cpu_to_le32(to->sq_node);
199                 hdr->dst_port_id = cpu_to_le32(to->sq_port);
200         }
201 
202         hdr->size = cpu_to_le32(len);
203         hdr->confirm_rx = 0;
204 
205         skb_put_padto(skb, ALIGN(len, 4));
206 
207         mutex_lock(&node->ep_lock);
208         if (node->ep)
209                 rc = node->ep->xmit(node->ep, skb);
210         else
211                 kfree_skb(skb);
212         mutex_unlock(&node->ep_lock);
213 
214         return rc;
215 }
216 
217 /* Lookup node by id.
218  *
219  * callers must release with qrtr_node_release()
220  */
221 static struct qrtr_node *qrtr_node_lookup(unsigned int nid)
222 {
223         struct qrtr_node *node;
224 
225         mutex_lock(&qrtr_node_lock);
226         node = radix_tree_lookup(&qrtr_nodes, nid);
227         node = qrtr_node_acquire(node);
228         mutex_unlock(&qrtr_node_lock);
229 
230         return node;
231 }
232 
233 /* Assign node id to node.
234  *
235  * This is mostly useful for automatic node id assignment, based on
236  * the source id in the incoming packet.
237  */
238 static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid)
239 {
240         if (node->nid != QRTR_EP_NID_AUTO || nid == QRTR_EP_NID_AUTO)
241                 return;
242 
243         mutex_lock(&qrtr_node_lock);
244         radix_tree_insert(&qrtr_nodes, nid, node);
245         node->nid = nid;
246         mutex_unlock(&qrtr_node_lock);
247 }
248 
249 /**
250  * qrtr_endpoint_post() - post incoming data
251  * @ep: endpoint handle
252  * @data: data pointer
253  * @len: size of data in bytes
254  *
255  * Return: 0 on success; negative error code on failure
256  */
257 int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
258 {
259         struct qrtr_node *node = ep->node;
260         const struct qrtr_hdr_v1 *v1;
261         const struct qrtr_hdr_v2 *v2;
262         struct sk_buff *skb;
263         struct qrtr_cb *cb;
264         unsigned int size;
265         unsigned int ver;
266         size_t hdrlen;
267 
268         if (len & 3)
269                 return -EINVAL;
270 
271         skb = netdev_alloc_skb(NULL, len);
272         if (!skb)
273                 return -ENOMEM;
274 
275         cb = (struct qrtr_cb *)skb->cb;
276 
277         /* Version field in v1 is little endian, so this works for both cases */
278         ver = *(u8*)data;
279 
280         switch (ver) {
281         case QRTR_PROTO_VER_1:
282                 v1 = data;
283                 hdrlen = sizeof(*v1);
284 
285                 cb->type = le32_to_cpu(v1->type);
286                 cb->src_node = le32_to_cpu(v1->src_node_id);
287                 cb->src_port = le32_to_cpu(v1->src_port_id);
288                 cb->confirm_rx = !!v1->confirm_rx;
289                 cb->dst_node = le32_to_cpu(v1->dst_node_id);
290                 cb->dst_port = le32_to_cpu(v1->dst_port_id);
291 
292                 size = le32_to_cpu(v1->size);
293                 break;
294         case QRTR_PROTO_VER_2:
295                 v2 = data;
296                 hdrlen = sizeof(*v2) + v2->optlen;
297 
298                 cb->type = v2->type;
299                 cb->confirm_rx = !!(v2->flags & QRTR_FLAGS_CONFIRM_RX);
300                 cb->src_node = le16_to_cpu(v2->src_node_id);
301                 cb->src_port = le16_to_cpu(v2->src_port_id);
302                 cb->dst_node = le16_to_cpu(v2->dst_node_id);
303                 cb->dst_port = le16_to_cpu(v2->dst_port_id);
304 
305                 if (cb->src_port == (u16)QRTR_PORT_CTRL)
306                         cb->src_port = QRTR_PORT_CTRL;
307                 if (cb->dst_port == (u16)QRTR_PORT_CTRL)
308                         cb->dst_port = QRTR_PORT_CTRL;
309 
310                 size = le32_to_cpu(v2->size);
311                 break;
312         default:
313                 pr_err("qrtr: Invalid version %d\n", ver);
314                 goto err;
315         }
316 
317         if (len != ALIGN(size, 4) + hdrlen)
318                 goto err;
319 
320         if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA)
321                 goto err;
322 
323         skb_put_data(skb, data + hdrlen, size);
324 
325         skb_queue_tail(&node->rx_queue, skb);
326         schedule_work(&node->work);
327 
328         return 0;
329 
330 err:
331         kfree_skb(skb);
332         return -EINVAL;
333 
334 }
335 EXPORT_SYMBOL_GPL(qrtr_endpoint_post);
336 
337 /**
338  * qrtr_alloc_ctrl_packet() - allocate control packet skb
339  * @pkt: reference to qrtr_ctrl_pkt pointer
340  *
341  * Returns newly allocated sk_buff, or NULL on failure
342  *
343  * This function allocates a sk_buff large enough to carry a qrtr_ctrl_pkt and
344  * on success returns a reference to the control packet in @pkt.
345  */
346 static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt)
347 {
348         const int pkt_len = sizeof(struct qrtr_ctrl_pkt);
349         struct sk_buff *skb;
350 
351         skb = alloc_skb(QRTR_HDR_MAX_SIZE + pkt_len, GFP_KERNEL);
352         if (!skb)
353                 return NULL;
354 
355         skb_reserve(skb, QRTR_HDR_MAX_SIZE);
356         *pkt = skb_put_zero(skb, pkt_len);
357 
358         return skb;
359 }
360 
361 static struct qrtr_sock *qrtr_port_lookup(int port);
362 static void qrtr_port_put(struct qrtr_sock *ipc);
363 
364 /* Handle and route a received packet.
365  *
366  * This will auto-reply with resume-tx packet as necessary.
367  */
368 static void qrtr_node_rx_work(struct work_struct *work)
369 {
370         struct qrtr_node *node = container_of(work, struct qrtr_node, work);
371         struct qrtr_ctrl_pkt *pkt;
372         struct sockaddr_qrtr dst;
373         struct sockaddr_qrtr src;
374         struct sk_buff *skb;
375 
376         while ((skb = skb_dequeue(&node->rx_queue)) != NULL) {
377                 struct qrtr_sock *ipc;
378                 struct qrtr_cb *cb;
379                 int confirm;
380 
381                 cb = (struct qrtr_cb *)skb->cb;
382                 src.sq_node = cb->src_node;
383                 src.sq_port = cb->src_port;
384                 dst.sq_node = cb->dst_node;
385                 dst.sq_port = cb->dst_port;
386                 confirm = !!cb->confirm_rx;
387 
388                 qrtr_node_assign(node, cb->src_node);
389 
390                 ipc = qrtr_port_lookup(cb->dst_port);
391                 if (!ipc) {
392                         kfree_skb(skb);
393                 } else {
394                         if (sock_queue_rcv_skb(&ipc->sk, skb))
395                                 kfree_skb(skb);
396 
397                         qrtr_port_put(ipc);
398                 }
399 
400                 if (confirm) {
401                         skb = qrtr_alloc_ctrl_packet(&pkt);
402                         if (!skb)
403                                 break;
404 
405                         pkt->cmd = cpu_to_le32(QRTR_TYPE_RESUME_TX);
406                         pkt->client.node = cpu_to_le32(dst.sq_node);
407                         pkt->client.port = cpu_to_le32(dst.sq_port);
408 
409                         if (qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX,
410                                               &dst, &src))
411                                 break;
412                 }
413         }
414 }
415 
416 /**
417  * qrtr_endpoint_register() - register a new endpoint
418  * @ep: endpoint to register
419  * @nid: desired node id; may be QRTR_EP_NID_AUTO for auto-assignment
420  * Return: 0 on success; negative error code on failure
421  *
422  * The specified endpoint must have the xmit function pointer set on call.
423  */
424 int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid)
425 {
426         struct qrtr_node *node;
427 
428         if (!ep || !ep->xmit)
429                 return -EINVAL;
430 
431         node = kzalloc(sizeof(*node), GFP_KERNEL);
432         if (!node)
433                 return -ENOMEM;
434 
435         INIT_WORK(&node->work, qrtr_node_rx_work);
436         kref_init(&node->ref);
437         mutex_init(&node->ep_lock);
438         skb_queue_head_init(&node->rx_queue);
439         node->nid = QRTR_EP_NID_AUTO;
440         node->ep = ep;
441 
442         qrtr_node_assign(node, nid);
443 
444         mutex_lock(&qrtr_node_lock);
445         list_add(&node->item, &qrtr_all_nodes);
446         mutex_unlock(&qrtr_node_lock);
447         ep->node = node;
448 
449         return 0;
450 }
451 EXPORT_SYMBOL_GPL(qrtr_endpoint_register);
452 
453 /**
454  * qrtr_endpoint_unregister - unregister endpoint
455  * @ep: endpoint to unregister
456  */
457 void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)
458 {
459         struct qrtr_node *node = ep->node;
460         struct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};
461         struct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};
462         struct qrtr_ctrl_pkt *pkt;
463         struct sk_buff *skb;
464 
465         mutex_lock(&node->ep_lock);
466         node->ep = NULL;
467         mutex_unlock(&node->ep_lock);
468 
469         /* Notify the local controller about the event */
470         skb = qrtr_alloc_ctrl_packet(&pkt);
471         if (skb) {
472                 pkt->cmd = cpu_to_le32(QRTR_TYPE_BYE);
473                 qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst);
474         }
475 
476         qrtr_node_release(node);
477         ep->node = NULL;
478 }
479 EXPORT_SYMBOL_GPL(qrtr_endpoint_unregister);
480 
481 /* Lookup socket by port.
482  *
483  * Callers must release with qrtr_port_put()
484  */
485 static struct qrtr_sock *qrtr_port_lookup(int port)
486 {
487         struct qrtr_sock *ipc;
488 
489         if (port == QRTR_PORT_CTRL)
490                 port = 0;
491 
492         mutex_lock(&qrtr_port_lock);
493         ipc = idr_find(&qrtr_ports, port);
494         if (ipc)
495                 sock_hold(&ipc->sk);
496         mutex_unlock(&qrtr_port_lock);
497 
498         return ipc;
499 }
500 
501 /* Release acquired socket. */
502 static void qrtr_port_put(struct qrtr_sock *ipc)
503 {
504         sock_put(&ipc->sk);
505 }
506 
507 /* Remove port assignment. */
508 static void qrtr_port_remove(struct qrtr_sock *ipc)
509 {
510         struct qrtr_ctrl_pkt *pkt;
511         struct sk_buff *skb;
512         int port = ipc->us.sq_port;
513         struct sockaddr_qrtr to;
514 
515         to.sq_family = AF_QIPCRTR;
516         to.sq_node = QRTR_NODE_BCAST;
517         to.sq_port = QRTR_PORT_CTRL;
518 
519         skb = qrtr_alloc_ctrl_packet(&pkt);
520         if (skb) {
521                 pkt->cmd = cpu_to_le32(QRTR_TYPE_DEL_CLIENT);
522                 pkt->client.node = cpu_to_le32(ipc->us.sq_node);
523                 pkt->client.port = cpu_to_le32(ipc->us.sq_port);
524 
525                 skb_set_owner_w(skb, &ipc->sk);
526                 qrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us,
527                                    &to);
528         }
529 
530         if (port == QRTR_PORT_CTRL)
531                 port = 0;
532 
533         __sock_put(&ipc->sk);
534 
535         mutex_lock(&qrtr_port_lock);
536         idr_remove(&qrtr_ports, port);
537         mutex_unlock(&qrtr_port_lock);
538 }
539 
540 /* Assign port number to socket.
541  *
542  * Specify port in the integer pointed to by port, and it will be adjusted
543  * on return as necesssary.
544  *
545  * Port may be:
546  *   0: Assign ephemeral port in [QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET]
547  *   <QRTR_MIN_EPH_SOCKET: Specified; requires CAP_NET_ADMIN
548  *   >QRTR_MIN_EPH_SOCKET: Specified; available to all
549  */
550 static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
551 {
552         int rc;
553 
554         mutex_lock(&qrtr_port_lock);
555         if (!*port) {
556                 rc = idr_alloc(&qrtr_ports, ipc,
557                                QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET + 1,
558                                GFP_ATOMIC);
559                 if (rc >= 0)
560                         *port = rc;
561         } else if (*port < QRTR_MIN_EPH_SOCKET && !capable(CAP_NET_ADMIN)) {
562                 rc = -EACCES;
563         } else if (*port == QRTR_PORT_CTRL) {
564                 rc = idr_alloc(&qrtr_ports, ipc, 0, 1, GFP_ATOMIC);
565         } else {
566                 rc = idr_alloc(&qrtr_ports, ipc, *port, *port + 1, GFP_ATOMIC);
567                 if (rc >= 0)
568                         *port = rc;
569         }
570         mutex_unlock(&qrtr_port_lock);
571 
572         if (rc == -ENOSPC)
573                 return -EADDRINUSE;
574         else if (rc < 0)
575                 return rc;
576 
577         sock_hold(&ipc->sk);
578 
579         return 0;
580 }
581 
582 /* Reset all non-control ports */
583 static void qrtr_reset_ports(void)
584 {
585         struct qrtr_sock *ipc;
586         int id;
587 
588         mutex_lock(&qrtr_port_lock);
589         idr_for_each_entry(&qrtr_ports, ipc, id) {
590                 /* Don't reset control port */
591                 if (id == 0)
592                         continue;
593 
594                 sock_hold(&ipc->sk);
595                 ipc->sk.sk_err = ENETRESET;
596                 ipc->sk.sk_error_report(&ipc->sk);
597                 sock_put(&ipc->sk);
598         }
599         mutex_unlock(&qrtr_port_lock);
600 }
601 
602 /* Bind socket to address.
603  *
604  * Socket should be locked upon call.
605  */
606 static int __qrtr_bind(struct socket *sock,
607                        const struct sockaddr_qrtr *addr, int zapped)
608 {
609         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
610         struct sock *sk = sock->sk;
611         int port;
612         int rc;
613 
614         /* rebinding ok */
615         if (!zapped && addr->sq_port == ipc->us.sq_port)
616                 return 0;
617 
618         port = addr->sq_port;
619         rc = qrtr_port_assign(ipc, &port);
620         if (rc)
621                 return rc;
622 
623         /* unbind previous, if any */
624         if (!zapped)
625                 qrtr_port_remove(ipc);
626         ipc->us.sq_port = port;
627 
628         sock_reset_flag(sk, SOCK_ZAPPED);
629 
630         /* Notify all open ports about the new controller */
631         if (port == QRTR_PORT_CTRL)
632                 qrtr_reset_ports();
633 
634         return 0;
635 }
636 
637 /* Auto bind to an ephemeral port. */
638 static int qrtr_autobind(struct socket *sock)
639 {
640         struct sock *sk = sock->sk;
641         struct sockaddr_qrtr addr;
642 
643         if (!sock_flag(sk, SOCK_ZAPPED))
644                 return 0;
645 
646         addr.sq_family = AF_QIPCRTR;
647         addr.sq_node = qrtr_local_nid;
648         addr.sq_port = 0;
649 
650         return __qrtr_bind(sock, &addr, 1);
651 }
652 
653 /* Bind socket to specified sockaddr. */
654 static int qrtr_bind(struct socket *sock, struct sockaddr *saddr, int len)
655 {
656         DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
657         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
658         struct sock *sk = sock->sk;
659         int rc;
660 
661         if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
662                 return -EINVAL;
663 
664         if (addr->sq_node != ipc->us.sq_node)
665                 return -EINVAL;
666 
667         lock_sock(sk);
668         rc = __qrtr_bind(sock, addr, sock_flag(sk, SOCK_ZAPPED));
669         release_sock(sk);
670 
671         return rc;
672 }
673 
674 /* Queue packet to local peer socket. */
675 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,
676                               int type, struct sockaddr_qrtr *from,
677                               struct sockaddr_qrtr *to)
678 {
679         struct qrtr_sock *ipc;
680         struct qrtr_cb *cb;
681 
682         ipc = qrtr_port_lookup(to->sq_port);
683         if (!ipc || &ipc->sk == skb->sk) { /* do not send to self */
684                 kfree_skb(skb);
685                 return -ENODEV;
686         }
687 
688         cb = (struct qrtr_cb *)skb->cb;
689         cb->src_node = from->sq_node;
690         cb->src_port = from->sq_port;
691 
692         if (sock_queue_rcv_skb(&ipc->sk, skb)) {
693                 qrtr_port_put(ipc);
694                 kfree_skb(skb);
695                 return -ENOSPC;
696         }
697 
698         qrtr_port_put(ipc);
699 
700         return 0;
701 }
702 
703 /* Queue packet for broadcast. */
704 static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
705                               int type, struct sockaddr_qrtr *from,
706                               struct sockaddr_qrtr *to)
707 {
708         struct sk_buff *skbn;
709 
710         mutex_lock(&qrtr_node_lock);
711         list_for_each_entry(node, &qrtr_all_nodes, item) {
712                 skbn = skb_clone(skb, GFP_KERNEL);
713                 if (!skbn)
714                         break;
715                 skb_set_owner_w(skbn, skb->sk);
716                 qrtr_node_enqueue(node, skbn, type, from, to);
717         }
718         mutex_unlock(&qrtr_node_lock);
719 
720         qrtr_local_enqueue(node, skb, type, from, to);
721 
722         return 0;
723 }
724 
725 static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
726 {
727         DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
728         int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int,
729                           struct sockaddr_qrtr *, struct sockaddr_qrtr *);
730         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
731         struct sock *sk = sock->sk;
732         struct qrtr_node *node;
733         struct sk_buff *skb;
734         size_t plen;
735         u32 type = QRTR_TYPE_DATA;
736         int rc;
737 
738         if (msg->msg_flags & ~(MSG_DONTWAIT))
739                 return -EINVAL;
740 
741         if (len > 65535)
742                 return -EMSGSIZE;
743 
744         lock_sock(sk);
745 
746         if (addr) {
747                 if (msg->msg_namelen < sizeof(*addr)) {
748                         release_sock(sk);
749                         return -EINVAL;
750                 }
751 
752                 if (addr->sq_family != AF_QIPCRTR) {
753                         release_sock(sk);
754                         return -EINVAL;
755                 }
756 
757                 rc = qrtr_autobind(sock);
758                 if (rc) {
759                         release_sock(sk);
760                         return rc;
761                 }
762         } else if (sk->sk_state == TCP_ESTABLISHED) {
763                 addr = &ipc->peer;
764         } else {
765                 release_sock(sk);
766                 return -ENOTCONN;
767         }
768 
769         node = NULL;
770         if (addr->sq_node == QRTR_NODE_BCAST) {
771                 enqueue_fn = qrtr_bcast_enqueue;
772                 if (addr->sq_port != QRTR_PORT_CTRL) {
773                         release_sock(sk);
774                         return -ENOTCONN;
775                 }
776         } else if (addr->sq_node == ipc->us.sq_node) {
777                 enqueue_fn = qrtr_local_enqueue;
778         } else {
779                 enqueue_fn = qrtr_node_enqueue;
780                 node = qrtr_node_lookup(addr->sq_node);
781                 if (!node) {
782                         release_sock(sk);
783                         return -ECONNRESET;
784                 }
785         }
786 
787         plen = (len + 3) & ~3;
788         skb = sock_alloc_send_skb(sk, plen + QRTR_HDR_MAX_SIZE,
789                                   msg->msg_flags & MSG_DONTWAIT, &rc);
790         if (!skb)
791                 goto out_node;
792 
793         skb_reserve(skb, QRTR_HDR_MAX_SIZE);
794 
795         rc = memcpy_from_msg(skb_put(skb, len), msg, len);
796         if (rc) {
797                 kfree_skb(skb);
798                 goto out_node;
799         }
800 
801         if (ipc->us.sq_port == QRTR_PORT_CTRL) {
802                 if (len < 4) {
803                         rc = -EINVAL;
804                         kfree_skb(skb);
805                         goto out_node;
806                 }
807 
808                 /* control messages already require the type as 'command' */
809                 skb_copy_bits(skb, 0, &type, 4);
810                 type = le32_to_cpu(type);
811         }
812 
813         rc = enqueue_fn(node, skb, type, &ipc->us, addr);
814         if (rc >= 0)
815                 rc = len;
816 
817 out_node:
818         qrtr_node_release(node);
819         release_sock(sk);
820 
821         return rc;
822 }
823 
824 static int qrtr_recvmsg(struct socket *sock, struct msghdr *msg,
825                         size_t size, int flags)
826 {
827         DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);
828         struct sock *sk = sock->sk;
829         struct sk_buff *skb;
830         struct qrtr_cb *cb;
831         int copied, rc;
832 
833         lock_sock(sk);
834 
835         if (sock_flag(sk, SOCK_ZAPPED)) {
836                 release_sock(sk);
837                 return -EADDRNOTAVAIL;
838         }
839 
840         skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
841                                 flags & MSG_DONTWAIT, &rc);
842         if (!skb) {
843                 release_sock(sk);
844                 return rc;
845         }
846 
847         copied = skb->len;
848         if (copied > size) {
849                 copied = size;
850                 msg->msg_flags |= MSG_TRUNC;
851         }
852 
853         rc = skb_copy_datagram_msg(skb, 0, msg, copied);
854         if (rc < 0)
855                 goto out;
856         rc = copied;
857 
858         if (addr) {
859                 cb = (struct qrtr_cb *)skb->cb;
860                 addr->sq_family = AF_QIPCRTR;
861                 addr->sq_node = cb->src_node;
862                 addr->sq_port = cb->src_port;
863                 msg->msg_namelen = sizeof(*addr);
864         }
865 
866 out:
867         skb_free_datagram(sk, skb);
868         release_sock(sk);
869 
870         return rc;
871 }
872 
873 static int qrtr_connect(struct socket *sock, struct sockaddr *saddr,
874                         int len, int flags)
875 {
876         DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, saddr);
877         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
878         struct sock *sk = sock->sk;
879         int rc;
880 
881         if (len < sizeof(*addr) || addr->sq_family != AF_QIPCRTR)
882                 return -EINVAL;
883 
884         lock_sock(sk);
885 
886         sk->sk_state = TCP_CLOSE;
887         sock->state = SS_UNCONNECTED;
888 
889         rc = qrtr_autobind(sock);
890         if (rc) {
891                 release_sock(sk);
892                 return rc;
893         }
894 
895         ipc->peer = *addr;
896         sock->state = SS_CONNECTED;
897         sk->sk_state = TCP_ESTABLISHED;
898 
899         release_sock(sk);
900 
901         return 0;
902 }
903 
904 static int qrtr_getname(struct socket *sock, struct sockaddr *saddr,
905                         int peer)
906 {
907         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
908         struct sockaddr_qrtr qaddr;
909         struct sock *sk = sock->sk;
910 
911         lock_sock(sk);
912         if (peer) {
913                 if (sk->sk_state != TCP_ESTABLISHED) {
914                         release_sock(sk);
915                         return -ENOTCONN;
916                 }
917 
918                 qaddr = ipc->peer;
919         } else {
920                 qaddr = ipc->us;
921         }
922         release_sock(sk);
923 
924         qaddr.sq_family = AF_QIPCRTR;
925 
926         memcpy(saddr, &qaddr, sizeof(qaddr));
927 
928         return sizeof(qaddr);
929 }
930 
931 static int qrtr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
932 {
933         void __user *argp = (void __user *)arg;
934         struct qrtr_sock *ipc = qrtr_sk(sock->sk);
935         struct sock *sk = sock->sk;
936         struct sockaddr_qrtr *sq;
937         struct sk_buff *skb;
938         struct ifreq ifr;
939         long len = 0;
940         int rc = 0;
941 
942         lock_sock(sk);
943 
944         switch (cmd) {
945         case TIOCOUTQ:
946                 len = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
947                 if (len < 0)
948                         len = 0;
949                 rc = put_user(len, (int __user *)argp);
950                 break;
951         case TIOCINQ:
952                 skb = skb_peek(&sk->sk_receive_queue);
953                 if (skb)
954                         len = skb->len;
955                 rc = put_user(len, (int __user *)argp);
956                 break;
957         case SIOCGIFADDR:
958                 if (copy_from_user(&ifr, argp, sizeof(ifr))) {
959                         rc = -EFAULT;
960                         break;
961                 }
962 
963                 sq = (struct sockaddr_qrtr *)&ifr.ifr_addr;
964                 *sq = ipc->us;
965                 if (copy_to_user(argp, &ifr, sizeof(ifr))) {
966                         rc = -EFAULT;
967                         break;
968                 }
969                 break;
970         case SIOCGSTAMP:
971                 rc = sock_get_timestamp(sk, argp);
972                 break;
973         case SIOCADDRT:
974         case SIOCDELRT:
975         case SIOCSIFADDR:
976         case SIOCGIFDSTADDR:
977         case SIOCSIFDSTADDR:
978         case SIOCGIFBRDADDR:
979         case SIOCSIFBRDADDR:
980         case SIOCGIFNETMASK:
981         case SIOCSIFNETMASK:
982                 rc = -EINVAL;
983                 break;
984         default:
985                 rc = -ENOIOCTLCMD;
986                 break;
987         }
988 
989         release_sock(sk);
990 
991         return rc;
992 }
993 
994 static int qrtr_release(struct socket *sock)
995 {
996         struct sock *sk = sock->sk;
997         struct qrtr_sock *ipc;
998 
999         if (!sk)
1000                 return 0;
1001 
1002         lock_sock(sk);
1003 
1004         ipc = qrtr_sk(sk);
1005         sk->sk_shutdown = SHUTDOWN_MASK;
1006         if (!sock_flag(sk, SOCK_DEAD))
1007                 sk->sk_state_change(sk);
1008 
1009         sock_set_flag(sk, SOCK_DEAD);
1010         sock->sk = NULL;
1011 
1012         if (!sock_flag(sk, SOCK_ZAPPED))
1013                 qrtr_port_remove(ipc);
1014 
1015         skb_queue_purge(&sk->sk_receive_queue);
1016 
1017         release_sock(sk);
1018         sock_put(sk);
1019 
1020         return 0;
1021 }
1022 
1023 static const struct proto_ops qrtr_proto_ops = {
1024         .owner          = THIS_MODULE,
1025         .family         = AF_QIPCRTR,
1026         .bind           = qrtr_bind,
1027         .connect        = qrtr_connect,
1028         .socketpair     = sock_no_socketpair,
1029         .accept         = sock_no_accept,
1030         .listen         = sock_no_listen,
1031         .sendmsg        = qrtr_sendmsg,
1032         .recvmsg        = qrtr_recvmsg,
1033         .getname        = qrtr_getname,
1034         .ioctl          = qrtr_ioctl,
1035         .poll           = datagram_poll,
1036         .shutdown       = sock_no_shutdown,
1037         .setsockopt     = sock_no_setsockopt,
1038         .getsockopt     = sock_no_getsockopt,
1039         .release        = qrtr_release,
1040         .mmap           = sock_no_mmap,
1041         .sendpage       = sock_no_sendpage,
1042 };
1043 
1044 static struct proto qrtr_proto = {
1045         .name           = "QIPCRTR",
1046         .owner          = THIS_MODULE,
1047         .obj_size       = sizeof(struct qrtr_sock),
1048 };
1049 
1050 static int qrtr_create(struct net *net, struct socket *sock,
1051                        int protocol, int kern)
1052 {
1053         struct qrtr_sock *ipc;
1054         struct sock *sk;
1055 
1056         if (sock->type != SOCK_DGRAM)
1057                 return -EPROTOTYPE;
1058 
1059         sk = sk_alloc(net, AF_QIPCRTR, GFP_KERNEL, &qrtr_proto, kern);
1060         if (!sk)
1061                 return -ENOMEM;
1062 
1063         sock_set_flag(sk, SOCK_ZAPPED);
1064 
1065         sock_init_data(sock, sk);
1066         sock->ops = &qrtr_proto_ops;
1067 
1068         ipc = qrtr_sk(sk);
1069         ipc->us.sq_family = AF_QIPCRTR;
1070         ipc->us.sq_node = qrtr_local_nid;
1071         ipc->us.sq_port = 0;
1072 
1073         return 0;
1074 }
1075 
1076 static const struct nla_policy qrtr_policy[IFA_MAX + 1] = {
1077         [IFA_LOCAL] = { .type = NLA_U32 },
1078 };
1079 
1080 static int qrtr_addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
1081                           struct netlink_ext_ack *extack)
1082 {
1083         struct nlattr *tb[IFA_MAX + 1];
1084         struct ifaddrmsg *ifm;
1085         int rc;
1086 
1087         if (!netlink_capable(skb, CAP_NET_ADMIN))
1088                 return -EPERM;
1089 
1090         if (!netlink_capable(skb, CAP_SYS_ADMIN))
1091                 return -EPERM;
1092 
1093         ASSERT_RTNL();
1094 
1095         rc = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, qrtr_policy, extack);
1096         if (rc < 0)
1097                 return rc;
1098 
1099         ifm = nlmsg_data(nlh);
1100         if (!tb[IFA_LOCAL])
1101                 return -EINVAL;
1102 
1103         qrtr_local_nid = nla_get_u32(tb[IFA_LOCAL]);
1104         return 0;
1105 }
1106 
1107 static const struct net_proto_family qrtr_family = {
1108         .owner  = THIS_MODULE,
1109         .family = AF_QIPCRTR,
1110         .create = qrtr_create,
1111 };
1112 
1113 static int __init qrtr_proto_init(void)
1114 {
1115         int rc;
1116 
1117         rc = proto_register(&qrtr_proto, 1);
1118         if (rc)
1119                 return rc;
1120 
1121         rc = sock_register(&qrtr_family);
1122         if (rc) {
1123                 proto_unregister(&qrtr_proto);
1124                 return rc;
1125         }
1126 
1127         rc = rtnl_register_module(THIS_MODULE, PF_QIPCRTR, RTM_NEWADDR, qrtr_addr_doit, NULL, 0);
1128         if (rc) {
1129                 sock_unregister(qrtr_family.family);
1130                 proto_unregister(&qrtr_proto);
1131         }
1132 
1133         return rc;
1134 }
1135 postcore_initcall(qrtr_proto_init);
1136 
1137 static void __exit qrtr_proto_fini(void)
1138 {
1139         rtnl_unregister(PF_QIPCRTR, RTM_NEWADDR);
1140         sock_unregister(qrtr_family.family);
1141         proto_unregister(&qrtr_proto);
1142 }
1143 module_exit(qrtr_proto_fini);
1144 
1145 MODULE_DESCRIPTION("Qualcomm IPC-router driver");
1146 MODULE_LICENSE("GPL v2");
1147 MODULE_ALIAS_NETPROTO(PF_QIPCRTR);
1148 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp