aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/nfc/llcp/commands.c46
-rw-r--r--net/nfc/llcp/llcp.h1
2 files changed, 47 insertions, 0 deletions
diff --git a/net/nfc/llcp/commands.c b/net/nfc/llcp/commands.c
index 5e33cba43936..6db280ddc4c8 100644
--- a/net/nfc/llcp/commands.c
+++ b/net/nfc/llcp/commands.c
@@ -420,6 +420,52 @@ error_tlv:
420 return err; 420 return err;
421} 421}
422 422
423int nfc_llcp_send_snl(struct nfc_llcp_local *local, u8 tid, u8 sap)
424{
425 struct sk_buff *skb;
426 struct nfc_dev *dev;
427 u8 *sdres_tlv = NULL, sdres_tlv_length, sdres[2];
428 u16 size = 0;
429
430 pr_debug("Sending SNL tid 0x%x sap 0x%x\n", tid, sap);
431
432 if (local == NULL)
433 return -ENODEV;
434
435 dev = local->dev;
436 if (dev == NULL)
437 return -ENODEV;
438
439 sdres[0] = tid;
440 sdres[1] = sap;
441 sdres_tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, sdres, 0,
442 &sdres_tlv_length);
443 if (sdres_tlv == NULL)
444 return -ENOMEM;
445
446 size += LLCP_HEADER_SIZE;
447 size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
448 size += sdres_tlv_length;
449
450 skb = alloc_skb(size, GFP_KERNEL);
451 if (skb == NULL) {
452 kfree(sdres_tlv);
453 return -ENOMEM;
454 }
455
456 skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
457
458 skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);
459
460 memcpy(skb_put(skb, sdres_tlv_length), sdres_tlv, sdres_tlv_length);
461
462 skb_queue_tail(&local->tx_queue, skb);
463
464 kfree(sdres_tlv);
465
466 return 0;
467}
468
423int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason) 469int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
424{ 470{
425 struct sk_buff *skb; 471 struct sk_buff *skb;
diff --git a/net/nfc/llcp/llcp.h b/net/nfc/llcp/llcp.h
index fdb2d24e60bd..1c0a66fab570 100644
--- a/net/nfc/llcp/llcp.h
+++ b/net/nfc/llcp/llcp.h
@@ -209,6 +209,7 @@ int nfc_llcp_disconnect(struct nfc_llcp_sock *sock);
209int nfc_llcp_send_symm(struct nfc_dev *dev); 209int nfc_llcp_send_symm(struct nfc_dev *dev);
210int nfc_llcp_send_connect(struct nfc_llcp_sock *sock); 210int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
211int nfc_llcp_send_cc(struct nfc_llcp_sock *sock); 211int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
212int nfc_llcp_send_snl(struct nfc_llcp_local *local, u8 tid, u8 sap);
212int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason); 213int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
213int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock); 214int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
214int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, 215int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,