diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /include/net/bluetooth/l2cap.h | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'include/net/bluetooth/l2cap.h')
-rw-r--r-- | include/net/bluetooth/l2cap.h | 545 |
1 files changed, 123 insertions, 422 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 7588ef44eba..4f34ad25e75 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -27,35 +27,20 @@ | |||
27 | #ifndef __L2CAP_H | 27 | #ifndef __L2CAP_H |
28 | #define __L2CAP_H | 28 | #define __L2CAP_H |
29 | 29 | ||
30 | #include <asm/unaligned.h> | ||
31 | |||
32 | /* L2CAP defaults */ | 30 | /* L2CAP defaults */ |
33 | #define L2CAP_DEFAULT_MTU 672 | 31 | #define L2CAP_DEFAULT_MTU 672 |
34 | #define L2CAP_DEFAULT_MIN_MTU 48 | 32 | #define L2CAP_DEFAULT_MIN_MTU 48 |
35 | #define L2CAP_DEFAULT_FLUSH_TO 0xFFFF | 33 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff |
36 | #define L2CAP_EFS_DEFAULT_FLUSH_TO 0xFFFFFFFF | ||
37 | #define L2CAP_DEFAULT_TX_WINDOW 63 | 34 | #define L2CAP_DEFAULT_TX_WINDOW 63 |
38 | #define L2CAP_DEFAULT_EXT_WINDOW 0x3FFF | ||
39 | #define L2CAP_DEFAULT_MAX_TX 3 | 35 | #define L2CAP_DEFAULT_MAX_TX 3 |
40 | #define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */ | 36 | #define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */ |
41 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ | 37 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ |
42 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1492 /* Sized for AMP packet */ | 38 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ |
43 | #define L2CAP_DEFAULT_ACK_TO 200 | 39 | #define L2CAP_DEFAULT_ACK_TO 200 |
44 | #define L2CAP_DEFAULT_MAX_SDU_SIZE 0xFFFF | 40 | #define L2CAP_LE_DEFAULT_MTU 23 |
45 | #define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF | 41 | |
46 | #define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF | 42 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ |
47 | #define L2CAP_BREDR_MAX_PAYLOAD 1019 /* 3-DH5 packet */ | 43 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ |
48 | #define L2CAP_LE_MIN_MTU 23 | ||
49 | |||
50 | #define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100) | ||
51 | #define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000) | ||
52 | #define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000) | ||
53 | #define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000) | ||
54 | #define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000) | ||
55 | #define L2CAP_MOVE_TIMEOUT msecs_to_jiffies(4000) | ||
56 | #define L2CAP_MOVE_ERTX_TIMEOUT msecs_to_jiffies(60000) | ||
57 | |||
58 | #define L2CAP_A2MP_DEFAULT_MTU 670 | ||
59 | 44 | ||
60 | /* L2CAP socket address */ | 45 | /* L2CAP socket address */ |
61 | struct sockaddr_l2 { | 46 | struct sockaddr_l2 { |
@@ -63,7 +48,6 @@ struct sockaddr_l2 { | |||
63 | __le16 l2_psm; | 48 | __le16 l2_psm; |
64 | bdaddr_t l2_bdaddr; | 49 | bdaddr_t l2_bdaddr; |
65 | __le16 l2_cid; | 50 | __le16 l2_cid; |
66 | __u8 l2_bdaddr_type; | ||
67 | }; | 51 | }; |
68 | 52 | ||
69 | /* L2CAP socket options */ | 53 | /* L2CAP socket options */ |
@@ -104,86 +88,52 @@ struct l2cap_conninfo { | |||
104 | #define L2CAP_ECHO_RSP 0x09 | 88 | #define L2CAP_ECHO_RSP 0x09 |
105 | #define L2CAP_INFO_REQ 0x0a | 89 | #define L2CAP_INFO_REQ 0x0a |
106 | #define L2CAP_INFO_RSP 0x0b | 90 | #define L2CAP_INFO_RSP 0x0b |
107 | #define L2CAP_CREATE_CHAN_REQ 0x0c | ||
108 | #define L2CAP_CREATE_CHAN_RSP 0x0d | ||
109 | #define L2CAP_MOVE_CHAN_REQ 0x0e | ||
110 | #define L2CAP_MOVE_CHAN_RSP 0x0f | ||
111 | #define L2CAP_MOVE_CHAN_CFM 0x10 | ||
112 | #define L2CAP_MOVE_CHAN_CFM_RSP 0x11 | ||
113 | #define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 | 91 | #define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 |
114 | #define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 | 92 | #define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 |
115 | 93 | ||
116 | /* L2CAP extended feature mask */ | 94 | /* L2CAP feature mask */ |
117 | #define L2CAP_FEAT_FLOWCTL 0x00000001 | 95 | #define L2CAP_FEAT_FLOWCTL 0x00000001 |
118 | #define L2CAP_FEAT_RETRANS 0x00000002 | 96 | #define L2CAP_FEAT_RETRANS 0x00000002 |
119 | #define L2CAP_FEAT_BIDIR_QOS 0x00000004 | ||
120 | #define L2CAP_FEAT_ERTM 0x00000008 | 97 | #define L2CAP_FEAT_ERTM 0x00000008 |
121 | #define L2CAP_FEAT_STREAMING 0x00000010 | 98 | #define L2CAP_FEAT_STREAMING 0x00000010 |
122 | #define L2CAP_FEAT_FCS 0x00000020 | 99 | #define L2CAP_FEAT_FCS 0x00000020 |
123 | #define L2CAP_FEAT_EXT_FLOW 0x00000040 | ||
124 | #define L2CAP_FEAT_FIXED_CHAN 0x00000080 | 100 | #define L2CAP_FEAT_FIXED_CHAN 0x00000080 |
125 | #define L2CAP_FEAT_EXT_WINDOW 0x00000100 | ||
126 | #define L2CAP_FEAT_UCD 0x00000200 | ||
127 | 101 | ||
128 | /* L2CAP checksum option */ | 102 | /* L2CAP checksum option */ |
129 | #define L2CAP_FCS_NONE 0x00 | 103 | #define L2CAP_FCS_NONE 0x00 |
130 | #define L2CAP_FCS_CRC16 0x01 | 104 | #define L2CAP_FCS_CRC16 0x01 |
131 | 105 | ||
132 | /* L2CAP fixed channels */ | ||
133 | #define L2CAP_FC_L2CAP 0x02 | ||
134 | #define L2CAP_FC_A2MP 0x08 | ||
135 | |||
136 | /* L2CAP Control Field bit masks */ | 106 | /* L2CAP Control Field bit masks */ |
137 | #define L2CAP_CTRL_SAR 0xC000 | 107 | #define L2CAP_CTRL_SAR 0xC000 |
138 | #define L2CAP_CTRL_REQSEQ 0x3F00 | 108 | #define L2CAP_CTRL_REQSEQ 0x3F00 |
139 | #define L2CAP_CTRL_TXSEQ 0x007E | 109 | #define L2CAP_CTRL_TXSEQ 0x007E |
140 | #define L2CAP_CTRL_SUPERVISE 0x000C | 110 | #define L2CAP_CTRL_RETRANS 0x0080 |
141 | 111 | #define L2CAP_CTRL_FINAL 0x0080 | |
142 | #define L2CAP_CTRL_RETRANS 0x0080 | 112 | #define L2CAP_CTRL_POLL 0x0010 |
143 | #define L2CAP_CTRL_FINAL 0x0080 | 113 | #define L2CAP_CTRL_SUPERVISE 0x000C |
144 | #define L2CAP_CTRL_POLL 0x0010 | 114 | #define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ |
145 | #define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ | 115 | |
146 | 116 | #define L2CAP_CTRL_TXSEQ_SHIFT 1 | |
147 | #define L2CAP_CTRL_TXSEQ_SHIFT 1 | 117 | #define L2CAP_CTRL_REQSEQ_SHIFT 8 |
148 | #define L2CAP_CTRL_SUPER_SHIFT 2 | 118 | #define L2CAP_CTRL_SAR_SHIFT 14 |
149 | #define L2CAP_CTRL_POLL_SHIFT 4 | ||
150 | #define L2CAP_CTRL_FINAL_SHIFT 7 | ||
151 | #define L2CAP_CTRL_REQSEQ_SHIFT 8 | ||
152 | #define L2CAP_CTRL_SAR_SHIFT 14 | ||
153 | |||
154 | /* L2CAP Extended Control Field bit mask */ | ||
155 | #define L2CAP_EXT_CTRL_TXSEQ 0xFFFC0000 | ||
156 | #define L2CAP_EXT_CTRL_SAR 0x00030000 | ||
157 | #define L2CAP_EXT_CTRL_SUPERVISE 0x00030000 | ||
158 | #define L2CAP_EXT_CTRL_REQSEQ 0x0000FFFC | ||
159 | |||
160 | #define L2CAP_EXT_CTRL_POLL 0x00040000 | ||
161 | #define L2CAP_EXT_CTRL_FINAL 0x00000002 | ||
162 | #define L2CAP_EXT_CTRL_FRAME_TYPE 0x00000001 /* I- or S-Frame */ | ||
163 | |||
164 | #define L2CAP_EXT_CTRL_FINAL_SHIFT 1 | ||
165 | #define L2CAP_EXT_CTRL_REQSEQ_SHIFT 2 | ||
166 | #define L2CAP_EXT_CTRL_SAR_SHIFT 16 | ||
167 | #define L2CAP_EXT_CTRL_SUPER_SHIFT 16 | ||
168 | #define L2CAP_EXT_CTRL_POLL_SHIFT 18 | ||
169 | #define L2CAP_EXT_CTRL_TXSEQ_SHIFT 18 | ||
170 | 119 | ||
171 | /* L2CAP Supervisory Function */ | 120 | /* L2CAP Supervisory Function */ |
172 | #define L2CAP_SUPER_RR 0x00 | 121 | #define L2CAP_SUPER_RCV_READY 0x0000 |
173 | #define L2CAP_SUPER_REJ 0x01 | 122 | #define L2CAP_SUPER_REJECT 0x0004 |
174 | #define L2CAP_SUPER_RNR 0x02 | 123 | #define L2CAP_SUPER_RCV_NOT_READY 0x0008 |
175 | #define L2CAP_SUPER_SREJ 0x03 | 124 | #define L2CAP_SUPER_SELECT_REJECT 0x000C |
176 | 125 | ||
177 | /* L2CAP Segmentation and Reassembly */ | 126 | /* L2CAP Segmentation and Reassembly */ |
178 | #define L2CAP_SAR_UNSEGMENTED 0x00 | 127 | #define L2CAP_SDU_UNSEGMENTED 0x0000 |
179 | #define L2CAP_SAR_START 0x01 | 128 | #define L2CAP_SDU_START 0x4000 |
180 | #define L2CAP_SAR_END 0x02 | 129 | #define L2CAP_SDU_END 0x8000 |
181 | #define L2CAP_SAR_CONTINUE 0x03 | 130 | #define L2CAP_SDU_CONTINUE 0xC000 |
182 | 131 | ||
183 | /* L2CAP Command rej. reasons */ | 132 | /* L2CAP Command rej. reasons */ |
184 | #define L2CAP_REJ_NOT_UNDERSTOOD 0x0000 | 133 | #define L2CAP_REJ_NOT_UNDERSTOOD 0x0000 |
185 | #define L2CAP_REJ_MTU_EXCEEDED 0x0001 | 134 | #define L2CAP_REJ_MTU_EXCEEDED 0x0001 |
186 | #define L2CAP_REJ_INVALID_CID 0x0002 | 135 | #define L2CAP_REJ_INVALID_CID 0x0002 |
136 | |||
187 | 137 | ||
188 | /* L2CAP structures */ | 138 | /* L2CAP structures */ |
189 | struct l2cap_hdr { | 139 | struct l2cap_hdr { |
@@ -191,14 +141,6 @@ struct l2cap_hdr { | |||
191 | __le16 cid; | 141 | __le16 cid; |
192 | } __packed; | 142 | } __packed; |
193 | #define L2CAP_HDR_SIZE 4 | 143 | #define L2CAP_HDR_SIZE 4 |
194 | #define L2CAP_ENH_HDR_SIZE 6 | ||
195 | #define L2CAP_EXT_HDR_SIZE 8 | ||
196 | |||
197 | #define L2CAP_FCS_SIZE 2 | ||
198 | #define L2CAP_SDULEN_SIZE 2 | ||
199 | #define L2CAP_PSMLEN_SIZE 2 | ||
200 | #define L2CAP_ENH_CTRL_SIZE 2 | ||
201 | #define L2CAP_EXT_CTRL_SIZE 4 | ||
202 | 144 | ||
203 | struct l2cap_cmd_hdr { | 145 | struct l2cap_cmd_hdr { |
204 | __u8 code; | 146 | __u8 code; |
@@ -234,29 +176,23 @@ struct l2cap_conn_rsp { | |||
234 | __le16 status; | 176 | __le16 status; |
235 | } __packed; | 177 | } __packed; |
236 | 178 | ||
237 | /* protocol/service multiplexer (PSM) */ | ||
238 | #define L2CAP_PSM_SDP 0x0001 | ||
239 | #define L2CAP_PSM_RFCOMM 0x0003 | ||
240 | |||
241 | /* channel indentifier */ | 179 | /* channel indentifier */ |
242 | #define L2CAP_CID_SIGNALING 0x0001 | 180 | #define L2CAP_CID_SIGNALING 0x0001 |
243 | #define L2CAP_CID_CONN_LESS 0x0002 | 181 | #define L2CAP_CID_CONN_LESS 0x0002 |
244 | #define L2CAP_CID_A2MP 0x0003 | ||
245 | #define L2CAP_CID_LE_DATA 0x0004 | 182 | #define L2CAP_CID_LE_DATA 0x0004 |
246 | #define L2CAP_CID_LE_SIGNALING 0x0005 | 183 | #define L2CAP_CID_LE_SIGNALING 0x0005 |
247 | #define L2CAP_CID_SMP 0x0006 | 184 | #define L2CAP_CID_SMP 0x0006 |
248 | #define L2CAP_CID_DYN_START 0x0040 | 185 | #define L2CAP_CID_DYN_START 0x0040 |
249 | #define L2CAP_CID_DYN_END 0xffff | 186 | #define L2CAP_CID_DYN_END 0xffff |
250 | 187 | ||
251 | /* connect/create channel results */ | 188 | /* connect result */ |
252 | #define L2CAP_CR_SUCCESS 0x0000 | 189 | #define L2CAP_CR_SUCCESS 0x0000 |
253 | #define L2CAP_CR_PEND 0x0001 | 190 | #define L2CAP_CR_PEND 0x0001 |
254 | #define L2CAP_CR_BAD_PSM 0x0002 | 191 | #define L2CAP_CR_BAD_PSM 0x0002 |
255 | #define L2CAP_CR_SEC_BLOCK 0x0003 | 192 | #define L2CAP_CR_SEC_BLOCK 0x0003 |
256 | #define L2CAP_CR_NO_MEM 0x0004 | 193 | #define L2CAP_CR_NO_MEM 0x0004 |
257 | #define L2CAP_CR_BAD_AMP 0x0005 | ||
258 | 194 | ||
259 | /* connect/create channel status */ | 195 | /* connect status */ |
260 | #define L2CAP_CS_NO_INFO 0x0000 | 196 | #define L2CAP_CS_NO_INFO 0x0000 |
261 | #define L2CAP_CS_AUTHEN_PEND 0x0001 | 197 | #define L2CAP_CS_AUTHEN_PEND 0x0001 |
262 | #define L2CAP_CS_AUTHOR_PEND 0x0002 | 198 | #define L2CAP_CS_AUTHOR_PEND 0x0002 |
@@ -278,11 +214,6 @@ struct l2cap_conf_rsp { | |||
278 | #define L2CAP_CONF_UNACCEPT 0x0001 | 214 | #define L2CAP_CONF_UNACCEPT 0x0001 |
279 | #define L2CAP_CONF_REJECT 0x0002 | 215 | #define L2CAP_CONF_REJECT 0x0002 |
280 | #define L2CAP_CONF_UNKNOWN 0x0003 | 216 | #define L2CAP_CONF_UNKNOWN 0x0003 |
281 | #define L2CAP_CONF_PENDING 0x0004 | ||
282 | #define L2CAP_CONF_EFS_REJECT 0x0005 | ||
283 | |||
284 | /* configuration req/rsp continuation flag */ | ||
285 | #define L2CAP_CONF_FLAG_CONTINUATION 0x0001 | ||
286 | 217 | ||
287 | struct l2cap_conf_opt { | 218 | struct l2cap_conf_opt { |
288 | __u8 type; | 219 | __u8 type; |
@@ -299,8 +230,6 @@ struct l2cap_conf_opt { | |||
299 | #define L2CAP_CONF_QOS 0x03 | 230 | #define L2CAP_CONF_QOS 0x03 |
300 | #define L2CAP_CONF_RFC 0x04 | 231 | #define L2CAP_CONF_RFC 0x04 |
301 | #define L2CAP_CONF_FCS 0x05 | 232 | #define L2CAP_CONF_FCS 0x05 |
302 | #define L2CAP_CONF_EFS 0x06 | ||
303 | #define L2CAP_CONF_EWS 0x07 | ||
304 | 233 | ||
305 | #define L2CAP_CONF_MAX_SIZE 22 | 234 | #define L2CAP_CONF_MAX_SIZE 22 |
306 | 235 | ||
@@ -319,21 +248,6 @@ struct l2cap_conf_rfc { | |||
319 | #define L2CAP_MODE_ERTM 0x03 | 248 | #define L2CAP_MODE_ERTM 0x03 |
320 | #define L2CAP_MODE_STREAMING 0x04 | 249 | #define L2CAP_MODE_STREAMING 0x04 |
321 | 250 | ||
322 | struct l2cap_conf_efs { | ||
323 | __u8 id; | ||
324 | __u8 stype; | ||
325 | __le16 msdu; | ||
326 | __le32 sdu_itime; | ||
327 | __le32 acc_lat; | ||
328 | __le32 flush_to; | ||
329 | } __packed; | ||
330 | |||
331 | #define L2CAP_SERV_NOTRAFIC 0x00 | ||
332 | #define L2CAP_SERV_BESTEFFORT 0x01 | ||
333 | #define L2CAP_SERV_GUARANTEED 0x02 | ||
334 | |||
335 | #define L2CAP_BESTEFFORT_ID 0x01 | ||
336 | |||
337 | struct l2cap_disconn_req { | 251 | struct l2cap_disconn_req { |
338 | __le16 dcid; | 252 | __le16 dcid; |
339 | __le16 scid; | 253 | __le16 scid; |
@@ -354,57 +268,14 @@ struct l2cap_info_rsp { | |||
354 | __u8 data[0]; | 268 | __u8 data[0]; |
355 | } __packed; | 269 | } __packed; |
356 | 270 | ||
357 | struct l2cap_create_chan_req { | ||
358 | __le16 psm; | ||
359 | __le16 scid; | ||
360 | __u8 amp_id; | ||
361 | } __packed; | ||
362 | |||
363 | struct l2cap_create_chan_rsp { | ||
364 | __le16 dcid; | ||
365 | __le16 scid; | ||
366 | __le16 result; | ||
367 | __le16 status; | ||
368 | } __packed; | ||
369 | |||
370 | struct l2cap_move_chan_req { | ||
371 | __le16 icid; | ||
372 | __u8 dest_amp_id; | ||
373 | } __packed; | ||
374 | |||
375 | struct l2cap_move_chan_rsp { | ||
376 | __le16 icid; | ||
377 | __le16 result; | ||
378 | } __packed; | ||
379 | |||
380 | #define L2CAP_MR_SUCCESS 0x0000 | ||
381 | #define L2CAP_MR_PEND 0x0001 | ||
382 | #define L2CAP_MR_BAD_ID 0x0002 | ||
383 | #define L2CAP_MR_SAME_ID 0x0003 | ||
384 | #define L2CAP_MR_NOT_SUPP 0x0004 | ||
385 | #define L2CAP_MR_COLLISION 0x0005 | ||
386 | #define L2CAP_MR_NOT_ALLOWED 0x0006 | ||
387 | |||
388 | struct l2cap_move_chan_cfm { | ||
389 | __le16 icid; | ||
390 | __le16 result; | ||
391 | } __packed; | ||
392 | |||
393 | #define L2CAP_MC_CONFIRMED 0x0000 | ||
394 | #define L2CAP_MC_UNCONFIRMED 0x0001 | ||
395 | |||
396 | struct l2cap_move_chan_cfm_rsp { | ||
397 | __le16 icid; | ||
398 | } __packed; | ||
399 | |||
400 | /* info type */ | 271 | /* info type */ |
401 | #define L2CAP_IT_CL_MTU 0x0001 | 272 | #define L2CAP_IT_CL_MTU 0x0001 |
402 | #define L2CAP_IT_FEAT_MASK 0x0002 | 273 | #define L2CAP_IT_FEAT_MASK 0x0002 |
403 | #define L2CAP_IT_FIXED_CHAN 0x0003 | 274 | #define L2CAP_IT_FIXED_CHAN 0x0003 |
404 | 275 | ||
405 | /* info result */ | 276 | /* info result */ |
406 | #define L2CAP_IR_SUCCESS 0x0000 | 277 | #define L2CAP_IR_SUCCESS 0x0000 |
407 | #define L2CAP_IR_NOTSUPP 0x0001 | 278 | #define L2CAP_IR_NOTSUPP 0x0001 |
408 | 279 | ||
409 | struct l2cap_conn_param_update_req { | 280 | struct l2cap_conn_param_update_req { |
410 | __le16 min; | 281 | __le16 min; |
@@ -422,26 +293,20 @@ struct l2cap_conn_param_update_rsp { | |||
422 | #define L2CAP_CONN_PARAM_REJECTED 0x0001 | 293 | #define L2CAP_CONN_PARAM_REJECTED 0x0001 |
423 | 294 | ||
424 | /* ----- L2CAP channels and connections ----- */ | 295 | /* ----- L2CAP channels and connections ----- */ |
425 | struct l2cap_seq_list { | 296 | struct srej_list { |
426 | __u16 head; | 297 | __u8 tx_seq; |
427 | __u16 tail; | 298 | struct list_head list; |
428 | __u16 mask; | ||
429 | __u16 *list; | ||
430 | }; | 299 | }; |
431 | 300 | ||
432 | #define L2CAP_SEQ_LIST_CLEAR 0xFFFF | ||
433 | #define L2CAP_SEQ_LIST_TAIL 0x8000 | ||
434 | |||
435 | struct l2cap_chan { | 301 | struct l2cap_chan { |
436 | struct sock *sk; | 302 | struct sock *sk; |
437 | 303 | ||
438 | struct l2cap_conn *conn; | 304 | struct l2cap_conn *conn; |
439 | struct hci_conn *hs_hcon; | ||
440 | struct hci_chan *hs_hchan; | ||
441 | struct kref kref; | ||
442 | 305 | ||
443 | __u8 state; | 306 | __u8 state; |
444 | 307 | ||
308 | atomic_t refcnt; | ||
309 | |||
445 | __le16 psm; | 310 | __le16 psm; |
446 | __u16 dcid; | 311 | __u16 dcid; |
447 | __u16 scid; | 312 | __u16 scid; |
@@ -451,11 +316,14 @@ struct l2cap_chan { | |||
451 | __u16 flush_to; | 316 | __u16 flush_to; |
452 | __u8 mode; | 317 | __u8 mode; |
453 | __u8 chan_type; | 318 | __u8 chan_type; |
454 | __u8 chan_policy; | ||
455 | 319 | ||
456 | __le16 sport; | 320 | __le16 sport; |
457 | 321 | ||
458 | __u8 sec_level; | 322 | __u8 sec_level; |
323 | __u8 role_switch; | ||
324 | __u8 force_reliable; | ||
325 | __u8 flushable; | ||
326 | __u8 force_active; | ||
459 | 327 | ||
460 | __u8 ident; | 328 | __u8 ident; |
461 | 329 | ||
@@ -466,124 +334,92 @@ struct l2cap_chan { | |||
466 | 334 | ||
467 | __u8 fcs; | 335 | __u8 fcs; |
468 | 336 | ||
469 | __u16 tx_win; | 337 | __u8 tx_win; |
470 | __u16 tx_win_max; | ||
471 | __u16 ack_win; | ||
472 | __u8 max_tx; | 338 | __u8 max_tx; |
473 | __u16 retrans_timeout; | 339 | __u16 retrans_timeout; |
474 | __u16 monitor_timeout; | 340 | __u16 monitor_timeout; |
475 | __u16 mps; | 341 | __u16 mps; |
476 | 342 | ||
477 | __u8 tx_state; | ||
478 | __u8 rx_state; | ||
479 | |||
480 | unsigned long conf_state; | 343 | unsigned long conf_state; |
481 | unsigned long conn_state; | 344 | unsigned long conn_state; |
482 | unsigned long flags; | 345 | |
483 | 346 | __u8 next_tx_seq; | |
484 | __u8 remote_amp_id; | 347 | __u8 expected_ack_seq; |
485 | __u8 local_amp_id; | 348 | __u8 expected_tx_seq; |
486 | __u8 move_id; | 349 | __u8 buffer_seq; |
487 | __u8 move_state; | 350 | __u8 buffer_seq_srej; |
488 | __u8 move_role; | 351 | __u8 srej_save_reqseq; |
489 | 352 | __u8 frames_sent; | |
490 | __u16 next_tx_seq; | 353 | __u8 unacked_frames; |
491 | __u16 expected_ack_seq; | ||
492 | __u16 expected_tx_seq; | ||
493 | __u16 buffer_seq; | ||
494 | __u16 srej_save_reqseq; | ||
495 | __u16 last_acked_seq; | ||
496 | __u16 frames_sent; | ||
497 | __u16 unacked_frames; | ||
498 | __u8 retry_count; | 354 | __u8 retry_count; |
499 | __u16 srej_queue_next; | 355 | __u8 num_acked; |
500 | __u16 sdu_len; | 356 | __u16 sdu_len; |
357 | __u16 partial_sdu_len; | ||
501 | struct sk_buff *sdu; | 358 | struct sk_buff *sdu; |
502 | struct sk_buff *sdu_last_frag; | ||
503 | 359 | ||
504 | __u16 remote_tx_win; | 360 | __u8 remote_tx_win; |
505 | __u8 remote_max_tx; | 361 | __u8 remote_max_tx; |
506 | __u16 remote_mps; | 362 | __u16 remote_mps; |
507 | 363 | ||
508 | __u8 local_id; | 364 | struct timer_list chan_timer; |
509 | __u8 local_stype; | 365 | struct timer_list retrans_timer; |
510 | __u16 local_msdu; | 366 | struct timer_list monitor_timer; |
511 | __u32 local_sdu_itime; | 367 | struct timer_list ack_timer; |
512 | __u32 local_acc_lat; | ||
513 | __u32 local_flush_to; | ||
514 | |||
515 | __u8 remote_id; | ||
516 | __u8 remote_stype; | ||
517 | __u16 remote_msdu; | ||
518 | __u32 remote_sdu_itime; | ||
519 | __u32 remote_acc_lat; | ||
520 | __u32 remote_flush_to; | ||
521 | |||
522 | struct delayed_work chan_timer; | ||
523 | struct delayed_work retrans_timer; | ||
524 | struct delayed_work monitor_timer; | ||
525 | struct delayed_work ack_timer; | ||
526 | |||
527 | struct sk_buff *tx_send_head; | 368 | struct sk_buff *tx_send_head; |
528 | struct sk_buff_head tx_q; | 369 | struct sk_buff_head tx_q; |
529 | struct sk_buff_head srej_q; | 370 | struct sk_buff_head srej_q; |
530 | struct l2cap_seq_list srej_list; | 371 | struct list_head srej_l; |
531 | struct l2cap_seq_list retrans_list; | ||
532 | 372 | ||
533 | struct list_head list; | 373 | struct list_head list; |
534 | struct list_head global_l; | 374 | struct list_head global_l; |
535 | 375 | ||
536 | void *data; | 376 | void *data; |
537 | struct l2cap_ops *ops; | 377 | struct l2cap_ops *ops; |
538 | struct mutex lock; | ||
539 | }; | 378 | }; |
540 | 379 | ||
541 | struct l2cap_ops { | 380 | struct l2cap_ops { |
542 | char *name; | 381 | char *name; |
543 | 382 | ||
544 | struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan); | 383 | struct l2cap_chan *(*new_connection) (void *data); |
545 | int (*recv) (struct l2cap_chan * chan, | 384 | int (*recv) (void *data, struct sk_buff *skb); |
546 | struct sk_buff *skb); | 385 | void (*close) (void *data); |
547 | void (*teardown) (struct l2cap_chan *chan, int err); | 386 | void (*state_change) (void *data, int state); |
548 | void (*close) (struct l2cap_chan *chan); | ||
549 | void (*state_change) (struct l2cap_chan *chan, | ||
550 | int state); | ||
551 | void (*ready) (struct l2cap_chan *chan); | ||
552 | void (*defer) (struct l2cap_chan *chan); | ||
553 | struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan, | ||
554 | unsigned long len, int nb); | ||
555 | }; | 387 | }; |
556 | 388 | ||
557 | struct l2cap_conn { | 389 | struct l2cap_conn { |
558 | struct hci_conn *hcon; | 390 | struct hci_conn *hcon; |
559 | struct hci_chan *hchan; | 391 | |
392 | bdaddr_t *dst; | ||
393 | bdaddr_t *src; | ||
560 | 394 | ||
561 | bdaddr_t *dst; | 395 | unsigned int mtu; |
562 | bdaddr_t *src; | ||
563 | 396 | ||
564 | unsigned int mtu; | 397 | __u32 feat_mask; |
565 | 398 | ||
566 | __u32 feat_mask; | 399 | __u8 info_state; |
567 | __u8 fixed_chan_mask; | 400 | __u8 info_ident; |
568 | 401 | ||
569 | __u8 info_state; | 402 | struct timer_list info_timer; |
570 | __u8 info_ident; | ||
571 | 403 | ||
572 | struct delayed_work info_timer; | 404 | spinlock_t lock; |
573 | 405 | ||
574 | spinlock_t lock; | 406 | struct sk_buff *rx_skb; |
407 | __u32 rx_len; | ||
408 | __u8 tx_ident; | ||
575 | 409 | ||
576 | struct sk_buff *rx_skb; | 410 | __u8 disc_reason; |
577 | __u32 rx_len; | ||
578 | __u8 tx_ident; | ||
579 | 411 | ||
580 | __u8 disc_reason; | 412 | __u8 preq[7]; /* SMP Pairing Request */ |
413 | __u8 prsp[7]; /* SMP Pairing Response */ | ||
414 | __u8 prnd[16]; /* SMP Pairing Random */ | ||
415 | __u8 pcnf[16]; /* SMP Pairing Confirm */ | ||
416 | __u8 tk[16]; /* SMP Temporary Key */ | ||
417 | __u8 smp_key_size; | ||
581 | 418 | ||
582 | struct delayed_work security_timer; | 419 | struct timer_list security_timer; |
583 | struct smp_chan *smp_chan; | ||
584 | 420 | ||
585 | struct list_head chan_l; | 421 | struct list_head chan_l; |
586 | struct mutex chan_lock; | 422 | rwlock_t chan_lock; |
587 | }; | 423 | }; |
588 | 424 | ||
589 | #define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 | 425 | #define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 |
@@ -593,15 +429,14 @@ struct l2cap_conn { | |||
593 | #define L2CAP_CHAN_RAW 1 | 429 | #define L2CAP_CHAN_RAW 1 |
594 | #define L2CAP_CHAN_CONN_LESS 2 | 430 | #define L2CAP_CHAN_CONN_LESS 2 |
595 | #define L2CAP_CHAN_CONN_ORIENTED 3 | 431 | #define L2CAP_CHAN_CONN_ORIENTED 3 |
596 | #define L2CAP_CHAN_CONN_FIX_A2MP 4 | ||
597 | 432 | ||
598 | /* ----- L2CAP socket info ----- */ | 433 | /* ----- L2CAP socket info ----- */ |
599 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 434 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
600 | 435 | ||
601 | struct l2cap_pinfo { | 436 | struct l2cap_pinfo { |
602 | struct bt_sock bt; | 437 | struct bt_sock bt; |
603 | struct l2cap_chan *chan; | 438 | struct l2cap_chan *chan; |
604 | struct sk_buff *rx_busy_skb; | 439 | struct sk_buff *rx_busy_skb; |
605 | }; | 440 | }; |
606 | 441 | ||
607 | enum { | 442 | enum { |
@@ -611,18 +446,15 @@ enum { | |||
611 | CONF_MTU_DONE, | 446 | CONF_MTU_DONE, |
612 | CONF_MODE_DONE, | 447 | CONF_MODE_DONE, |
613 | CONF_CONNECT_PEND, | 448 | CONF_CONNECT_PEND, |
614 | CONF_RECV_NO_FCS, | 449 | CONF_NO_FCS_RECV, |
615 | CONF_STATE2_DEVICE, | 450 | CONF_STATE2_DEVICE, |
616 | CONF_EWS_RECV, | ||
617 | CONF_LOC_CONF_PEND, | ||
618 | CONF_REM_CONF_PEND, | ||
619 | CONF_NOT_COMPLETE, | ||
620 | }; | 451 | }; |
621 | 452 | ||
622 | #define L2CAP_CONF_MAX_CONF_REQ 2 | 453 | #define L2CAP_CONF_MAX_CONF_REQ 2 |
623 | #define L2CAP_CONF_MAX_CONF_RSP 2 | 454 | #define L2CAP_CONF_MAX_CONF_RSP 2 |
624 | 455 | ||
625 | enum { | 456 | enum { |
457 | CONN_SAR_SDU, | ||
626 | CONN_SREJ_SENT, | 458 | CONN_SREJ_SENT, |
627 | CONN_WAIT_F, | 459 | CONN_WAIT_F, |
628 | CONN_SREJ_ACT, | 460 | CONN_SREJ_ACT, |
@@ -634,156 +466,37 @@ enum { | |||
634 | CONN_RNR_SENT, | 466 | CONN_RNR_SENT, |
635 | }; | 467 | }; |
636 | 468 | ||
637 | /* Definitions for flags in l2cap_chan */ | ||
638 | enum { | ||
639 | FLAG_ROLE_SWITCH, | ||
640 | FLAG_FORCE_ACTIVE, | ||
641 | FLAG_FORCE_RELIABLE, | ||
642 | FLAG_FLUSHABLE, | ||
643 | FLAG_EXT_CTRL, | ||
644 | FLAG_EFS_ENABLE, | ||
645 | }; | ||
646 | |||
647 | enum { | ||
648 | L2CAP_TX_STATE_XMIT, | ||
649 | L2CAP_TX_STATE_WAIT_F, | ||
650 | }; | ||
651 | |||
652 | enum { | ||
653 | L2CAP_RX_STATE_RECV, | ||
654 | L2CAP_RX_STATE_SREJ_SENT, | ||
655 | L2CAP_RX_STATE_MOVE, | ||
656 | L2CAP_RX_STATE_WAIT_P, | ||
657 | L2CAP_RX_STATE_WAIT_F, | ||
658 | }; | ||
659 | |||
660 | enum { | ||
661 | L2CAP_TXSEQ_EXPECTED, | ||
662 | L2CAP_TXSEQ_EXPECTED_SREJ, | ||
663 | L2CAP_TXSEQ_UNEXPECTED, | ||
664 | L2CAP_TXSEQ_UNEXPECTED_SREJ, | ||
665 | L2CAP_TXSEQ_DUPLICATE, | ||
666 | L2CAP_TXSEQ_DUPLICATE_SREJ, | ||
667 | L2CAP_TXSEQ_INVALID, | ||
668 | L2CAP_TXSEQ_INVALID_IGNORE, | ||
669 | }; | ||
670 | |||
671 | enum { | ||
672 | L2CAP_EV_DATA_REQUEST, | ||
673 | L2CAP_EV_LOCAL_BUSY_DETECTED, | ||
674 | L2CAP_EV_LOCAL_BUSY_CLEAR, | ||
675 | L2CAP_EV_RECV_REQSEQ_AND_FBIT, | ||
676 | L2CAP_EV_RECV_FBIT, | ||
677 | L2CAP_EV_RETRANS_TO, | ||
678 | L2CAP_EV_MONITOR_TO, | ||
679 | L2CAP_EV_EXPLICIT_POLL, | ||
680 | L2CAP_EV_RECV_IFRAME, | ||
681 | L2CAP_EV_RECV_RR, | ||
682 | L2CAP_EV_RECV_REJ, | ||
683 | L2CAP_EV_RECV_RNR, | ||
684 | L2CAP_EV_RECV_SREJ, | ||
685 | L2CAP_EV_RECV_FRAME, | ||
686 | }; | ||
687 | |||
688 | enum { | ||
689 | L2CAP_MOVE_ROLE_NONE, | ||
690 | L2CAP_MOVE_ROLE_INITIATOR, | ||
691 | L2CAP_MOVE_ROLE_RESPONDER, | ||
692 | }; | ||
693 | |||
694 | enum { | ||
695 | L2CAP_MOVE_STABLE, | ||
696 | L2CAP_MOVE_WAIT_REQ, | ||
697 | L2CAP_MOVE_WAIT_RSP, | ||
698 | L2CAP_MOVE_WAIT_RSP_SUCCESS, | ||
699 | L2CAP_MOVE_WAIT_CONFIRM, | ||
700 | L2CAP_MOVE_WAIT_CONFIRM_RSP, | ||
701 | L2CAP_MOVE_WAIT_LOGICAL_COMP, | ||
702 | L2CAP_MOVE_WAIT_LOGICAL_CFM, | ||
703 | L2CAP_MOVE_WAIT_LOCAL_BUSY, | ||
704 | L2CAP_MOVE_WAIT_PREPARE, | ||
705 | }; | ||
706 | |||
707 | void l2cap_chan_hold(struct l2cap_chan *c); | ||
708 | void l2cap_chan_put(struct l2cap_chan *c); | ||
709 | |||
710 | static inline void l2cap_chan_lock(struct l2cap_chan *chan) | ||
711 | { | ||
712 | mutex_lock(&chan->lock); | ||
713 | } | ||
714 | |||
715 | static inline void l2cap_chan_unlock(struct l2cap_chan *chan) | ||
716 | { | ||
717 | mutex_unlock(&chan->lock); | ||
718 | } | ||
719 | |||
720 | static inline void l2cap_set_timer(struct l2cap_chan *chan, | ||
721 | struct delayed_work *work, long timeout) | ||
722 | { | ||
723 | BT_DBG("chan %p state %s timeout %ld", chan, | ||
724 | state_to_string(chan->state), timeout); | ||
725 | |||
726 | /* If delayed work cancelled do not hold(chan) | ||
727 | since it is already done with previous set_timer */ | ||
728 | if (!cancel_delayed_work(work)) | ||
729 | l2cap_chan_hold(chan); | ||
730 | |||
731 | schedule_delayed_work(work, timeout); | ||
732 | } | ||
733 | |||
734 | static inline bool l2cap_clear_timer(struct l2cap_chan *chan, | ||
735 | struct delayed_work *work) | ||
736 | { | ||
737 | bool ret; | ||
738 | |||
739 | /* put(chan) if delayed work cancelled otherwise it | ||
740 | is done in delayed work function */ | ||
741 | ret = cancel_delayed_work(work); | ||
742 | if (ret) | ||
743 | l2cap_chan_put(chan); | ||
744 | |||
745 | return ret; | ||
746 | } | ||
747 | |||
748 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) | 469 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) |
749 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) | 470 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) |
471 | #define __set_retrans_timer(c) l2cap_set_timer(c, &c->retrans_timer, \ | ||
472 | L2CAP_DEFAULT_RETRANS_TO); | ||
750 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) | 473 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) |
474 | #define __set_monitor_timer(c) l2cap_set_timer(c, &c->monitor_timer, \ | ||
475 | L2CAP_DEFAULT_MONITOR_TO); | ||
751 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) | 476 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) |
752 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ | 477 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ |
753 | msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); | 478 | L2CAP_DEFAULT_ACK_TO); |
754 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) | 479 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) |
755 | 480 | ||
756 | static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) | 481 | static inline int l2cap_tx_window_full(struct l2cap_chan *ch) |
757 | { | 482 | { |
758 | if (seq1 >= seq2) | 483 | int sub; |
759 | return seq1 - seq2; | ||
760 | else | ||
761 | return chan->tx_win_max + 1 - seq2 + seq1; | ||
762 | } | ||
763 | 484 | ||
764 | static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq) | 485 | sub = (ch->next_tx_seq - ch->expected_ack_seq) % 64; |
765 | { | ||
766 | return (seq + 1) % (chan->tx_win_max + 1); | ||
767 | } | ||
768 | |||
769 | static inline struct l2cap_chan *l2cap_chan_no_new_connection(struct l2cap_chan *chan) | ||
770 | { | ||
771 | return NULL; | ||
772 | } | ||
773 | 486 | ||
774 | static inline void l2cap_chan_no_teardown(struct l2cap_chan *chan, int err) | 487 | if (sub < 0) |
775 | { | 488 | sub += 64; |
776 | } | ||
777 | 489 | ||
778 | static inline void l2cap_chan_no_ready(struct l2cap_chan *chan) | 490 | return sub == ch->remote_tx_win; |
779 | { | ||
780 | } | 491 | } |
781 | 492 | ||
782 | static inline void l2cap_chan_no_defer(struct l2cap_chan *chan) | 493 | #define __get_txseq(ctrl) (((ctrl) & L2CAP_CTRL_TXSEQ) >> 1) |
783 | { | 494 | #define __get_reqseq(ctrl) (((ctrl) & L2CAP_CTRL_REQSEQ) >> 8) |
784 | } | 495 | #define __is_iframe(ctrl) (!((ctrl) & L2CAP_CTRL_FRAME_TYPE)) |
496 | #define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE) | ||
497 | #define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START) | ||
785 | 498 | ||
786 | extern bool disable_ertm; | 499 | extern int disable_ertm; |
787 | 500 | ||
788 | int l2cap_init_sockets(void); | 501 | int l2cap_init_sockets(void); |
789 | void l2cap_cleanup_sockets(void); | 502 | void l2cap_cleanup_sockets(void); |
@@ -794,23 +507,11 @@ int __l2cap_wait_ack(struct sock *sk); | |||
794 | int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); | 507 | int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); |
795 | int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); | 508 | int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); |
796 | 509 | ||
797 | struct l2cap_chan *l2cap_chan_create(void); | 510 | struct l2cap_chan *l2cap_chan_create(struct sock *sk); |
798 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); | 511 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); |
799 | int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, | 512 | void l2cap_chan_destroy(struct l2cap_chan *chan); |
800 | bdaddr_t *dst, u8 dst_type); | 513 | int l2cap_chan_connect(struct l2cap_chan *chan); |
801 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, | 514 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); |
802 | u32 priority); | ||
803 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); | 515 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); |
804 | int l2cap_chan_check_security(struct l2cap_chan *chan); | ||
805 | void l2cap_chan_set_defaults(struct l2cap_chan *chan); | ||
806 | int l2cap_ertm_init(struct l2cap_chan *chan); | ||
807 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | ||
808 | void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | ||
809 | void l2cap_chan_del(struct l2cap_chan *chan, int err); | ||
810 | void l2cap_send_conn_req(struct l2cap_chan *chan); | ||
811 | void l2cap_move_start(struct l2cap_chan *chan); | ||
812 | void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, | ||
813 | u8 status); | ||
814 | void __l2cap_physical_cfm(struct l2cap_chan *chan, int result); | ||
815 | 516 | ||
816 | #endif /* __L2CAP_H */ | 517 | #endif /* __L2CAP_H */ |