0001
0002
0003
0004
0005
0006 #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
0007
0008 #include <linux/init.h>
0009 #include <linux/kernel.h>
0010 #include <linux/module.h>
0011 #include <linux/nfc.h>
0012
0013 #include <net/nfc/nfc.h>
0014
0015 #include "nfc.h"
0016 #include "llcp.h"
0017
0018 static const u8 llcp_tlv_length[LLCP_TLV_MAX] = {
0019 0,
0020 1,
0021 2,
0022 2,
0023 1,
0024 1,
0025 0,
0026 1,
0027 0,
0028 2,
0029
0030 };
0031
0032 static u8 llcp_tlv8(const u8 *tlv, u8 type)
0033 {
0034 if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
0035 return 0;
0036
0037 return tlv[2];
0038 }
0039
0040 static u16 llcp_tlv16(const u8 *tlv, u8 type)
0041 {
0042 if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
0043 return 0;
0044
0045 return be16_to_cpu(*((__be16 *)(tlv + 2)));
0046 }
0047
0048
0049 static u8 llcp_tlv_version(const u8 *tlv)
0050 {
0051 return llcp_tlv8(tlv, LLCP_TLV_VERSION);
0052 }
0053
0054 static u16 llcp_tlv_miux(const u8 *tlv)
0055 {
0056 return llcp_tlv16(tlv, LLCP_TLV_MIUX) & 0x7ff;
0057 }
0058
0059 static u16 llcp_tlv_wks(const u8 *tlv)
0060 {
0061 return llcp_tlv16(tlv, LLCP_TLV_WKS);
0062 }
0063
0064 static u16 llcp_tlv_lto(const u8 *tlv)
0065 {
0066 return llcp_tlv8(tlv, LLCP_TLV_LTO);
0067 }
0068
0069 static u8 llcp_tlv_opt(const u8 *tlv)
0070 {
0071 return llcp_tlv8(tlv, LLCP_TLV_OPT);
0072 }
0073
0074 static u8 llcp_tlv_rw(const u8 *tlv)
0075 {
0076 return llcp_tlv8(tlv, LLCP_TLV_RW) & 0xf;
0077 }
0078
0079 u8 *nfc_llcp_build_tlv(u8 type, const u8 *value, u8 value_length, u8 *tlv_length)
0080 {
0081 u8 *tlv, length;
0082
0083 pr_debug("type %d\n", type);
0084
0085 if (type >= LLCP_TLV_MAX)
0086 return NULL;
0087
0088 length = llcp_tlv_length[type];
0089 if (length == 0 && value_length == 0)
0090 return NULL;
0091 else if (length == 0)
0092 length = value_length;
0093
0094 *tlv_length = 2 + length;
0095 tlv = kzalloc(2 + length, GFP_KERNEL);
0096 if (tlv == NULL)
0097 return tlv;
0098
0099 tlv[0] = type;
0100 tlv[1] = length;
0101 memcpy(tlv + 2, value, length);
0102
0103 return tlv;
0104 }
0105
0106 struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap)
0107 {
0108 struct nfc_llcp_sdp_tlv *sdres;
0109 u8 value[2];
0110
0111 sdres = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
0112 if (sdres == NULL)
0113 return NULL;
0114
0115 value[0] = tid;
0116 value[1] = sap;
0117
0118 sdres->tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, value, 2,
0119 &sdres->tlv_len);
0120 if (sdres->tlv == NULL) {
0121 kfree(sdres);
0122 return NULL;
0123 }
0124
0125 sdres->tid = tid;
0126 sdres->sap = sap;
0127
0128 INIT_HLIST_NODE(&sdres->node);
0129
0130 return sdres;
0131 }
0132
0133 struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, const char *uri,
0134 size_t uri_len)
0135 {
0136 struct nfc_llcp_sdp_tlv *sdreq;
0137
0138 pr_debug("uri: %s, len: %zu\n", uri, uri_len);
0139
0140
0141 if (WARN_ON_ONCE(uri_len > U8_MAX - 4))
0142 return NULL;
0143
0144 sdreq = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
0145 if (sdreq == NULL)
0146 return NULL;
0147
0148 sdreq->tlv_len = uri_len + 3;
0149
0150 if (uri[uri_len - 1] == 0)
0151 sdreq->tlv_len--;
0152
0153 sdreq->tlv = kzalloc(sdreq->tlv_len + 1, GFP_KERNEL);
0154 if (sdreq->tlv == NULL) {
0155 kfree(sdreq);
0156 return NULL;
0157 }
0158
0159 sdreq->tlv[0] = LLCP_TLV_SDREQ;
0160 sdreq->tlv[1] = sdreq->tlv_len - 2;
0161 sdreq->tlv[2] = tid;
0162
0163 sdreq->tid = tid;
0164 sdreq->uri = sdreq->tlv + 3;
0165 memcpy(sdreq->uri, uri, uri_len);
0166
0167 sdreq->time = jiffies;
0168
0169 INIT_HLIST_NODE(&sdreq->node);
0170
0171 return sdreq;
0172 }
0173
0174 void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp)
0175 {
0176 kfree(sdp->tlv);
0177 kfree(sdp);
0178 }
0179
0180 void nfc_llcp_free_sdp_tlv_list(struct hlist_head *head)
0181 {
0182 struct nfc_llcp_sdp_tlv *sdp;
0183 struct hlist_node *n;
0184
0185 hlist_for_each_entry_safe(sdp, n, head, node) {
0186 hlist_del(&sdp->node);
0187
0188 nfc_llcp_free_sdp_tlv(sdp);
0189 }
0190 }
0191
0192 int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
0193 const u8 *tlv_array, u16 tlv_array_len)
0194 {
0195 const u8 *tlv = tlv_array;
0196 u8 type, length, offset = 0;
0197
0198 pr_debug("TLV array length %d\n", tlv_array_len);
0199
0200 if (local == NULL)
0201 return -ENODEV;
0202
0203 while (offset < tlv_array_len) {
0204 type = tlv[0];
0205 length = tlv[1];
0206
0207 pr_debug("type 0x%x length %d\n", type, length);
0208
0209 switch (type) {
0210 case LLCP_TLV_VERSION:
0211 local->remote_version = llcp_tlv_version(tlv);
0212 break;
0213 case LLCP_TLV_MIUX:
0214 local->remote_miu = llcp_tlv_miux(tlv) + 128;
0215 break;
0216 case LLCP_TLV_WKS:
0217 local->remote_wks = llcp_tlv_wks(tlv);
0218 break;
0219 case LLCP_TLV_LTO:
0220 local->remote_lto = llcp_tlv_lto(tlv) * 10;
0221 break;
0222 case LLCP_TLV_OPT:
0223 local->remote_opt = llcp_tlv_opt(tlv);
0224 break;
0225 default:
0226 pr_err("Invalid gt tlv value 0x%x\n", type);
0227 break;
0228 }
0229
0230 offset += length + 2;
0231 tlv += length + 2;
0232 }
0233
0234 pr_debug("version 0x%x miu %d lto %d opt 0x%x wks 0x%x\n",
0235 local->remote_version, local->remote_miu,
0236 local->remote_lto, local->remote_opt,
0237 local->remote_wks);
0238
0239 return 0;
0240 }
0241
0242 int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
0243 const u8 *tlv_array, u16 tlv_array_len)
0244 {
0245 const u8 *tlv = tlv_array;
0246 u8 type, length, offset = 0;
0247
0248 pr_debug("TLV array length %d\n", tlv_array_len);
0249
0250 if (sock == NULL)
0251 return -ENOTCONN;
0252
0253 while (offset < tlv_array_len) {
0254 type = tlv[0];
0255 length = tlv[1];
0256
0257 pr_debug("type 0x%x length %d\n", type, length);
0258
0259 switch (type) {
0260 case LLCP_TLV_MIUX:
0261 sock->remote_miu = llcp_tlv_miux(tlv) + 128;
0262 break;
0263 case LLCP_TLV_RW:
0264 sock->remote_rw = llcp_tlv_rw(tlv);
0265 break;
0266 case LLCP_TLV_SN:
0267 break;
0268 default:
0269 pr_err("Invalid gt tlv value 0x%x\n", type);
0270 break;
0271 }
0272
0273 offset += length + 2;
0274 tlv += length + 2;
0275 }
0276
0277 pr_debug("sock %p rw %d miu %d\n", sock,
0278 sock->remote_rw, sock->remote_miu);
0279
0280 return 0;
0281 }
0282
0283 static struct sk_buff *llcp_add_header(struct sk_buff *pdu,
0284 u8 dsap, u8 ssap, u8 ptype)
0285 {
0286 u8 header[2];
0287
0288 pr_debug("ptype 0x%x dsap 0x%x ssap 0x%x\n", ptype, dsap, ssap);
0289
0290 header[0] = (u8)((dsap << 2) | (ptype >> 2));
0291 header[1] = (u8)((ptype << 6) | ssap);
0292
0293 pr_debug("header 0x%x 0x%x\n", header[0], header[1]);
0294
0295 skb_put_data(pdu, header, LLCP_HEADER_SIZE);
0296
0297 return pdu;
0298 }
0299
0300 static struct sk_buff *llcp_add_tlv(struct sk_buff *pdu, const u8 *tlv,
0301 u8 tlv_length)
0302 {
0303
0304
0305 if (tlv == NULL)
0306 return NULL;
0307
0308 skb_put_data(pdu, tlv, tlv_length);
0309
0310 return pdu;
0311 }
0312
0313 static struct sk_buff *llcp_allocate_pdu(struct nfc_llcp_sock *sock,
0314 u8 cmd, u16 size)
0315 {
0316 struct sk_buff *skb;
0317 int err;
0318
0319 if (sock->ssap == 0)
0320 return NULL;
0321
0322 skb = nfc_alloc_send_skb(sock->dev, &sock->sk, MSG_DONTWAIT,
0323 size + LLCP_HEADER_SIZE, &err);
0324 if (skb == NULL) {
0325 pr_err("Could not allocate PDU\n");
0326 return NULL;
0327 }
0328
0329 skb = llcp_add_header(skb, sock->dsap, sock->ssap, cmd);
0330
0331 return skb;
0332 }
0333
0334 int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)
0335 {
0336 struct sk_buff *skb;
0337 struct nfc_dev *dev;
0338 struct nfc_llcp_local *local;
0339
0340 local = sock->local;
0341 if (local == NULL)
0342 return -ENODEV;
0343
0344 dev = sock->dev;
0345 if (dev == NULL)
0346 return -ENODEV;
0347
0348 skb = llcp_allocate_pdu(sock, LLCP_PDU_DISC, 0);
0349 if (skb == NULL)
0350 return -ENOMEM;
0351
0352 skb_queue_tail(&local->tx_queue, skb);
0353
0354 return 0;
0355 }
0356
0357 int nfc_llcp_send_symm(struct nfc_dev *dev)
0358 {
0359 struct sk_buff *skb;
0360 struct nfc_llcp_local *local;
0361 u16 size = 0;
0362
0363 local = nfc_llcp_find_local(dev);
0364 if (local == NULL)
0365 return -ENODEV;
0366
0367 size += LLCP_HEADER_SIZE;
0368 size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
0369
0370 skb = alloc_skb(size, GFP_KERNEL);
0371 if (skb == NULL)
0372 return -ENOMEM;
0373
0374 skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
0375
0376 skb = llcp_add_header(skb, 0, 0, LLCP_PDU_SYMM);
0377
0378 __net_timestamp(skb);
0379
0380 nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_TX);
0381
0382 return nfc_data_exchange(dev, local->target_idx, skb,
0383 nfc_llcp_recv, local);
0384 }
0385
0386 int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
0387 {
0388 struct nfc_llcp_local *local;
0389 struct sk_buff *skb;
0390 const u8 *service_name_tlv = NULL;
0391 const u8 *miux_tlv = NULL;
0392 const u8 *rw_tlv = NULL;
0393 u8 service_name_tlv_length, miux_tlv_length, rw_tlv_length, rw;
0394 int err;
0395 u16 size = 0;
0396 __be16 miux;
0397
0398 local = sock->local;
0399 if (local == NULL)
0400 return -ENODEV;
0401
0402 if (sock->service_name != NULL) {
0403 service_name_tlv = nfc_llcp_build_tlv(LLCP_TLV_SN,
0404 sock->service_name,
0405 sock->service_name_len,
0406 &service_name_tlv_length);
0407 if (!service_name_tlv) {
0408 err = -ENOMEM;
0409 goto error_tlv;
0410 }
0411 size += service_name_tlv_length;
0412 }
0413
0414
0415 miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
0416 local->miux : sock->miux;
0417 rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
0418
0419 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
0420 &miux_tlv_length);
0421 if (!miux_tlv) {
0422 err = -ENOMEM;
0423 goto error_tlv;
0424 }
0425 size += miux_tlv_length;
0426
0427 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
0428 if (!rw_tlv) {
0429 err = -ENOMEM;
0430 goto error_tlv;
0431 }
0432 size += rw_tlv_length;
0433
0434 pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
0435
0436 skb = llcp_allocate_pdu(sock, LLCP_PDU_CONNECT, size);
0437 if (skb == NULL) {
0438 err = -ENOMEM;
0439 goto error_tlv;
0440 }
0441
0442 llcp_add_tlv(skb, service_name_tlv, service_name_tlv_length);
0443 llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
0444 llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
0445
0446 skb_queue_tail(&local->tx_queue, skb);
0447
0448 err = 0;
0449
0450 error_tlv:
0451 if (err)
0452 pr_err("error %d\n", err);
0453
0454 kfree(service_name_tlv);
0455 kfree(miux_tlv);
0456 kfree(rw_tlv);
0457
0458 return err;
0459 }
0460
0461 int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
0462 {
0463 struct nfc_llcp_local *local;
0464 struct sk_buff *skb;
0465 const u8 *miux_tlv = NULL;
0466 const u8 *rw_tlv = NULL;
0467 u8 miux_tlv_length, rw_tlv_length, rw;
0468 int err;
0469 u16 size = 0;
0470 __be16 miux;
0471
0472 local = sock->local;
0473 if (local == NULL)
0474 return -ENODEV;
0475
0476
0477 miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
0478 local->miux : sock->miux;
0479 rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
0480
0481 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
0482 &miux_tlv_length);
0483 if (!miux_tlv) {
0484 err = -ENOMEM;
0485 goto error_tlv;
0486 }
0487 size += miux_tlv_length;
0488
0489 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
0490 if (!rw_tlv) {
0491 err = -ENOMEM;
0492 goto error_tlv;
0493 }
0494 size += rw_tlv_length;
0495
0496 skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
0497 if (skb == NULL) {
0498 err = -ENOMEM;
0499 goto error_tlv;
0500 }
0501
0502 llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
0503 llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
0504
0505 skb_queue_tail(&local->tx_queue, skb);
0506
0507 err = 0;
0508
0509 error_tlv:
0510 if (err)
0511 pr_err("error %d\n", err);
0512
0513 kfree(miux_tlv);
0514 kfree(rw_tlv);
0515
0516 return err;
0517 }
0518
0519 static struct sk_buff *nfc_llcp_allocate_snl(struct nfc_llcp_local *local,
0520 size_t tlv_length)
0521 {
0522 struct sk_buff *skb;
0523 struct nfc_dev *dev;
0524 u16 size = 0;
0525
0526 if (local == NULL)
0527 return ERR_PTR(-ENODEV);
0528
0529 dev = local->dev;
0530 if (dev == NULL)
0531 return ERR_PTR(-ENODEV);
0532
0533 size += LLCP_HEADER_SIZE;
0534 size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
0535 size += tlv_length;
0536
0537 skb = alloc_skb(size, GFP_KERNEL);
0538 if (skb == NULL)
0539 return ERR_PTR(-ENOMEM);
0540
0541 skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
0542
0543 skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);
0544
0545 return skb;
0546 }
0547
0548 int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
0549 struct hlist_head *tlv_list, size_t tlvs_len)
0550 {
0551 struct nfc_llcp_sdp_tlv *sdp;
0552 struct hlist_node *n;
0553 struct sk_buff *skb;
0554
0555 skb = nfc_llcp_allocate_snl(local, tlvs_len);
0556 if (IS_ERR(skb))
0557 return PTR_ERR(skb);
0558
0559 hlist_for_each_entry_safe(sdp, n, tlv_list, node) {
0560 skb_put_data(skb, sdp->tlv, sdp->tlv_len);
0561
0562 hlist_del(&sdp->node);
0563
0564 nfc_llcp_free_sdp_tlv(sdp);
0565 }
0566
0567 skb_queue_tail(&local->tx_queue, skb);
0568
0569 return 0;
0570 }
0571
0572 int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
0573 struct hlist_head *tlv_list, size_t tlvs_len)
0574 {
0575 struct nfc_llcp_sdp_tlv *sdreq;
0576 struct hlist_node *n;
0577 struct sk_buff *skb;
0578
0579 skb = nfc_llcp_allocate_snl(local, tlvs_len);
0580 if (IS_ERR(skb))
0581 return PTR_ERR(skb);
0582
0583 mutex_lock(&local->sdreq_lock);
0584
0585 if (hlist_empty(&local->pending_sdreqs))
0586 mod_timer(&local->sdreq_timer,
0587 jiffies + msecs_to_jiffies(3 * local->remote_lto));
0588
0589 hlist_for_each_entry_safe(sdreq, n, tlv_list, node) {
0590 pr_debug("tid %d for %s\n", sdreq->tid, sdreq->uri);
0591
0592 skb_put_data(skb, sdreq->tlv, sdreq->tlv_len);
0593
0594 hlist_del(&sdreq->node);
0595
0596 hlist_add_head(&sdreq->node, &local->pending_sdreqs);
0597 }
0598
0599 mutex_unlock(&local->sdreq_lock);
0600
0601 skb_queue_tail(&local->tx_queue, skb);
0602
0603 return 0;
0604 }
0605
0606 int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
0607 {
0608 struct sk_buff *skb;
0609 struct nfc_dev *dev;
0610 u16 size = 1;
0611
0612 pr_debug("Sending DM reason 0x%x\n", reason);
0613
0614 if (local == NULL)
0615 return -ENODEV;
0616
0617 dev = local->dev;
0618 if (dev == NULL)
0619 return -ENODEV;
0620
0621 size += LLCP_HEADER_SIZE;
0622 size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
0623
0624 skb = alloc_skb(size, GFP_KERNEL);
0625 if (skb == NULL)
0626 return -ENOMEM;
0627
0628 skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
0629
0630 skb = llcp_add_header(skb, dsap, ssap, LLCP_PDU_DM);
0631
0632 skb_put_data(skb, &reason, 1);
0633
0634 skb_queue_head(&local->tx_queue, skb);
0635
0636 return 0;
0637 }
0638
0639 int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
0640 struct msghdr *msg, size_t len)
0641 {
0642 struct sk_buff *pdu;
0643 struct sock *sk = &sock->sk;
0644 struct nfc_llcp_local *local;
0645 size_t frag_len = 0, remaining_len;
0646 u8 *msg_data, *msg_ptr;
0647 u16 remote_miu;
0648
0649 pr_debug("Send I frame len %zd\n", len);
0650
0651 local = sock->local;
0652 if (local == NULL)
0653 return -ENODEV;
0654
0655
0656 if((sock->remote_ready &&
0657 skb_queue_len(&sock->tx_pending_queue) >= sock->remote_rw &&
0658 skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
0659 pr_err("Pending queue is full %d frames\n",
0660 skb_queue_len(&sock->tx_pending_queue));
0661 return -ENOBUFS;
0662 }
0663
0664
0665 if ((!sock->remote_ready &&
0666 skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
0667 pr_err("Tx queue is full %d frames\n",
0668 skb_queue_len(&sock->tx_queue));
0669 return -ENOBUFS;
0670 }
0671
0672 msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
0673 if (msg_data == NULL)
0674 return -ENOMEM;
0675
0676 if (memcpy_from_msg(msg_data, msg, len)) {
0677 kfree(msg_data);
0678 return -EFAULT;
0679 }
0680
0681 remaining_len = len;
0682 msg_ptr = msg_data;
0683
0684 do {
0685 remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
0686 LLCP_DEFAULT_MIU : sock->remote_miu;
0687
0688 frag_len = min_t(size_t, remote_miu, remaining_len);
0689
0690 pr_debug("Fragment %zd bytes remaining %zd",
0691 frag_len, remaining_len);
0692
0693 pdu = llcp_allocate_pdu(sock, LLCP_PDU_I,
0694 frag_len + LLCP_SEQUENCE_SIZE);
0695 if (pdu == NULL) {
0696 kfree(msg_data);
0697 return -ENOMEM;
0698 }
0699
0700 skb_put(pdu, LLCP_SEQUENCE_SIZE);
0701
0702 if (likely(frag_len > 0))
0703 skb_put_data(pdu, msg_ptr, frag_len);
0704
0705 skb_queue_tail(&sock->tx_queue, pdu);
0706
0707 lock_sock(sk);
0708
0709 nfc_llcp_queue_i_frames(sock);
0710
0711 release_sock(sk);
0712
0713 remaining_len -= frag_len;
0714 msg_ptr += frag_len;
0715 } while (remaining_len > 0);
0716
0717 kfree(msg_data);
0718
0719 return len;
0720 }
0721
0722 int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
0723 struct msghdr *msg, size_t len)
0724 {
0725 struct sk_buff *pdu;
0726 struct nfc_llcp_local *local;
0727 size_t frag_len = 0, remaining_len;
0728 u8 *msg_ptr, *msg_data;
0729 u16 remote_miu;
0730 int err;
0731
0732 pr_debug("Send UI frame len %zd\n", len);
0733
0734 local = sock->local;
0735 if (local == NULL)
0736 return -ENODEV;
0737
0738 msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
0739 if (msg_data == NULL)
0740 return -ENOMEM;
0741
0742 if (memcpy_from_msg(msg_data, msg, len)) {
0743 kfree(msg_data);
0744 return -EFAULT;
0745 }
0746
0747 remaining_len = len;
0748 msg_ptr = msg_data;
0749
0750 do {
0751 remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
0752 local->remote_miu : sock->remote_miu;
0753
0754 frag_len = min_t(size_t, remote_miu, remaining_len);
0755
0756 pr_debug("Fragment %zd bytes remaining %zd",
0757 frag_len, remaining_len);
0758
0759 pdu = nfc_alloc_send_skb(sock->dev, &sock->sk, 0,
0760 frag_len + LLCP_HEADER_SIZE, &err);
0761 if (pdu == NULL) {
0762 pr_err("Could not allocate PDU (error=%d)\n", err);
0763 len -= remaining_len;
0764 if (len == 0)
0765 len = err;
0766 break;
0767 }
0768
0769 pdu = llcp_add_header(pdu, dsap, ssap, LLCP_PDU_UI);
0770
0771 if (likely(frag_len > 0))
0772 skb_put_data(pdu, msg_ptr, frag_len);
0773
0774
0775 skb_queue_tail(&local->tx_queue, pdu);
0776
0777 remaining_len -= frag_len;
0778 msg_ptr += frag_len;
0779 } while (remaining_len > 0);
0780
0781 kfree(msg_data);
0782
0783 return len;
0784 }
0785
0786 int nfc_llcp_send_rr(struct nfc_llcp_sock *sock)
0787 {
0788 struct sk_buff *skb;
0789 struct nfc_llcp_local *local;
0790
0791 pr_debug("Send rr nr %d\n", sock->recv_n);
0792
0793 local = sock->local;
0794 if (local == NULL)
0795 return -ENODEV;
0796
0797 skb = llcp_allocate_pdu(sock, LLCP_PDU_RR, LLCP_SEQUENCE_SIZE);
0798 if (skb == NULL)
0799 return -ENOMEM;
0800
0801 skb_put(skb, LLCP_SEQUENCE_SIZE);
0802
0803 skb->data[2] = sock->recv_n;
0804
0805 skb_queue_head(&local->tx_queue, skb);
0806
0807 return 0;
0808 }