xref: /linux/net/nfc/llcp_commands.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2011  Intel Corporation. All rights reserved.
4  */
5 
6 #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
7 
8 #include <linux/init.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/nfc.h>
12 
13 #include <net/nfc/nfc.h>
14 
15 #include "nfc.h"
16 #include "llcp.h"
17 
18 static const u8 llcp_tlv_length[LLCP_TLV_MAX] = {
19 	0,
20 	1, /* VERSION */
21 	2, /* MIUX */
22 	2, /* WKS */
23 	1, /* LTO */
24 	1, /* RW */
25 	0, /* SN */
26 	1, /* OPT */
27 	0, /* SDREQ */
28 	2, /* SDRES */
29 
30 };
31 
llcp_tlv8(const u8 * tlv,u8 type)32 static u8 llcp_tlv8(const u8 *tlv, u8 type)
33 {
34 	if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
35 		return 0;
36 
37 	return tlv[2];
38 }
39 
llcp_tlv16(const u8 * tlv,u8 type)40 static u16 llcp_tlv16(const u8 *tlv, u8 type)
41 {
42 	if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
43 		return 0;
44 
45 	return be16_to_cpu(*((__be16 *)(tlv + 2)));
46 }
47 
48 
llcp_tlv_version(const u8 * tlv)49 static u8 llcp_tlv_version(const u8 *tlv)
50 {
51 	return llcp_tlv8(tlv, LLCP_TLV_VERSION);
52 }
53 
llcp_tlv_miux(const u8 * tlv)54 static u16 llcp_tlv_miux(const u8 *tlv)
55 {
56 	return llcp_tlv16(tlv, LLCP_TLV_MIUX) & 0x7ff;
57 }
58 
llcp_tlv_wks(const u8 * tlv)59 static u16 llcp_tlv_wks(const u8 *tlv)
60 {
61 	return llcp_tlv16(tlv, LLCP_TLV_WKS);
62 }
63 
llcp_tlv_lto(const u8 * tlv)64 static u16 llcp_tlv_lto(const u8 *tlv)
65 {
66 	return llcp_tlv8(tlv, LLCP_TLV_LTO);
67 }
68 
llcp_tlv_opt(const u8 * tlv)69 static u8 llcp_tlv_opt(const u8 *tlv)
70 {
71 	return llcp_tlv8(tlv, LLCP_TLV_OPT);
72 }
73 
llcp_tlv_rw(const u8 * tlv)74 static u8 llcp_tlv_rw(const u8 *tlv)
75 {
76 	return llcp_tlv8(tlv, LLCP_TLV_RW) & 0xf;
77 }
78 
nfc_llcp_build_tlv(u8 type,const u8 * value,u8 value_length,u8 * tlv_length)79 u8 *nfc_llcp_build_tlv(u8 type, const u8 *value, u8 value_length, u8 *tlv_length)
80 {
81 	u8 *tlv, length;
82 
83 	pr_debug("type %d\n", type);
84 
85 	if (type >= LLCP_TLV_MAX)
86 		return NULL;
87 
88 	length = llcp_tlv_length[type];
89 	if (length == 0 && value_length == 0)
90 		return NULL;
91 	else if (length == 0)
92 		length = value_length;
93 
94 	*tlv_length = 2 + length;
95 	tlv = kzalloc(2 + length, GFP_KERNEL);
96 	if (tlv == NULL)
97 		return tlv;
98 
99 	tlv[0] = type;
100 	tlv[1] = length;
101 	memcpy(tlv + 2, value, length);
102 
103 	return tlv;
104 }
105 
nfc_llcp_build_sdres_tlv(u8 tid,u8 sap)106 struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap)
107 {
108 	struct nfc_llcp_sdp_tlv *sdres;
109 	u8 value[2];
110 
111 	sdres = kzalloc_obj(struct nfc_llcp_sdp_tlv);
112 	if (sdres == NULL)
113 		return NULL;
114 
115 	value[0] = tid;
116 	value[1] = sap;
117 
118 	sdres->tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, value, 2,
119 					&sdres->tlv_len);
120 	if (sdres->tlv == NULL) {
121 		kfree(sdres);
122 		return NULL;
123 	}
124 
125 	sdres->tid = tid;
126 	sdres->sap = sap;
127 
128 	INIT_HLIST_NODE(&sdres->node);
129 
130 	return sdres;
131 }
132 
nfc_llcp_build_sdreq_tlv(u8 tid,const char * uri,size_t uri_len)133 struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, const char *uri,
134 						  size_t uri_len)
135 {
136 	struct nfc_llcp_sdp_tlv *sdreq;
137 
138 	pr_debug("uri: %s, len: %zu\n", uri, uri_len);
139 
140 	/* sdreq->tlv_len is u8, takes uri_len, + 3 for header, + 1 for NULL */
141 	if (WARN_ON_ONCE(uri_len > U8_MAX - 4))
142 		return NULL;
143 
144 	sdreq = kzalloc_obj(struct nfc_llcp_sdp_tlv);
145 	if (sdreq == NULL)
146 		return NULL;
147 
148 	sdreq->tlv_len = uri_len + 3;
149 
150 	if (uri[uri_len - 1] == 0)
151 		sdreq->tlv_len--;
152 
153 	sdreq->tlv = kzalloc(sdreq->tlv_len + 1, GFP_KERNEL);
154 	if (sdreq->tlv == NULL) {
155 		kfree(sdreq);
156 		return NULL;
157 	}
158 
159 	sdreq->tlv[0] = LLCP_TLV_SDREQ;
160 	sdreq->tlv[1] = sdreq->tlv_len - 2;
161 	sdreq->tlv[2] = tid;
162 
163 	sdreq->tid = tid;
164 	sdreq->uri = sdreq->tlv + 3;
165 	memcpy(sdreq->uri, uri, uri_len);
166 
167 	sdreq->time = jiffies;
168 
169 	INIT_HLIST_NODE(&sdreq->node);
170 
171 	return sdreq;
172 }
173 
nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv * sdp)174 void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp)
175 {
176 	kfree(sdp->tlv);
177 	kfree(sdp);
178 }
179 
nfc_llcp_free_sdp_tlv_list(struct hlist_head * head)180 void nfc_llcp_free_sdp_tlv_list(struct hlist_head *head)
181 {
182 	struct nfc_llcp_sdp_tlv *sdp;
183 	struct hlist_node *n;
184 
185 	hlist_for_each_entry_safe(sdp, n, head, node) {
186 		hlist_del(&sdp->node);
187 
188 		nfc_llcp_free_sdp_tlv(sdp);
189 	}
190 }
191 
nfc_llcp_parse_gb_tlv(struct nfc_llcp_local * local,const u8 * tlv_array,u16 tlv_array_len)192 int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
193 			  const u8 *tlv_array, u16 tlv_array_len)
194 {
195 	const u8 *tlv = tlv_array;
196 	u8 type, length;
197 	u16 offset = 0;
198 
199 	pr_debug("TLV array length %d\n", tlv_array_len);
200 
201 	if (local == NULL)
202 		return -ENODEV;
203 
204 	while (offset < tlv_array_len) {
205 		if (offset + 2 > tlv_array_len)
206 			return -EINVAL;
207 
208 		type = tlv[0];
209 		length = tlv[1];
210 
211 		if (offset + 2 + length > tlv_array_len)
212 			return -EINVAL;
213 
214 		pr_debug("type 0x%x length %d\n", type, length);
215 
216 		switch (type) {
217 		case LLCP_TLV_VERSION:
218 			local->remote_version = llcp_tlv_version(tlv);
219 			break;
220 		case LLCP_TLV_MIUX:
221 			local->remote_miu = llcp_tlv_miux(tlv) + 128;
222 			break;
223 		case LLCP_TLV_WKS:
224 			local->remote_wks = llcp_tlv_wks(tlv);
225 			break;
226 		case LLCP_TLV_LTO:
227 			local->remote_lto = llcp_tlv_lto(tlv) * 10;
228 			break;
229 		case LLCP_TLV_OPT:
230 			local->remote_opt = llcp_tlv_opt(tlv);
231 			break;
232 		default:
233 			pr_err("Invalid gt tlv value 0x%x\n", type);
234 			break;
235 		}
236 
237 		offset += length + 2;
238 		tlv += length + 2;
239 	}
240 
241 	pr_debug("version 0x%x miu %d lto %d opt 0x%x wks 0x%x\n",
242 		 local->remote_version, local->remote_miu,
243 		 local->remote_lto, local->remote_opt,
244 		 local->remote_wks);
245 
246 	return 0;
247 }
248 
nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock * sock,const u8 * tlv_array,u16 tlv_array_len)249 int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
250 				  const u8 *tlv_array, u16 tlv_array_len)
251 {
252 	const u8 *tlv = tlv_array;
253 	u8 type, length;
254 	u16 offset = 0;
255 
256 	pr_debug("TLV array length %d\n", tlv_array_len);
257 
258 	if (sock == NULL)
259 		return -ENOTCONN;
260 
261 	while (offset < tlv_array_len) {
262 		if (offset + 2 > tlv_array_len)
263 			return -EINVAL;
264 
265 		type = tlv[0];
266 		length = tlv[1];
267 
268 		if (offset + 2 + length > tlv_array_len)
269 			return -EINVAL;
270 
271 		pr_debug("type 0x%x length %d\n", type, length);
272 
273 		switch (type) {
274 		case LLCP_TLV_MIUX:
275 			sock->remote_miu = llcp_tlv_miux(tlv) + 128;
276 			break;
277 		case LLCP_TLV_RW:
278 			sock->remote_rw = llcp_tlv_rw(tlv);
279 			break;
280 		case LLCP_TLV_SN:
281 			break;
282 		default:
283 			pr_err("Invalid gt tlv value 0x%x\n", type);
284 			break;
285 		}
286 
287 		offset += length + 2;
288 		tlv += length + 2;
289 	}
290 
291 	pr_debug("sock %p rw %d miu %d\n", sock,
292 		 sock->remote_rw, sock->remote_miu);
293 
294 	return 0;
295 }
296 
llcp_add_header(struct sk_buff * pdu,u8 dsap,u8 ssap,u8 ptype)297 static struct sk_buff *llcp_add_header(struct sk_buff *pdu,
298 				       u8 dsap, u8 ssap, u8 ptype)
299 {
300 	u8 header[2];
301 
302 	pr_debug("ptype 0x%x dsap 0x%x ssap 0x%x\n", ptype, dsap, ssap);
303 
304 	header[0] = (u8)((dsap << 2) | (ptype >> 2));
305 	header[1] = (u8)((ptype << 6) | ssap);
306 
307 	pr_debug("header 0x%x 0x%x\n", header[0], header[1]);
308 
309 	skb_put_data(pdu, header, LLCP_HEADER_SIZE);
310 
311 	return pdu;
312 }
313 
llcp_add_tlv(struct sk_buff * pdu,const u8 * tlv,u8 tlv_length)314 static struct sk_buff *llcp_add_tlv(struct sk_buff *pdu, const u8 *tlv,
315 				    u8 tlv_length)
316 {
317 	/* XXX Add an skb length check */
318 
319 	if (tlv == NULL)
320 		return NULL;
321 
322 	skb_put_data(pdu, tlv, tlv_length);
323 
324 	return pdu;
325 }
326 
llcp_allocate_pdu(struct nfc_llcp_sock * sock,u8 cmd,u16 size)327 static struct sk_buff *llcp_allocate_pdu(struct nfc_llcp_sock *sock,
328 					 u8 cmd, u16 size)
329 {
330 	struct sk_buff *skb;
331 	int err;
332 
333 	if (sock->ssap == 0)
334 		return NULL;
335 
336 	skb = nfc_alloc_send_skb(sock->dev, &sock->sk, MSG_DONTWAIT,
337 				 size + LLCP_HEADER_SIZE, &err);
338 	if (skb == NULL) {
339 		pr_err("Could not allocate PDU\n");
340 		return NULL;
341 	}
342 
343 	skb = llcp_add_header(skb, sock->dsap, sock->ssap, cmd);
344 
345 	return skb;
346 }
347 
nfc_llcp_send_disconnect(struct nfc_llcp_sock * sock)348 int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)
349 {
350 	struct sk_buff *skb;
351 	struct nfc_dev *dev;
352 	struct nfc_llcp_local *local;
353 
354 	local = sock->local;
355 	if (local == NULL)
356 		return -ENODEV;
357 
358 	dev = sock->dev;
359 	if (dev == NULL)
360 		return -ENODEV;
361 
362 	skb = llcp_allocate_pdu(sock, LLCP_PDU_DISC, 0);
363 	if (skb == NULL)
364 		return -ENOMEM;
365 
366 	skb_queue_tail(&local->tx_queue, skb);
367 
368 	return 0;
369 }
370 
nfc_llcp_send_symm(struct nfc_dev * dev)371 int nfc_llcp_send_symm(struct nfc_dev *dev)
372 {
373 	struct sk_buff *skb;
374 	struct nfc_llcp_local *local;
375 	u16 size = 0;
376 	int err;
377 
378 	local = nfc_llcp_find_local(dev);
379 	if (local == NULL)
380 		return -ENODEV;
381 
382 	size += LLCP_HEADER_SIZE;
383 	size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
384 
385 	skb = alloc_skb(size, GFP_KERNEL);
386 	if (skb == NULL) {
387 		err = -ENOMEM;
388 		goto out;
389 	}
390 
391 	skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
392 
393 	skb = llcp_add_header(skb, 0, 0, LLCP_PDU_SYMM);
394 
395 	__net_timestamp(skb);
396 
397 	nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_TX);
398 
399 	err = nfc_data_exchange(dev, local->target_idx, skb,
400 				 nfc_llcp_recv, local);
401 out:
402 	nfc_llcp_local_put(local);
403 	return err;
404 }
405 
nfc_llcp_send_connect(struct nfc_llcp_sock * sock)406 int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
407 {
408 	struct nfc_llcp_local *local;
409 	struct sk_buff *skb;
410 	const u8 *service_name_tlv = NULL;
411 	const u8 *miux_tlv = NULL;
412 	const u8 *rw_tlv = NULL;
413 	u8 service_name_tlv_length = 0;
414 	u8 miux_tlv_length,  rw_tlv_length, rw;
415 	int err;
416 	u16 size = 0;
417 	__be16 miux;
418 
419 	local = sock->local;
420 	if (local == NULL)
421 		return -ENODEV;
422 
423 	if (sock->service_name != NULL) {
424 		service_name_tlv = nfc_llcp_build_tlv(LLCP_TLV_SN,
425 						      sock->service_name,
426 						      sock->service_name_len,
427 						      &service_name_tlv_length);
428 		if (!service_name_tlv) {
429 			err = -ENOMEM;
430 			goto error_tlv;
431 		}
432 		size += service_name_tlv_length;
433 	}
434 
435 	/* If the socket parameters are not set, use the local ones */
436 	miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
437 		local->miux : sock->miux;
438 	rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
439 
440 	miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
441 				      &miux_tlv_length);
442 	if (!miux_tlv) {
443 		err = -ENOMEM;
444 		goto error_tlv;
445 	}
446 	size += miux_tlv_length;
447 
448 	rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
449 	if (!rw_tlv) {
450 		err = -ENOMEM;
451 		goto error_tlv;
452 	}
453 	size += rw_tlv_length;
454 
455 	pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
456 
457 	skb = llcp_allocate_pdu(sock, LLCP_PDU_CONNECT, size);
458 	if (skb == NULL) {
459 		err = -ENOMEM;
460 		goto error_tlv;
461 	}
462 
463 	llcp_add_tlv(skb, service_name_tlv, service_name_tlv_length);
464 	llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
465 	llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
466 
467 	skb_queue_tail(&local->tx_queue, skb);
468 
469 	err = 0;
470 
471 error_tlv:
472 	if (err)
473 		pr_err("error %d\n", err);
474 
475 	kfree(service_name_tlv);
476 	kfree(miux_tlv);
477 	kfree(rw_tlv);
478 
479 	return err;
480 }
481 
nfc_llcp_send_cc(struct nfc_llcp_sock * sock)482 int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
483 {
484 	struct nfc_llcp_local *local;
485 	struct sk_buff *skb;
486 	const u8 *miux_tlv = NULL;
487 	const u8 *rw_tlv = NULL;
488 	u8 miux_tlv_length, rw_tlv_length, rw;
489 	int err;
490 	u16 size = 0;
491 	__be16 miux;
492 
493 	local = sock->local;
494 	if (local == NULL)
495 		return -ENODEV;
496 
497 	/* If the socket parameters are not set, use the local ones */
498 	miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
499 		local->miux : sock->miux;
500 	rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
501 
502 	miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
503 				      &miux_tlv_length);
504 	if (!miux_tlv) {
505 		err = -ENOMEM;
506 		goto error_tlv;
507 	}
508 	size += miux_tlv_length;
509 
510 	rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
511 	if (!rw_tlv) {
512 		err = -ENOMEM;
513 		goto error_tlv;
514 	}
515 	size += rw_tlv_length;
516 
517 	skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
518 	if (skb == NULL) {
519 		err = -ENOMEM;
520 		goto error_tlv;
521 	}
522 
523 	llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
524 	llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
525 
526 	skb_queue_tail(&local->tx_queue, skb);
527 
528 	err = 0;
529 
530 error_tlv:
531 	if (err)
532 		pr_err("error %d\n", err);
533 
534 	kfree(miux_tlv);
535 	kfree(rw_tlv);
536 
537 	return err;
538 }
539 
nfc_llcp_allocate_snl(struct nfc_llcp_local * local,size_t tlv_length)540 static struct sk_buff *nfc_llcp_allocate_snl(struct nfc_llcp_local *local,
541 					     size_t tlv_length)
542 {
543 	struct sk_buff *skb;
544 	struct nfc_dev *dev;
545 	u16 size = 0;
546 
547 	if (local == NULL)
548 		return ERR_PTR(-ENODEV);
549 
550 	dev = local->dev;
551 	if (dev == NULL)
552 		return ERR_PTR(-ENODEV);
553 
554 	size += LLCP_HEADER_SIZE;
555 	size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
556 	size += tlv_length;
557 
558 	skb = alloc_skb(size, GFP_KERNEL);
559 	if (skb == NULL)
560 		return ERR_PTR(-ENOMEM);
561 
562 	skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
563 
564 	skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);
565 
566 	return skb;
567 }
568 
nfc_llcp_send_snl_sdres(struct nfc_llcp_local * local,struct hlist_head * tlv_list,size_t tlvs_len)569 int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
570 			    struct hlist_head *tlv_list, size_t tlvs_len)
571 {
572 	struct nfc_llcp_sdp_tlv *sdp;
573 	struct hlist_node *n;
574 	struct sk_buff *skb;
575 
576 	skb = nfc_llcp_allocate_snl(local, tlvs_len);
577 	if (IS_ERR(skb))
578 		return PTR_ERR(skb);
579 
580 	hlist_for_each_entry_safe(sdp, n, tlv_list, node) {
581 		skb_put_data(skb, sdp->tlv, sdp->tlv_len);
582 
583 		hlist_del(&sdp->node);
584 
585 		nfc_llcp_free_sdp_tlv(sdp);
586 	}
587 
588 	skb_queue_tail(&local->tx_queue, skb);
589 
590 	return 0;
591 }
592 
nfc_llcp_send_snl_sdreq(struct nfc_llcp_local * local,struct hlist_head * tlv_list,size_t tlvs_len)593 int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
594 			    struct hlist_head *tlv_list, size_t tlvs_len)
595 {
596 	struct nfc_llcp_sdp_tlv *sdreq;
597 	struct hlist_node *n;
598 	struct sk_buff *skb;
599 
600 	skb = nfc_llcp_allocate_snl(local, tlvs_len);
601 	if (IS_ERR(skb))
602 		return PTR_ERR(skb);
603 
604 	mutex_lock(&local->sdreq_lock);
605 
606 	if (hlist_empty(&local->pending_sdreqs))
607 		mod_timer(&local->sdreq_timer,
608 			  jiffies + msecs_to_jiffies(3 * local->remote_lto));
609 
610 	hlist_for_each_entry_safe(sdreq, n, tlv_list, node) {
611 		pr_debug("tid %d for %s\n", sdreq->tid, sdreq->uri);
612 
613 		skb_put_data(skb, sdreq->tlv, sdreq->tlv_len);
614 
615 		hlist_del(&sdreq->node);
616 
617 		hlist_add_head(&sdreq->node, &local->pending_sdreqs);
618 	}
619 
620 	mutex_unlock(&local->sdreq_lock);
621 
622 	skb_queue_tail(&local->tx_queue, skb);
623 
624 	return 0;
625 }
626 
nfc_llcp_send_dm(struct nfc_llcp_local * local,u8 ssap,u8 dsap,u8 reason)627 int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
628 {
629 	struct sk_buff *skb;
630 	struct nfc_dev *dev;
631 	u16 size = 1; /* Reason code */
632 
633 	pr_debug("Sending DM reason 0x%x\n", reason);
634 
635 	if (local == NULL)
636 		return -ENODEV;
637 
638 	dev = local->dev;
639 	if (dev == NULL)
640 		return -ENODEV;
641 
642 	size += LLCP_HEADER_SIZE;
643 	size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
644 
645 	skb = alloc_skb(size, GFP_KERNEL);
646 	if (skb == NULL)
647 		return -ENOMEM;
648 
649 	skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
650 
651 	skb = llcp_add_header(skb, dsap, ssap, LLCP_PDU_DM);
652 
653 	skb_put_data(skb, &reason, 1);
654 
655 	skb_queue_head(&local->tx_queue, skb);
656 
657 	return 0;
658 }
659 
nfc_llcp_send_i_frame(struct nfc_llcp_sock * sock,struct msghdr * msg,size_t len)660 int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
661 			  struct msghdr *msg, size_t len)
662 {
663 	struct sk_buff *pdu;
664 	struct sock *sk = &sock->sk;
665 	struct nfc_llcp_local *local;
666 	size_t frag_len = 0, remaining_len;
667 	u8 *msg_data, *msg_ptr;
668 	u16 remote_miu;
669 
670 	pr_debug("Send I frame len %zd\n", len);
671 
672 	local = sock->local;
673 	if (local == NULL)
674 		return -ENODEV;
675 
676 	/* Remote is ready but has not acknowledged our frames */
677 	if((sock->remote_ready &&
678 	    skb_queue_len(&sock->tx_pending_queue) >= sock->remote_rw &&
679 	    skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
680 		pr_err("Pending queue is full %d frames\n",
681 		       skb_queue_len(&sock->tx_pending_queue));
682 		return -ENOBUFS;
683 	}
684 
685 	/* Remote is not ready and we've been queueing enough frames */
686 	if ((!sock->remote_ready &&
687 	     skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
688 		pr_err("Tx queue is full %d frames\n",
689 		       skb_queue_len(&sock->tx_queue));
690 		return -ENOBUFS;
691 	}
692 
693 	msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
694 	if (msg_data == NULL)
695 		return -ENOMEM;
696 
697 	if (memcpy_from_msg(msg_data, msg, len)) {
698 		kfree(msg_data);
699 		return -EFAULT;
700 	}
701 
702 	remaining_len = len;
703 	msg_ptr = msg_data;
704 
705 	do {
706 		remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
707 				LLCP_DEFAULT_MIU : sock->remote_miu;
708 
709 		frag_len = min_t(size_t, remote_miu, remaining_len);
710 
711 		pr_debug("Fragment %zd bytes remaining %zd",
712 			 frag_len, remaining_len);
713 
714 		pdu = llcp_allocate_pdu(sock, LLCP_PDU_I,
715 					frag_len + LLCP_SEQUENCE_SIZE);
716 		if (pdu == NULL) {
717 			kfree(msg_data);
718 			return -ENOMEM;
719 		}
720 
721 		skb_put(pdu, LLCP_SEQUENCE_SIZE);
722 
723 		if (likely(frag_len > 0))
724 			skb_put_data(pdu, msg_ptr, frag_len);
725 
726 		skb_queue_tail(&sock->tx_queue, pdu);
727 
728 		lock_sock(sk);
729 
730 		nfc_llcp_queue_i_frames(sock);
731 
732 		release_sock(sk);
733 
734 		remaining_len -= frag_len;
735 		msg_ptr += frag_len;
736 	} while (remaining_len > 0);
737 
738 	kfree(msg_data);
739 
740 	return len;
741 }
742 
nfc_llcp_send_ui_frame(struct nfc_llcp_sock * sock,u8 ssap,u8 dsap,struct msghdr * msg,size_t len)743 int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
744 			   struct msghdr *msg, size_t len)
745 {
746 	struct sk_buff *pdu;
747 	struct nfc_llcp_local *local;
748 	size_t frag_len = 0, remaining_len;
749 	u8 *msg_ptr, *msg_data;
750 	u16 remote_miu;
751 	int err;
752 
753 	pr_debug("Send UI frame len %zd\n", len);
754 
755 	local = sock->local;
756 	if (local == NULL)
757 		return -ENODEV;
758 
759 	msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
760 	if (msg_data == NULL)
761 		return -ENOMEM;
762 
763 	if (memcpy_from_msg(msg_data, msg, len)) {
764 		kfree(msg_data);
765 		return -EFAULT;
766 	}
767 
768 	remaining_len = len;
769 	msg_ptr = msg_data;
770 
771 	do {
772 		remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
773 				local->remote_miu : sock->remote_miu;
774 
775 		frag_len = min_t(size_t, remote_miu, remaining_len);
776 
777 		pr_debug("Fragment %zd bytes remaining %zd",
778 			 frag_len, remaining_len);
779 
780 		pdu = nfc_alloc_send_skb(sock->dev, &sock->sk, 0,
781 					 frag_len + LLCP_HEADER_SIZE, &err);
782 		if (pdu == NULL) {
783 			pr_err("Could not allocate PDU (error=%d)\n", err);
784 			len -= remaining_len;
785 			if (len == 0)
786 				len = err;
787 			break;
788 		}
789 
790 		pdu = llcp_add_header(pdu, dsap, ssap, LLCP_PDU_UI);
791 
792 		if (likely(frag_len > 0))
793 			skb_put_data(pdu, msg_ptr, frag_len);
794 
795 		spin_lock(&local->tx_queue.lock);
796 
797 		if (list_empty(&local->list)) {
798 			spin_unlock(&local->tx_queue.lock);
799 
800 			kfree_skb(pdu);
801 
802 			len -= remaining_len;
803 			if (len == 0)
804 				len = -ENXIO;
805 			break;
806 		}
807 
808 		/* No need to check for the peer RW for UI frames */
809 		__skb_queue_tail(&local->tx_queue, pdu);
810 
811 		spin_unlock(&local->tx_queue.lock);
812 
813 		remaining_len -= frag_len;
814 		msg_ptr += frag_len;
815 	} while (remaining_len > 0);
816 
817 	kfree(msg_data);
818 
819 	return len;
820 }
821 
nfc_llcp_send_rr(struct nfc_llcp_sock * sock)822 int nfc_llcp_send_rr(struct nfc_llcp_sock *sock)
823 {
824 	struct sk_buff *skb;
825 	struct nfc_llcp_local *local;
826 
827 	pr_debug("Send rr nr %d\n", sock->recv_n);
828 
829 	local = sock->local;
830 	if (local == NULL)
831 		return -ENODEV;
832 
833 	skb = llcp_allocate_pdu(sock, LLCP_PDU_RR, LLCP_SEQUENCE_SIZE);
834 	if (skb == NULL)
835 		return -ENOMEM;
836 
837 	skb_put(skb, LLCP_SEQUENCE_SIZE);
838 
839 	skb->data[2] = sock->recv_n;
840 
841 	skb_queue_head(&local->tx_queue, skb);
842 
843 	return 0;
844 }
845