• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  *
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23  *
24  */
25 
26 #ifndef __L2CAP_H
27 #define __L2CAP_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/socket.h>
34 
35 /* L2CAP defaults */
36 #define L2CAP_DEFAULT_MTU	672
37 #define L2CAP_DEFAULT_FLUSH_TO	0xFFFF
38 
39 /* L2CAP socket address */
40 struct sockaddr_l2 {
41 	sa_family_t	l2_family;
42 	unsigned short	l2_psm;
43 	bdaddr_t	l2_bdaddr;
44 	unsigned short	l2_cid;
45 };
46 
47 /* L2CAP socket options */
48 #define L2CAP_OPTIONS	0x01
49 struct l2cap_options {
50 	uint16_t	omtu;
51 	uint16_t	imtu;
52 	uint16_t	flush_to;
53 	uint8_t		mode;
54 	uint8_t		fcs;
55 	uint8_t		max_tx;
56 	uint16_t	txwin_size;
57 };
58 
59 #define L2CAP_CONNINFO	0x02
60 struct l2cap_conninfo {
61 	uint16_t	hci_handle;
62 	uint8_t		dev_class[3];
63 };
64 
65 #define L2CAP_LM	0x03
66 #define L2CAP_LM_MASTER		0x0001
67 #define L2CAP_LM_AUTH		0x0002
68 #define L2CAP_LM_ENCRYPT	0x0004
69 #define L2CAP_LM_TRUSTED	0x0008
70 #define L2CAP_LM_RELIABLE	0x0010
71 #define L2CAP_LM_SECURE		0x0020
72 
73 /* L2CAP command codes */
74 #define L2CAP_COMMAND_REJ	0x01
75 #define L2CAP_CONN_REQ		0x02
76 #define L2CAP_CONN_RSP		0x03
77 #define L2CAP_CONF_REQ		0x04
78 #define L2CAP_CONF_RSP		0x05
79 #define L2CAP_DISCONN_REQ	0x06
80 #define L2CAP_DISCONN_RSP	0x07
81 #define L2CAP_ECHO_REQ		0x08
82 #define L2CAP_ECHO_RSP		0x09
83 #define L2CAP_INFO_REQ		0x0a
84 #define L2CAP_INFO_RSP		0x0b
85 
86 /* L2CAP structures */
87 typedef struct {
88 	uint16_t	len;
89 	uint16_t	cid;
90 } __attribute__ ((packed)) l2cap_hdr;
91 #define L2CAP_HDR_SIZE 4
92 
93 typedef struct {
94 	uint8_t		code;
95 	uint8_t		ident;
96 	uint16_t	len;
97 } __attribute__ ((packed)) l2cap_cmd_hdr;
98 #define L2CAP_CMD_HDR_SIZE 4
99 
100 typedef struct {
101 	uint16_t	reason;
102 } __attribute__ ((packed)) l2cap_cmd_rej;
103 #define L2CAP_CMD_REJ_SIZE 2
104 
105 typedef struct {
106 	uint16_t	psm;
107 	uint16_t	scid;
108 } __attribute__ ((packed)) l2cap_conn_req;
109 #define L2CAP_CONN_REQ_SIZE 4
110 
111 typedef struct {
112 	uint16_t	dcid;
113 	uint16_t	scid;
114 	uint16_t	result;
115 	uint16_t	status;
116 } __attribute__ ((packed)) l2cap_conn_rsp;
117 #define L2CAP_CONN_RSP_SIZE 8
118 
119 /* connect result */
120 #define L2CAP_CR_SUCCESS	0x0000
121 #define L2CAP_CR_PEND		0x0001
122 #define L2CAP_CR_BAD_PSM	0x0002
123 #define L2CAP_CR_SEC_BLOCK	0x0003
124 #define L2CAP_CR_NO_MEM		0x0004
125 
126 /* connect status */
127 #define L2CAP_CS_NO_INFO	0x0000
128 #define L2CAP_CS_AUTHEN_PEND	0x0001
129 #define L2CAP_CS_AUTHOR_PEND	0x0002
130 
131 typedef struct {
132 	uint16_t	dcid;
133 	uint16_t	flags;
134 	uint8_t		data[0];
135 } __attribute__ ((packed)) l2cap_conf_req;
136 #define L2CAP_CONF_REQ_SIZE 4
137 
138 typedef struct {
139 	uint16_t	scid;
140 	uint16_t	flags;
141 	uint16_t	result;
142 	uint8_t		data[0];
143 } __attribute__ ((packed)) l2cap_conf_rsp;
144 #define L2CAP_CONF_RSP_SIZE 6
145 
146 #define L2CAP_CONF_SUCCESS	0x0000
147 #define L2CAP_CONF_UNACCEPT	0x0001
148 #define L2CAP_CONF_REJECT	0x0002
149 #define L2CAP_CONF_UNKNOWN	0x0003
150 
151 typedef struct {
152 	uint8_t		type;
153 	uint8_t		len;
154 	uint8_t		val[0];
155 } __attribute__ ((packed)) l2cap_conf_opt;
156 #define L2CAP_CONF_OPT_SIZE 2
157 
158 #define L2CAP_CONF_MTU		0x01
159 #define L2CAP_CONF_FLUSH_TO	0x02
160 #define L2CAP_CONF_QOS		0x03
161 #define L2CAP_CONF_RFC		0x04
162 #define L2CAP_CONF_FCS		0x05
163 
164 #define L2CAP_CONF_MAX_SIZE	22
165 
166 #define L2CAP_MODE_BASIC	0x00
167 #define L2CAP_MODE_RETRANS	0x01
168 #define L2CAP_MODE_FLOWCTL	0x02
169 #define L2CAP_MODE_ERTM		0x03
170 #define L2CAP_MODE_STREAMING	0x04
171 
172 typedef struct {
173 	uint16_t	dcid;
174 	uint16_t	scid;
175 } __attribute__ ((packed)) l2cap_disconn_req;
176 #define L2CAP_DISCONN_REQ_SIZE 4
177 
178 typedef struct {
179 	uint16_t	dcid;
180 	uint16_t	scid;
181 } __attribute__ ((packed)) l2cap_disconn_rsp;
182 #define L2CAP_DISCONN_RSP_SIZE 4
183 
184 typedef struct {
185 	uint16_t	type;
186 } __attribute__ ((packed)) l2cap_info_req;
187 #define L2CAP_INFO_REQ_SIZE 2
188 
189 typedef struct {
190 	uint16_t	type;
191 	uint16_t	result;
192 	uint8_t		data[0];
193 } __attribute__ ((packed)) l2cap_info_rsp;
194 #define L2CAP_INFO_RSP_SIZE 4
195 
196 /* info type */
197 #define L2CAP_IT_CL_MTU		0x0001
198 #define L2CAP_IT_FEAT_MASK	0x0002
199 
200 /* info result */
201 #define L2CAP_IR_SUCCESS	0x0000
202 #define L2CAP_IR_NOTSUPP	0x0001
203 
204 #ifdef __cplusplus
205 }
206 #endif
207 
208 #endif /* __L2CAP_H */
209