Skip to content

Commit eda21f1

Browse files
Samuel Ortizlinvjw
Samuel Ortiz
authored andcommitted
NFC: Set MIU and RW values from CONNECT and CC LLCP frames
We use the maximum values for the LLCP Maximum Information Unit and Receive Window Size. Signed-off-by: Samuel Ortiz <[email protected]> Signed-off-by: John W. Linville <[email protected]>
1 parent d094afa commit eda21f1

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

net/nfc/llcp/commands.c

+45-3
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
284284
struct nfc_llcp_local *local;
285285
struct sk_buff *skb;
286286
u8 *service_name_tlv = NULL, service_name_tlv_length;
287+
u8 *miux_tlv = NULL, miux_tlv_length;
288+
u8 *rw_tlv = NULL, rw_tlv_length, rw;
289+
__be16 miux;
287290
int err;
288291
u16 size = 0;
289292

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

307+
miux = cpu_to_be16(LLCP_MAX_MIUX);
308+
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, &miux_tlv_length);
309+
size += miux_tlv_length;
310+
311+
rw = LLCP_MAX_RW;
312+
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
313+
size += rw_tlv_length;
314+
304315
pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
305316

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

327+
skb = llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
328+
skb = llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
329+
316330
skb_queue_tail(&local->tx_queue, skb);
317331

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

323337
kfree(service_name_tlv);
338+
kfree(miux_tlv);
339+
kfree(rw_tlv);
324340

325341
return err;
326342
}
@@ -329,20 +345,46 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
329345
{
330346
struct nfc_llcp_local *local;
331347
struct sk_buff *skb;
348+
u8 *miux_tlv = NULL, miux_tlv_length;
349+
u8 *rw_tlv = NULL, rw_tlv_length, rw;
350+
__be16 miux;
351+
int err;
352+
u16 size = 0;
332353

333354
pr_debug("Sending CC\n");
334355

335356
local = sock->local;
336357
if (local == NULL)
337358
return -ENODEV;
338359

339-
skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, 0);
340-
if (skb == NULL)
341-
return -ENOMEM;
360+
miux = cpu_to_be16(LLCP_MAX_MIUX);
361+
miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0, &miux_tlv_length);
362+
size += miux_tlv_length;
363+
364+
rw = LLCP_MAX_RW;
365+
rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
366+
size += rw_tlv_length;
367+
368+
skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
369+
if (skb == NULL) {
370+
err = -ENOMEM;
371+
goto error_tlv;
372+
}
373+
374+
skb = llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
375+
skb = llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
342376

343377
skb_queue_tail(&local->tx_queue, skb);
344378

345379
return 0;
380+
381+
error_tlv:
382+
pr_err("error %d\n", err);
383+
384+
kfree(miux_tlv);
385+
kfree(rw_tlv);
386+
387+
return err;
346388
}
347389

348390
int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)

net/nfc/llcp/llcp.h

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ enum llcp_state {
2828
#define LLCP_DEFAULT_RW 1
2929
#define LLCP_DEFAULT_MIU 128
3030

31+
#define LLCP_MAX_LTO 0xff
32+
#define LLCP_MAX_RW 15
33+
#define LLCP_MAX_MIUX 0x7ff
34+
3135
#define LLCP_WKS_NUM_SAP 16
3236
#define LLCP_SDP_NUM_SAP 16
3337
#define LLCP_LOCAL_NUM_SAP 32

0 commit comments

Comments
 (0)