^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2011 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) enum llcp_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) LLCP_CONNECTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) LLCP_DISCONNECTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) LLCP_CLOSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) LLCP_BOUND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) LLCP_LISTEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define LLCP_DEFAULT_LTO 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define LLCP_DEFAULT_RW 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define LLCP_DEFAULT_MIU 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define LLCP_MAX_LTO 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define LLCP_MAX_RW 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define LLCP_MAX_MIUX 0x7ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define LLCP_MAX_MIU (LLCP_MAX_MIUX + 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define LLCP_WKS_NUM_SAP 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define LLCP_SDP_NUM_SAP 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define LLCP_LOCAL_NUM_SAP 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define LLCP_LOCAL_SAP_OFFSET (LLCP_WKS_NUM_SAP + LLCP_SDP_NUM_SAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define LLCP_MAX_SAP (LLCP_WKS_NUM_SAP + LLCP_SDP_NUM_SAP + LLCP_LOCAL_NUM_SAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define LLCP_SDP_UNBOUND (LLCP_MAX_SAP + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct nfc_llcp_sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct llcp_sock_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct hlist_head head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) rwlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct nfc_llcp_sdp_tlv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) u8 *tlv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) u8 tlv_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) char *uri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 sap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) unsigned long time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct hlist_node node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct nfc_llcp_local {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct nfc_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct kref ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct mutex sdp_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct timer_list link_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct sk_buff_head tx_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct work_struct tx_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct work_struct rx_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct sk_buff *rx_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct work_struct timeout_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u32 target_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u8 rf_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) u8 comm_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u8 lto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u8 rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) __be16 miux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) unsigned long local_wks; /* Well known services */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned long local_sdp; /* Local services */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned long local_sap; /* Local SAPs, not available for discovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) atomic_t local_sdp_cnt[LLCP_SDP_NUM_SAP];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* local */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u8 gb[NFC_MAX_GT_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u8 gb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* remote */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u8 remote_gb[NFC_MAX_GT_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u8 remote_gb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) u8 remote_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) u16 remote_miu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u16 remote_lto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 remote_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u16 remote_wks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct mutex sdreq_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct hlist_head pending_sdreqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct timer_list sdreq_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct work_struct sdreq_timeout_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u8 sdreq_next_tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* sockets array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct llcp_sock_list sockets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct llcp_sock_list connecting_sockets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct llcp_sock_list raw_sockets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct nfc_llcp_sock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct sock sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct nfc_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct nfc_llcp_local *local;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) u32 target_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) u32 nfc_protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /* Link parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) u8 ssap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) u8 dsap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) char *service_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) size_t service_name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u8 rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) __be16 miux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* Remote link parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) u8 remote_rw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u16 remote_miu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Link variables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) u8 send_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) u8 send_ack_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 recv_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u8 recv_ack_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* Is the remote peer ready to receive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u8 remote_ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* Reserved source SAP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u8 reserved_ssap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct sk_buff_head tx_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct sk_buff_head tx_pending_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct list_head accept_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct sock *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct nfc_llcp_ui_cb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) __u8 dsap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) __u8 ssap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define nfc_llcp_ui_skb_cb(__skb) ((struct nfc_llcp_ui_cb *)&((__skb)->cb[0]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define nfc_llcp_sock(sk) ((struct nfc_llcp_sock *) (sk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define nfc_llcp_dev(sk) (nfc_llcp_sock((sk))->dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define LLCP_HEADER_SIZE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define LLCP_SEQUENCE_SIZE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define LLCP_AGF_PDU_HEADER_SIZE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* LLCP versions: 1.1 is 1.0 plus SDP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define LLCP_VERSION_10 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define LLCP_VERSION_11 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* LLCP PDU types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define LLCP_PDU_SYMM 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define LLCP_PDU_PAX 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define LLCP_PDU_AGF 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define LLCP_PDU_UI 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define LLCP_PDU_CONNECT 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define LLCP_PDU_DISC 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define LLCP_PDU_CC 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define LLCP_PDU_DM 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define LLCP_PDU_FRMR 0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define LLCP_PDU_SNL 0x9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define LLCP_PDU_I 0xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define LLCP_PDU_RR 0xd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define LLCP_PDU_RNR 0xe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* Parameters TLV types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define LLCP_TLV_VERSION 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define LLCP_TLV_MIUX 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define LLCP_TLV_WKS 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define LLCP_TLV_LTO 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define LLCP_TLV_RW 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define LLCP_TLV_SN 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define LLCP_TLV_OPT 0x7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define LLCP_TLV_SDREQ 0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define LLCP_TLV_SDRES 0x9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define LLCP_TLV_MAX 0xa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* Well known LLCP SAP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define LLCP_SAP_SDP 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define LLCP_SAP_IP 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define LLCP_SAP_OBEX 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define LLCP_SAP_SNEP 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define LLCP_SAP_MAX 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* Disconnection reason code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define LLCP_DM_DISC 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define LLCP_DM_NOCONN 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define LLCP_DM_NOBOUND 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define LLCP_DM_REJ 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) void nfc_llcp_sock_link(struct llcp_sock_list *l, struct sock *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) void nfc_llcp_sock_unlink(struct llcp_sock_list *l, struct sock *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) void nfc_llcp_socket_remote_param_init(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int nfc_llcp_local_put(struct nfc_llcp_local *local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) int nfc_llcp_queue_i_frames(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) void nfc_llcp_send_to_raw_sock(struct nfc_llcp_local *local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct sk_buff *skb, u8 direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) /* Sock API */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp, int kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) void nfc_llcp_sock_free(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) void nfc_llcp_accept_unlink(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) void nfc_llcp_accept_enqueue(struct sock *parent, struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct sock *nfc_llcp_accept_dequeue(struct sock *sk, struct socket *newsock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* TLV API */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) u8 *tlv_array, u16 tlv_array_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) u8 *tlv_array, u16 tlv_array_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* Commands API */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) void nfc_llcp_recv(void *data, struct sk_buff *skb, int err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u8 *nfc_llcp_build_tlv(u8 type, u8 *value, u8 value_length, u8 *tlv_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, char *uri,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) size_t uri_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) void nfc_llcp_free_sdp_tlv_list(struct hlist_head *sdp_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) void nfc_llcp_recv(void *data, struct sk_buff *skb, int err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) int nfc_llcp_send_symm(struct nfc_dev *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct hlist_head *tlv_list, size_t tlvs_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) struct hlist_head *tlv_list, size_t tlvs_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) struct msghdr *msg, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct msghdr *msg, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) int nfc_llcp_send_rr(struct nfc_llcp_sock *sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* Socket API */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) int __init nfc_llcp_sock_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) void nfc_llcp_sock_exit(void);