linux/net/nfc/llcp_commands.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2011  Intel Corporation. All rights reserved.
   4 */
   5
   6#define pr_fmt(fmt) "llcp: %s: " fmt, __func__
   7
   8#include <linux/init.h>
   9#include <linux/kernel.h>
  10#include <linux/module.h>
  11#include <linux/nfc.h>
  12
  13#include <net/nfc/nfc.h>
  14
  15#include "nfc.h"
  16#include "llcp.h"
  17
  18static const u8 llcp_tlv_length[LLCP_TLV_MAX] = {
  19        0,
  20        1, /* VERSION */
  21        2, /* MIUX */
  22        2, /* WKS */
  23        1, /* LTO */
  24        1, /* RW */
  25        0, /* SN */
  26        1, /* OPT */
  27        0, /* SDREQ */
  28        2, /* SDRES */
  29
  30};
  31
  32static u8 llcp_tlv8(const u8 *tlv, u8 type)
  33{
  34        if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
  35                return 0;
  36
  37        return tlv[2];
  38}
  39
  40static u16 llcp_tlv16(const u8 *tlv, u8 type)
  41{
  42        if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
  43                return 0;
  44
  45        return be16_to_cpu(*((__be16 *)(tlv + 2)));
  46}
  47
  48
  49static u8 llcp_tlv_version(const u8 *tlv)
  50{
  51        return llcp_tlv8(tlv, LLCP_TLV_VERSION);
  52}
  53
  54static u16 llcp_tlv_miux(const u8 *tlv)
  55{
  56        return llcp_tlv16(tlv, LLCP_TLV_MIUX) & 0x7ff;
  57}
  58
  59static u16 llcp_tlv_wks(const u8 *tlv)
  60{
  61        return llcp_tlv16(tlv, LLCP_TLV_WKS);
  62}
  63
  64static u16 llcp_tlv_lto(const u8 *tlv)
  65{
  66        return llcp_tlv8(tlv, LLCP_TLV_LTO);
  67}
  68
  69static u8 llcp_tlv_opt(const u8 *tlv)
  70{
  71        return llcp_tlv8(tlv, LLCP_TLV_OPT);
  72}
  73
  74static u8 llcp_tlv_rw(const u8 *tlv)
  75{
  76        return llcp_tlv8(tlv, LLCP_TLV_RW) & 0xf;
  77}
  78
  79u8 *nfc_llcp_build_tlv(u8 type, const u8 *value, u8 value_length, u8 *tlv_length)
  80{
  81        u8 *tlv, length;
  82
  83        pr_debug("type %d\n", type);
  84
  85        if (type >= LLCP_TLV_MAX)
  86                return NULL;
  87
  88        length = llcp_tlv_length[type];
  89        if (length == 0 && value_length == 0)
  90                return NULL;
  91        else if (length == 0)
  92                length = value_length;
  93
  94        *tlv_length = 2 + length;
  95        tlv = kzalloc(2 + length, GFP_KERNEL);
  96        if (tlv == NULL)
  97                return tlv;
  98
  99        tlv[0] = type;
 100        tlv[1] = length;
 101        memcpy(tlv + 2, value, length);
 102
 103        return tlv;
 104}
 105
 106struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap)
 107{
 108        struct nfc_llcp_sdp_tlv *sdres;
 109        u8 value[2];
 110
 111        sdres = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
 112        if (sdres == NULL)
 113                return NULL;
 114
 115        value[0] = tid;
 116        value[1] = sap;
 117
 118        sdres->tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, value, 2,
 119                                        &sdres->tlv_len);
 120        if (sdres->tlv == NULL) {
 121                kfree(sdres);
 122                return NULL;
 123        }
 124
 125        sdres->tid = tid;
 126        sdres->sap = sap;
 127
 128        INIT_HLIST_NODE(&sdres->node);
 129
 130        return sdres;
 131}
 132
 133struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, const char *uri,
 134                                                  size_t uri_len)
 135{
 136        struct nfc_llcp_sdp_tlv *sdreq;
 137
 138        pr_debug("uri: %s, len: %zu\n", uri, uri_len);
 139
 140        /* sdreq->tlv_len is u8, takes uri_len, + 3 for header, + 1 for NULL */
 141        if (WARN_ON_ONCE(uri_len > U8_MAX - 4))
 142                return NULL;
 143
 144        sdreq = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
 145        if (sdreq == NULL)
 146                return NULL;
 147
 148        sdreq->tlv_len = uri_len + 3;
 149
 150        if (uri[uri_len - 1] == 0)
 151                sdreq->tlv_len--;
 152
 153        sdreq->tlv = kzalloc(sdreq->tlv_len + 1, GFP_KERNEL);
 154        if (sdreq->tlv == NULL) {
 155                kfree(sdreq);
 156                return NULL;
 157        }
 158
 159        sdreq->tlv[0] = LLCP_TLV_SDREQ;
 160        sdreq->tlv[1] = sdreq->tlv_len - 2;
 161        sdreq->tlv[2] = tid;
 162
 163        sdreq->tid = tid;
 164        sdreq->uri = sdreq->tlv + 3;
 165        memcpy(sdreq->uri, uri, uri_len);
 166
 167        sdreq->time = jiffies;
 168
 169        INIT_HLIST_NODE(&sdreq->node);
 170
 171        return sdreq;
 172}
 173
 174void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp)
 175{
 176        kfree(sdp->tlv);
 177        kfree(sdp);
 178}
 179
 180void nfc_llcp_free_sdp_tlv_list(struct hlist_head *head)
 181{
 182        struct nfc_llcp_sdp_tlv *sdp;
 183        struct hlist_node *n;
 184
 185        hlist_for_each_entry_safe(sdp, n, head, node) {
 186                hlist_del(&sdp->node);
 187
 188                nfc_llcp_free_sdp_tlv(sdp);
 189        }
 190}
 191
 192int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
 193                          const u8 *tlv_array, u16 tlv_array_len)
 194{
 195        const u8 *tlv = tlv_array;
 196        u8 type, length, offset = 0;
 197
 198        pr_debug("TLV array length %d\n", tlv_array_len);
 199
 200        if (local == NULL)
 201                return -ENODEV;
 202
 203        while (offset < tlv_array_len) {
 204                type = tlv[0];
 205                length = tlv[1];
 206
 207                pr_debug("type 0x%x length %d\n", type, length);
 208
 209                switch (type) {
 210                case LLCP_TLV_VERSION:
 211                        local->remote_version = llcp_tlv_version(tlv);
 212                        break;
 213                case LLCP_TLV_MIUX:
 214                        local->remote_miu = llcp_tlv_miux(tlv) + 128;
 215                        break;
 216                case LLCP_TLV_WKS:
 217                        local->remote_wks = llcp_tlv_wks(tlv);
 218                        break;
 219                case LLCP_TLV_LTO:
 220                        local->remote_lto = llcp_tlv_lto(tlv) * 10;
 221                        break;
 222                case LLCP_TLV_OPT:
 223                        local->remote_opt = llcp_tlv_opt(tlv);
 224                        break;
 225                default:
 226                        pr_err("Invalid gt tlv value 0x%x\n", type);
 227                        break;
 228                }
 229
 230                offset += length + 2;
 231                tlv += length + 2;
 232        }
 233
 234        pr_debug("version 0x%x miu %d lto %d opt 0x%x wks 0x%x\n",
 235                 local->remote_version, local->remote_miu,
 236                 local->remote_lto, local->remote_opt,
 237                 local->remote_wks);
 238
 239        return 0;
 240}
 241
 242int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
 243                                  const u8 *tlv_array, u16 tlv_array_len)
 244{
 245        const u8 *tlv = tlv_array;
 246        u8 type, length, offset = 0;
 247
 248        pr_debug("TLV array length %d\n", tlv_array_len);
 249
 250        if (sock == NULL)
 251                return -ENOTCONN;
 252
 253        while (offset < tlv_array_len) {
 254                type = tlv[0];
 255                length = tlv[1];
 256
 257                pr_debug("type 0x%x length %d\n", type, length);
 258
 259                switch (type) {
 260                case LLCP_TLV_MIUX:
 261                        sock->remote_miu = llcp_tlv_miux(tlv) + 128;
 262                        break;
 263                case LLCP_TLV_RW:
 264                        sock->remote_rw = llcp_tlv_rw(tlv);
 265                        break;
 266                case LLCP_TLV_SN:
 267                        break;
 268                default:
 269                        pr_err("Invalid gt tlv value 0x%x\n", type);
 270                        break;
 271                }
 272
 273                offset += length + 2;
 274                tlv += length + 2;
 275        }
 276
 277        pr_debug("sock %p rw %d miu %d\n", sock,
 278                 sock->remote_rw, sock->remote_miu);
 279
 280        return 0;
 281}
 282
 283static struct sk_buff *llcp_add_header(struct sk_buff *pdu,
 284                                       u8 dsap, u8 ssap, u8 ptype)
 285{
 286        u8 header[2];
 287
 288        pr_debug("ptype 0x%x dsap 0x%x ssap 0x%x\n", ptype, dsap, ssap);
 289
 290        header[0] = (u8)((dsap << 2) | (ptype >> 2));
 291        header[1] = (u8)((ptype << 6) | ssap);
 292
 293        pr_debug("header 0x%x 0x%x\n", header[0], header[1]);
 294
 295        skb_put_data(pdu, header, LLCP_HEADER_SIZE);
 296
 297        return pdu;
 298}
 299
 300static struct sk_buff *llcp_add_tlv(struct sk_buff *pdu, const u8 *tlv,
 301                                    u8 tlv_length)
 302{
 303        /* XXX Add an skb length check */
 304
 305        if (tlv == NULL)
 306                return NULL;
 307
 308        skb_put_data(pdu, tlv, tlv_length);
 309
 310        return pdu;
 311}
 312
 313static struct sk_buff *llcp_allocate_pdu(struct nfc_llcp_sock *sock,
 314                                         u8 cmd, u16 size)
 315{
 316        struct sk_buff *skb;
 317        int err;
 318
 319        if (sock->ssap == 0)
 320                return NULL;
 321
 322        skb = nfc_alloc_send_skb(sock->dev, &sock->sk, MSG_DONTWAIT,
 323                                 size + LLCP_HEADER_SIZE, &err);
 324        if (skb == NULL) {
 325                pr_err("Could not allocate PDU\n");
 326                return NULL;
 327        }
 328
 329        skb = llcp_add_header(skb, sock->dsap, sock->ssap, cmd);
 330
 331        return skb;
 332}
 333
 334int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)
 335{
 336        struct sk_buff *skb;
 337        struct nfc_dev *dev;
 338        struct nfc_llcp_local *local;
 339
 340        pr_debug("Sending DISC\n");
 341
 342        local = sock->local;
 343        if (local == NULL)
 344                return -ENODEV;
 345
 346        dev = sock->dev;
 347        if (dev == NULL)
 348                return -ENODEV;
 349
 350        skb = llcp_allocate_pdu(sock, LLCP_PDU_DISC, 0);
 351        if (skb == NULL)
 352                return -ENOMEM;
 353
 354        skb_queue_tail(&local->tx_queue, skb);
 355
 356        return 0;
 357}
 358
 359int nfc_llcp_send_symm(struct nfc_dev *dev)
 360{
 361        struct sk_buff *skb;
 362        struct nfc_llcp_local *local;
 363        u16 size = 0;
 364
 365        pr_debug("Sending SYMM\n");
 366
 367        local = nfc_llcp_find_local(dev);
 368        if (local == NULL)
 369                return -ENODEV;
 370
 371        size += LLCP_HEADER_SIZE;
 372        size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
 373
 374        skb = alloc_skb(size, GFP_KERNEL);
 375        if (skb == NULL)
 376                return -ENOMEM;
 377
 378        skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
 379
 380        skb = llcp_add_header(skb, 0, 0, LLCP_PDU_SYMM);
 381
 382        __net_timestamp(skb);
 383
 384        nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_TX);
 385
 386        return nfc_data_exchange(dev, local->target_idx, skb,
 387                                 nfc_llcp_recv, local);
 388}
 389
 390int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
 391{
 392        struct nfc_llcp_local *local;
 393        struct sk_buff *skb;
 394        const u8 *service_name_tlv = NULL;
 395        const u8 *miux_tlv = NULL;
 396        const u8 *rw_tlv = NULL;
 397        u8 service_name_tlv_length, miux_tlv_length,  rw_tlv_length, rw;
 398        int err;
 399        u16 size = 0;
 400        __be16 miux;
 401
 402        pr_debug("Sending CONNECT\n");
 403
 404        local = sock->local;
 405        if (local == NULL)
 406                return -ENODEV;
 407
 408        if (sock->service_name != NULL) {
 409                service_name_tlv = nfc_llcp_build_tlv(LLCP_TLV_SN,
 410                                                      sock->service_name,
 411                                                      sock->service_name_len,
 412                                                      &service_name_tlv_length);
 413                if (!service_name_tlv) {
 414                        err = -ENOMEM;
 415                        goto error_tlv;
 416                }
 417                size += service_name_tlv_length;
 418        }
 419
 420        /* If the socket parameters are not set, use the local ones */
 421        miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
 422                local->miux : sock->miux;
 423        rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
 424
 425        miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
 426                                      &miux_tlv_length);
 427        if (!miux_tlv) {
 428                err = -ENOMEM;
 429                goto error_tlv;
 430        }
 431        size += miux_tlv_length;
 432
 433        rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
 434        if (!rw_tlv) {
 435                err = -ENOMEM;
 436                goto error_tlv;
 437        }
 438        size += rw_tlv_length;
 439
 440        pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
 441
 442        skb = llcp_allocate_pdu(sock, LLCP_PDU_CONNECT, size);
 443        if (skb == NULL) {
 444                err = -ENOMEM;
 445                goto error_tlv;
 446        }
 447
 448        llcp_add_tlv(skb, service_name_tlv, service_name_tlv_length);
 449        llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
 450        llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
 451
 452        skb_queue_tail(&local->tx_queue, skb);
 453
 454        err = 0;
 455
 456error_tlv:
 457        if (err)
 458                pr_err("error %d\n", err);
 459
 460        kfree(service_name_tlv);
 461        kfree(miux_tlv);
 462        kfree(rw_tlv);
 463
 464        return err;
 465}
 466
 467int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
 468{
 469        struct nfc_llcp_local *local;
 470        struct sk_buff *skb;
 471        const u8 *miux_tlv = NULL;
 472        const u8 *rw_tlv = NULL;
 473        u8 miux_tlv_length, rw_tlv_length, rw;
 474        int err;
 475        u16 size = 0;
 476        __be16 miux;
 477
 478        pr_debug("Sending CC\n");
 479
 480        local = sock->local;
 481        if (local == NULL)
 482                return -ENODEV;
 483
 484        /* If the socket parameters are not set, use the local ones */
 485        miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
 486                local->miux : sock->miux;
 487        rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
 488
 489        miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
 490                                      &miux_tlv_length);
 491        if (!miux_tlv) {
 492                err = -ENOMEM;
 493                goto error_tlv;
 494        }
 495        size += miux_tlv_length;
 496
 497        rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
 498        if (!rw_tlv) {
 499                err = -ENOMEM;
 500                goto error_tlv;
 501        }
 502        size += rw_tlv_length;
 503
 504        skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
 505        if (skb == NULL) {
 506                err = -ENOMEM;
 507                goto error_tlv;
 508        }
 509
 510        llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
 511        llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
 512
 513        skb_queue_tail(&local->tx_queue, skb);
 514
 515        err = 0;
 516
 517error_tlv:
 518        if (err)
 519                pr_err("error %d\n", err);
 520
 521        kfree(miux_tlv);
 522        kfree(rw_tlv);
 523
 524        return err;
 525}
 526
 527static struct sk_buff *nfc_llcp_allocate_snl(struct nfc_llcp_local *local,
 528                                             size_t tlv_length)
 529{
 530        struct sk_buff *skb;
 531        struct nfc_dev *dev;
 532        u16 size = 0;
 533
 534        if (local == NULL)
 535                return ERR_PTR(-ENODEV);
 536
 537        dev = local->dev;
 538        if (dev == NULL)
 539                return ERR_PTR(-ENODEV);
 540
 541        size += LLCP_HEADER_SIZE;
 542        size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
 543        size += tlv_length;
 544
 545        skb = alloc_skb(size, GFP_KERNEL);
 546        if (skb == NULL)
 547                return ERR_PTR(-ENOMEM);
 548
 549        skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
 550
 551        skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);
 552
 553        return skb;
 554}
 555
 556int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
 557                            struct hlist_head *tlv_list, size_t tlvs_len)
 558{
 559        struct nfc_llcp_sdp_tlv *sdp;
 560        struct hlist_node *n;
 561        struct sk_buff *skb;
 562
 563        skb = nfc_llcp_allocate_snl(local, tlvs_len);
 564        if (IS_ERR(skb))
 565                return PTR_ERR(skb);
 566
 567        hlist_for_each_entry_safe(sdp, n, tlv_list, node) {
 568                skb_put_data(skb, sdp->tlv, sdp->tlv_len);
 569
 570                hlist_del(&sdp->node);
 571
 572                nfc_llcp_free_sdp_tlv(sdp);
 573        }
 574
 575        skb_queue_tail(&local->tx_queue, skb);
 576
 577        return 0;
 578}
 579
 580int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
 581                            struct hlist_head *tlv_list, size_t tlvs_len)
 582{
 583        struct nfc_llcp_sdp_tlv *sdreq;
 584        struct hlist_node *n;
 585        struct sk_buff *skb;
 586
 587        skb = nfc_llcp_allocate_snl(local, tlvs_len);
 588        if (IS_ERR(skb))
 589                return PTR_ERR(skb);
 590
 591        mutex_lock(&local->sdreq_lock);
 592
 593        if (hlist_empty(&local->pending_sdreqs))
 594                mod_timer(&local->sdreq_timer,
 595                          jiffies + msecs_to_jiffies(3 * local->remote_lto));
 596
 597        hlist_for_each_entry_safe(sdreq, n, tlv_list, node) {
 598                pr_debug("tid %d for %s\n", sdreq->tid, sdreq->uri);
 599
 600                skb_put_data(skb, sdreq->tlv, sdreq->tlv_len);
 601
 602                hlist_del(&sdreq->node);
 603
 604                hlist_add_head(&sdreq->node, &local->pending_sdreqs);
 605        }
 606
 607        mutex_unlock(&local->sdreq_lock);
 608
 609        skb_queue_tail(&local->tx_queue, skb);
 610
 611        return 0;
 612}
 613
 614int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
 615{
 616        struct sk_buff *skb;
 617        struct nfc_dev *dev;
 618        u16 size = 1; /* Reason code */
 619
 620        pr_debug("Sending DM reason 0x%x\n", reason);
 621
 622        if (local == NULL)
 623                return -ENODEV;
 624
 625        dev = local->dev;
 626        if (dev == NULL)
 627                return -ENODEV;
 628
 629        size += LLCP_HEADER_SIZE;
 630        size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
 631
 632        skb = alloc_skb(size, GFP_KERNEL);
 633        if (skb == NULL)
 634                return -ENOMEM;
 635
 636        skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
 637
 638        skb = llcp_add_header(skb, dsap, ssap, LLCP_PDU_DM);
 639
 640        skb_put_data(skb, &reason, 1);
 641
 642        skb_queue_head(&local->tx_queue, skb);
 643
 644        return 0;
 645}
 646
 647int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
 648                          struct msghdr *msg, size_t len)
 649{
 650        struct sk_buff *pdu;
 651        struct sock *sk = &sock->sk;
 652        struct nfc_llcp_local *local;
 653        size_t frag_len = 0, remaining_len;
 654        u8 *msg_data, *msg_ptr;
 655        u16 remote_miu;
 656
 657        pr_debug("Send I frame len %zd\n", len);
 658
 659        local = sock->local;
 660        if (local == NULL)
 661                return -ENODEV;
 662
 663        /* Remote is ready but has not acknowledged our frames */
 664        if((sock->remote_ready &&
 665            skb_queue_len(&sock->tx_pending_queue) >= sock->remote_rw &&
 666            skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
 667                pr_err("Pending queue is full %d frames\n",
 668                       skb_queue_len(&sock->tx_pending_queue));
 669                return -ENOBUFS;
 670        }
 671
 672        /* Remote is not ready and we've been queueing enough frames */
 673        if ((!sock->remote_ready &&
 674             skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
 675                pr_err("Tx queue is full %d frames\n",
 676                       skb_queue_len(&sock->tx_queue));
 677                return -ENOBUFS;
 678        }
 679
 680        msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
 681        if (msg_data == NULL)
 682                return -ENOMEM;
 683
 684        if (memcpy_from_msg(msg_data, msg, len)) {
 685                kfree(msg_data);
 686                return -EFAULT;
 687        }
 688
 689        remaining_len = len;
 690        msg_ptr = msg_data;
 691
 692        do {
 693                remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
 694                                LLCP_DEFAULT_MIU : sock->remote_miu;
 695
 696                frag_len = min_t(size_t, remote_miu, remaining_len);
 697
 698                pr_debug("Fragment %zd bytes remaining %zd",
 699                         frag_len, remaining_len);
 700
 701                pdu = llcp_allocate_pdu(sock, LLCP_PDU_I,
 702                                        frag_len + LLCP_SEQUENCE_SIZE);
 703                if (pdu == NULL) {
 704                        kfree(msg_data);
 705                        return -ENOMEM;
 706                }
 707
 708                skb_put(pdu, LLCP_SEQUENCE_SIZE);
 709
 710                if (likely(frag_len > 0))
 711                        skb_put_data(pdu, msg_ptr, frag_len);
 712
 713                skb_queue_tail(&sock->tx_queue, pdu);
 714
 715                lock_sock(sk);
 716
 717                nfc_llcp_queue_i_frames(sock);
 718
 719                release_sock(sk);
 720
 721                remaining_len -= frag_len;
 722                msg_ptr += frag_len;
 723        } while (remaining_len > 0);
 724
 725        kfree(msg_data);
 726
 727        return len;
 728}
 729
 730int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
 731                           struct msghdr *msg, size_t len)
 732{
 733        struct sk_buff *pdu;
 734        struct nfc_llcp_local *local;
 735        size_t frag_len = 0, remaining_len;
 736        u8 *msg_ptr, *msg_data;
 737        u16 remote_miu;
 738        int err;
 739
 740        pr_debug("Send UI frame len %zd\n", len);
 741
 742        local = sock->local;
 743        if (local == NULL)
 744                return -ENODEV;
 745
 746        msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
 747        if (msg_data == NULL)
 748                return -ENOMEM;
 749
 750        if (memcpy_from_msg(msg_data, msg, len)) {
 751                kfree(msg_data);
 752                return -EFAULT;
 753        }
 754
 755        remaining_len = len;
 756        msg_ptr = msg_data;
 757
 758        do {
 759                remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
 760                                local->remote_miu : sock->remote_miu;
 761
 762                frag_len = min_t(size_t, remote_miu, remaining_len);
 763
 764                pr_debug("Fragment %zd bytes remaining %zd",
 765                         frag_len, remaining_len);
 766
 767                pdu = nfc_alloc_send_skb(sock->dev, &sock->sk, 0,
 768                                         frag_len + LLCP_HEADER_SIZE, &err);
 769                if (pdu == NULL) {
 770                        pr_err("Could not allocate PDU (error=%d)\n", err);
 771                        len -= remaining_len;
 772                        if (len == 0)
 773                                len = err;
 774                        break;
 775                }
 776
 777                pdu = llcp_add_header(pdu, dsap, ssap, LLCP_PDU_UI);
 778
 779                if (likely(frag_len > 0))
 780                        skb_put_data(pdu, msg_ptr, frag_len);
 781
 782                /* No need to check for the peer RW for UI frames */
 783                skb_queue_tail(&local->tx_queue, pdu);
 784
 785                remaining_len -= frag_len;
 786                msg_ptr += frag_len;
 787        } while (remaining_len > 0);
 788
 789        kfree(msg_data);
 790
 791        return len;
 792}
 793
 794int nfc_llcp_send_rr(struct nfc_llcp_sock *sock)
 795{
 796        struct sk_buff *skb;
 797        struct nfc_llcp_local *local;
 798
 799        pr_debug("Send rr nr %d\n", sock->recv_n);
 800
 801        local = sock->local;
 802        if (local == NULL)
 803                return -ENODEV;
 804
 805        skb = llcp_allocate_pdu(sock, LLCP_PDU_RR, LLCP_SEQUENCE_SIZE);
 806        if (skb == NULL)
 807                return -ENOMEM;
 808
 809        skb_put(skb, LLCP_SEQUENCE_SIZE);
 810
 811        skb->data[2] = sock->recv_n;
 812
 813        skb_queue_head(&local->tx_queue, skb);
 814
 815        return 0;
 816}
 817