llcp_commands.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2011 Intel Corporation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
  6. #include <linux/init.h>
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/nfc.h>
  10. #include <net/nfc/nfc.h>
  11. #include "nfc.h"
  12. #include "llcp.h"
  13. static const u8 llcp_tlv_length[LLCP_TLV_MAX] = {
  14. 0,
  15. 1, /* VERSION */
  16. 2, /* MIUX */
  17. 2, /* WKS */
  18. 1, /* LTO */
  19. 1, /* RW */
  20. 0, /* SN */
  21. 1, /* OPT */
  22. 0, /* SDREQ */
  23. 2, /* SDRES */
  24. };
  25. static u8 llcp_tlv8(const u8 *tlv, u8 type)
  26. {
  27. if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
  28. return 0;
  29. return tlv[2];
  30. }
  31. static u16 llcp_tlv16(const u8 *tlv, u8 type)
  32. {
  33. if (tlv[0] != type || tlv[1] != llcp_tlv_length[tlv[0]])
  34. return 0;
  35. return be16_to_cpu(*((__be16 *)(tlv + 2)));
  36. }
  37. static u8 llcp_tlv_version(const u8 *tlv)
  38. {
  39. return llcp_tlv8(tlv, LLCP_TLV_VERSION);
  40. }
  41. static u16 llcp_tlv_miux(const u8 *tlv)
  42. {
  43. return llcp_tlv16(tlv, LLCP_TLV_MIUX) & 0x7ff;
  44. }
  45. static u16 llcp_tlv_wks(const u8 *tlv)
  46. {
  47. return llcp_tlv16(tlv, LLCP_TLV_WKS);
  48. }
  49. static u16 llcp_tlv_lto(const u8 *tlv)
  50. {
  51. return llcp_tlv8(tlv, LLCP_TLV_LTO);
  52. }
  53. static u8 llcp_tlv_opt(const u8 *tlv)
  54. {
  55. return llcp_tlv8(tlv, LLCP_TLV_OPT);
  56. }
  57. static u8 llcp_tlv_rw(const u8 *tlv)
  58. {
  59. return llcp_tlv8(tlv, LLCP_TLV_RW) & 0xf;
  60. }
  61. u8 *nfc_llcp_build_tlv(u8 type, const u8 *value, u8 value_length, u8 *tlv_length)
  62. {
  63. u8 *tlv, length;
  64. pr_debug("type %d\n", type);
  65. if (type >= LLCP_TLV_MAX)
  66. return NULL;
  67. length = llcp_tlv_length[type];
  68. if (length == 0 && value_length == 0)
  69. return NULL;
  70. else if (length == 0)
  71. length = value_length;
  72. *tlv_length = 2 + length;
  73. tlv = kzalloc(2 + length, GFP_KERNEL);
  74. if (tlv == NULL)
  75. return tlv;
  76. tlv[0] = type;
  77. tlv[1] = length;
  78. memcpy(tlv + 2, value, length);
  79. return tlv;
  80. }
  81. struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap)
  82. {
  83. struct nfc_llcp_sdp_tlv *sdres;
  84. u8 value[2];
  85. sdres = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
  86. if (sdres == NULL)
  87. return NULL;
  88. value[0] = tid;
  89. value[1] = sap;
  90. sdres->tlv = nfc_llcp_build_tlv(LLCP_TLV_SDRES, value, 2,
  91. &sdres->tlv_len);
  92. if (sdres->tlv == NULL) {
  93. kfree(sdres);
  94. return NULL;
  95. }
  96. sdres->tid = tid;
  97. sdres->sap = sap;
  98. INIT_HLIST_NODE(&sdres->node);
  99. return sdres;
  100. }
  101. struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, const char *uri,
  102. size_t uri_len)
  103. {
  104. struct nfc_llcp_sdp_tlv *sdreq;
  105. pr_debug("uri: %s, len: %zu\n", uri, uri_len);
  106. /* sdreq->tlv_len is u8, takes uri_len, + 3 for header, + 1 for NULL */
  107. if (WARN_ON_ONCE(uri_len > U8_MAX - 4))
  108. return NULL;
  109. sdreq = kzalloc(sizeof(struct nfc_llcp_sdp_tlv), GFP_KERNEL);
  110. if (sdreq == NULL)
  111. return NULL;
  112. sdreq->tlv_len = uri_len + 3;
  113. if (uri[uri_len - 1] == 0)
  114. sdreq->tlv_len--;
  115. sdreq->tlv = kzalloc(sdreq->tlv_len + 1, GFP_KERNEL);
  116. if (sdreq->tlv == NULL) {
  117. kfree(sdreq);
  118. return NULL;
  119. }
  120. sdreq->tlv[0] = LLCP_TLV_SDREQ;
  121. sdreq->tlv[1] = sdreq->tlv_len - 2;
  122. sdreq->tlv[2] = tid;
  123. sdreq->tid = tid;
  124. sdreq->uri = sdreq->tlv + 3;
  125. memcpy(sdreq->uri, uri, uri_len);
  126. sdreq->time = jiffies;
  127. INIT_HLIST_NODE(&sdreq->node);
  128. return sdreq;
  129. }
  130. void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp)
  131. {
  132. kfree(sdp->tlv);
  133. kfree(sdp);
  134. }
  135. void nfc_llcp_free_sdp_tlv_list(struct hlist_head *head)
  136. {
  137. struct nfc_llcp_sdp_tlv *sdp;
  138. struct hlist_node *n;
  139. hlist_for_each_entry_safe(sdp, n, head, node) {
  140. hlist_del(&sdp->node);
  141. nfc_llcp_free_sdp_tlv(sdp);
  142. }
  143. }
  144. int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
  145. const u8 *tlv_array, u16 tlv_array_len)
  146. {
  147. const u8 *tlv = tlv_array;
  148. u8 type, length, offset = 0;
  149. pr_debug("TLV array length %d\n", tlv_array_len);
  150. if (local == NULL)
  151. return -ENODEV;
  152. while (offset < tlv_array_len) {
  153. type = tlv[0];
  154. length = tlv[1];
  155. pr_debug("type 0x%x length %d\n", type, length);
  156. switch (type) {
  157. case LLCP_TLV_VERSION:
  158. local->remote_version = llcp_tlv_version(tlv);
  159. break;
  160. case LLCP_TLV_MIUX:
  161. local->remote_miu = llcp_tlv_miux(tlv) + 128;
  162. break;
  163. case LLCP_TLV_WKS:
  164. local->remote_wks = llcp_tlv_wks(tlv);
  165. break;
  166. case LLCP_TLV_LTO:
  167. local->remote_lto = llcp_tlv_lto(tlv) * 10;
  168. break;
  169. case LLCP_TLV_OPT:
  170. local->remote_opt = llcp_tlv_opt(tlv);
  171. break;
  172. default:
  173. pr_err("Invalid gt tlv value 0x%x\n", type);
  174. break;
  175. }
  176. offset += length + 2;
  177. tlv += length + 2;
  178. }
  179. pr_debug("version 0x%x miu %d lto %d opt 0x%x wks 0x%x\n",
  180. local->remote_version, local->remote_miu,
  181. local->remote_lto, local->remote_opt,
  182. local->remote_wks);
  183. return 0;
  184. }
  185. int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
  186. const u8 *tlv_array, u16 tlv_array_len)
  187. {
  188. const u8 *tlv = tlv_array;
  189. u8 type, length, offset = 0;
  190. pr_debug("TLV array length %d\n", tlv_array_len);
  191. if (sock == NULL)
  192. return -ENOTCONN;
  193. while (offset < tlv_array_len) {
  194. type = tlv[0];
  195. length = tlv[1];
  196. pr_debug("type 0x%x length %d\n", type, length);
  197. switch (type) {
  198. case LLCP_TLV_MIUX:
  199. sock->remote_miu = llcp_tlv_miux(tlv) + 128;
  200. break;
  201. case LLCP_TLV_RW:
  202. sock->remote_rw = llcp_tlv_rw(tlv);
  203. break;
  204. case LLCP_TLV_SN:
  205. break;
  206. default:
  207. pr_err("Invalid gt tlv value 0x%x\n", type);
  208. break;
  209. }
  210. offset += length + 2;
  211. tlv += length + 2;
  212. }
  213. pr_debug("sock %p rw %d miu %d\n", sock,
  214. sock->remote_rw, sock->remote_miu);
  215. return 0;
  216. }
  217. static struct sk_buff *llcp_add_header(struct sk_buff *pdu,
  218. u8 dsap, u8 ssap, u8 ptype)
  219. {
  220. u8 header[2];
  221. pr_debug("ptype 0x%x dsap 0x%x ssap 0x%x\n", ptype, dsap, ssap);
  222. header[0] = (u8)((dsap << 2) | (ptype >> 2));
  223. header[1] = (u8)((ptype << 6) | ssap);
  224. pr_debug("header 0x%x 0x%x\n", header[0], header[1]);
  225. skb_put_data(pdu, header, LLCP_HEADER_SIZE);
  226. return pdu;
  227. }
  228. static struct sk_buff *llcp_add_tlv(struct sk_buff *pdu, const u8 *tlv,
  229. u8 tlv_length)
  230. {
  231. /* XXX Add an skb length check */
  232. if (tlv == NULL)
  233. return NULL;
  234. skb_put_data(pdu, tlv, tlv_length);
  235. return pdu;
  236. }
  237. static struct sk_buff *llcp_allocate_pdu(struct nfc_llcp_sock *sock,
  238. u8 cmd, u16 size)
  239. {
  240. struct sk_buff *skb;
  241. int err;
  242. if (sock->ssap == 0)
  243. return NULL;
  244. skb = nfc_alloc_send_skb(sock->dev, &sock->sk, MSG_DONTWAIT,
  245. size + LLCP_HEADER_SIZE, &err);
  246. if (skb == NULL) {
  247. pr_err("Could not allocate PDU\n");
  248. return NULL;
  249. }
  250. skb = llcp_add_header(skb, sock->dsap, sock->ssap, cmd);
  251. return skb;
  252. }
  253. int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)
  254. {
  255. struct sk_buff *skb;
  256. struct nfc_dev *dev;
  257. struct nfc_llcp_local *local;
  258. local = sock->local;
  259. if (local == NULL)
  260. return -ENODEV;
  261. dev = sock->dev;
  262. if (dev == NULL)
  263. return -ENODEV;
  264. skb = llcp_allocate_pdu(sock, LLCP_PDU_DISC, 0);
  265. if (skb == NULL)
  266. return -ENOMEM;
  267. skb_queue_tail(&local->tx_queue, skb);
  268. return 0;
  269. }
  270. int nfc_llcp_send_symm(struct nfc_dev *dev)
  271. {
  272. struct sk_buff *skb;
  273. struct nfc_llcp_local *local;
  274. u16 size = 0;
  275. int err;
  276. local = nfc_llcp_find_local(dev);
  277. if (local == NULL)
  278. return -ENODEV;
  279. size += LLCP_HEADER_SIZE;
  280. size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
  281. skb = alloc_skb(size, GFP_KERNEL);
  282. if (skb == NULL) {
  283. err = -ENOMEM;
  284. goto out;
  285. }
  286. skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
  287. skb = llcp_add_header(skb, 0, 0, LLCP_PDU_SYMM);
  288. __net_timestamp(skb);
  289. nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_TX);
  290. err = nfc_data_exchange(dev, local->target_idx, skb,
  291. nfc_llcp_recv, local);
  292. out:
  293. nfc_llcp_local_put(local);
  294. return err;
  295. }
  296. int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
  297. {
  298. struct nfc_llcp_local *local;
  299. struct sk_buff *skb;
  300. const u8 *service_name_tlv = NULL;
  301. const u8 *miux_tlv = NULL;
  302. const u8 *rw_tlv = NULL;
  303. u8 service_name_tlv_length = 0;
  304. u8 miux_tlv_length, rw_tlv_length, rw;
  305. int err;
  306. u16 size = 0;
  307. __be16 miux;
  308. local = sock->local;
  309. if (local == NULL)
  310. return -ENODEV;
  311. if (sock->service_name != NULL) {
  312. service_name_tlv = nfc_llcp_build_tlv(LLCP_TLV_SN,
  313. sock->service_name,
  314. sock->service_name_len,
  315. &service_name_tlv_length);
  316. if (!service_name_tlv) {
  317. err = -ENOMEM;
  318. goto error_tlv;
  319. }
  320. size += service_name_tlv_length;
  321. }
  322. /* If the socket parameters are not set, use the local ones */
  323. miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
  324. local->miux : sock->miux;
  325. rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
  326. miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
  327. &miux_tlv_length);
  328. if (!miux_tlv) {
  329. err = -ENOMEM;
  330. goto error_tlv;
  331. }
  332. size += miux_tlv_length;
  333. rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
  334. if (!rw_tlv) {
  335. err = -ENOMEM;
  336. goto error_tlv;
  337. }
  338. size += rw_tlv_length;
  339. pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
  340. skb = llcp_allocate_pdu(sock, LLCP_PDU_CONNECT, size);
  341. if (skb == NULL) {
  342. err = -ENOMEM;
  343. goto error_tlv;
  344. }
  345. llcp_add_tlv(skb, service_name_tlv, service_name_tlv_length);
  346. llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
  347. llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
  348. skb_queue_tail(&local->tx_queue, skb);
  349. err = 0;
  350. error_tlv:
  351. if (err)
  352. pr_err("error %d\n", err);
  353. kfree(service_name_tlv);
  354. kfree(miux_tlv);
  355. kfree(rw_tlv);
  356. return err;
  357. }
  358. int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
  359. {
  360. struct nfc_llcp_local *local;
  361. struct sk_buff *skb;
  362. const u8 *miux_tlv = NULL;
  363. const u8 *rw_tlv = NULL;
  364. u8 miux_tlv_length, rw_tlv_length, rw;
  365. int err;
  366. u16 size = 0;
  367. __be16 miux;
  368. local = sock->local;
  369. if (local == NULL)
  370. return -ENODEV;
  371. /* If the socket parameters are not set, use the local ones */
  372. miux = be16_to_cpu(sock->miux) > LLCP_MAX_MIUX ?
  373. local->miux : sock->miux;
  374. rw = sock->rw > LLCP_MAX_RW ? local->rw : sock->rw;
  375. miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
  376. &miux_tlv_length);
  377. if (!miux_tlv) {
  378. err = -ENOMEM;
  379. goto error_tlv;
  380. }
  381. size += miux_tlv_length;
  382. rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
  383. if (!rw_tlv) {
  384. err = -ENOMEM;
  385. goto error_tlv;
  386. }
  387. size += rw_tlv_length;
  388. skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
  389. if (skb == NULL) {
  390. err = -ENOMEM;
  391. goto error_tlv;
  392. }
  393. llcp_add_tlv(skb, miux_tlv, miux_tlv_length);
  394. llcp_add_tlv(skb, rw_tlv, rw_tlv_length);
  395. skb_queue_tail(&local->tx_queue, skb);
  396. err = 0;
  397. error_tlv:
  398. if (err)
  399. pr_err("error %d\n", err);
  400. kfree(miux_tlv);
  401. kfree(rw_tlv);
  402. return err;
  403. }
  404. static struct sk_buff *nfc_llcp_allocate_snl(struct nfc_llcp_local *local,
  405. size_t tlv_length)
  406. {
  407. struct sk_buff *skb;
  408. struct nfc_dev *dev;
  409. u16 size = 0;
  410. if (local == NULL)
  411. return ERR_PTR(-ENODEV);
  412. dev = local->dev;
  413. if (dev == NULL)
  414. return ERR_PTR(-ENODEV);
  415. size += LLCP_HEADER_SIZE;
  416. size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
  417. size += tlv_length;
  418. skb = alloc_skb(size, GFP_KERNEL);
  419. if (skb == NULL)
  420. return ERR_PTR(-ENOMEM);
  421. skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
  422. skb = llcp_add_header(skb, LLCP_SAP_SDP, LLCP_SAP_SDP, LLCP_PDU_SNL);
  423. return skb;
  424. }
  425. int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
  426. struct hlist_head *tlv_list, size_t tlvs_len)
  427. {
  428. struct nfc_llcp_sdp_tlv *sdp;
  429. struct hlist_node *n;
  430. struct sk_buff *skb;
  431. skb = nfc_llcp_allocate_snl(local, tlvs_len);
  432. if (IS_ERR(skb))
  433. return PTR_ERR(skb);
  434. hlist_for_each_entry_safe(sdp, n, tlv_list, node) {
  435. skb_put_data(skb, sdp->tlv, sdp->tlv_len);
  436. hlist_del(&sdp->node);
  437. nfc_llcp_free_sdp_tlv(sdp);
  438. }
  439. skb_queue_tail(&local->tx_queue, skb);
  440. return 0;
  441. }
  442. int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
  443. struct hlist_head *tlv_list, size_t tlvs_len)
  444. {
  445. struct nfc_llcp_sdp_tlv *sdreq;
  446. struct hlist_node *n;
  447. struct sk_buff *skb;
  448. skb = nfc_llcp_allocate_snl(local, tlvs_len);
  449. if (IS_ERR(skb))
  450. return PTR_ERR(skb);
  451. mutex_lock(&local->sdreq_lock);
  452. if (hlist_empty(&local->pending_sdreqs))
  453. mod_timer(&local->sdreq_timer,
  454. jiffies + msecs_to_jiffies(3 * local->remote_lto));
  455. hlist_for_each_entry_safe(sdreq, n, tlv_list, node) {
  456. pr_debug("tid %d for %s\n", sdreq->tid, sdreq->uri);
  457. skb_put_data(skb, sdreq->tlv, sdreq->tlv_len);
  458. hlist_del(&sdreq->node);
  459. hlist_add_head(&sdreq->node, &local->pending_sdreqs);
  460. }
  461. mutex_unlock(&local->sdreq_lock);
  462. skb_queue_tail(&local->tx_queue, skb);
  463. return 0;
  464. }
  465. int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason)
  466. {
  467. struct sk_buff *skb;
  468. struct nfc_dev *dev;
  469. u16 size = 1; /* Reason code */
  470. pr_debug("Sending DM reason 0x%x\n", reason);
  471. if (local == NULL)
  472. return -ENODEV;
  473. dev = local->dev;
  474. if (dev == NULL)
  475. return -ENODEV;
  476. size += LLCP_HEADER_SIZE;
  477. size += dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE;
  478. skb = alloc_skb(size, GFP_KERNEL);
  479. if (skb == NULL)
  480. return -ENOMEM;
  481. skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
  482. skb = llcp_add_header(skb, dsap, ssap, LLCP_PDU_DM);
  483. skb_put_data(skb, &reason, 1);
  484. skb_queue_head(&local->tx_queue, skb);
  485. return 0;
  486. }
  487. int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
  488. struct msghdr *msg, size_t len)
  489. {
  490. struct sk_buff *pdu;
  491. struct sock *sk = &sock->sk;
  492. struct nfc_llcp_local *local;
  493. size_t frag_len = 0, remaining_len;
  494. u8 *msg_data, *msg_ptr;
  495. u16 remote_miu;
  496. pr_debug("Send I frame len %zd\n", len);
  497. local = sock->local;
  498. if (local == NULL)
  499. return -ENODEV;
  500. /* Remote is ready but has not acknowledged our frames */
  501. if((sock->remote_ready &&
  502. skb_queue_len(&sock->tx_pending_queue) >= sock->remote_rw &&
  503. skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
  504. pr_err("Pending queue is full %d frames\n",
  505. skb_queue_len(&sock->tx_pending_queue));
  506. return -ENOBUFS;
  507. }
  508. /* Remote is not ready and we've been queueing enough frames */
  509. if ((!sock->remote_ready &&
  510. skb_queue_len(&sock->tx_queue) >= 2 * sock->remote_rw)) {
  511. pr_err("Tx queue is full %d frames\n",
  512. skb_queue_len(&sock->tx_queue));
  513. return -ENOBUFS;
  514. }
  515. msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
  516. if (msg_data == NULL)
  517. return -ENOMEM;
  518. if (memcpy_from_msg(msg_data, msg, len)) {
  519. kfree(msg_data);
  520. return -EFAULT;
  521. }
  522. remaining_len = len;
  523. msg_ptr = msg_data;
  524. do {
  525. remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
  526. LLCP_DEFAULT_MIU : sock->remote_miu;
  527. frag_len = min_t(size_t, remote_miu, remaining_len);
  528. pr_debug("Fragment %zd bytes remaining %zd",
  529. frag_len, remaining_len);
  530. pdu = llcp_allocate_pdu(sock, LLCP_PDU_I,
  531. frag_len + LLCP_SEQUENCE_SIZE);
  532. if (pdu == NULL) {
  533. kfree(msg_data);
  534. return -ENOMEM;
  535. }
  536. skb_put(pdu, LLCP_SEQUENCE_SIZE);
  537. if (likely(frag_len > 0))
  538. skb_put_data(pdu, msg_ptr, frag_len);
  539. skb_queue_tail(&sock->tx_queue, pdu);
  540. lock_sock(sk);
  541. nfc_llcp_queue_i_frames(sock);
  542. release_sock(sk);
  543. remaining_len -= frag_len;
  544. msg_ptr += frag_len;
  545. } while (remaining_len > 0);
  546. kfree(msg_data);
  547. return len;
  548. }
  549. int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
  550. struct msghdr *msg, size_t len)
  551. {
  552. struct sk_buff *pdu;
  553. struct nfc_llcp_local *local;
  554. size_t frag_len = 0, remaining_len;
  555. u8 *msg_ptr, *msg_data;
  556. u16 remote_miu;
  557. int err;
  558. pr_debug("Send UI frame len %zd\n", len);
  559. local = sock->local;
  560. if (local == NULL)
  561. return -ENODEV;
  562. msg_data = kmalloc(len, GFP_USER | __GFP_NOWARN);
  563. if (msg_data == NULL)
  564. return -ENOMEM;
  565. if (memcpy_from_msg(msg_data, msg, len)) {
  566. kfree(msg_data);
  567. return -EFAULT;
  568. }
  569. remaining_len = len;
  570. msg_ptr = msg_data;
  571. do {
  572. remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
  573. local->remote_miu : sock->remote_miu;
  574. frag_len = min_t(size_t, remote_miu, remaining_len);
  575. pr_debug("Fragment %zd bytes remaining %zd",
  576. frag_len, remaining_len);
  577. pdu = nfc_alloc_send_skb(sock->dev, &sock->sk, 0,
  578. frag_len + LLCP_HEADER_SIZE, &err);
  579. if (pdu == NULL) {
  580. pr_err("Could not allocate PDU (error=%d)\n", err);
  581. len -= remaining_len;
  582. if (len == 0)
  583. len = err;
  584. break;
  585. }
  586. pdu = llcp_add_header(pdu, dsap, ssap, LLCP_PDU_UI);
  587. if (likely(frag_len > 0))
  588. skb_put_data(pdu, msg_ptr, frag_len);
  589. /* No need to check for the peer RW for UI frames */
  590. skb_queue_tail(&local->tx_queue, pdu);
  591. remaining_len -= frag_len;
  592. msg_ptr += frag_len;
  593. } while (remaining_len > 0);
  594. kfree(msg_data);
  595. return len;
  596. }
  597. int nfc_llcp_send_rr(struct nfc_llcp_sock *sock)
  598. {
  599. struct sk_buff *skb;
  600. struct nfc_llcp_local *local;
  601. pr_debug("Send rr nr %d\n", sock->recv_n);
  602. local = sock->local;
  603. if (local == NULL)
  604. return -ENODEV;
  605. skb = llcp_allocate_pdu(sock, LLCP_PDU_RR, LLCP_SEQUENCE_SIZE);
  606. if (skb == NULL)
  607. return -ENOMEM;
  608. skb_put(skb, LLCP_SEQUENCE_SIZE);
  609. skb->data[2] = sock->recv_n;
  610. skb_queue_head(&local->tx_queue, skb);
  611. return 0;
  612. }