Skip to content

Commit

Permalink
NFC: Set MIU and RW values from CONNECT and CC LLCP frames
Browse files Browse the repository at this point in the history
We use the maximum values for the LLCP Maximum Information Unit and Receive
Window Size.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Samuel Ortiz authored and linvjw committed Mar 6, 2012
1 parent d094afa commit eda21f1
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
48 changes: 45 additions & 3 deletions net/nfc/llcp/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
struct nfc_llcp_local *local;
struct sk_buff *skb;
u8 *service_name_tlv = NULL, service_name_tlv_length;
u8 *miux_tlv = NULL, miux_tlv_length;
u8 *rw_tlv = NULL, rw_tlv_length, rw;
__be16 miux;
int err;
u16 size = 0;

Expand All @@ -301,6 +304,14 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
size += service_name_tlv_length;
}

miux = cpu_to_be16(LLCP_MAX_MIUX);
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, &miux_tlv_length);
size += miux_tlv_length;

rw = LLCP_MAX_RW;
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
size += rw_tlv_length;

pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);

skb = llcp_allocate_pdu(sock, LLCP_PDU_CONNECT, size);
Expand All @@ -313,6 +324,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
skb = llcp_add_tlv(skb, service_name_tlv,
service_name_tlv_length);

skb = llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
skb = llcp_add_tlv(skb, rw_tlv, rw_tlv_length);

skb_queue_tail(&local->tx_queue, skb);

return 0;
Expand All @@ -321,6 +335,8 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
pr_err("error %d\n", err);

kfree(service_name_tlv);
kfree(miux_tlv);
kfree(rw_tlv);

return err;
}
Expand All @@ -329,20 +345,46 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
{
struct nfc_llcp_local *local;
struct sk_buff *skb;
u8 *miux_tlv = NULL, miux_tlv_length;
u8 *rw_tlv = NULL, rw_tlv_length, rw;
__be16 miux;
int err;
u16 size = 0;

pr_debug("Sending CC\n");

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

skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, 0);
if (skb == NULL)
return -ENOMEM;
miux = cpu_to_be16(LLCP_MAX_MIUX);
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, &miux_tlv_length);
size += miux_tlv_length;

rw = LLCP_MAX_RW;
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
size += rw_tlv_length;

skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
if (skb == NULL) {
err = -ENOMEM;
goto error_tlv;
}

skb = llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
skb = llcp_add_tlv(skb, rw_tlv, rw_tlv_length);

skb_queue_tail(&local->tx_queue, skb);

return 0;

error_tlv:
pr_err("error %d\n", err);

kfree(miux_tlv);
kfree(rw_tlv);

return err;
}

int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
Expand Down
4 changes: 4 additions & 0 deletions net/nfc/llcp/llcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ enum llcp_state {
#define LLCP_DEFAULT_RW 1
#define LLCP_DEFAULT_MIU 128

#define LLCP_MAX_LTO 0xff
#define LLCP_MAX_RW 15
#define LLCP_MAX_MIUX 0x7ff

#define LLCP_WKS_NUM_SAP 16
#define LLCP_SDP_NUM_SAP 16
#define LLCP_LOCAL_NUM_SAP 32
Expand Down

0 comments on commit eda21f1

Please sign in to comment.