Tizen 2.0 Release
[framework/connectivity/bluez.git] / lib / l2cap.h
1 /*
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
31 extern "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 */
41 struct 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
51 struct 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
62 struct 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 */
112 typedef struct {
113         uint16_t        len;
114         uint16_t        cid;
115 } __attribute__ ((packed)) l2cap_hdr;
116 #define L2CAP_HDR_SIZE 4
117
118 typedef 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
125 typedef struct {
126         uint16_t        reason;
127 } __attribute__ ((packed)) l2cap_cmd_rej;
128 #define L2CAP_CMD_REJ_SIZE 2
129
130 typedef struct {
131         uint16_t        psm;
132         uint16_t        scid;
133 } __attribute__ ((packed)) l2cap_conn_req;
134 #define L2CAP_CONN_REQ_SIZE 4
135
136 typedef 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
156 typedef 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
163 typedef 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
178 typedef 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
205 typedef struct {
206         uint16_t        dcid;
207         uint16_t        scid;
208 } __attribute__ ((packed)) l2cap_disconn_req;
209 #define L2CAP_DISCONN_REQ_SIZE 4
210
211 typedef struct {
212         uint16_t        dcid;
213         uint16_t        scid;
214 } __attribute__ ((packed)) l2cap_disconn_rsp;
215 #define L2CAP_DISCONN_RSP_SIZE 4
216
217 typedef struct {
218         uint16_t        type;
219 } __attribute__ ((packed)) l2cap_info_req;
220 #define L2CAP_INFO_REQ_SIZE 2
221
222 typedef 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
237 typedef 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
244 typedef 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
252 typedef struct {
253         uint16_t        icid;
254         uint8_t         id;
255 } __attribute__ ((packed)) l2cap_move_req;
256 #define L2CAP_MOVE_REQ_SIZE 3
257
258 typedef struct {
259         uint16_t        icid;
260         uint16_t        result;
261 } __attribute__ ((packed)) l2cap_move_rsp;
262 #define L2CAP_MOVE_RSP_SIZE 4
263
264 typedef struct {
265         uint16_t        icid;
266         uint16_t        result;
267 } __attribute__ ((packed)) l2cap_move_cfm;
268 #define L2CAP_MOVE_CFM_SIZE 4
269
270 typedef 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 */