Blame view

net/nfc/llcp.h 6.73 KB
1ccea77e2   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
2
3
  /*
   * Copyright (C) 2011  Intel Corporation. All rights reserved.
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
4
5
6
7
   */
  
  enum llcp_state {
  	LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
b4011239a   Samuel Ortiz   NFC: llcp: Fix no...
8
  	LLCP_CONNECTING,
17f7ae16a   Thierry Escande   NFC: Keep socket ...
9
  	LLCP_DISCONNECTING,
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
10
11
12
13
14
15
16
17
  	LLCP_CLOSED,
  	LLCP_BOUND,
  	LLCP_LISTEN,
  };
  
  #define LLCP_DEFAULT_LTO 100
  #define LLCP_DEFAULT_RW  1
  #define LLCP_DEFAULT_MIU 128
eda21f16a   Samuel Ortiz   NFC: Set MIU and ...
18
19
20
  #define LLCP_MAX_LTO  0xff
  #define LLCP_MAX_RW   15
  #define LLCP_MAX_MIUX 0x7ff
66cbfa10f   Thierry Escande   NFC: llcp: Use lo...
21
  #define LLCP_MAX_MIU (LLCP_MAX_MIUX + 128)
eda21f16a   Samuel Ortiz   NFC: Set MIU and ...
22

d646960f7   Samuel Ortiz   NFC: Initial LLCP...
23
24
25
26
27
  #define LLCP_WKS_NUM_SAP   16
  #define LLCP_SDP_NUM_SAP   16
  #define LLCP_LOCAL_NUM_SAP 32
  #define LLCP_LOCAL_SAP_OFFSET (LLCP_WKS_NUM_SAP + LLCP_SDP_NUM_SAP)
  #define LLCP_MAX_SAP (LLCP_WKS_NUM_SAP + LLCP_SDP_NUM_SAP + LLCP_LOCAL_NUM_SAP)
8f50020ed   Samuel Ortiz   NFC: LLCP late bi...
28
  #define LLCP_SDP_UNBOUND   (LLCP_MAX_SAP + 1)
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
29
30
  
  struct nfc_llcp_sock;
a69f32af8   Samuel Ortiz   NFC: Socket linke...
31
32
33
34
  struct llcp_sock_list {
  	struct hlist_head head;
  	rwlock_t          lock;
  };
e0ae7bac0   Thierry Escande   NFC: llcp: Servic...
35
36
37
38
39
40
41
  struct nfc_llcp_sdp_tlv {
  	u8 *tlv;
  	u8 tlv_len;
  
  	char *uri;
  	u8 tid;
  	u8 sap;
40213fa85   Thierry Escande   NFC: llcp: Add cl...
42
  	unsigned long time;
e0ae7bac0   Thierry Escande   NFC: llcp: Servic...
43
44
  	struct hlist_node node;
  };
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
45
46
47
  struct nfc_llcp_local {
  	struct list_head list;
  	struct nfc_dev *dev;
c7aa12252   Samuel Ortiz   NFC: Take a refer...
48
  	struct kref ref;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
49
  	struct mutex sdp_lock;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
50
51
52
  
  	struct timer_list link_timer;
  	struct sk_buff_head tx_queue;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
53
  	struct work_struct	 tx_work;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
54
55
  	struct work_struct	 rx_work;
  	struct sk_buff *rx_pending;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
56
57
58
59
60
  	struct work_struct	 timeout_work;
  
  	u32 target_idx;
  	u8 rf_mode;
  	u8 comm_mode;
52feb444a   Thierry Escande   NFC: Extend netli...
61
62
63
  	u8 lto;
  	u8 rw;
  	__be16 miux;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
64
65
66
  	unsigned long local_wks;      /* Well known services */
  	unsigned long local_sdp;      /* Local services  */
  	unsigned long local_sap; /* Local SAPs, not available for discovery */
8f50020ed   Samuel Ortiz   NFC: LLCP late bi...
67
  	atomic_t local_sdp_cnt[LLCP_SDP_NUM_SAP];
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  
  	/* local */
  	u8 gb[NFC_MAX_GT_LEN];
  	u8 gb_len;
  
  	/* remote */
  	u8 remote_gb[NFC_MAX_GT_LEN];
  	u8 remote_gb_len;
  
  	u8  remote_version;
  	u16 remote_miu;
  	u16 remote_lto;
  	u8  remote_opt;
  	u16 remote_wks;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
82

d9b8d8e19   Thierry Escande   NFC: llcp: Servic...
83
84
  	struct mutex sdreq_lock;
  	struct hlist_head pending_sdreqs;
40213fa85   Thierry Escande   NFC: llcp: Add cl...
85
86
  	struct timer_list sdreq_timer;
  	struct work_struct sdreq_timeout_work;
d9b8d8e19   Thierry Escande   NFC: llcp: Servic...
87
  	u8 sdreq_next_tid;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
88
  	/* sockets array */
a69f32af8   Samuel Ortiz   NFC: Socket linke...
89
90
  	struct llcp_sock_list sockets;
  	struct llcp_sock_list connecting_sockets;
4463523be   Thierry Escande   NFC: LLCP raw soc...
91
  	struct llcp_sock_list raw_sockets;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
92
93
94
95
  };
  
  struct nfc_llcp_sock {
  	struct sock sk;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
96
97
98
99
  	struct nfc_dev *dev;
  	struct nfc_llcp_local *local;
  	u32 target_idx;
  	u32 nfc_protocol;
7a06e586b   Samuel Ortiz   NFC: Move LLCP re...
100
  	/* Link parameters */
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
101
102
103
104
  	u8 ssap;
  	u8 dsap;
  	char *service_name;
  	size_t service_name_len;
26fd76cab   Samuel Ortiz   NFC: llcp: Implem...
105
  	u8 rw;
5eef66697   Samuel Ortiz   NFC: llcp: Socket...
106
  	__be16 miux;
26fd76cab   Samuel Ortiz   NFC: llcp: Implem...
107

e4306bec4   Samuel Ortiz   NFC: llcp: Rename...
108
109
110
111
  
  	/* Remote link parameters */
  	u8 remote_rw;
  	u16 remote_miu;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
112
113
114
115
116
117
118
119
120
  
  	/* Link variables */
  	u8 send_n;
  	u8 send_ack_n;
  	u8 recv_n;
  	u8 recv_ack_n;
  
  	/* Is the remote peer ready to receive */
  	u8 remote_ready;
cbbf47218   Samuel Ortiz   NFC: Release LLCP...
121
122
  	/* Reserved source SAP */
  	u8 reserved_ssap;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
123
124
  	struct sk_buff_head tx_queue;
  	struct sk_buff_head tx_pending_queue;
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
125
126
127
128
  
  	struct list_head accept_queue;
  	struct sock *parent;
  };
