xref: /freebsd-src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h (revision 0fac350c54d0a72f5341e15021efcde63eb58a4b)
1f2bb1caeSJulian Elischer /*
2f2bb1caeSJulian Elischer  * ng_btsocket_rfcomm.h
3c398230bSWarner Losh  */
4c398230bSWarner Losh 
5c398230bSWarner Losh /*-
64d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
7fe267a55SPedro F. Giffuni  *
8f2bb1caeSJulian Elischer  * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
9f2bb1caeSJulian Elischer  * All rights reserved.
10f2bb1caeSJulian Elischer  *
11f2bb1caeSJulian Elischer  * Redistribution and use in source and binary forms, with or without
12f2bb1caeSJulian Elischer  * modification, are permitted provided that the following conditions
13f2bb1caeSJulian Elischer  * are met:
14f2bb1caeSJulian Elischer  * 1. Redistributions of source code must retain the above copyright
15f2bb1caeSJulian Elischer  *    notice, this list of conditions and the following disclaimer.
16f2bb1caeSJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
17f2bb1caeSJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
18f2bb1caeSJulian Elischer  *    documentation and/or other materials provided with the distribution.
19f2bb1caeSJulian Elischer  *
20f2bb1caeSJulian Elischer  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21f2bb1caeSJulian Elischer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22f2bb1caeSJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23f2bb1caeSJulian Elischer  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24f2bb1caeSJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25f2bb1caeSJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26f2bb1caeSJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27f2bb1caeSJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28f2bb1caeSJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29f2bb1caeSJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30f2bb1caeSJulian Elischer  * SUCH DAMAGE.
31f2bb1caeSJulian Elischer  *
32f2bb1caeSJulian Elischer  * $Id: ng_btsocket_rfcomm.h,v 1.10 2003/03/29 22:27:42 max Exp $
33f2bb1caeSJulian Elischer  */
34f2bb1caeSJulian Elischer 
35f2bb1caeSJulian Elischer #ifndef _NETGRAPH_BTSOCKET_RFCOMM_H_
36f21fff6cSMaksim Yevmenkin #define _NETGRAPH_BTSOCKET_RFCOMM_H_
37f2bb1caeSJulian Elischer 
38f2bb1caeSJulian Elischer /*****************************************************************************
39f2bb1caeSJulian Elischer  *****************************************************************************
40f2bb1caeSJulian Elischer  **                              RFCOMM                                     **
41f2bb1caeSJulian Elischer  *****************************************************************************
42f2bb1caeSJulian Elischer  *****************************************************************************/
43f2bb1caeSJulian Elischer 
44f2bb1caeSJulian Elischer /* XXX FIXME this does not belong here */
45f2bb1caeSJulian Elischer 
46980b8b89SMaksim Yevmenkin #define RFCOMM_DEFAULT_MTU		667
47f2bb1caeSJulian Elischer #define RFCOMM_MAX_MTU			1024
48f2bb1caeSJulian Elischer 
49f2bb1caeSJulian Elischer #define RFCOMM_DEFAULT_CREDITS		7
50f2bb1caeSJulian Elischer #define RFCOMM_MAX_CREDITS		40
51f2bb1caeSJulian Elischer 
52f2bb1caeSJulian Elischer /* RFCOMM frame types */
53f2bb1caeSJulian Elischer #define RFCOMM_FRAME_SABM		0x2f
54f2bb1caeSJulian Elischer #define RFCOMM_FRAME_DISC		0x43
55f2bb1caeSJulian Elischer #define RFCOMM_FRAME_UA			0x63
56f2bb1caeSJulian Elischer #define RFCOMM_FRAME_DM			0x0f
57f2bb1caeSJulian Elischer #define RFCOMM_FRAME_UIH		0xef
58f2bb1caeSJulian Elischer 
59f2bb1caeSJulian Elischer /* RFCOMM MCC commands */
60f2bb1caeSJulian Elischer #define RFCOMM_MCC_TEST			0x08 /* Test */
61f2bb1caeSJulian Elischer #define RFCOMM_MCC_FCON			0x28 /* Flow Control on */
62f2bb1caeSJulian Elischer #define RFCOMM_MCC_FCOFF		0x18 /* Flow Control off */
63f2bb1caeSJulian Elischer #define RFCOMM_MCC_MSC			0x38 /* Modem Status Command */
64f2bb1caeSJulian Elischer #define RFCOMM_MCC_RPN			0x24 /* Remote Port Negotiation */
65f2bb1caeSJulian Elischer #define RFCOMM_MCC_RLS			0x14 /* Remote Line Status */
66f2bb1caeSJulian Elischer #define RFCOMM_MCC_PN			0x20 /* Port Negotiation */
67f2bb1caeSJulian Elischer #define RFCOMM_MCC_NSC			0x04 /* Non Supported Command */
68f2bb1caeSJulian Elischer 
69f2bb1caeSJulian Elischer /* RFCOMM modem signals */
70f2bb1caeSJulian Elischer #define RFCOMM_MODEM_FC			0x02 /* Flow Control asserted */
71f2bb1caeSJulian Elischer #define RFCOMM_MODEM_RTC		0x04 /* Ready To Communicate */
72f2bb1caeSJulian Elischer #define RFCOMM_MODEM_RTR		0x08 /* Ready To Receive */
73053359b7SPedro F. Giffuni #define	RFCOMM_MODEM_IC			0x40 /* Incoming Call */
74f2bb1caeSJulian Elischer #define RFCOMM_MODEM_DV			0x80 /* Data Valid */
75f2bb1caeSJulian Elischer 
76f2bb1caeSJulian Elischer /* RPN parameters - baud rate */
77f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_2400		0x0
78f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_4800		0x1
79f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_7200		0x2
80f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_9600		0x3
81f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_19200		0x4
82f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_38400		0x5
83f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_57600		0x6
84f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_115200		0x7
85f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_230400		0x8
86f2bb1caeSJulian Elischer 
87f2bb1caeSJulian Elischer /* RPN parameters - data bits */
88f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_5		0x0
8906acf4bcSMaksim Yevmenkin #define RFCOMM_RPN_DATA_6		0x2
9006acf4bcSMaksim Yevmenkin #define RFCOMM_RPN_DATA_7		0x1
91f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_8		0x3
92f2bb1caeSJulian Elischer 
93f2bb1caeSJulian Elischer /* RPN parameters - stop bit */
94f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_1		0
95f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_15		1
96f2bb1caeSJulian Elischer 
97f2bb1caeSJulian Elischer /* RPN parameters - parity */
98f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_NONE		0x0
99f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_ODD		0x4
100f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_EVEN		0x5
101f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_MARK		0x6
102f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_SPACE		0x7
103f2bb1caeSJulian Elischer 
104f2bb1caeSJulian Elischer /* RPN parameters - flow control */
105f2bb1caeSJulian Elischer #define RFCOMM_RPN_FLOW_NONE		0x00
106f2bb1caeSJulian Elischer #define RFCOMM_RPN_XON_CHAR		0x11
107f2bb1caeSJulian Elischer #define RFCOMM_RPN_XOFF_CHAR		0x13
108f2bb1caeSJulian Elischer 
109f2bb1caeSJulian Elischer /* RPN parameters - mask */
110f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_BITRATE		0x0001
111f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_DATA		0x0002
112f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_STOP		0x0004
113f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_PARITY		0x0008
114f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_PARITY_TYPE	0x0010
115f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_XON		0x0020
116f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_XOFF		0x0040
117f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_FLOW		0x3F00
118f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_ALL		0x3F7F
119f2bb1caeSJulian Elischer 
120f2bb1caeSJulian Elischer /* RFCOMM frame header */
121f2bb1caeSJulian Elischer struct rfcomm_frame_hdr
122f2bb1caeSJulian Elischer {
123f2bb1caeSJulian Elischer 	u_int8_t	address;
124f2bb1caeSJulian Elischer 	u_int8_t	control;
125f2bb1caeSJulian Elischer 	u_int8_t	length;	/* Actual size could be 2 bytes */
126f2bb1caeSJulian Elischer } __attribute__ ((packed));
127f2bb1caeSJulian Elischer 
128f2bb1caeSJulian Elischer /* RFCOMM command frame header */
129f2bb1caeSJulian Elischer struct rfcomm_cmd_hdr
130f2bb1caeSJulian Elischer {
131f2bb1caeSJulian Elischer 	u_int8_t	address;
132f2bb1caeSJulian Elischer 	u_int8_t	control;
133f2bb1caeSJulian Elischer 	u_int8_t	length;
134f2bb1caeSJulian Elischer 	u_int8_t	fcs;
135f2bb1caeSJulian Elischer } __attribute__ ((packed));
136f2bb1caeSJulian Elischer 
137f2bb1caeSJulian Elischer /* RFCOMM MCC command header */
138f2bb1caeSJulian Elischer struct rfcomm_mcc_hdr
139f2bb1caeSJulian Elischer {
140f2bb1caeSJulian Elischer 	u_int8_t	type;
141f2bb1caeSJulian Elischer 	u_int8_t	length; /* XXX FIXME Can actual size be 2 bytes?? */
142f2bb1caeSJulian Elischer } __attribute__ ((packed));
143f2bb1caeSJulian Elischer 
144f2bb1caeSJulian Elischer /* RFCOMM MSC command */
145f2bb1caeSJulian Elischer struct rfcomm_mcc_msc
146f2bb1caeSJulian Elischer {
147f2bb1caeSJulian Elischer 	u_int8_t	address;
148f2bb1caeSJulian Elischer 	u_int8_t	modem;
149f2bb1caeSJulian Elischer } __attribute__ ((packed));
150f2bb1caeSJulian Elischer 
151f2bb1caeSJulian Elischer /* RFCOMM RPN command */
152f2bb1caeSJulian Elischer struct rfcomm_mcc_rpn
153f2bb1caeSJulian Elischer {
154f2bb1caeSJulian Elischer 	u_int8_t	dlci;
155f2bb1caeSJulian Elischer 	u_int8_t	bit_rate;
156f2bb1caeSJulian Elischer 	u_int8_t	line_settings;
157f2bb1caeSJulian Elischer 	u_int8_t	flow_control;
158f2bb1caeSJulian Elischer 	u_int8_t	xon_char;
159f2bb1caeSJulian Elischer 	u_int8_t	xoff_char;
160f2bb1caeSJulian Elischer 	u_int16_t	param_mask;
161f2bb1caeSJulian Elischer } __attribute__ ((packed));
162f2bb1caeSJulian Elischer 
163f2bb1caeSJulian Elischer /* RFCOMM RLS command */
164f2bb1caeSJulian Elischer struct rfcomm_mcc_rls
165f2bb1caeSJulian Elischer {
166f2bb1caeSJulian Elischer 	u_int8_t	address;
167f2bb1caeSJulian Elischer 	u_int8_t	status;
168f2bb1caeSJulian Elischer } __attribute__ ((packed));
169f2bb1caeSJulian Elischer 
170f2bb1caeSJulian Elischer /* RFCOMM PN command */
171f2bb1caeSJulian Elischer struct rfcomm_mcc_pn
172f2bb1caeSJulian Elischer {
173f2bb1caeSJulian Elischer 	u_int8_t	dlci;
174f2bb1caeSJulian Elischer 	u_int8_t	flow_control;
175f2bb1caeSJulian Elischer 	u_int8_t	priority;
176f2bb1caeSJulian Elischer 	u_int8_t	ack_timer;
177f2bb1caeSJulian Elischer 	u_int16_t	mtu;
178f2bb1caeSJulian Elischer 	u_int8_t	max_retrans;
179f2bb1caeSJulian Elischer 	u_int8_t	credits;
180f2bb1caeSJulian Elischer } __attribute__ ((packed));
181f2bb1caeSJulian Elischer 
182f2bb1caeSJulian Elischer /* RFCOMM frame parsing macros */
183f2bb1caeSJulian Elischer #define RFCOMM_DLCI(b)			(((b) & 0xfc) >> 2)
184f2bb1caeSJulian Elischer #define RFCOMM_CHANNEL(b)		(((b) & 0xf8) >> 3)
185f2bb1caeSJulian Elischer #define RFCOMM_DIRECTION(b)		(((b) & 0x04) >> 2)
186f2bb1caeSJulian Elischer #define RFCOMM_TYPE(b)			(((b) & 0xef))
187f2bb1caeSJulian Elischer 
188f2bb1caeSJulian Elischer #define RFCOMM_EA(b)			(((b) & 0x01))
189f2bb1caeSJulian Elischer #define RFCOMM_CR(b)			(((b) & 0x02) >> 1)
190f2bb1caeSJulian Elischer #define RFCOMM_PF(b)			(((b) & 0x10) >> 4)
191f2bb1caeSJulian Elischer 
192f2bb1caeSJulian Elischer #define RFCOMM_SRVCHANNEL(dlci)		((dlci) >> 1)
193f2bb1caeSJulian Elischer 
194f2bb1caeSJulian Elischer #define RFCOMM_MKADDRESS(cr, dlci) \
195f2bb1caeSJulian Elischer 	((((dlci) & 0x3f) << 2) | ((cr) << 1) | 0x01)
196f2bb1caeSJulian Elischer 
197f2bb1caeSJulian Elischer #define RFCOMM_MKCONTROL(type, pf)	((((type) & 0xef) | ((pf) << 4)))
198f2bb1caeSJulian Elischer #define RFCOMM_MKDLCI(dir, channel)	((((channel) & 0x1f) << 1) | (dir))
199f2bb1caeSJulian Elischer 
200f2bb1caeSJulian Elischer #define RFCOMM_MKLEN8(len)		(((len) << 1) | 1)
201f2bb1caeSJulian Elischer #define RFCOMM_MKLEN16(len)		((len) << 1)
202f2bb1caeSJulian Elischer 
203f2bb1caeSJulian Elischer /* RFCOMM MCC macros */
204f2bb1caeSJulian Elischer #define RFCOMM_MCC_TYPE(b)		(((b) & 0xfc) >> 2)
205f2bb1caeSJulian Elischer #define RFCOMM_MCC_LENGTH(b)		(((b) & 0xfe) >> 1)
206f2bb1caeSJulian Elischer #define RFCOMM_MKMCC_TYPE(cr, type)	((((type) << 2) | ((cr) << 1) | 0x01))
207f2bb1caeSJulian Elischer 
208f2bb1caeSJulian Elischer /* RPN macros */
209f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_BITS(line)	((line) & 0x3)
210f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_BITS(line)	(((line) >> 2) & 0x1)
211f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY(line)		(((line) >> 3) & 0x3)
212f2bb1caeSJulian Elischer #define RFCOMM_MKRPN_LINE_SETTINGS(data, stop, parity) \
213f2bb1caeSJulian Elischer 	(((data) & 0x3) | (((stop) & 0x1) << 2) | (((parity) & 0x3) << 3))
214f2bb1caeSJulian Elischer 
215f2bb1caeSJulian Elischer /*****************************************************************************
216f2bb1caeSJulian Elischer  *****************************************************************************
217f2bb1caeSJulian Elischer  **                      SOCK_STREAM RFCOMM sockets                         **
218f2bb1caeSJulian Elischer  *****************************************************************************
219f2bb1caeSJulian Elischer  *****************************************************************************/
220f2bb1caeSJulian Elischer 
221f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SENDSPACE \
222980b8b89SMaksim Yevmenkin 	(RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2)
223f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_RECVSPACE \
224980b8b89SMaksim Yevmenkin 	(RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2)
225f2bb1caeSJulian Elischer 
226f2bb1caeSJulian Elischer /*
227f2bb1caeSJulian Elischer  * Bluetooth RFCOMM session. One L2CAP connection == one RFCOMM session
228f2bb1caeSJulian Elischer  */
229f2bb1caeSJulian Elischer 
230f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_pcb;
231f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_session;
232f2bb1caeSJulian Elischer 
233f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_session {
234f2bb1caeSJulian Elischer 	struct socket				*l2so;	 /* L2CAP socket */
235f2bb1caeSJulian Elischer 
236f2bb1caeSJulian Elischer 	u_int16_t				 state;  /* session state */
237f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CLOSED	 0
238f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_LISTENING	 1
239f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CONNECTING	 2
240f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CONNECTED	 3
241f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_OPEN		 4
242f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING 5
243f2bb1caeSJulian Elischer 
244f2bb1caeSJulian Elischer 	u_int16_t				 flags;  /* session flags */
245f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_INITIATOR	(1 << 0) /* initiator */
246f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_LFC		(1 << 1) /* local flow */
247f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_RFC		(1 << 2) /* remote flow */
248f2bb1caeSJulian Elischer 
249f2bb1caeSJulian Elischer #define INITIATOR(s) \
250f2bb1caeSJulian Elischer 	(((s)->flags & NG_BTSOCKET_RFCOMM_SESSION_INITIATOR)? 1 : 0)
251f2bb1caeSJulian Elischer 
252f2bb1caeSJulian Elischer 	u_int16_t				 mtu;    /* default MTU */
253f2bb1caeSJulian Elischer 	struct ng_bt_mbufq			 outq;   /* outgoing queue */
254f2bb1caeSJulian Elischer 
255f2bb1caeSJulian Elischer 	struct mtx				 session_mtx; /* session lock */
256f2bb1caeSJulian Elischer 	LIST_HEAD(, ng_btsocket_rfcomm_pcb)	 dlcs;	 /* active DLC */
257f2bb1caeSJulian Elischer 
258f2bb1caeSJulian Elischer 	LIST_ENTRY(ng_btsocket_rfcomm_session)	 next;	 /* link to next */
259f2bb1caeSJulian Elischer };
260f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_session	ng_btsocket_rfcomm_session_t;
261f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_session *	ng_btsocket_rfcomm_session_p;
262f2bb1caeSJulian Elischer 
263f2bb1caeSJulian Elischer /*
264f2bb1caeSJulian Elischer  * Bluetooth RFCOMM socket PCB (DLC)
265f2bb1caeSJulian Elischer  */
266f2bb1caeSJulian Elischer 
267f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_pcb {
268f2bb1caeSJulian Elischer 	struct socket				*so;	  /* RFCOMM socket */
269f2bb1caeSJulian Elischer 	struct ng_btsocket_rfcomm_session	*session; /* RFCOMM session */
270f2bb1caeSJulian Elischer 
271f2bb1caeSJulian Elischer 	u_int16_t				 flags;   /* DLC flags */
272f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_TIMO		(1 << 0)  /* timeout pending */
273f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CFC		(1 << 1)  /* credit flow ctrl */
274053359b7SPedro F. Giffuni #define	NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT		(1 << 2)  /* timeout happened */
275f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_DETACHED		(1 << 3)  /* DLC detached */
276f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_SENDING		(1 << 4)  /* send pending */
277f2bb1caeSJulian Elischer 
278f2bb1caeSJulian Elischer 	u_int16_t				 state;   /* DLC state */
279f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CLOSED		0
280f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT	1
281f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONFIGURING	2
282f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONNECTING	3
283f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONNECTED	4
284f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING	5
285f2bb1caeSJulian Elischer 
286f2bb1caeSJulian Elischer 	bdaddr_t				 src;     /* source address */
287f2bb1caeSJulian Elischer 	bdaddr_t				 dst;     /* dest. address */
288f2bb1caeSJulian Elischer 
289f2bb1caeSJulian Elischer 	u_int8_t				 channel; /* RFCOMM channel */
290f2bb1caeSJulian Elischer 	u_int8_t				 dlci;    /* RFCOMM DLCI */
291f2bb1caeSJulian Elischer 
292f2bb1caeSJulian Elischer 	u_int8_t				 lmodem;  /* local mdm signls */
293f2bb1caeSJulian Elischer 	u_int8_t				 rmodem;  /* remote -/- */
294f2bb1caeSJulian Elischer 
295f2bb1caeSJulian Elischer 	u_int16_t				 mtu;	  /* MTU */
296f2bb1caeSJulian Elischer 	int16_t					 rx_cred; /* RX credits */
297f2bb1caeSJulian Elischer 	int16_t					 tx_cred; /* TX credits */
298f2bb1caeSJulian Elischer 
299f2bb1caeSJulian Elischer 	struct mtx				 pcb_mtx; /* PCB lock */
3003d1592efSJohn Baldwin 	struct callout				 timo;    /* timeout */
301f2bb1caeSJulian Elischer 
302f2bb1caeSJulian Elischer 	LIST_ENTRY(ng_btsocket_rfcomm_pcb)	 session_next;/* link to next */
303f2bb1caeSJulian Elischer 	LIST_ENTRY(ng_btsocket_rfcomm_pcb)	 next;	  /* link to next */
304f2bb1caeSJulian Elischer };
305f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_pcb	ng_btsocket_rfcomm_pcb_t;
306f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_pcb *	ng_btsocket_rfcomm_pcb_p;
307f2bb1caeSJulian Elischer 
308f2bb1caeSJulian Elischer #define	so2rfcomm_pcb(so) \
309f2bb1caeSJulian Elischer 	((struct ng_btsocket_rfcomm_pcb *)((so)->so_pcb))
310f2bb1caeSJulian Elischer 
311f2bb1caeSJulian Elischer /*
312f2bb1caeSJulian Elischer  * Bluetooth RFCOMM socket methods
313f2bb1caeSJulian Elischer  */
314f2bb1caeSJulian Elischer 
315f2bb1caeSJulian Elischer #ifdef _KERNEL
316f2bb1caeSJulian Elischer 
317ac45e92fSRobert Watson void ng_btsocket_rfcomm_abort      (struct socket *);
318a152f8a3SRobert Watson void ng_btsocket_rfcomm_close      (struct socket *);
319cfb1e929SGleb Smirnoff int  ng_btsocket_rfcomm_accept     (struct socket *, struct sockaddr *);
320f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_attach     (struct socket *, int, struct thread *);
321f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_bind       (struct socket *, struct sockaddr *,
322f2bb1caeSJulian Elischer                                     struct thread *);
323f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_connect    (struct socket *, struct sockaddr *,
324f2bb1caeSJulian Elischer                                     struct thread *);
325f277746eSGleb Smirnoff int  ng_btsocket_rfcomm_control    (struct socket *, u_long, void *,
326f2bb1caeSJulian Elischer                                     struct ifnet *, struct thread *);
327f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_ctloutput  (struct socket *, struct sockopt *);
328bc725eafSRobert Watson void ng_btsocket_rfcomm_detach     (struct socket *);
329f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_disconnect (struct socket *);
330d374e81eSRobert Watson int  ng_btsocket_rfcomm_listen     (struct socket *, int, struct thread *);
331*0fac350cSGleb Smirnoff int  ng_btsocket_rfcomm_peeraddr   (struct socket *, struct sockaddr *);
332f2bb1caeSJulian Elischer int  ng_btsocket_rfcomm_send       (struct socket *, int, struct mbuf *,
333f2bb1caeSJulian Elischer                                     struct sockaddr *, struct mbuf *,
334f2bb1caeSJulian Elischer                                     struct thread *);
335*0fac350cSGleb Smirnoff int  ng_btsocket_rfcomm_sockaddr   (struct socket *, struct sockaddr *);
336f2bb1caeSJulian Elischer 
337f2bb1caeSJulian Elischer #endif /* _KERNEL */
338f2bb1caeSJulian Elischer 
339f2bb1caeSJulian Elischer #endif /* _NETGRAPH_BTSOCKET_RFCOMM_H_ */
340