llcp.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. /*
  2. * Copyright (C) 2011 Intel Corporation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the
  16. * Free Software Foundation, Inc.,
  17. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
  20. #include <linux/init.h>
  21. #include <linux/kernel.h>
  22. #include <linux/list.h>
  23. #include <linux/nfc.h>
  24. #include "../nfc.h"
  25. #include "llcp.h"
  26. static u8 llcp_magic[3] = {0x46, 0x66, 0x6d};
  27. static struct list_head llcp_devices;
  28. static void nfc_llcp_socket_release(struct nfc_llcp_local *local)
  29. {
  30. struct nfc_llcp_sock *parent, *s, *n;
  31. struct sock *sk, *parent_sk;
  32. int i;
  33. mutex_lock(&local->socket_lock);
  34. for (i = 0; i < LLCP_MAX_SAP; i++) {
  35. parent = local->sockets[i];
  36. if (parent == NULL)
  37. continue;
  38. /* Release all child sockets */
  39. list_for_each_entry_safe(s, n, &parent->list, list) {
  40. list_del(&s->list);
  41. sk = &s->sk;
  42. lock_sock(sk);
  43. if (sk->sk_state == LLCP_CONNECTED)
  44. nfc_put_device(s->dev);
  45. sk->sk_state = LLCP_CLOSED;
  46. sock_set_flag(sk, SOCK_DEAD);
  47. release_sock(sk);
  48. }
  49. parent_sk = &parent->sk;
  50. lock_sock(parent_sk);
  51. if (parent_sk->sk_state == LLCP_LISTEN) {
  52. struct nfc_llcp_sock *lsk, *n;
  53. struct sock *accept_sk;
  54. list_for_each_entry_safe(lsk, n, &parent->accept_queue,
  55. accept_queue) {
  56. accept_sk = &lsk->sk;
  57. lock_sock(accept_sk);
  58. nfc_llcp_accept_unlink(accept_sk);
  59. accept_sk->sk_state = LLCP_CLOSED;
  60. sock_set_flag(accept_sk, SOCK_DEAD);
  61. release_sock(accept_sk);
  62. sock_orphan(accept_sk);
  63. }
  64. }
  65. if (parent_sk->sk_state == LLCP_CONNECTED)
  66. nfc_put_device(parent->dev);
  67. parent_sk->sk_state = LLCP_CLOSED;
  68. sock_set_flag(parent_sk, SOCK_DEAD);
  69. release_sock(parent_sk);
  70. }
  71. mutex_unlock(&local->socket_lock);
  72. }
  73. static void nfc_llcp_timeout_work(struct work_struct *work)
  74. {
  75. struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
  76. timeout_work);
  77. nfc_dep_link_down(local->dev);
  78. }
  79. static void nfc_llcp_symm_timer(unsigned long data)
  80. {
  81. struct nfc_llcp_local *local = (struct nfc_llcp_local *) data;
  82. pr_err("SYMM timeout\n");
  83. queue_work(local->timeout_wq, &local->timeout_work);
  84. }
  85. struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev)
  86. {
  87. struct nfc_llcp_local *local, *n;
  88. list_for_each_entry_safe(local, n, &llcp_devices, list)
  89. if (local->dev == dev)
  90. return local;
  91. pr_debug("No device found\n");
  92. return NULL;
  93. }
  94. static char *wks[] = {
  95. NULL,
  96. NULL, /* SDP */
  97. "urn:nfc:sn:ip",
  98. "urn:nfc:sn:obex",
  99. "urn:nfc:sn:snep",
  100. };
  101. static int nfc_llcp_wks_sap(char *service_name, size_t service_name_len)
  102. {
  103. int sap, num_wks;
  104. pr_debug("%s\n", service_name);
  105. if (service_name == NULL)
  106. return -EINVAL;
  107. num_wks = ARRAY_SIZE(wks);
  108. for (sap = 0 ; sap < num_wks; sap++) {
  109. if (wks[sap] == NULL)
  110. continue;
  111. if (strncmp(wks[sap], service_name, service_name_len) == 0)
  112. return sap;
  113. }
  114. return -EINVAL;
  115. }
  116. u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
  117. struct nfc_llcp_sock *sock)
  118. {
  119. mutex_lock(&local->sdp_lock);
  120. if (sock->service_name != NULL && sock->service_name_len > 0) {
  121. int ssap = nfc_llcp_wks_sap(sock->service_name,
  122. sock->service_name_len);
  123. if (ssap > 0) {
  124. pr_debug("WKS %d\n", ssap);
  125. /* This is a WKS, let's check if it's free */
  126. if (local->local_wks & BIT(ssap)) {
  127. mutex_unlock(&local->sdp_lock);
  128. return LLCP_SAP_MAX;
  129. }
  130. set_bit(BIT(ssap), &local->local_wks);
  131. mutex_unlock(&local->sdp_lock);
  132. return ssap;
  133. }
  134. /*
  135. * This is not a well known service,
  136. * we should try to find a local SDP free spot
  137. */
  138. ssap = find_first_zero_bit(&local->local_sdp, LLCP_SDP_NUM_SAP);
  139. if (ssap == LLCP_SDP_NUM_SAP) {
  140. mutex_unlock(&local->sdp_lock);
  141. return LLCP_SAP_MAX;
  142. }
  143. pr_debug("SDP ssap %d\n", LLCP_WKS_NUM_SAP + ssap);
  144. set_bit(BIT(ssap), &local->local_sdp);
  145. mutex_unlock(&local->sdp_lock);
  146. return LLCP_WKS_NUM_SAP + ssap;
  147. } else if (sock->ssap != 0) {
  148. if (sock->ssap < LLCP_WKS_NUM_SAP) {
  149. if (!(local->local_wks & BIT(sock->ssap))) {
  150. set_bit(BIT(sock->ssap), &local->local_wks);
  151. mutex_unlock(&local->sdp_lock);
  152. return sock->ssap;
  153. }
  154. } else if (sock->ssap < LLCP_SDP_NUM_SAP) {
  155. if (!(local->local_sdp &
  156. BIT(sock->ssap - LLCP_WKS_NUM_SAP))) {
  157. set_bit(BIT(sock->ssap - LLCP_WKS_NUM_SAP),
  158. &local->local_sdp);
  159. mutex_unlock(&local->sdp_lock);
  160. return sock->ssap;
  161. }
  162. }
  163. }
  164. mutex_unlock(&local->sdp_lock);
  165. return LLCP_SAP_MAX;
  166. }
  167. u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local)
  168. {
  169. u8 local_ssap;
  170. mutex_lock(&local->sdp_lock);
  171. local_ssap = find_first_zero_bit(&local->local_sap, LLCP_LOCAL_NUM_SAP);
  172. if (local_ssap == LLCP_LOCAL_NUM_SAP) {
  173. mutex_unlock(&local->sdp_lock);
  174. return LLCP_SAP_MAX;
  175. }
  176. set_bit(BIT(local_ssap), &local->local_sap);
  177. mutex_unlock(&local->sdp_lock);
  178. return local_ssap + LLCP_LOCAL_SAP_OFFSET;
  179. }
  180. void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap)
  181. {
  182. u8 local_ssap;
  183. unsigned long *sdp;
  184. if (ssap < LLCP_WKS_NUM_SAP) {
  185. local_ssap = ssap;
  186. sdp = &local->local_wks;
  187. } else if (ssap < LLCP_LOCAL_NUM_SAP) {
  188. local_ssap = ssap - LLCP_WKS_NUM_SAP;
  189. sdp = &local->local_sdp;
  190. } else if (ssap < LLCP_MAX_SAP) {
  191. local_ssap = ssap - LLCP_LOCAL_NUM_SAP;
  192. sdp = &local->local_sap;
  193. } else {
  194. return;
  195. }
  196. mutex_lock(&local->sdp_lock);
  197. clear_bit(1 << local_ssap, sdp);
  198. mutex_unlock(&local->sdp_lock);
  199. }
  200. u8 *nfc_llcp_general_bytes(struct nfc_dev *dev, u8 *general_bytes_len)
  201. {
  202. struct nfc_llcp_local *local;
  203. local = nfc_llcp_find_local(dev);
  204. if (local == NULL) {
  205. *general_bytes_len = 0;
  206. return NULL;
  207. }
  208. *general_bytes_len = local->gb_len;
  209. return local->gb;
  210. }
  211. static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
  212. {
  213. u8 *gb_cur, *version_tlv, version, version_length;
  214. u8 *lto_tlv, lto, lto_length;
  215. u8 *wks_tlv, wks_length;
  216. u8 gb_len = 0;
  217. version = LLCP_VERSION_11;
  218. version_tlv = nfc_llcp_build_tlv(LLCP_TLV_VERSION, &version,
  219. 1, &version_length);
  220. gb_len += version_length;
  221. /* 1500 ms */
  222. lto = 150;
  223. lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_VERSION, &lto, 1, &lto_length);
  224. gb_len += lto_length;
  225. pr_debug("Local wks 0x%lx\n", local->local_wks);
  226. wks_tlv = nfc_llcp_build_tlv(LLCP_TLV_WKS, (u8 *)&local->local_wks, 2,
  227. &wks_length);
  228. gb_len += wks_length;
  229. gb_len += ARRAY_SIZE(llcp_magic);
  230. if (gb_len > NFC_MAX_GT_LEN) {
  231. kfree(version_tlv);
  232. return -EINVAL;
  233. }
  234. gb_cur = local->gb;
  235. memcpy(gb_cur, llcp_magic, ARRAY_SIZE(llcp_magic));
  236. gb_cur += ARRAY_SIZE(llcp_magic);
  237. memcpy(gb_cur, version_tlv, version_length);
  238. gb_cur += version_length;
  239. memcpy(gb_cur, lto_tlv, lto_length);
  240. gb_cur += lto_length;
  241. memcpy(gb_cur, wks_tlv, wks_length);
  242. gb_cur += wks_length;
  243. kfree(version_tlv);
  244. kfree(lto_tlv);
  245. local->gb_len = gb_len;
  246. return 0;
  247. }
  248. int nfc_llcp_set_remote_gb(struct nfc_dev *dev, u8 *gb, u8 gb_len)
  249. {
  250. struct nfc_llcp_local *local = nfc_llcp_find_local(dev);
  251. if (local == NULL) {
  252. pr_err("No LLCP device\n");
  253. return -ENODEV;
  254. }
  255. memset(local->remote_gb, 0, NFC_MAX_GT_LEN);
  256. memcpy(local->remote_gb, gb, gb_len);
  257. local->remote_gb_len = gb_len;
  258. if (local->remote_gb == NULL ||
  259. local->remote_gb_len == 0)
  260. return -ENODEV;
  261. if (memcmp(local->remote_gb, llcp_magic, 3)) {
  262. pr_err("MAC does not support LLCP\n");
  263. return -EINVAL;
  264. }
  265. return nfc_llcp_parse_tlv(local,
  266. &local->remote_gb[3], local->remote_gb_len - 3);
  267. }
  268. static void nfc_llcp_tx_work(struct work_struct *work)
  269. {
  270. struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
  271. tx_work);
  272. struct sk_buff *skb;
  273. skb = skb_dequeue(&local->tx_queue);
  274. if (skb != NULL) {
  275. pr_debug("Sending pending skb\n");
  276. nfc_data_exchange(local->dev, local->target_idx,
  277. skb, nfc_llcp_recv, local);
  278. } else {
  279. nfc_llcp_send_symm(local->dev);
  280. }
  281. mod_timer(&local->link_timer,
  282. jiffies + msecs_to_jiffies(local->remote_lto));
  283. }
  284. static u8 nfc_llcp_dsap(struct sk_buff *pdu)
  285. {
  286. return (pdu->data[0] & 0xfc) >> 2;
  287. }
  288. static u8 nfc_llcp_ptype(struct sk_buff *pdu)
  289. {
  290. return ((pdu->data[0] & 0x03) << 2) | ((pdu->data[1] & 0xc0) >> 6);
  291. }
  292. static u8 nfc_llcp_ssap(struct sk_buff *pdu)
  293. {
  294. return pdu->data[1] & 0x3f;
  295. }
  296. static u8 nfc_llcp_ns(struct sk_buff *pdu)
  297. {
  298. return pdu->data[2] >> 4;
  299. }
  300. static u8 nfc_llcp_nr(struct sk_buff *pdu)
  301. {
  302. return pdu->data[2] & 0xf;
  303. }
  304. static void nfc_llcp_set_nrns(struct nfc_llcp_sock *sock, struct sk_buff *pdu)
  305. {
  306. pdu->data[2] = (sock->send_n << 4) | ((sock->recv_n - 1) % 16);
  307. sock->send_n = (sock->send_n + 1) % 16;
  308. sock->recv_ack_n = (sock->recv_n - 1) % 16;
  309. }
  310. static struct nfc_llcp_sock *nfc_llcp_sock_get(struct nfc_llcp_local *local,
  311. u8 ssap, u8 dsap)
  312. {
  313. struct nfc_llcp_sock *sock, *llcp_sock, *n;
  314. if (ssap == 0 && dsap == 0)
  315. return NULL;
  316. mutex_lock(&local->socket_lock);
  317. sock = local->sockets[ssap];
  318. if (sock == NULL) {
  319. mutex_unlock(&local->socket_lock);
  320. return NULL;
  321. }
  322. pr_debug("root dsap %d (%d)\n", sock->dsap, dsap);
  323. if (sock->dsap == dsap) {
  324. sock_hold(&sock->sk);
  325. mutex_unlock(&local->socket_lock);
  326. return sock;
  327. }
  328. list_for_each_entry_safe(llcp_sock, n, &sock->list, list) {
  329. pr_debug("llcp_sock %p sk %p dsap %d\n", llcp_sock,
  330. &llcp_sock->sk, llcp_sock->dsap);
  331. if (llcp_sock->dsap == dsap) {
  332. sock_hold(&llcp_sock->sk);
  333. mutex_unlock(&local->socket_lock);
  334. return llcp_sock;
  335. }
  336. }
  337. pr_err("Could not find socket for %d %d\n", ssap, dsap);
  338. mutex_unlock(&local->socket_lock);
  339. return NULL;
  340. }
  341. static void nfc_llcp_sock_put(struct nfc_llcp_sock *sock)
  342. {
  343. sock_put(&sock->sk);
  344. }
  345. static u8 *nfc_llcp_connect_sn(struct sk_buff *skb, size_t *sn_len)
  346. {
  347. u8 *tlv = &skb->data[2], type, length;
  348. size_t tlv_array_len = skb->len - LLCP_HEADER_SIZE, offset = 0;
  349. while (offset < tlv_array_len) {
  350. type = tlv[0];
  351. length = tlv[1];
  352. pr_debug("type 0x%x length %d\n", type, length);
  353. if (type == LLCP_TLV_SN) {
  354. *sn_len = length;
  355. return &tlv[2];
  356. }
  357. offset += length + 2;
  358. tlv += length + 2;
  359. }
  360. return NULL;
  361. }
  362. static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
  363. struct sk_buff *skb)
  364. {
  365. struct sock *new_sk, *parent;
  366. struct nfc_llcp_sock *sock, *new_sock;
  367. u8 dsap, ssap, bound_sap, reason;
  368. dsap = nfc_llcp_dsap(skb);
  369. ssap = nfc_llcp_ssap(skb);
  370. pr_debug("%d %d\n", dsap, ssap);
  371. nfc_llcp_parse_tlv(local, &skb->data[LLCP_HEADER_SIZE],
  372. skb->len - LLCP_HEADER_SIZE);
  373. if (dsap != LLCP_SAP_SDP) {
  374. bound_sap = dsap;
  375. mutex_lock(&local->socket_lock);
  376. sock = local->sockets[dsap];
  377. if (sock == NULL) {
  378. mutex_unlock(&local->socket_lock);
  379. reason = LLCP_DM_NOBOUND;
  380. goto fail;
  381. }
  382. sock_hold(&sock->sk);
  383. mutex_unlock(&local->socket_lock);
  384. lock_sock(&sock->sk);
  385. if (sock->dsap == LLCP_SAP_SDP &&
  386. sock->sk.sk_state == LLCP_LISTEN)
  387. goto enqueue;
  388. } else {
  389. u8 *sn;
  390. size_t sn_len;
  391. sn = nfc_llcp_connect_sn(skb, &sn_len);
  392. if (sn == NULL) {
  393. reason = LLCP_DM_NOBOUND;
  394. goto fail;
  395. }
  396. pr_debug("Service name length %zu\n", sn_len);
  397. mutex_lock(&local->socket_lock);
  398. for (bound_sap = 0; bound_sap < LLCP_LOCAL_SAP_OFFSET;
  399. bound_sap++) {
  400. sock = local->sockets[bound_sap];
  401. if (sock == NULL)
  402. continue;
  403. if (sock->service_name == NULL ||
  404. sock->service_name_len == 0)
  405. continue;
  406. if (sock->service_name_len != sn_len)
  407. continue;
  408. if (sock->dsap == LLCP_SAP_SDP &&
  409. sock->sk.sk_state == LLCP_LISTEN &&
  410. !memcmp(sn, sock->service_name, sn_len)) {
  411. pr_debug("Found service name at SAP %d\n",
  412. bound_sap);
  413. sock_hold(&sock->sk);
  414. mutex_unlock(&local->socket_lock);
  415. lock_sock(&sock->sk);
  416. goto enqueue;
  417. }
  418. }
  419. mutex_unlock(&local->socket_lock);
  420. }
  421. reason = LLCP_DM_NOBOUND;
  422. goto fail;
  423. enqueue:
  424. parent = &sock->sk;
  425. if (sk_acceptq_is_full(parent)) {
  426. reason = LLCP_DM_REJ;
  427. release_sock(&sock->sk);
  428. sock_put(&sock->sk);
  429. goto fail;
  430. }
  431. new_sk = nfc_llcp_sock_alloc(NULL, parent->sk_type,
  432. GFP_ATOMIC);
  433. if (new_sk == NULL) {
  434. reason = LLCP_DM_REJ;
  435. release_sock(&sock->sk);
  436. sock_put(&sock->sk);
  437. goto fail;
  438. }
  439. new_sock = nfc_llcp_sock(new_sk);
  440. new_sock->dev = local->dev;
  441. new_sock->local = local;
  442. new_sock->nfc_protocol = sock->nfc_protocol;
  443. new_sock->ssap = bound_sap;
  444. new_sock->dsap = ssap;
  445. new_sock->parent = parent;
  446. pr_debug("new sock %p sk %p\n", new_sock, &new_sock->sk);
  447. list_add_tail(&new_sock->list, &sock->list);
  448. nfc_llcp_accept_enqueue(&sock->sk, new_sk);
  449. nfc_get_device(local->dev->idx);
  450. new_sk->sk_state = LLCP_CONNECTED;
  451. /* Wake the listening processes */
  452. parent->sk_data_ready(parent, 0);
  453. /* Send CC */
  454. nfc_llcp_send_cc(new_sock);
  455. release_sock(&sock->sk);
  456. sock_put(&sock->sk);
  457. return;
  458. fail:
  459. /* Send DM */
  460. nfc_llcp_send_dm(local, dsap, ssap, reason);
  461. return;
  462. }
  463. static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
  464. struct sk_buff *skb)
  465. {
  466. struct nfc_llcp_sock *llcp_sock;
  467. struct sock *sk;
  468. u8 dsap, ssap, ptype, ns, nr;
  469. ptype = nfc_llcp_ptype(skb);
  470. dsap = nfc_llcp_dsap(skb);
  471. ssap = nfc_llcp_ssap(skb);
  472. ns = nfc_llcp_ns(skb);
  473. nr = nfc_llcp_nr(skb);
  474. pr_debug("%d %d R %d S %d\n", dsap, ssap, nr, ns);
  475. llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
  476. if (llcp_sock == NULL) {
  477. nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
  478. return;
  479. }
  480. sk = &llcp_sock->sk;
  481. lock_sock(sk);
  482. if (sk->sk_state == LLCP_CLOSED) {
  483. release_sock(sk);
  484. nfc_llcp_sock_put(llcp_sock);
  485. }
  486. if (ns == llcp_sock->recv_n)
  487. llcp_sock->recv_n = (llcp_sock->recv_n + 1) % 16;
  488. else
  489. pr_err("Received out of sequence I PDU\n");
  490. /* Pass the payload upstream */
  491. if (ptype == LLCP_PDU_I) {
  492. pr_debug("I frame, queueing on %p\n", &llcp_sock->sk);
  493. skb_pull(skb, LLCP_HEADER_SIZE + LLCP_SEQUENCE_SIZE);
  494. if (sock_queue_rcv_skb(&llcp_sock->sk, skb)) {
  495. pr_err("receive queue is full\n");
  496. skb_queue_head(&llcp_sock->tx_backlog_queue, skb);
  497. }
  498. }
  499. /* Remove skbs from the pending queue */
  500. if (llcp_sock->send_ack_n != nr) {
  501. struct sk_buff *s, *tmp;
  502. llcp_sock->send_ack_n = nr;
  503. skb_queue_walk_safe(&llcp_sock->tx_pending_queue, s, tmp)
  504. if (nfc_llcp_ns(s) <= nr) {
  505. skb_unlink(s, &llcp_sock->tx_pending_queue);
  506. kfree_skb(s);
  507. }
  508. }
  509. /* Queue some I frames for transmission */
  510. while (llcp_sock->remote_ready &&
  511. skb_queue_len(&llcp_sock->tx_pending_queue) <= local->remote_rw) {
  512. struct sk_buff *pdu, *pending_pdu;
  513. pdu = skb_dequeue(&llcp_sock->tx_queue);
  514. if (pdu == NULL)
  515. break;
  516. /* Update N(S)/N(R) */
  517. nfc_llcp_set_nrns(llcp_sock, pdu);
  518. pending_pdu = skb_clone(pdu, GFP_KERNEL);
  519. skb_queue_tail(&local->tx_queue, pdu);
  520. skb_queue_tail(&llcp_sock->tx_pending_queue, pending_pdu);
  521. }
  522. release_sock(sk);
  523. nfc_llcp_sock_put(llcp_sock);
  524. }
  525. static void nfc_llcp_recv_disc(struct nfc_llcp_local *local,
  526. struct sk_buff *skb)
  527. {
  528. struct nfc_llcp_sock *llcp_sock;
  529. struct sock *sk;
  530. u8 dsap, ssap;
  531. dsap = nfc_llcp_dsap(skb);
  532. ssap = nfc_llcp_ssap(skb);
  533. llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
  534. if (llcp_sock == NULL) {
  535. nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
  536. return;
  537. }
  538. sk = &llcp_sock->sk;
  539. lock_sock(sk);
  540. if (sk->sk_state == LLCP_CLOSED) {
  541. release_sock(sk);
  542. nfc_llcp_sock_put(llcp_sock);
  543. }
  544. if (sk->sk_state == LLCP_CONNECTED) {
  545. nfc_put_device(local->dev);
  546. sk->sk_state = LLCP_CLOSED;
  547. sk->sk_state_change(sk);
  548. }
  549. nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_DISC);
  550. release_sock(sk);
  551. nfc_llcp_sock_put(llcp_sock);
  552. }
  553. static void nfc_llcp_recv_cc(struct nfc_llcp_local *local,
  554. struct sk_buff *skb)
  555. {
  556. struct nfc_llcp_sock *llcp_sock;
  557. u8 dsap, ssap;
  558. dsap = nfc_llcp_dsap(skb);
  559. ssap = nfc_llcp_ssap(skb);
  560. llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
  561. if (llcp_sock == NULL)
  562. llcp_sock = nfc_llcp_sock_get(local, dsap, LLCP_SAP_SDP);
  563. if (llcp_sock == NULL) {
  564. pr_err("Invalid CC\n");
  565. nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
  566. return;
  567. }
  568. llcp_sock->dsap = ssap;
  569. nfc_llcp_parse_tlv(local, &skb->data[LLCP_HEADER_SIZE],
  570. skb->len - LLCP_HEADER_SIZE);
  571. nfc_llcp_sock_put(llcp_sock);
  572. }
  573. static void nfc_llcp_rx_work(struct work_struct *work)
  574. {
  575. struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
  576. rx_work);
  577. u8 dsap, ssap, ptype;
  578. struct sk_buff *skb;
  579. skb = local->rx_pending;
  580. if (skb == NULL) {
  581. pr_debug("No pending SKB\n");
  582. return;
  583. }
  584. ptype = nfc_llcp_ptype(skb);
  585. dsap = nfc_llcp_dsap(skb);
  586. ssap = nfc_llcp_ssap(skb);
  587. pr_debug("ptype 0x%x dsap 0x%x ssap 0x%x\n", ptype, dsap, ssap);
  588. switch (ptype) {
  589. case LLCP_PDU_SYMM:
  590. pr_debug("SYMM\n");
  591. break;
  592. case LLCP_PDU_CONNECT:
  593. pr_debug("CONNECT\n");
  594. nfc_llcp_recv_connect(local, skb);
  595. break;
  596. case LLCP_PDU_DISC:
  597. pr_debug("DISC\n");
  598. nfc_llcp_recv_disc(local, skb);
  599. break;
  600. case LLCP_PDU_CC:
  601. pr_debug("CC\n");
  602. nfc_llcp_recv_cc(local, skb);
  603. break;
  604. case LLCP_PDU_I:
  605. case LLCP_PDU_RR:
  606. pr_debug("I frame\n");
  607. nfc_llcp_recv_hdlc(local, skb);
  608. break;
  609. }
  610. queue_work(local->tx_wq, &local->tx_work);
  611. kfree_skb(local->rx_pending);
  612. local->rx_pending = NULL;
  613. return;
  614. }
  615. void nfc_llcp_recv(void *data, struct sk_buff *skb, int err)
  616. {
  617. struct nfc_llcp_local *local = (struct nfc_llcp_local *) data;
  618. pr_debug("Received an LLCP PDU\n");
  619. if (err < 0) {
  620. pr_err("err %d", err);
  621. return;
  622. }
  623. local->rx_pending = skb_get(skb);
  624. del_timer(&local->link_timer);
  625. queue_work(local->rx_wq, &local->rx_work);
  626. return;
  627. }
  628. void nfc_llcp_mac_is_down(struct nfc_dev *dev)
  629. {
  630. struct nfc_llcp_local *local;
  631. local = nfc_llcp_find_local(dev);
  632. if (local == NULL)
  633. return;
  634. /* Close and purge all existing sockets */
  635. nfc_llcp_socket_release(local);
  636. }
  637. void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx,
  638. u8 comm_mode, u8 rf_mode)
  639. {
  640. struct nfc_llcp_local *local;
  641. pr_debug("rf mode %d\n", rf_mode);
  642. local = nfc_llcp_find_local(dev);
  643. if (local == NULL)
  644. return;
  645. local->target_idx = target_idx;
  646. local->comm_mode = comm_mode;
  647. local->rf_mode = rf_mode;
  648. if (rf_mode == NFC_RF_INITIATOR) {
  649. pr_debug("Queueing Tx work\n");
  650. queue_work(local->tx_wq, &local->tx_work);
  651. } else {
  652. mod_timer(&local->link_timer,
  653. jiffies + msecs_to_jiffies(local->remote_lto));
  654. }
  655. }
  656. int nfc_llcp_register_device(struct nfc_dev *ndev)
  657. {
  658. struct device *dev = &ndev->dev;
  659. struct nfc_llcp_local *local;
  660. char name[32];
  661. int err;
  662. local = kzalloc(sizeof(struct nfc_llcp_local), GFP_KERNEL);
  663. if (local == NULL)
  664. return -ENOMEM;
  665. local->dev = ndev;
  666. INIT_LIST_HEAD(&local->list);
  667. mutex_init(&local->sdp_lock);
  668. mutex_init(&local->socket_lock);
  669. init_timer(&local->link_timer);
  670. local->link_timer.data = (unsigned long) local;
  671. local->link_timer.function = nfc_llcp_symm_timer;
  672. skb_queue_head_init(&local->tx_queue);
  673. INIT_WORK(&local->tx_work, nfc_llcp_tx_work);
  674. snprintf(name, sizeof(name), "%s_llcp_tx_wq", dev_name(dev));
  675. local->tx_wq = alloc_workqueue(name,
  676. WQ_NON_REENTRANT | WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
  677. if (local->tx_wq == NULL) {
  678. err = -ENOMEM;
  679. goto err_local;
  680. }
  681. local->rx_pending = NULL;
  682. INIT_WORK(&local->rx_work, nfc_llcp_rx_work);
  683. snprintf(name, sizeof(name), "%s_llcp_rx_wq", dev_name(dev));
  684. local->rx_wq = alloc_workqueue(name,
  685. WQ_NON_REENTRANT | WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
  686. if (local->rx_wq == NULL) {
  687. err = -ENOMEM;
  688. goto err_tx_wq;
  689. }
  690. INIT_WORK(&local->timeout_work, nfc_llcp_timeout_work);
  691. snprintf(name, sizeof(name), "%s_llcp_timeout_wq", dev_name(dev));
  692. local->timeout_wq = alloc_workqueue(name,
  693. WQ_NON_REENTRANT | WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
  694. if (local->timeout_wq == NULL) {
  695. err = -ENOMEM;
  696. goto err_rx_wq;
  697. }
  698. nfc_llcp_build_gb(local);
  699. local->remote_miu = LLCP_DEFAULT_MIU;
  700. local->remote_lto = LLCP_DEFAULT_LTO;
  701. local->remote_rw = LLCP_DEFAULT_RW;
  702. list_add(&llcp_devices, &local->list);
  703. return 0;
  704. err_rx_wq:
  705. destroy_workqueue(local->rx_wq);
  706. err_tx_wq:
  707. destroy_workqueue(local->tx_wq);
  708. err_local:
  709. kfree(local);
  710. return 0;
  711. }
  712. void nfc_llcp_unregister_device(struct nfc_dev *dev)
  713. {
  714. struct nfc_llcp_local *local = nfc_llcp_find_local(dev);
  715. if (local == NULL) {
  716. pr_debug("No such device\n");
  717. return;
  718. }
  719. list_del(&local->list);
  720. nfc_llcp_socket_release(local);
  721. del_timer_sync(&local->link_timer);
  722. skb_queue_purge(&local->tx_queue);
  723. destroy_workqueue(local->tx_wq);
  724. destroy_workqueue(local->rx_wq);
  725. kfree_skb(local->rx_pending);
  726. kfree(local);
  727. }
  728. int __init nfc_llcp_init(void)
  729. {
  730. INIT_LIST_HEAD(&llcp_devices);
  731. return nfc_llcp_sock_init();
  732. }
  733. void nfc_llcp_exit(void)
  734. {
  735. nfc_llcp_sock_exit();
  736. }