968272bf0   Samuel Ortiz   NFC: Handle LLCP ...
129
130
131
132
133
134
  struct nfc_llcp_ui_cb {
  	__u8 dsap;
  	__u8 ssap;
  };
  
  #define nfc_llcp_ui_skb_cb(__skb) ((struct nfc_llcp_ui_cb *)&((__skb)->cb[0]))
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
135
136
137
138
139
  #define nfc_llcp_sock(sk) ((struct nfc_llcp_sock *) (sk))
  #define nfc_llcp_dev(sk)  (nfc_llcp_sock((sk))->dev)
  
  #define LLCP_HEADER_SIZE   2
  #define LLCP_SEQUENCE_SIZE 1
098dafcfb   Thierry Escande   NFC: llcp: Aggreg...
140
  #define LLCP_AGF_PDU_HEADER_SIZE 2
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  
  /* LLCP versions: 1.1 is 1.0 plus SDP */
  #define LLCP_VERSION_10 0x10
  #define LLCP_VERSION_11 0x11
  
  /* LLCP PDU types */
  #define LLCP_PDU_SYMM     0x0
  #define LLCP_PDU_PAX      0x1
  #define LLCP_PDU_AGF      0x2
  #define LLCP_PDU_UI       0x3
  #define LLCP_PDU_CONNECT  0x4
  #define LLCP_PDU_DISC     0x5
  #define LLCP_PDU_CC       0x6
  #define LLCP_PDU_DM       0x7
  #define LLCP_PDU_FRMR     0x8
  #define LLCP_PDU_SNL      0x9
  #define LLCP_PDU_I        0xc
  #define LLCP_PDU_RR       0xd
  #define LLCP_PDU_RNR      0xe
  
  /* Parameters TLV types */
  #define LLCP_TLV_VERSION 0x1
  #define LLCP_TLV_MIUX    0x2
  #define LLCP_TLV_WKS     0x3
  #define LLCP_TLV_LTO     0x4
  #define LLCP_TLV_RW      0x5
  #define LLCP_TLV_SN      0x6
  #define LLCP_TLV_OPT     0x7
  #define LLCP_TLV_SDREQ   0x8
  #define LLCP_TLV_SDRES   0x9
  #define LLCP_TLV_MAX     0xa
  
  /* Well known LLCP SAP */
  #define LLCP_SAP_SDP   0x1
  #define LLCP_SAP_IP    0x2
  #define LLCP_SAP_OBEX  0x3
  #define LLCP_SAP_SNEP  0x4
  #define LLCP_SAP_MAX   0xff
  
  /* Disconnection reason code */
  #define LLCP_DM_DISC    0x00
  #define LLCP_DM_NOCONN  0x01
  #define LLCP_DM_NOBOUND 0x02
  #define LLCP_DM_REJ     0x03
