linux/net/nfc/llcp_sock.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2011  Intel Corporation. All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License as published by
   6 * the Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   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 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#define pr_fmt(fmt) "llcp: %s: " fmt, __func__
  19
  20#include <linux/init.h>
  21#include <linux/kernel.h>
  22#include <linux/module.h>
  23#include <linux/nfc.h>
  24#include <linux/sched/signal.h>
  25
  26#include "nfc.h"
  27#include "llcp.h"
  28
  29static int sock_wait_state(struct sock *sk, int state, unsigned long timeo)
  30{
  31        DECLARE_WAITQUEUE(wait, current);
  32        int err = 0;
  33
  34        pr_debug("sk %p", sk);
  35
  36        add_wait_queue(sk_sleep(sk), &wait);
  37        set_current_state(TASK_INTERRUPTIBLE);
  38
  39        while (sk->sk_state != state) {
  40                if (!timeo) {
  41                        err = -EINPROGRESS;
  42                        break;
  43                }
  44
  45                if (signal_pending(current)) {
  46                        err = sock_intr_errno(timeo);
  47                        break;
  48                }
  49
  50                release_sock(sk);
  51                timeo = schedule_timeout(timeo);
  52                lock_sock(sk);
  53                set_current_state(TASK_INTERRUPTIBLE);
  54
  55                err = sock_error(sk);
  56                if (err)
  57                        break;
  58        }
  59
  60        __set_current_state(TASK_RUNNING);
  61        remove_wait_queue(sk_sleep(sk), &wait);
  62        return err;
  63}
  64
  65static struct proto llcp_sock_proto = {
  66        .name     = "NFC_LLCP",
  67        .owner    = THIS_MODULE,
  68        .obj_size = sizeof(struct nfc_llcp_sock),
  69};
  70
  71static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
  72{
  73        struct sock *sk = sock->sk;
  74        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
  75        struct nfc_llcp_local *local;
  76        struct nfc_dev *dev;
  77        struct sockaddr_nfc_llcp llcp_addr;
  78        int len, ret = 0;
  79
  80        if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
  81            addr->sa_family != AF_NFC)
  82                return -EINVAL;
  83
  84        pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
  85
  86        memset(&llcp_addr, 0, sizeof(llcp_addr));
  87        len = min_t(unsigned int, sizeof(llcp_addr), alen);
  88        memcpy(&llcp_addr, addr, len);
  89
  90        /* This is going to be a listening socket, dsap must be 0 */
  91        if (llcp_addr.dsap != 0)
  92                return -EINVAL;
  93
  94        lock_sock(sk);
  95
  96        if (sk->sk_state != LLCP_CLOSED) {
  97                ret = -EBADFD;
  98                goto error;
  99        }
 100
 101        dev = nfc_get_device(llcp_addr.dev_idx);
 102        if (dev == NULL) {
 103                ret = -ENODEV;
 104                goto error;
 105        }
 106
 107        local = nfc_llcp_find_local(dev);
 108        if (local == NULL) {
 109                ret = -ENODEV;
 110                goto put_dev;
 111        }
 112
 113        llcp_sock->dev = dev;
 114        llcp_sock->local = nfc_llcp_local_get(local);
 115        llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
 116        llcp_sock->service_name_len = min_t(unsigned int,
 117                                            llcp_addr.service_name_len,
 118                                            NFC_LLCP_MAX_SERVICE_NAME);
 119        llcp_sock->service_name = kmemdup(llcp_addr.service_name,
 120                                          llcp_sock->service_name_len,
 121                                          GFP_KERNEL);
 122
 123        llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
 124        if (llcp_sock->ssap == LLCP_SAP_MAX) {
 125                ret = -EADDRINUSE;
 126                goto put_dev;
 127        }
 128
 129        llcp_sock->reserved_ssap = llcp_sock->ssap;
 130
 131        nfc_llcp_sock_link(&local->sockets, sk);
 132
 133        pr_debug("Socket bound to SAP %d\n", llcp_sock->ssap);
 134
 135        sk->sk_state = LLCP_BOUND;
 136
 137put_dev:
 138        nfc_put_device(dev);
 139
 140error:
 141        release_sock(sk);
 142        return ret;
 143}
 144
 145static int llcp_raw_sock_bind(struct socket *sock, struct sockaddr *addr,
 146                              int alen)
 147{
 148        struct sock *sk = sock->sk;
 149        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 150        struct nfc_llcp_local *local;
 151        struct nfc_dev *dev;
 152        struct sockaddr_nfc_llcp llcp_addr;
 153        int len, ret = 0;
 154
 155        if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
 156            addr->sa_family != AF_NFC)
 157                return -EINVAL;
 158
 159        pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
 160
 161        memset(&llcp_addr, 0, sizeof(llcp_addr));
 162        len = min_t(unsigned int, sizeof(llcp_addr), alen);
 163        memcpy(&llcp_addr, addr, len);
 164
 165        lock_sock(sk);
 166
 167        if (sk->sk_state != LLCP_CLOSED) {
 168                ret = -EBADFD;
 169                goto error;
 170        }
 171
 172        dev = nfc_get_device(llcp_addr.dev_idx);
 173        if (dev == NULL) {
 174                ret = -ENODEV;
 175                goto error;
 176        }
 177
 178        local = nfc_llcp_find_local(dev);
 179        if (local == NULL) {
 180                ret = -ENODEV;
 181                goto put_dev;
 182        }
 183
 184        llcp_sock->dev = dev;
 185        llcp_sock->local = nfc_llcp_local_get(local);
 186        llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
 187
 188        nfc_llcp_sock_link(&local->raw_sockets, sk);
 189
 190        sk->sk_state = LLCP_BOUND;
 191
 192put_dev:
 193        nfc_put_device(dev);
 194
 195error:
 196        release_sock(sk);
 197        return ret;
 198}
 199
 200static int llcp_sock_listen(struct socket *sock, int backlog)
 201{
 202        struct sock *sk = sock->sk;
 203        int ret = 0;
 204
 205        pr_debug("sk %p backlog %d\n", sk, backlog);
 206
 207        lock_sock(sk);
 208
 209        if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM) ||
 210            sk->sk_state != LLCP_BOUND) {
 211                ret = -EBADFD;
 212                goto error;
 213        }
 214
 215        sk->sk_max_ack_backlog = backlog;
 216        sk->sk_ack_backlog = 0;
 217
 218        pr_debug("Socket listening\n");
 219        sk->sk_state = LLCP_LISTEN;
 220
 221error:
 222        release_sock(sk);
 223
 224        return ret;
 225}
 226
 227static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname,
 228                               char __user *optval, unsigned int optlen)
 229{
 230        struct sock *sk = sock->sk;
 231        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 232        u32 opt;
 233        int err = 0;
 234
 235        pr_debug("%p optname %d\n", sk, optname);
 236
 237        if (level != SOL_NFC)
 238                return -ENOPROTOOPT;
 239
 240        lock_sock(sk);
 241
 242        switch (optname) {
 243        case NFC_LLCP_RW:
 244                if (sk->sk_state == LLCP_CONNECTED ||
 245                    sk->sk_state == LLCP_BOUND ||
 246                    sk->sk_state == LLCP_LISTEN) {
 247                        err = -EINVAL;
 248                        break;
 249                }
 250
 251                if (get_user(opt, (u32 __user *) optval)) {
 252                        err = -EFAULT;
 253                        break;
 254                }
 255
 256                if (opt > LLCP_MAX_RW) {
 257                        err = -EINVAL;
 258                        break;
 259                }
 260
 261                llcp_sock->rw = (u8) opt;
 262
 263                break;
 264
 265        case NFC_LLCP_MIUX:
 266                if (sk->sk_state == LLCP_CONNECTED ||
 267                    sk->sk_state == LLCP_BOUND ||
 268                    sk->sk_state == LLCP_LISTEN) {
 269                        err = -EINVAL;
 270                        break;
 271                }
 272
 273                if (get_user(opt, (u32 __user *) optval)) {
 274                        err = -EFAULT;
 275                        break;
 276                }
 277
 278                if (opt > LLCP_MAX_MIUX) {
 279                        err = -EINVAL;
 280                        break;
 281                }
 282
 283                llcp_sock->miux = cpu_to_be16((u16) opt);
 284
 285                break;
 286
 287        default:
 288                err = -ENOPROTOOPT;
 289                break;
 290        }
 291
 292        release_sock(sk);
 293
 294        pr_debug("%p rw %d miux %d\n", llcp_sock,
 295                 llcp_sock->rw, llcp_sock->miux);
 296
 297        return err;
 298}
 299
 300static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname,
 301                               char __user *optval, int __user *optlen)
 302{
 303        struct nfc_llcp_local *local;
 304        struct sock *sk = sock->sk;
 305        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 306        int len, err = 0;
 307        u16 miux, remote_miu;
 308        u8 rw;
 309
 310        pr_debug("%p optname %d\n", sk, optname);
 311
 312        if (level != SOL_NFC)
 313                return -ENOPROTOOPT;
 314
 315        if (get_user(len, optlen))
 316                return -EFAULT;
 317
 318        local = llcp_sock->local;
 319        if (!local)
 320                return -ENODEV;
 321
 322        len = min_t(u32, len, sizeof(u32));
 323
 324        lock_sock(sk);
 325
 326        switch (optname) {
 327        case NFC_LLCP_RW:
 328                rw = llcp_sock->rw > LLCP_MAX_RW ? local->rw : llcp_sock->rw;
 329                if (put_user(rw, (u32 __user *) optval))
 330                        err = -EFAULT;
 331
 332                break;
 333
 334        case NFC_LLCP_MIUX:
 335                miux = be16_to_cpu(llcp_sock->miux) > LLCP_MAX_MIUX ?
 336                        be16_to_cpu(local->miux) : be16_to_cpu(llcp_sock->miux);
 337
 338                if (put_user(miux, (u32 __user *) optval))
 339                        err = -EFAULT;
 340
 341                break;
 342
 343        case NFC_LLCP_REMOTE_MIU:
 344                remote_miu = llcp_sock->remote_miu > LLCP_MAX_MIU ?
 345                                local->remote_miu : llcp_sock->remote_miu;
 346
 347                if (put_user(remote_miu, (u32 __user *) optval))
 348                        err = -EFAULT;
 349
 350                break;
 351
 352        case NFC_LLCP_REMOTE_LTO:
 353                if (put_user(local->remote_lto / 10, (u32 __user *) optval))
 354                        err = -EFAULT;
 355
 356                break;
 357
 358        case NFC_LLCP_REMOTE_RW:
 359                if (put_user(llcp_sock->remote_rw, (u32 __user *) optval))
 360                        err = -EFAULT;
 361
 362                break;
 363
 364        default:
 365                err = -ENOPROTOOPT;
 366                break;
 367        }
 368
 369        release_sock(sk);
 370
 371        if (put_user(len, optlen))
 372                return -EFAULT;
 373
 374        return err;
 375}
 376
 377void nfc_llcp_accept_unlink(struct sock *sk)
 378{
 379        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 380
 381        pr_debug("state %d\n", sk->sk_state);
 382
 383        list_del_init(&llcp_sock->accept_queue);
 384        sk_acceptq_removed(llcp_sock->parent);
 385        llcp_sock->parent = NULL;
 386
 387        sock_put(sk);
 388}
 389
 390void nfc_llcp_accept_enqueue(struct sock *parent, struct sock *sk)
 391{
 392        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 393        struct nfc_llcp_sock *llcp_sock_parent = nfc_llcp_sock(parent);
 394
 395        /* Lock will be free from unlink */
 396        sock_hold(sk);
 397
 398        list_add_tail(&llcp_sock->accept_queue,
 399                      &llcp_sock_parent->accept_queue);
 400        llcp_sock->parent = parent;
 401        sk_acceptq_added(parent);
 402}
 403
 404struct sock *nfc_llcp_accept_dequeue(struct sock *parent,
 405                                     struct socket *newsock)
 406{
 407        struct nfc_llcp_sock *lsk, *n, *llcp_parent;
 408        struct sock *sk;
 409
 410        llcp_parent = nfc_llcp_sock(parent);
 411
 412        list_for_each_entry_safe(lsk, n, &llcp_parent->accept_queue,
 413                                 accept_queue) {
 414                sk = &lsk->sk;
 415                lock_sock(sk);
 416
 417                if (sk->sk_state == LLCP_CLOSED) {
 418                        release_sock(sk);
 419                        nfc_llcp_accept_unlink(sk);
 420                        continue;
 421                }
 422
 423                if (sk->sk_state == LLCP_CONNECTED || !newsock) {
 424                        list_del_init(&lsk->accept_queue);
 425                        sock_put(sk);
 426
 427                        if (newsock)
 428                                sock_graft(sk, newsock);
 429
 430                        release_sock(sk);
 431
 432                        pr_debug("Returning sk state %d\n", sk->sk_state);
 433
 434                        sk_acceptq_removed(parent);
 435
 436                        return sk;
 437                }
 438
 439                release_sock(sk);
 440        }
 441
 442        return NULL;
 443}
 444
 445static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
 446                            int flags, bool kern)
 447{
 448        DECLARE_WAITQUEUE(wait, current);
 449        struct sock *sk = sock->sk, *new_sk;
 450        long timeo;
 451        int ret = 0;
 452
 453        pr_debug("parent %p\n", sk);
 454
 455        lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
 456
 457        if (sk->sk_state != LLCP_LISTEN) {
 458                ret = -EBADFD;
 459                goto error;
 460        }
 461
 462        timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
 463
 464        /* Wait for an incoming connection. */
 465        add_wait_queue_exclusive(sk_sleep(sk), &wait);
 466        while (!(new_sk = nfc_llcp_accept_dequeue(sk, newsock))) {
 467                set_current_state(TASK_INTERRUPTIBLE);
 468
 469                if (!timeo) {
 470                        ret = -EAGAIN;
 471                        break;
 472                }
 473
 474                if (signal_pending(current)) {
 475                        ret = sock_intr_errno(timeo);
 476                        break;
 477                }
 478
 479                release_sock(sk);
 480                timeo = schedule_timeout(timeo);
 481                lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
 482        }
 483        __set_current_state(TASK_RUNNING);
 484        remove_wait_queue(sk_sleep(sk), &wait);
 485
 486        if (ret)
 487                goto error;
 488
 489        newsock->state = SS_CONNECTED;
 490
 491        pr_debug("new socket %p\n", new_sk);
 492
 493error:
 494        release_sock(sk);
 495
 496        return ret;
 497}
 498
 499static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
 500                             int *len, int peer)
 501{
 502        struct sock *sk = sock->sk;
 503        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 504        DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, llcp_addr, uaddr);
 505
 506        if (llcp_sock == NULL || llcp_sock->dev == NULL)
 507                return -EBADFD;
 508
 509        pr_debug("%p %d %d %d\n", sk, llcp_sock->target_idx,
 510                 llcp_sock->dsap, llcp_sock->ssap);
 511
 512        memset(llcp_addr, 0, sizeof(*llcp_addr));
 513        *len = sizeof(struct sockaddr_nfc_llcp);
 514
 515        lock_sock(sk);
 516        if (!llcp_sock->dev) {
 517                release_sock(sk);
 518                return -EBADFD;
 519        }
 520        llcp_addr->sa_family = AF_NFC;
 521        llcp_addr->dev_idx = llcp_sock->dev->idx;
 522        llcp_addr->target_idx = llcp_sock->target_idx;
 523        llcp_addr->nfc_protocol = llcp_sock->nfc_protocol;
 524        llcp_addr->dsap = llcp_sock->dsap;
 525        llcp_addr->ssap = llcp_sock->ssap;
 526        llcp_addr->service_name_len = llcp_sock->service_name_len;
 527        memcpy(llcp_addr->service_name, llcp_sock->service_name,
 528               llcp_addr->service_name_len);
 529        release_sock(sk);
 530
 531        return 0;
 532}
 533
 534static inline unsigned int llcp_accept_poll(struct sock *parent)
 535{
 536        struct nfc_llcp_sock *llcp_sock, *parent_sock;
 537        struct sock *sk;
 538
 539        parent_sock = nfc_llcp_sock(parent);
 540
 541        list_for_each_entry(llcp_sock, &parent_sock->accept_queue,
 542                            accept_queue) {
 543                sk = &llcp_sock->sk;
 544
 545                if (sk->sk_state == LLCP_CONNECTED)
 546                        return POLLIN | POLLRDNORM;
 547        }
 548
 549        return 0;
 550}
 551
 552static unsigned int llcp_sock_poll(struct file *file, struct socket *sock,
 553                                   poll_table *wait)
 554{
 555        struct sock *sk = sock->sk;
 556        unsigned int mask = 0;
 557
 558        pr_debug("%p\n", sk);
 559
 560        sock_poll_wait(file, sk_sleep(sk), wait);
 561
 562        if (sk->sk_state == LLCP_LISTEN)
 563                return llcp_accept_poll(sk);
 564
 565        if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
 566                mask |= POLLERR |
 567                        (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
 568
 569        if (!skb_queue_empty(&sk->sk_receive_queue))
 570                mask |= POLLIN | POLLRDNORM;
 571
 572        if (sk->sk_state == LLCP_CLOSED)
 573                mask |= POLLHUP;
 574
 575        if (sk->sk_shutdown & RCV_SHUTDOWN)
 576                mask |= POLLRDHUP | POLLIN | POLLRDNORM;
 577
 578        if (sk->sk_shutdown == SHUTDOWN_MASK)
 579                mask |= POLLHUP;
 580
 581        if (sock_writeable(sk) && sk->sk_state == LLCP_CONNECTED)
 582                mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
 583        else
 584                sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
 585
 586        pr_debug("mask 0x%x\n", mask);
 587
 588        return mask;
 589}
 590
 591static int llcp_sock_release(struct socket *sock)
 592{
 593        struct sock *sk = sock->sk;
 594        struct nfc_llcp_local *local;
 595        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 596        int err = 0;
 597
 598        if (!sk)
 599                return 0;
 600
 601        pr_debug("%p\n", sk);
 602
 603        local = llcp_sock->local;
 604        if (local == NULL) {
 605                err = -ENODEV;
 606                goto out;
 607        }
 608
 609        lock_sock(sk);
 610
 611        /* Send a DISC */
 612        if (sk->sk_state == LLCP_CONNECTED)
 613                nfc_llcp_send_disconnect(llcp_sock);
 614
 615        if (sk->sk_state == LLCP_LISTEN) {
 616                struct nfc_llcp_sock *lsk, *n;
 617                struct sock *accept_sk;
 618
 619                list_for_each_entry_safe(lsk, n, &llcp_sock->accept_queue,
 620                                         accept_queue) {
 621                        accept_sk = &lsk->sk;
 622                        lock_sock(accept_sk);
 623
 624                        nfc_llcp_send_disconnect(lsk);
 625                        nfc_llcp_accept_unlink(accept_sk);
 626
 627                        release_sock(accept_sk);
 628                }
 629        }
 630
 631        if (llcp_sock->reserved_ssap < LLCP_SAP_MAX)
 632                nfc_llcp_put_ssap(llcp_sock->local, llcp_sock->ssap);
 633
 634        release_sock(sk);
 635
 636        /* Keep this sock alive and therefore do not remove it from the sockets
 637         * list until the DISC PDU has been actually sent. Otherwise we would
 638         * reply with DM PDUs before sending the DISC one.
 639         */
 640        if (sk->sk_state == LLCP_DISCONNECTING)
 641                return err;
 642
 643        if (sock->type == SOCK_RAW)
 644                nfc_llcp_sock_unlink(&local->raw_sockets, sk);
 645        else
 646                nfc_llcp_sock_unlink(&local->sockets, sk);
 647
 648out:
 649        sock_orphan(sk);
 650        sock_put(sk);
 651
 652        return err;
 653}
 654
 655static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
 656                             int len, int flags)
 657{
 658        struct sock *sk = sock->sk;
 659        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 660        struct sockaddr_nfc_llcp *addr = (struct sockaddr_nfc_llcp *)_addr;
 661        struct nfc_dev *dev;
 662        struct nfc_llcp_local *local;
 663        int ret = 0;
 664
 665        pr_debug("sock %p sk %p flags 0x%x\n", sock, sk, flags);
 666
 667        if (!addr || len < sizeof(*addr) || addr->sa_family != AF_NFC)
 668                return -EINVAL;
 669
 670        if (addr->service_name_len == 0 && addr->dsap == 0)
 671                return -EINVAL;
 672
 673        pr_debug("addr dev_idx=%u target_idx=%u protocol=%u\n", addr->dev_idx,
 674                 addr->target_idx, addr->nfc_protocol);
 675
 676        lock_sock(sk);
 677
 678        if (sk->sk_state == LLCP_CONNECTED) {
 679                ret = -EISCONN;
 680                goto error;
 681        }
 682
 683        dev = nfc_get_device(addr->dev_idx);
 684        if (dev == NULL) {
 685                ret = -ENODEV;
 686                goto error;
 687        }
 688
 689        local = nfc_llcp_find_local(dev);
 690        if (local == NULL) {
 691                ret = -ENODEV;
 692                goto put_dev;
 693        }
 694
 695        device_lock(&dev->dev);
 696        if (dev->dep_link_up == false) {
 697                ret = -ENOLINK;
 698                device_unlock(&dev->dev);
 699                goto put_dev;
 700        }
 701        device_unlock(&dev->dev);
 702
 703        if (local->rf_mode == NFC_RF_INITIATOR &&
 704            addr->target_idx != local->target_idx) {
 705                ret = -ENOLINK;
 706                goto put_dev;
 707        }
 708
 709        llcp_sock->dev = dev;
 710        llcp_sock->local = nfc_llcp_local_get(local);
 711        llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
 712        if (llcp_sock->ssap == LLCP_SAP_MAX) {
 713                ret = -ENOMEM;
 714                goto put_dev;
 715        }
 716
 717        llcp_sock->reserved_ssap = llcp_sock->ssap;
 718
 719        if (addr->service_name_len == 0)
 720                llcp_sock->dsap = addr->dsap;
 721        else
 722                llcp_sock->dsap = LLCP_SAP_SDP;
 723        llcp_sock->nfc_protocol = addr->nfc_protocol;
 724        llcp_sock->service_name_len = min_t(unsigned int,
 725                                            addr->service_name_len,
 726                                            NFC_LLCP_MAX_SERVICE_NAME);
 727        llcp_sock->service_name = kmemdup(addr->service_name,
 728                                          llcp_sock->service_name_len,
 729                                          GFP_KERNEL);
 730
 731        nfc_llcp_sock_link(&local->connecting_sockets, sk);
 732
 733        ret = nfc_llcp_send_connect(llcp_sock);
 734        if (ret)
 735                goto sock_unlink;
 736
 737        sk->sk_state = LLCP_CONNECTING;
 738
 739        ret = sock_wait_state(sk, LLCP_CONNECTED,
 740                              sock_sndtimeo(sk, flags & O_NONBLOCK));
 741        if (ret && ret != -EINPROGRESS)
 742                goto sock_unlink;
 743
 744        release_sock(sk);
 745
 746        return ret;
 747
 748sock_unlink:
 749        nfc_llcp_put_ssap(local, llcp_sock->ssap);
 750
 751        nfc_llcp_sock_unlink(&local->connecting_sockets, sk);
 752
 753put_dev:
 754        nfc_put_device(dev);
 755
 756error:
 757        release_sock(sk);
 758        return ret;
 759}
 760
 761static int llcp_sock_sendmsg(struct socket *sock, struct msghdr *msg,
 762                             size_t len)
 763{
 764        struct sock *sk = sock->sk;
 765        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 766        int ret;
 767
 768        pr_debug("sock %p sk %p", sock, sk);
 769
 770        ret = sock_error(sk);
 771        if (ret)
 772                return ret;
 773
 774        if (msg->msg_flags & MSG_OOB)
 775                return -EOPNOTSUPP;
 776
 777        lock_sock(sk);
 778
 779        if (sk->sk_type == SOCK_DGRAM) {
 780                DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, addr,
 781                                 msg->msg_name);
 782
 783                if (msg->msg_namelen < sizeof(*addr)) {
 784                        release_sock(sk);
 785                        return -EINVAL;
 786                }
 787
 788                release_sock(sk);
 789
 790                return nfc_llcp_send_ui_frame(llcp_sock, addr->dsap, addr->ssap,
 791                                              msg, len);
 792        }
 793
 794        if (sk->sk_state != LLCP_CONNECTED) {
 795                release_sock(sk);
 796                return -ENOTCONN;
 797        }
 798
 799        release_sock(sk);
 800
 801        return nfc_llcp_send_i_frame(llcp_sock, msg, len);
 802}
 803
 804static int llcp_sock_recvmsg(struct socket *sock, struct msghdr *msg,
 805                             size_t len, int flags)
 806{
 807        int noblock = flags & MSG_DONTWAIT;
 808        struct sock *sk = sock->sk;
 809        unsigned int copied, rlen;
 810        struct sk_buff *skb, *cskb;
 811        int err = 0;
 812
 813        pr_debug("%p %zu\n", sk, len);
 814
 815        lock_sock(sk);
 816
 817        if (sk->sk_state == LLCP_CLOSED &&
 818            skb_queue_empty(&sk->sk_receive_queue)) {
 819                release_sock(sk);
 820                return 0;
 821        }
 822
 823        release_sock(sk);
 824
 825        if (flags & (MSG_OOB))
 826                return -EOPNOTSUPP;
 827
 828        skb = skb_recv_datagram(sk, flags, noblock, &err);
 829        if (!skb) {
 830                pr_err("Recv datagram failed state %d %d %d",
 831                       sk->sk_state, err, sock_error(sk));
 832
 833                if (sk->sk_shutdown & RCV_SHUTDOWN)
 834                        return 0;
 835
 836                return err;
 837        }
 838
 839        rlen = skb->len;                /* real length of skb */
 840        copied = min_t(unsigned int, rlen, len);
 841
 842        cskb = skb;
 843        if (skb_copy_datagram_msg(cskb, 0, msg, copied)) {
 844                if (!(flags & MSG_PEEK))
 845                        skb_queue_head(&sk->sk_receive_queue, skb);
 846                return -EFAULT;
 847        }
 848
 849        sock_recv_timestamp(msg, sk, skb);
 850
 851        if (sk->sk_type == SOCK_DGRAM && msg->msg_name) {
 852                struct nfc_llcp_ui_cb *ui_cb = nfc_llcp_ui_skb_cb(skb);
 853                DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, sockaddr,
 854                                 msg->msg_name);
 855
 856                msg->msg_namelen = sizeof(struct sockaddr_nfc_llcp);
 857
 858                pr_debug("Datagram socket %d %d\n", ui_cb->dsap, ui_cb->ssap);
 859
 860                memset(sockaddr, 0, sizeof(*sockaddr));
 861                sockaddr->sa_family = AF_NFC;
 862                sockaddr->nfc_protocol = NFC_PROTO_NFC_DEP;
 863                sockaddr->dsap = ui_cb->dsap;
 864                sockaddr->ssap = ui_cb->ssap;
 865        }
 866
 867        /* Mark read part of skb as used */
 868        if (!(flags & MSG_PEEK)) {
 869
 870                /* SOCK_STREAM: re-queue skb if it contains unreceived data */
 871                if (sk->sk_type == SOCK_STREAM ||
 872                    sk->sk_type == SOCK_DGRAM ||
 873                    sk->sk_type == SOCK_RAW) {
 874                        skb_pull(skb, copied);
 875                        if (skb->len) {
 876                                skb_queue_head(&sk->sk_receive_queue, skb);
 877                                goto done;
 878                        }
 879                }
 880
 881                kfree_skb(skb);
 882        }
 883
 884        /* XXX Queue backlogged skbs */
 885
 886done:
 887        /* SOCK_SEQPACKET: return real length if MSG_TRUNC is set */
 888        if (sk->sk_type == SOCK_SEQPACKET && (flags & MSG_TRUNC))
 889                copied = rlen;
 890
 891        return copied;
 892}
 893
 894static const struct proto_ops llcp_sock_ops = {
 895        .family         = PF_NFC,
 896        .owner          = THIS_MODULE,
 897        .bind           = llcp_sock_bind,
 898        .connect        = llcp_sock_connect,
 899        .release        = llcp_sock_release,
 900        .socketpair     = sock_no_socketpair,
 901        .accept         = llcp_sock_accept,
 902        .getname        = llcp_sock_getname,
 903        .poll           = llcp_sock_poll,
 904        .ioctl          = sock_no_ioctl,
 905        .listen         = llcp_sock_listen,
 906        .shutdown       = sock_no_shutdown,
 907        .setsockopt     = nfc_llcp_setsockopt,
 908        .getsockopt     = nfc_llcp_getsockopt,
 909        .sendmsg        = llcp_sock_sendmsg,
 910        .recvmsg        = llcp_sock_recvmsg,
 911        .mmap           = sock_no_mmap,
 912};
 913
 914static const struct proto_ops llcp_rawsock_ops = {
 915        .family         = PF_NFC,
 916        .owner          = THIS_MODULE,
 917        .bind           = llcp_raw_sock_bind,
 918        .connect        = sock_no_connect,
 919        .release        = llcp_sock_release,
 920        .socketpair     = sock_no_socketpair,
 921        .accept         = sock_no_accept,
 922        .getname        = llcp_sock_getname,
 923        .poll           = llcp_sock_poll,
 924        .ioctl          = sock_no_ioctl,
 925        .listen         = sock_no_listen,
 926        .shutdown       = sock_no_shutdown,
 927        .setsockopt     = sock_no_setsockopt,
 928        .getsockopt     = sock_no_getsockopt,
 929        .sendmsg        = sock_no_sendmsg,
 930        .recvmsg        = llcp_sock_recvmsg,
 931        .mmap           = sock_no_mmap,
 932};
 933
 934static void llcp_sock_destruct(struct sock *sk)
 935{
 936        struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
 937
 938        pr_debug("%p\n", sk);
 939
 940        if (sk->sk_state == LLCP_CONNECTED)
 941                nfc_put_device(llcp_sock->dev);
 942
 943        skb_queue_purge(&sk->sk_receive_queue);
 944
 945        nfc_llcp_sock_free(llcp_sock);
 946
 947        if (!sock_flag(sk, SOCK_DEAD)) {
 948                pr_err("Freeing alive NFC LLCP socket %p\n", sk);
 949                return;
 950        }
 951}
 952
 953struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp, int kern)
 954{
 955        struct sock *sk;
 956        struct nfc_llcp_sock *llcp_sock;
 957
 958        sk = sk_alloc(&init_net, PF_NFC, gfp, &llcp_sock_proto, kern);
 959        if (!sk)
 960                return NULL;
 961
 962        llcp_sock = nfc_llcp_sock(sk);
 963
 964        sock_init_data(sock, sk);
 965        sk->sk_state = LLCP_CLOSED;
 966        sk->sk_protocol = NFC_SOCKPROTO_LLCP;
 967        sk->sk_type = type;
 968        sk->sk_destruct = llcp_sock_destruct;
 969
 970        llcp_sock->ssap = 0;
 971        llcp_sock->dsap = LLCP_SAP_SDP;
 972        llcp_sock->rw = LLCP_MAX_RW + 1;
 973        llcp_sock->miux = cpu_to_be16(LLCP_MAX_MIUX + 1);
 974        llcp_sock->send_n = llcp_sock->send_ack_n = 0;
 975        llcp_sock->recv_n = llcp_sock->recv_ack_n = 0;
 976        llcp_sock->remote_ready = 1;
 977        llcp_sock->reserved_ssap = LLCP_SAP_MAX;
 978        nfc_llcp_socket_remote_param_init(llcp_sock);
 979        skb_queue_head_init(&llcp_sock->tx_queue);
 980        skb_queue_head_init(&llcp_sock->tx_pending_queue);
 981        INIT_LIST_HEAD(&llcp_sock->accept_queue);
 982
 983        if (sock != NULL)
 984                sock->state = SS_UNCONNECTED;
 985
 986        return sk;
 987}
 988
 989void nfc_llcp_sock_free(struct nfc_llcp_sock *sock)
 990{
 991        kfree(sock->service_name);
 992
 993        skb_queue_purge(&sock->tx_queue);
 994        skb_queue_purge(&sock->tx_pending_queue);
 995
 996        list_del_init(&sock->accept_queue);
 997
 998        sock->parent = NULL;
 999
1000        nfc_llcp_local_put(sock->local);
1001}
1002
1003static int llcp_sock_create(struct net *net, struct socket *sock,
1004                            const struct nfc_protocol *nfc_proto, int kern)
1005{
1006        struct sock *sk;
1007
1008        pr_debug("%p\n", sock);
1009
1010        if (sock->type != SOCK_STREAM &&
1011            sock->type != SOCK_DGRAM &&
1012            sock->type != SOCK_RAW)
1013                return -ESOCKTNOSUPPORT;
1014
1015        if (sock->type == SOCK_RAW)
1016                sock->ops = &llcp_rawsock_ops;
1017        else
1018                sock->ops = &llcp_sock_ops;
1019
1020        sk = nfc_llcp_sock_alloc(sock, sock->type, GFP_ATOMIC, kern);
1021        if (sk == NULL)
1022                return -ENOMEM;
1023
1024        return 0;
1025}
1026
1027static const struct nfc_protocol llcp_nfc_proto = {
1028        .id       = NFC_SOCKPROTO_LLCP,
1029        .proto    = &llcp_sock_proto,
1030        .owner    = THIS_MODULE,
1031        .create   = llcp_sock_create
1032};
1033
1034int __init nfc_llcp_sock_init(void)
1035{
1036        return nfc_proto_register(&llcp_nfc_proto);
1037}
1038
1039void nfc_llcp_sock_exit(void)
1040{
1041        nfc_proto_unregister(&llcp_nfc_proto);
1042}
1043