Lines Matching refs:local

23 static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb);
47 struct nfc_llcp_local *local = sock->local;
53 if (local == NULL)
56 /* Search for local pending SKBs that are related to this socket */
57 skb_queue_walk_safe(&local->tx_queue, s, tmp) {
61 skb_unlink(s, &local->tx_queue);
66 static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool device,
73 skb_queue_purge(&local->tx_queue);
75 write_lock(&local->sockets.lock);
77 sk_for_each_safe(sk, tmp, &local->sockets.head) {
118 write_unlock(&local->sockets.lock);
124 write_lock(&local->raw_sockets.lock);
126 sk_for_each_safe(sk, tmp, &local->raw_sockets.head) {
143 write_unlock(&local->raw_sockets.lock);
146 static struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local)
149 * we hold a reference to local, we also need to hold a reference to
152 if (!nfc_get_device(local->dev->idx))
155 kref_get(&local->ref);
157 return local;
160 static void local_cleanup(struct nfc_llcp_local *local)
162 nfc_llcp_socket_release(local, false, ENXIO);
163 del_timer_sync(&local->link_timer);
164 skb_queue_purge(&local->tx_queue);
165 cancel_work_sync(&local->tx_work);
166 cancel_work_sync(&local->rx_work);
167 cancel_work_sync(&local->timeout_work);
168 kfree_skb(local->rx_pending);
169 local->rx_pending = NULL;
170 del_timer_sync(&local->sdreq_timer);
171 cancel_work_sync(&local->sdreq_timeout_work);
172 nfc_llcp_free_sdp_tlv_list(&local->pending_sdreqs);
177 struct nfc_llcp_local *local;
179 local = container_of(ref, struct nfc_llcp_local, ref);
181 local_cleanup(local);
182 kfree(local);
185 int nfc_llcp_local_put(struct nfc_llcp_local *local)
190 if (local == NULL)
193 dev = local->dev;
195 ret = kref_put(&local->ref, local_release);
201 static struct nfc_llcp_sock *nfc_llcp_sock_get(struct nfc_llcp_local *local,
212 read_lock(&local->sockets.lock);
216 sk_for_each(sk, &local->sockets.head) {
226 read_unlock(&local->sockets.lock);
238 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
241 nfc_dep_link_down(local->dev);
246 struct nfc_llcp_local *local = from_timer(local, t, link_timer);
250 schedule_work(&local->timeout_work);
259 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
262 mutex_lock(&local->sdreq_lock);
264 time = jiffies - msecs_to_jiffies(3 * local->remote_lto);
266 hlist_for_each_entry_safe(sdp, n, &local->pending_sdreqs, node) {
277 if (!hlist_empty(&local->pending_sdreqs))
278 mod_timer(&local->sdreq_timer,
279 jiffies + msecs_to_jiffies(3 * local->remote_lto));
281 mutex_unlock(&local->sdreq_lock);
284 nfc_genl_llc_send_sdres(local->dev, &nl_sdres_list);
289 struct nfc_llcp_local *local = from_timer(local, t, sdreq_timer);
291 schedule_work(&local->sdreq_timeout_work);
296 struct nfc_llcp_local *local;
300 list_for_each_entry(local, &llcp_devices, list)
301 if (local->dev == dev) {
302 res = nfc_llcp_local_get(local);
312 struct nfc_llcp_local *local, *tmp;
315 list_for_each_entry_safe(local, tmp, &llcp_devices, list)
316 if (local->dev == dev) {
317 list_del(&local->list);
319 return local;
359 struct nfc_llcp_sock *nfc_llcp_sock_from_sn(struct nfc_llcp_local *local,
371 read_lock(&local->sockets.lock);
375 sk_for_each(sk, &local->sockets.head) {
403 read_unlock(&local->sockets.lock);
410 u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
413 mutex_lock(&local->sdp_lock);
423 if (test_bit(ssap, &local->local_wks)) {
424 mutex_unlock(&local->sdp_lock);
429 set_bit(ssap, &local->local_wks);
430 mutex_unlock(&local->sdp_lock);
439 if (nfc_llcp_sock_from_sn(local, sock->service_name,
442 mutex_unlock(&local->sdp_lock);
447 mutex_unlock(&local->sdp_lock);
452 if (!test_bit(sock->ssap, &local->local_wks)) {
453 set_bit(sock->ssap, &local->local_wks);
454 mutex_unlock(&local->sdp_lock);
460 mutex_unlock(&local->sdp_lock);
465 u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local)
469 mutex_lock(&local->sdp_lock);
471 local_ssap = find_first_zero_bit(&local->local_sap, LLCP_LOCAL_NUM_SAP);
473 mutex_unlock(&local->sdp_lock);
477 set_bit(local_ssap, &local->local_sap);
479 mutex_unlock(&local->sdp_lock);
484 void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap)
491 sdp = &local->local_wks;
496 sdp = &local->local_sdp;
497 client_cnt = &local->local_sdp_cnt[local_ssap];
501 mutex_lock(&local->sdp_lock);
511 l_sock = nfc_llcp_sock_get(local, ssap, LLCP_SAP_SDP);
518 mutex_unlock(&local->sdp_lock);
523 sdp = &local->local_sap;
528 mutex_lock(&local->sdp_lock);
532 mutex_unlock(&local->sdp_lock);
535 static u8 nfc_llcp_reserve_sdp_ssap(struct nfc_llcp_local *local)
539 mutex_lock(&local->sdp_lock);
541 ssap = find_first_zero_bit(&local->local_sdp, LLCP_SDP_NUM_SAP);
543 mutex_unlock(&local->sdp_lock);
550 set_bit(ssap, &local->local_sdp);
552 mutex_unlock(&local->sdp_lock);
557 static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
563 __be16 wks = cpu_to_be16(local->local_wks);
576 lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &local->lto, 1, &lto_length);
583 pr_debug("Local wks 0x%lx\n", local->local_wks);
591 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
606 gb_cur = local->gb;
623 local->gb_len = gb_len;
636 struct nfc_llcp_local *local;
638 local = nfc_llcp_find_local(dev);
639 if (local == NULL) {
644 nfc_llcp_build_gb(local);
646 *general_bytes_len = local->gb_len;
648 nfc_llcp_local_put(local);
650 return local->gb;
655 struct nfc_llcp_local *local;
661 local = nfc_llcp_find_local(dev);
662 if (local == NULL) {
667 memset(local->remote_gb, 0, NFC_MAX_GT_LEN);
668 memcpy(local->remote_gb, gb, gb_len);
669 local->remote_gb_len = gb_len;
671 if (memcmp(local->remote_gb, llcp_magic, 3)) {
677 err = nfc_llcp_parse_gb_tlv(local,
678 &local->remote_gb[3],
679 local->remote_gb_len - 3);
681 nfc_llcp_local_put(local);
717 void nfc_llcp_send_to_raw_sock(struct nfc_llcp_local *local,
724 read_lock(&local->raw_sockets.lock);
726 sk_for_each(sk, &local->raw_sockets.head) {
739 data[0] = local->dev ? local->dev->idx : 0xFF;
752 read_unlock(&local->raw_sockets.lock);
759 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
765 skb = skb_dequeue(&local->tx_queue);
772 nfc_llcp_send_symm(local->dev);
774 skb_queue_head(&local->tx_queue, skb);
775 nfc_llcp_send_symm(local->dev);
790 nfc_llcp_send_to_raw_sock(local, skb,
793 ret = nfc_data_exchange(local->dev, local->target_idx,
794 skb, nfc_llcp_recv, local);
806 nfc_llcp_send_symm(local->dev);
810 mod_timer(&local->link_timer,
811 jiffies + msecs_to_jiffies(2 * local->remote_lto));
814 static struct nfc_llcp_sock *nfc_llcp_connecting_sock_get(struct nfc_llcp_local *local,
820 read_lock(&local->connecting_sockets.lock);
822 sk_for_each(sk, &local->connecting_sockets.head) {
834 read_unlock(&local->connecting_sockets.lock);
839 static struct nfc_llcp_sock *nfc_llcp_sock_get_sn(struct nfc_llcp_local *local,
842 return nfc_llcp_sock_from_sn(local, sn, sn_len, true);
869 static void nfc_llcp_recv_ui(struct nfc_llcp_local *local,
886 llcp_sock = nfc_llcp_sock_get(local, dsap, LLCP_SAP_SDP);
905 static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
918 sock = nfc_llcp_sock_get(local, dsap, LLCP_SAP_SDP);
935 sock = nfc_llcp_sock_get_sn(local, sn, sn_len);
954 u8 ssap = nfc_llcp_reserve_sdp_ssap(local);
978 new_sock->local = nfc_llcp_local_get(local);
979 if (!new_sock->local) {
987 new_sock->dev = local->dev;
992 new_sock->target_idx = local->target_idx;
1001 &local->local_sdp_cnt[sock->ssap - LLCP_WKS_NUM_SAP];
1012 nfc_llcp_sock_link(&local->sockets, new_sk);
1016 nfc_get_device(local->dev->idx);
1033 nfc_llcp_send_dm(local, dsap, ssap, reason);
1039 struct nfc_llcp_local *local = sock->local;
1057 skb_queue_tail(&local->tx_queue, pdu);
1064 static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
1079 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
1081 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
1135 skb_queue_head(&local->tx_queue, s);
1151 static void nfc_llcp_recv_disc(struct nfc_llcp_local *local,
1163 nfc_dep_link_down(local->dev);
1167 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
1169 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
1184 nfc_put_device(local->dev);
1189 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_DISC);
1195 static void nfc_llcp_recv_cc(struct nfc_llcp_local *local,
1205 llcp_sock = nfc_llcp_connecting_sock_get(local, dsap);
1208 nfc_llcp_send_dm(local, dsap, ssap, LLCP_DM_NOCONN);
1216 nfc_llcp_sock_unlink(&local->connecting_sockets, sk);
1217 nfc_llcp_sock_link(&local->sockets, sk);
1229 static void nfc_llcp_recv_dm(struct nfc_llcp_local *local,
1245 llcp_sock = nfc_llcp_connecting_sock_get(local, dsap);
1249 llcp_sock = nfc_llcp_sock_get(local, dsap, ssap);
1267 static void nfc_llcp_recv_snl(struct nfc_llcp_local *local,
1315 llcp_sock = nfc_llcp_sock_from_sn(local, service_name,
1331 sap = nfc_llcp_reserve_sdp_ssap(local);
1342 &local->local_sdp_cnt[sap -
1366 mutex_lock(&local->sdreq_lock);
1370 hlist_for_each_entry(sdp, &local->pending_sdreqs, node) {
1386 mutex_unlock(&local->sdreq_lock);
1400 nfc_genl_llc_send_sdres(local->dev, &nl_sdres_list);
1403 nfc_llcp_send_snl_sdres(local, &llc_sdres_list, sdres_tlvs_len);
1406 static void nfc_llcp_recv_agf(struct nfc_llcp_local *local, struct sk_buff *skb)
1442 nfc_llcp_rx_skb(local, new_skb);
1450 static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb)
1471 nfc_llcp_recv_ui(local, skb);
1476 nfc_llcp_recv_connect(local, skb);
1481 nfc_llcp_recv_disc(local, skb);
1486 nfc_llcp_recv_cc(local, skb);
1491 nfc_llcp_recv_dm(local, skb);
1496 nfc_llcp_recv_snl(local, skb);
1503 nfc_llcp_recv_hdlc(local, skb);
1508 nfc_llcp_recv_agf(local, skb);
1515 struct nfc_llcp_local *local = container_of(work, struct nfc_llcp_local,
1519 skb = local->rx_pending;
1527 nfc_llcp_send_to_raw_sock(local, skb, NFC_DIRECTION_RX);
1529 nfc_llcp_rx_skb(local, skb);
1531 schedule_work(&local->tx_work);
1532 kfree_skb(local->rx_pending);
1533 local->rx_pending = NULL;
1536 static void __nfc_llcp_recv(struct nfc_llcp_local *local, struct sk_buff *skb)
1538 local->rx_pending = skb;
1539 del_timer(&local->link_timer);
1540 schedule_work(&local->rx_work);
1545 struct nfc_llcp_local *local = (struct nfc_llcp_local *) data;
1552 __nfc_llcp_recv(local, skb);
1557 struct nfc_llcp_local *local;
1559 local = nfc_llcp_find_local(dev);
1560 if (local == NULL) {
1565 __nfc_llcp_recv(local, skb);
1567 nfc_llcp_local_put(local);
1574 struct nfc_llcp_local *local;
1576 local = nfc_llcp_find_local(dev);
1577 if (local == NULL)
1580 local->remote_miu = LLCP_DEFAULT_MIU;
1581 local->remote_lto = LLCP_DEFAULT_LTO;
1584 nfc_llcp_socket_release(local, true, 0);
1586 nfc_llcp_local_put(local);
1592 struct nfc_llcp_local *local;
1596 local = nfc_llcp_find_local(dev);
1597 if (local == NULL)
1600 local->target_idx = target_idx;
1601 local->comm_mode = comm_mode;
1602 local->rf_mode = rf_mode;
1607 schedule_work(&local->tx_work);
1609 mod_timer(&local->link_timer,
1610 jiffies + msecs_to_jiffies(local->remote_lto));
1613 nfc_llcp_local_put(local);
1618 struct nfc_llcp_local *local;
1620 local = kzalloc(sizeof(struct nfc_llcp_local), GFP_KERNEL);
1621 if (local == NULL)
1624 /* As we are going to initialize local's refcount, we need to get the
1628 local->dev = nfc_get_device(ndev->idx);
1629 if (!local->dev) {
1630 kfree(local);
1634 INIT_LIST_HEAD(&local->list);
1635 kref_init(&local->ref);
1636 mutex_init(&local->sdp_lock);
1637 timer_setup(&local->link_timer, nfc_llcp_symm_timer, 0);
1639 skb_queue_head_init(&local->tx_queue);
1640 INIT_WORK(&local->tx_work, nfc_llcp_tx_work);
1642 local->rx_pending = NULL;
1643 INIT_WORK(&local->rx_work, nfc_llcp_rx_work);
1645 INIT_WORK(&local->timeout_work, nfc_llcp_timeout_work);
1647 rwlock_init(&local->sockets.lock);
1648 rwlock_init(&local->connecting_sockets.lock);
1649 rwlock_init(&local->raw_sockets.lock);
1651 local->lto = 150; /* 1500 ms */
1652 local->rw = LLCP_MAX_RW;
1653 local->miux = cpu_to_be16(LLCP_MAX_MIUX);
1654 local->local_wks = 0x1; /* LLC Link Management */
1656 nfc_llcp_build_gb(local);
1658 local->remote_miu = LLCP_DEFAULT_MIU;
1659 local->remote_lto = LLCP_DEFAULT_LTO;
1661 mutex_init(&local->sdreq_lock);
1662 INIT_HLIST_HEAD(&local->pending_sdreqs);
1663 timer_setup(&local->sdreq_timer, nfc_llcp_sdreq_timer, 0);
1664 INIT_WORK(&local->sdreq_timeout_work, nfc_llcp_sdreq_timeout_work);
1667 list_add(&local->list, &llcp_devices);
1675 struct nfc_llcp_local *local = nfc_llcp_remove_local(dev);
1677 if (local == NULL) {
1682 local_cleanup(local);
1684 nfc_llcp_local_put(local);