a69f32af8   Samuel Ortiz   NFC: Socket linke...
185
186
  void nfc_llcp_sock_link(struct llcp_sock_list *l, struct sock *s);
  void nfc_llcp_sock_unlink(struct llcp_sock_list *l, struct sock *s);
abd18d433   Thierry Escande   NFC: llcp: Reset ...
187
  void nfc_llcp_socket_remote_param_init(struct nfc_llcp_sock *sock);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
188
  struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev);
c7aa12252   Samuel Ortiz   NFC: Take a refer...
189
190
  struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local);
  int nfc_llcp_local_put(struct nfc_llcp_local *local);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
191
  u8 nfc_llcp_get_sdp_ssap(struct nfc_llcp_local *local,
427a2eb1f   Samuel Ortiz   NFC: LLCP code id...
192
  			 struct nfc_llcp_sock *sock);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
193
194
  u8 nfc_llcp_get_local_ssap(struct nfc_llcp_local *local);
  void nfc_llcp_put_ssap(struct nfc_llcp_local *local, u8 ssap);
d094afa15   Samuel Ortiz   NFC: Send LLCP RR...
195
  int nfc_llcp_queue_i_frames(struct nfc_llcp_sock *sock);
4463523be   Thierry Escande   NFC: LLCP raw soc...
196
197
  void nfc_llcp_send_to_raw_sock(struct nfc_llcp_local *local,
  			       struct sk_buff *skb, u8 direction);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
198
199
  
  /* Sock API */
11aa9c28b   Eric W. Biederman   net: Pass kern fr...
200
  struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp, int kern);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
201
202
203
204
205
206
  void nfc_llcp_sock_free(struct nfc_llcp_sock *sock);
  void nfc_llcp_accept_unlink(struct sock *sk);
  void nfc_llcp_accept_enqueue(struct sock *parent, struct sock *sk);
  struct sock *nfc_llcp_accept_dequeue(struct sock *sk, struct socket *newsock);
  
  /* TLV API */
7a06e586b   Samuel Ortiz   NFC: Move LLCP re...
207
208
209
210
  int nfc_llcp_parse_gb_tlv(struct nfc_llcp_local *local,
  			  u8 *tlv_array, u16 tlv_array_len);
  int nfc_llcp_parse_connection_tlv(struct nfc_llcp_sock *sock,
  				  u8 *tlv_array, u16 tlv_array_len);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
211
212
213
214
  
  /* Commands API */
  void nfc_llcp_recv(void *data, struct sk_buff *skb, int err);
  u8 *nfc_llcp_build_tlv(u8 type, u8 *value, u8 value_length, u8 *tlv_length);
e0ae7bac0   Thierry Escande   NFC: llcp: Servic...
215
  struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdres_tlv(u8 tid, u8 sap);
d9b8d8e19   Thierry Escande   NFC: llcp: Servic...
216
217
  struct nfc_llcp_sdp_tlv *nfc_llcp_build_sdreq_tlv(u8 tid, char *uri,
  						  size_t uri_len);
e0ae7bac0   Thierry Escande   NFC: llcp: Servic...
218
  void nfc_llcp_free_sdp_tlv(struct nfc_llcp_sdp_tlv *sdp);
d9b8d8e19   Thierry Escande   NFC: llcp: Servic...
219
  void nfc_llcp_free_sdp_tlv_list(struct hlist_head *sdp_head);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
220
  void nfc_llcp_recv(void *data, struct sk_buff *skb, int err);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
221
222
223
  int nfc_llcp_send_symm(struct nfc_dev *dev);
  int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
  int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
e0ae7bac0   Thierry Escande   NFC: llcp: Servic...
224
225
  int nfc_llcp_send_snl_sdres(struct nfc_llcp_local *local,
  			    struct hlist_head *tlv_list, size_t tlvs_len);
d9b8d8e19   Thierry Escande   NFC: llcp: Servic...
226
227
  int nfc_llcp_send_snl_sdreq(struct nfc_llcp_local *local,
  			    struct hlist_head *tlv_list, size_t tlvs_len);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
228
229
  int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
  int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
53a0ac2ee   Samuel Ortiz   NFC: LLCP socket ...
230
  int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
427a2eb1f   Samuel Ortiz   NFC: LLCP code id...
231
  			  struct msghdr *msg, size_t len);
94f418a20   Samuel Ortiz   NFC: UI frame sen...
232
233
  int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
  			   struct msghdr *msg, size_t len);
d094afa15   Samuel Ortiz   NFC: Send LLCP RR...
234
  int nfc_llcp_send_rr(struct nfc_llcp_sock *sock);
d646960f7   Samuel Ortiz   NFC: Initial LLCP...
235
236
237
238
  
  /* Socket API */
  int __init nfc_llcp_sock_init(void);
  void nfc_llcp_sock_exit(void);