diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2012-10-04 19:13:24 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-10-26 12:26:47 -0400 |
commit | c43bb03d5a7df53684cfb2a1fed5ea20014c7056 (patch) | |
tree | f402223e4c7e235489b29a5b32c5b8653a8f648f /net/nfc | |
parent | 922239064bb39b4ed9329ffd9418c20f8d64cbbb (diff) |
NFC: Add SNL frame building routine
SNL (Service Name Lookup) frames are used to respond to SNL requests.
This is needed for SDP implementation.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc')
-rw-r--r-- | net/nfc/llcp/commands.c | 46 | ||||
-rw-r--r-- | net/nfc/llcp/llcp.h | 1 |
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 | ||
423 | int 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 | |||
423 | int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason) | 469 | int 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); | |||
209 | int nfc_llcp_send_symm(struct nfc_dev *dev); | 209 | int nfc_llcp_send_symm(struct nfc_dev *dev); |
210 | int nfc_llcp_send_connect(struct nfc_llcp_sock *sock); | 210 | int nfc_llcp_send_connect(struct nfc_llcp_sock *sock); |
211 | int nfc_llcp_send_cc(struct nfc_llcp_sock *sock); | 211 | int nfc_llcp_send_cc(struct nfc_llcp_sock *sock); |
212 | int nfc_llcp_send_snl(struct nfc_llcp_local *local, u8 tid, u8 sap); | ||
212 | int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason); | 213 | int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason); |
213 | int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock); | 214 | int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock); |
214 | int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, | 215 | int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, |