Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c43bb03d authored by Samuel Ortiz's avatar Samuel Ortiz
Browse files

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: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 92223906
Loading
Loading
Loading
Loading
+46 −0
Original line number Original line Diff line number Diff line
@@ -420,6 +420,52 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
	return err;
	return err;
}
}


int nfc_llcp_send_snl(struct nfc_llcp_local *local, u8 tid, u8 sap)
{
	struct sk_buff *skb;
	struct nfc_dev *dev;
	u8 *sdres_tlv = NULL, sdres_tlv_length, sdres[2];
	u16 size = 0;

	pr_debug("Sending SNL tid 0x%x sap 0x%x\n", tid, sap);

	if (local == NULL)
		return -ENODEV;

	dev = local->dev;
	if (dev == NULL)
		return -ENODEV;

	sdres[0] = tid;
	sdres[1] = sap;
	sdres_tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, sdres, 0,
				       &sdres_tlv_length);
	if (sdres_tlv == NULL)
		return -ENOMEM;

	size += LLCP_HEADER_SIZE;
	size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
	size += sdres_tlv_length;

	skb = alloc_skb(size, GFP_KERNEL);
	if (skb == NULL) {
		kfree(sdres_tlv);
		return -ENOMEM;
	}

	skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);

	skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);

	memcpy(skb_put(skb, sdres_tlv_length), sdres_tlv, sdres_tlv_length);

	skb_queue_tail(&local->tx_queue, skb);

	kfree(sdres_tlv);

	return 0;
}

int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
{
{
	struct sk_buff *skb;
	struct sk_buff *skb;
+1 −0
Original line number Original line Diff line number Diff line
@@ -209,6 +209,7 @@ int nfc_llcp_disconnect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_symm(struct nfc_dev *dev);
int nfc_llcp_send_symm(struct nfc_dev *dev);
int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
int nfc_llcp_send_snl(struct nfc_llcp_local *local, u8 tid, u8 sap);
int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,