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