xref: /openbmc/linux/include/net/bluetooth/l2cap.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds    BlueZ - Bluetooth protocol stack for Linux
3*1da177e4SLinus Torvalds    Copyright (C) 2000-2001 Qualcomm Incorporated
4*1da177e4SLinus Torvalds 
5*1da177e4SLinus Torvalds    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6*1da177e4SLinus Torvalds 
7*1da177e4SLinus Torvalds    This program is free software; you can redistribute it and/or modify
8*1da177e4SLinus Torvalds    it under the terms of the GNU General Public License version 2 as
9*1da177e4SLinus Torvalds    published by the Free Software Foundation;
10*1da177e4SLinus Torvalds 
11*1da177e4SLinus Torvalds    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12*1da177e4SLinus Torvalds    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13*1da177e4SLinus Torvalds    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14*1da177e4SLinus Torvalds    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15*1da177e4SLinus Torvalds    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16*1da177e4SLinus Torvalds    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*1da177e4SLinus Torvalds    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*1da177e4SLinus Torvalds    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21*1da177e4SLinus Torvalds    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22*1da177e4SLinus Torvalds    SOFTWARE IS DISCLAIMED.
23*1da177e4SLinus Torvalds */
24*1da177e4SLinus Torvalds 
25*1da177e4SLinus Torvalds #ifndef __L2CAP_H
26*1da177e4SLinus Torvalds #define __L2CAP_H
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds /* L2CAP defaults */
29*1da177e4SLinus Torvalds #define L2CAP_DEFAULT_MTU	672
30*1da177e4SLinus Torvalds #define L2CAP_DEFAULT_FLUSH_TO	0xFFFF
31*1da177e4SLinus Torvalds 
32*1da177e4SLinus Torvalds #define L2CAP_CONN_TIMEOUT	(HZ * 40)
33*1da177e4SLinus Torvalds 
34*1da177e4SLinus Torvalds /* L2CAP socket address */
35*1da177e4SLinus Torvalds struct sockaddr_l2 {
36*1da177e4SLinus Torvalds 	sa_family_t	l2_family;
37*1da177e4SLinus Torvalds 	unsigned short	l2_psm;
38*1da177e4SLinus Torvalds 	bdaddr_t	l2_bdaddr;
39*1da177e4SLinus Torvalds };
40*1da177e4SLinus Torvalds 
41*1da177e4SLinus Torvalds /* L2CAP socket options */
42*1da177e4SLinus Torvalds #define L2CAP_OPTIONS	0x01
43*1da177e4SLinus Torvalds struct l2cap_options {
44*1da177e4SLinus Torvalds 	__u16 omtu;
45*1da177e4SLinus Torvalds 	__u16 imtu;
46*1da177e4SLinus Torvalds 	__u16 flush_to;
47*1da177e4SLinus Torvalds 	__u8  mode;
48*1da177e4SLinus Torvalds };
49*1da177e4SLinus Torvalds 
50*1da177e4SLinus Torvalds #define L2CAP_CONNINFO	0x02
51*1da177e4SLinus Torvalds struct l2cap_conninfo {
52*1da177e4SLinus Torvalds 	__u16 hci_handle;
53*1da177e4SLinus Torvalds 	__u8  dev_class[3];
54*1da177e4SLinus Torvalds };
55*1da177e4SLinus Torvalds 
56*1da177e4SLinus Torvalds #define L2CAP_LM	0x03
57*1da177e4SLinus Torvalds #define L2CAP_LM_MASTER		0x0001
58*1da177e4SLinus Torvalds #define L2CAP_LM_AUTH		0x0002
59*1da177e4SLinus Torvalds #define L2CAP_LM_ENCRYPT	0x0004
60*1da177e4SLinus Torvalds #define L2CAP_LM_TRUSTED	0x0008
61*1da177e4SLinus Torvalds #define L2CAP_LM_RELIABLE	0x0010
62*1da177e4SLinus Torvalds #define L2CAP_LM_SECURE		0x0020
63*1da177e4SLinus Torvalds 
64*1da177e4SLinus Torvalds /* L2CAP command codes */
65*1da177e4SLinus Torvalds #define L2CAP_COMMAND_REJ 0x01
66*1da177e4SLinus Torvalds #define L2CAP_CONN_REQ    0x02
67*1da177e4SLinus Torvalds #define L2CAP_CONN_RSP    0x03
68*1da177e4SLinus Torvalds #define L2CAP_CONF_REQ    0x04
69*1da177e4SLinus Torvalds #define L2CAP_CONF_RSP    0x05
70*1da177e4SLinus Torvalds #define L2CAP_DISCONN_REQ 0x06
71*1da177e4SLinus Torvalds #define L2CAP_DISCONN_RSP 0x07
72*1da177e4SLinus Torvalds #define L2CAP_ECHO_REQ    0x08
73*1da177e4SLinus Torvalds #define L2CAP_ECHO_RSP    0x09
74*1da177e4SLinus Torvalds #define L2CAP_INFO_REQ    0x0a
75*1da177e4SLinus Torvalds #define L2CAP_INFO_RSP    0x0b
76*1da177e4SLinus Torvalds 
77*1da177e4SLinus Torvalds /* L2CAP structures */
78*1da177e4SLinus Torvalds struct l2cap_hdr {
79*1da177e4SLinus Torvalds 	__u16      len;
80*1da177e4SLinus Torvalds 	__u16      cid;
81*1da177e4SLinus Torvalds } __attribute__ ((packed));
82*1da177e4SLinus Torvalds #define L2CAP_HDR_SIZE		4
83*1da177e4SLinus Torvalds 
84*1da177e4SLinus Torvalds struct l2cap_cmd_hdr {
85*1da177e4SLinus Torvalds 	__u8       code;
86*1da177e4SLinus Torvalds 	__u8       ident;
87*1da177e4SLinus Torvalds 	__u16      len;
88*1da177e4SLinus Torvalds } __attribute__ ((packed));
89*1da177e4SLinus Torvalds #define L2CAP_CMD_HDR_SIZE	4
90*1da177e4SLinus Torvalds 
91*1da177e4SLinus Torvalds struct l2cap_cmd_rej {
92*1da177e4SLinus Torvalds 	__u16      reason;
93*1da177e4SLinus Torvalds } __attribute__ ((packed));
94*1da177e4SLinus Torvalds 
95*1da177e4SLinus Torvalds struct l2cap_conn_req {
96*1da177e4SLinus Torvalds 	__u16      psm;
97*1da177e4SLinus Torvalds 	__u16      scid;
98*1da177e4SLinus Torvalds } __attribute__ ((packed));
99*1da177e4SLinus Torvalds 
100*1da177e4SLinus Torvalds struct l2cap_conn_rsp {
101*1da177e4SLinus Torvalds 	__u16      dcid;
102*1da177e4SLinus Torvalds 	__u16      scid;
103*1da177e4SLinus Torvalds 	__u16      result;
104*1da177e4SLinus Torvalds 	__u16      status;
105*1da177e4SLinus Torvalds } __attribute__ ((packed));
106*1da177e4SLinus Torvalds 
107*1da177e4SLinus Torvalds /* connect result */
108*1da177e4SLinus Torvalds #define L2CAP_CR_SUCCESS    0x0000
109*1da177e4SLinus Torvalds #define L2CAP_CR_PEND       0x0001
110*1da177e4SLinus Torvalds #define L2CAP_CR_BAD_PSM    0x0002
111*1da177e4SLinus Torvalds #define L2CAP_CR_SEC_BLOCK  0x0003
112*1da177e4SLinus Torvalds #define L2CAP_CR_NO_MEM     0x0004
113*1da177e4SLinus Torvalds 
114*1da177e4SLinus Torvalds /* connect status */
115*1da177e4SLinus Torvalds #define L2CAP_CS_NO_INFO      0x0000
116*1da177e4SLinus Torvalds #define L2CAP_CS_AUTHEN_PEND  0x0001
117*1da177e4SLinus Torvalds #define L2CAP_CS_AUTHOR_PEND  0x0002
118*1da177e4SLinus Torvalds 
119*1da177e4SLinus Torvalds struct l2cap_conf_req {
120*1da177e4SLinus Torvalds 	__u16      dcid;
121*1da177e4SLinus Torvalds 	__u16      flags;
122*1da177e4SLinus Torvalds 	__u8       data[0];
123*1da177e4SLinus Torvalds } __attribute__ ((packed));
124*1da177e4SLinus Torvalds 
125*1da177e4SLinus Torvalds struct l2cap_conf_rsp {
126*1da177e4SLinus Torvalds 	__u16      scid;
127*1da177e4SLinus Torvalds 	__u16      flags;
128*1da177e4SLinus Torvalds 	__u16      result;
129*1da177e4SLinus Torvalds 	__u8       data[0];
130*1da177e4SLinus Torvalds } __attribute__ ((packed));
131*1da177e4SLinus Torvalds 
132*1da177e4SLinus Torvalds #define L2CAP_CONF_SUCCESS	0x00
133*1da177e4SLinus Torvalds #define L2CAP_CONF_UNACCEPT	0x01
134*1da177e4SLinus Torvalds 
135*1da177e4SLinus Torvalds struct l2cap_conf_opt {
136*1da177e4SLinus Torvalds 	__u8       type;
137*1da177e4SLinus Torvalds 	__u8       len;
138*1da177e4SLinus Torvalds 	__u8       val[0];
139*1da177e4SLinus Torvalds } __attribute__ ((packed));
140*1da177e4SLinus Torvalds #define L2CAP_CONF_OPT_SIZE	2
141*1da177e4SLinus Torvalds 
142*1da177e4SLinus Torvalds #define L2CAP_CONF_MTU		0x01
143*1da177e4SLinus Torvalds #define L2CAP_CONF_FLUSH_TO	0x02
144*1da177e4SLinus Torvalds #define L2CAP_CONF_QOS		0x03
145*1da177e4SLinus Torvalds #define L2CAP_CONF_RFC		0x04
146*1da177e4SLinus Torvalds 
147*1da177e4SLinus Torvalds #define L2CAP_CONF_MAX_SIZE	22
148*1da177e4SLinus Torvalds 
149*1da177e4SLinus Torvalds struct l2cap_disconn_req {
150*1da177e4SLinus Torvalds 	__u16      dcid;
151*1da177e4SLinus Torvalds 	__u16      scid;
152*1da177e4SLinus Torvalds } __attribute__ ((packed));
153*1da177e4SLinus Torvalds 
154*1da177e4SLinus Torvalds struct l2cap_disconn_rsp {
155*1da177e4SLinus Torvalds 	__u16      dcid;
156*1da177e4SLinus Torvalds 	__u16      scid;
157*1da177e4SLinus Torvalds } __attribute__ ((packed));
158*1da177e4SLinus Torvalds 
159*1da177e4SLinus Torvalds struct l2cap_info_req {
160*1da177e4SLinus Torvalds 	__u16       type;
161*1da177e4SLinus Torvalds 	__u8        data[0];
162*1da177e4SLinus Torvalds } __attribute__ ((packed));
163*1da177e4SLinus Torvalds 
164*1da177e4SLinus Torvalds struct l2cap_info_rsp {
165*1da177e4SLinus Torvalds 	__u16       type;
166*1da177e4SLinus Torvalds 	__u16       result;
167*1da177e4SLinus Torvalds 	__u8        data[0];
168*1da177e4SLinus Torvalds } __attribute__ ((packed));
169*1da177e4SLinus Torvalds 
170*1da177e4SLinus Torvalds /* info type */
171*1da177e4SLinus Torvalds #define L2CAP_IT_CL_MTU     0x0001
172*1da177e4SLinus Torvalds #define L2CAP_IT_FEAT_MASK  0x0002
173*1da177e4SLinus Torvalds 
174*1da177e4SLinus Torvalds /* info result */
175*1da177e4SLinus Torvalds #define L2CAP_IR_SUCCESS    0x0000
176*1da177e4SLinus Torvalds #define L2CAP_IR_NOTSUPP    0x0001
177*1da177e4SLinus Torvalds 
178*1da177e4SLinus Torvalds /* ----- L2CAP connections ----- */
179*1da177e4SLinus Torvalds struct l2cap_chan_list {
180*1da177e4SLinus Torvalds 	struct sock	*head;
181*1da177e4SLinus Torvalds 	rwlock_t	lock;
182*1da177e4SLinus Torvalds 	long		num;
183*1da177e4SLinus Torvalds };
184*1da177e4SLinus Torvalds 
185*1da177e4SLinus Torvalds struct l2cap_conn {
186*1da177e4SLinus Torvalds 	struct hci_conn	*hcon;
187*1da177e4SLinus Torvalds 
188*1da177e4SLinus Torvalds 	bdaddr_t	*dst;
189*1da177e4SLinus Torvalds 	bdaddr_t	*src;
190*1da177e4SLinus Torvalds 
191*1da177e4SLinus Torvalds 	unsigned int	mtu;
192*1da177e4SLinus Torvalds 
193*1da177e4SLinus Torvalds 	spinlock_t	lock;
194*1da177e4SLinus Torvalds 
195*1da177e4SLinus Torvalds 	struct sk_buff *rx_skb;
196*1da177e4SLinus Torvalds 	__u32		rx_len;
197*1da177e4SLinus Torvalds 	__u8		rx_ident;
198*1da177e4SLinus Torvalds 	__u8		tx_ident;
199*1da177e4SLinus Torvalds 
200*1da177e4SLinus Torvalds 	struct l2cap_chan_list chan_list;
201*1da177e4SLinus Torvalds };
202*1da177e4SLinus Torvalds 
203*1da177e4SLinus Torvalds /* ----- L2CAP channel and socket info ----- */
204*1da177e4SLinus Torvalds #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
205*1da177e4SLinus Torvalds 
206*1da177e4SLinus Torvalds struct l2cap_pinfo {
207*1da177e4SLinus Torvalds 	struct bt_sock	bt;
208*1da177e4SLinus Torvalds 	__u16		psm;
209*1da177e4SLinus Torvalds 	__u16		dcid;
210*1da177e4SLinus Torvalds 	__u16		scid;
211*1da177e4SLinus Torvalds 
212*1da177e4SLinus Torvalds 	__u16		imtu;
213*1da177e4SLinus Torvalds 	__u16		omtu;
214*1da177e4SLinus Torvalds 	__u16		flush_to;
215*1da177e4SLinus Torvalds 
216*1da177e4SLinus Torvalds 	__u32		link_mode;
217*1da177e4SLinus Torvalds 
218*1da177e4SLinus Torvalds 	__u8		conf_state;
219*1da177e4SLinus Torvalds 	__u8		conf_retry;
220*1da177e4SLinus Torvalds 	__u16		conf_mtu;
221*1da177e4SLinus Torvalds 
222*1da177e4SLinus Torvalds 	__u8		ident;
223*1da177e4SLinus Torvalds 
224*1da177e4SLinus Torvalds 	__u16		sport;
225*1da177e4SLinus Torvalds 
226*1da177e4SLinus Torvalds 	struct l2cap_conn	*conn;
227*1da177e4SLinus Torvalds 	struct sock		*next_c;
228*1da177e4SLinus Torvalds 	struct sock		*prev_c;
229*1da177e4SLinus Torvalds };
230*1da177e4SLinus Torvalds 
231*1da177e4SLinus Torvalds #define L2CAP_CONF_REQ_SENT    0x01
232*1da177e4SLinus Torvalds #define L2CAP_CONF_INPUT_DONE  0x02
233*1da177e4SLinus Torvalds #define L2CAP_CONF_OUTPUT_DONE 0x04
234*1da177e4SLinus Torvalds #define L2CAP_CONF_MAX_RETRIES 2
235*1da177e4SLinus Torvalds 
236*1da177e4SLinus Torvalds void l2cap_load(void);
237*1da177e4SLinus Torvalds 
238*1da177e4SLinus Torvalds #endif /* __L2CAP_H */
239