blob: 5ce94c4ee5276cd13af9cbb994a8c3cbcd61f2a3 [file] [log] [blame]
Scott James Remnantfc5a3f72013-08-01 14:39:40 -07001/*
2 *
3 * BlueZ - Bluetooth protocol stack for Linux
4 *
5 * Copyright (C) 2000-2001 Qualcomm Incorporated
6 * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
7 * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
8 * Copyright (c) 2012 Code Aurora Forum. All rights reserved.
9 *
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 */
26
27#ifndef __L2CAP_H
28#define __L2CAP_H
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34#include <sys/socket.h>
35
36/* L2CAP defaults */
37#define L2CAP_DEFAULT_MTU 672
38#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF
39
40/* L2CAP socket address */
41struct sockaddr_l2 {
42 sa_family_t l2_family;
43 unsigned short l2_psm;
44 bdaddr_t l2_bdaddr;
45 unsigned short l2_cid;
46 uint8_t l2_bdaddr_type;
47};
48
49/* L2CAP socket options */
50#define L2CAP_OPTIONS 0x01
51struct l2cap_options {
52 uint16_t omtu;
53 uint16_t imtu;
54 uint16_t flush_to;
55 uint8_t mode;
56 uint8_t fcs;
57 uint8_t max_tx;
58 uint16_t txwin_size;
59};
60
61#define L2CAP_CONNINFO 0x02
62struct l2cap_conninfo {
63 uint16_t hci_handle;
64 uint8_t dev_class[3];
65};
66
67#define L2CAP_LM 0x03
68#define L2CAP_LM_MASTER 0x0001
69#define L2CAP_LM_AUTH 0x0002
70#define L2CAP_LM_ENCRYPT 0x0004
71#define L2CAP_LM_TRUSTED 0x0008
72#define L2CAP_LM_RELIABLE 0x0010
73#define L2CAP_LM_SECURE 0x0020
74
75/* L2CAP command codes */
76#define L2CAP_COMMAND_REJ 0x01
77#define L2CAP_CONN_REQ 0x02
78#define L2CAP_CONN_RSP 0x03
79#define L2CAP_CONF_REQ 0x04
80#define L2CAP_CONF_RSP 0x05
81#define L2CAP_DISCONN_REQ 0x06
82#define L2CAP_DISCONN_RSP 0x07
83#define L2CAP_ECHO_REQ 0x08
84#define L2CAP_ECHO_RSP 0x09
85#define L2CAP_INFO_REQ 0x0a
86#define L2CAP_INFO_RSP 0x0b
87#define L2CAP_CREATE_REQ 0x0c
88#define L2CAP_CREATE_RSP 0x0d
89#define L2CAP_MOVE_REQ 0x0e
90#define L2CAP_MOVE_RSP 0x0f
91#define L2CAP_MOVE_CFM 0x10
92#define L2CAP_MOVE_CFM_RSP 0x11
93
94/* L2CAP extended feature mask */
95#define L2CAP_FEAT_FLOWCTL 0x00000001
96#define L2CAP_FEAT_RETRANS 0x00000002
97#define L2CAP_FEAT_BIDIR_QOS 0x00000004
98#define L2CAP_FEAT_ERTM 0x00000008
99#define L2CAP_FEAT_STREAMING 0x00000010
100#define L2CAP_FEAT_FCS 0x00000020
101#define L2CAP_FEAT_EXT_FLOW 0x00000040
102#define L2CAP_FEAT_FIXED_CHAN 0x00000080
103#define L2CAP_FEAT_EXT_WINDOW 0x00000100
104#define L2CAP_FEAT_UCD 0x00000200
105
106/* L2CAP fixed channels */
107#define L2CAP_FC_L2CAP 0x02
108#define L2CAP_FC_CONNLESS 0x04
109#define L2CAP_FC_A2MP 0x08
110
111/* L2CAP structures */
112typedef struct {
113 uint16_t len;
114 uint16_t cid;
115} __attribute__ ((packed)) l2cap_hdr;
116#define L2CAP_HDR_SIZE 4
117
118typedef struct {
119 uint8_t code;
120 uint8_t ident;
121 uint16_t len;
122} __attribute__ ((packed)) l2cap_cmd_hdr;
123#define L2CAP_CMD_HDR_SIZE 4
124
125typedef struct {
126 uint16_t reason;
127} __attribute__ ((packed)) l2cap_cmd_rej;
128#define L2CAP_CMD_REJ_SIZE 2
129
130typedef struct {
131 uint16_t psm;
132 uint16_t scid;
133} __attribute__ ((packed)) l2cap_conn_req;
134#define L2CAP_CONN_REQ_SIZE 4
135
136typedef struct {
137 uint16_t dcid;
138 uint16_t scid;
139 uint16_t result;
140 uint16_t status;
141} __attribute__ ((packed)) l2cap_conn_rsp;
142#define L2CAP_CONN_RSP_SIZE 8
143
144/* connect result */
145#define L2CAP_CR_SUCCESS 0x0000
146#define L2CAP_CR_PEND 0x0001
147#define L2CAP_CR_BAD_PSM 0x0002
148#define L2CAP_CR_SEC_BLOCK 0x0003
149#define L2CAP_CR_NO_MEM 0x0004
150
151/* connect status */
152#define L2CAP_CS_NO_INFO 0x0000
153#define L2CAP_CS_AUTHEN_PEND 0x0001
154#define L2CAP_CS_AUTHOR_PEND 0x0002
155
156typedef struct {
157 uint16_t dcid;
158 uint16_t flags;
159 uint8_t data[0];
160} __attribute__ ((packed)) l2cap_conf_req;
161#define L2CAP_CONF_REQ_SIZE 4
162
163typedef struct {
164 uint16_t scid;
165 uint16_t flags;
166 uint16_t result;
167 uint8_t data[0];
168} __attribute__ ((packed)) l2cap_conf_rsp;
169#define L2CAP_CONF_RSP_SIZE 6
170
171#define L2CAP_CONF_SUCCESS 0x0000
172#define L2CAP_CONF_UNACCEPT 0x0001
173#define L2CAP_CONF_REJECT 0x0002
174#define L2CAP_CONF_UNKNOWN 0x0003
175#define L2CAP_CONF_PENDING 0x0004
176#define L2CAP_CONF_EFS_REJECT 0x0005
177
178typedef struct {
179 uint8_t type;
180 uint8_t len;
181 uint8_t val[0];
182} __attribute__ ((packed)) l2cap_conf_opt;
183#define L2CAP_CONF_OPT_SIZE 2
184
185#define L2CAP_CONF_MTU 0x01
186#define L2CAP_CONF_FLUSH_TO 0x02
187#define L2CAP_CONF_QOS 0x03
188#define L2CAP_CONF_RFC 0x04
189#define L2CAP_CONF_FCS 0x05
190#define L2CAP_CONF_EFS 0x06
191#define L2CAP_CONF_EWS 0x07
192
193#define L2CAP_CONF_MAX_SIZE 22
194
195#define L2CAP_MODE_BASIC 0x00
196#define L2CAP_MODE_RETRANS 0x01
197#define L2CAP_MODE_FLOWCTL 0x02
198#define L2CAP_MODE_ERTM 0x03
199#define L2CAP_MODE_STREAMING 0x04
200
201#define L2CAP_SERVTYPE_NOTRAFFIC 0x00
202#define L2CAP_SERVTYPE_BESTEFFORT 0x01
203#define L2CAP_SERVTYPE_GUARANTEED 0x02
204
205typedef struct {
206 uint16_t dcid;
207 uint16_t scid;
208} __attribute__ ((packed)) l2cap_disconn_req;
209#define L2CAP_DISCONN_REQ_SIZE 4
210
211typedef struct {
212 uint16_t dcid;
213 uint16_t scid;
214} __attribute__ ((packed)) l2cap_disconn_rsp;
215#define L2CAP_DISCONN_RSP_SIZE 4
216
217typedef struct {
218 uint16_t type;
219} __attribute__ ((packed)) l2cap_info_req;
220#define L2CAP_INFO_REQ_SIZE 2
221
222typedef struct {
223 uint16_t type;
224 uint16_t result;
225 uint8_t data[0];
226} __attribute__ ((packed)) l2cap_info_rsp;
227#define L2CAP_INFO_RSP_SIZE 4
228
229/* info type */
230#define L2CAP_IT_CL_MTU 0x0001
231#define L2CAP_IT_FEAT_MASK 0x0002
232
233/* info result */
234#define L2CAP_IR_SUCCESS 0x0000
235#define L2CAP_IR_NOTSUPP 0x0001
236
237typedef struct {
238 uint16_t psm;
239 uint16_t scid;
240 uint8_t id;
241} __attribute__ ((packed)) l2cap_create_req;
242#define L2CAP_CREATE_REQ_SIZE 5
243
244typedef struct {
245 uint16_t dcid;
246 uint16_t scid;
247 uint16_t result;
248 uint16_t status;
249} __attribute__ ((packed)) l2cap_create_rsp;
250#define L2CAP_CREATE_RSP_SIZE 8
251
252typedef struct {
253 uint16_t icid;
254 uint8_t id;
255} __attribute__ ((packed)) l2cap_move_req;
256#define L2CAP_MOVE_REQ_SIZE 3
257
258typedef struct {
259 uint16_t icid;
260 uint16_t result;
261} __attribute__ ((packed)) l2cap_move_rsp;
262#define L2CAP_MOVE_RSP_SIZE 4
263
264typedef struct {
265 uint16_t icid;
266 uint16_t result;
267} __attribute__ ((packed)) l2cap_move_cfm;
268#define L2CAP_MOVE_CFM_SIZE 4
269
270typedef struct {
271 uint16_t icid;
272} __attribute__ ((packed)) l2cap_move_cfm_rsp;
273#define L2CAP_MOVE_CFM_RSP_SIZE 2
274
275#ifdef __cplusplus
276}
277#endif
278
279#endif /* __L2CAP_H */