1107120Sjulian/*
2107120Sjulian * ng_btsocket.h
3139823Simp */
4139823Simp
5139823Simp/*-
6107120Sjulian * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
7107120Sjulian * All rights reserved.
8107120Sjulian *
9107120Sjulian * Redistribution and use in source and binary forms, with or without
10107120Sjulian * modification, are permitted provided that the following conditions
11107120Sjulian * are met:
12107120Sjulian * 1. Redistributions of source code must retain the above copyright
13107120Sjulian *    notice, this list of conditions and the following disclaimer.
14107120Sjulian * 2. Redistributions in binary form must reproduce the above copyright
15107120Sjulian *    notice, this list of conditions and the following disclaimer in the
16107120Sjulian *    documentation and/or other materials provided with the distribution.
17107120Sjulian *
18107120Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19107120Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20107120Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21107120Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22107120Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23107120Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24107120Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25107120Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26107120Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27107120Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28107120Sjulian * SUCH DAMAGE.
29107120Sjulian *
30114878Sjulian * $Id: ng_btsocket.h,v 1.8 2003/04/26 22:32:10 max Exp $
31107120Sjulian * $FreeBSD: releng/10.3/sys/netgraph/bluetooth/include/ng_btsocket.h 180399 2008-07-10 00:15:29Z emax $
32107120Sjulian */
33107120Sjulian
34107120Sjulian#ifndef _NETGRAPH_BTSOCKET_H_
35122634Semax#define _NETGRAPH_BTSOCKET_H_
36107120Sjulian
37107120Sjulian/*
38129079Semax * Bluetooth protocols
39107120Sjulian */
40107120Sjulian
41107120Sjulian#define BLUETOOTH_PROTO_HCI	134	/* HCI protocol number */
42107120Sjulian#define BLUETOOTH_PROTO_L2CAP	135	/* L2CAP protocol number */
43114878Sjulian#define BLUETOOTH_PROTO_RFCOMM	136	/* RFCOMM protocol number */
44180399Semax#define BLUETOOTH_PROTO_SCO	137	/* SCO protocol number */
45107120Sjulian
46107120Sjulian/*
47107120Sjulian * Bluetooth version of struct sockaddr for raw HCI sockets
48107120Sjulian */
49107120Sjulian
50107120Sjulianstruct sockaddr_hci {
51107120Sjulian	u_char		hci_len;	/* total length */
52107120Sjulian	u_char		hci_family;	/* address family */
53134057Sjulian	char		hci_node[32];	/* address (size == NG_NODESIZ ) */
54107120Sjulian};
55107120Sjulian
56107120Sjulian/* Raw HCI socket options */
57107120Sjulian#define SOL_HCI_RAW		0x0802	/* socket options level */
58107120Sjulian
59107120Sjulian#define SO_HCI_RAW_FILTER	1	/* get/set filter on socket */
60107120Sjulian#define SO_HCI_RAW_DIRECTION	2	/* turn on/off direction info */
61107120Sjulian#define SCM_HCI_RAW_DIRECTION	SO_HCI_RAW_DIRECTION /* cmsg_type  */
62107120Sjulian
63107120Sjulian/*
64107120Sjulian * Raw HCI socket filter.
65107120Sjulian *
66107120Sjulian * For packet mask use (1 << (HCI packet indicator - 1))
67107120Sjulian * For event mask use (1 << (Event - 1))
68107120Sjulian */
69107120Sjulian
70107120Sjulianstruct ng_btsocket_hci_raw_filter {
71107120Sjulian	bitstr_t	bit_decl(packet_mask, 32);
72107120Sjulian	bitstr_t	bit_decl(event_mask, (NG_HCI_EVENT_MASK_SIZE * 8));
73107120Sjulian};
74107120Sjulian
75107120Sjulian/*
76107120Sjulian * Raw HCI sockets ioctl's
77107120Sjulian */
78107120Sjulian
79107120Sjulian/* Get state */
80107120Sjulianstruct ng_btsocket_hci_raw_node_state {
81107120Sjulian	ng_hci_node_state_ep	state;
82107120Sjulian};
83107120Sjulian#define SIOC_HCI_RAW_NODE_GET_STATE \
84107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_STATE, \
85107120Sjulian		struct ng_btsocket_hci_raw_node_state)
86107120Sjulian
87107120Sjulian/* Initialize */
88107120Sjulian#define SIOC_HCI_RAW_NODE_INIT \
89114878Sjulian	_IO('b', NGM_HCI_NODE_INIT)
90107120Sjulian
91107120Sjulian/* Get/Set debug level */
92107120Sjulianstruct ng_btsocket_hci_raw_node_debug {
93107120Sjulian	ng_hci_node_debug_ep	debug;
94107120Sjulian};
95107120Sjulian#define SIOC_HCI_RAW_NODE_GET_DEBUG \
96107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_DEBUG, \
97107120Sjulian		struct ng_btsocket_hci_raw_node_debug)
98107120Sjulian#define SIOC_HCI_RAW_NODE_SET_DEBUG \
99107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_DEBUG, \
100107120Sjulian		struct ng_btsocket_hci_raw_node_debug)
101107120Sjulian
102107120Sjulian/* Get buffer info */
103107120Sjulianstruct ng_btsocket_hci_raw_node_buffer {
104107120Sjulian	ng_hci_node_buffer_ep	buffer;
105107120Sjulian};
106107120Sjulian#define SIOC_HCI_RAW_NODE_GET_BUFFER \
107107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_BUFFER, \
108107120Sjulian		struct ng_btsocket_hci_raw_node_buffer)
109107120Sjulian
110107120Sjulian/* Get BD_ADDR */
111107120Sjulianstruct ng_btsocket_hci_raw_node_bdaddr {
112107120Sjulian	bdaddr_t	bdaddr;
113107120Sjulian};
114107120Sjulian#define SIOC_HCI_RAW_NODE_GET_BDADDR \
115107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_BDADDR, \
116107120Sjulian		struct ng_btsocket_hci_raw_node_bdaddr)
117107120Sjulian
118107120Sjulian/* Get features */
119107120Sjulianstruct ng_btsocket_hci_raw_node_features {
120107120Sjulian	u_int8_t	features[NG_HCI_FEATURES_SIZE];
121107120Sjulian};
122107120Sjulian#define SIOC_HCI_RAW_NODE_GET_FEATURES \
123107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_FEATURES, \
124107120Sjulian		struct ng_btsocket_hci_raw_node_features)
125107120Sjulian
126107120Sjulian/* Get stat */
127107120Sjulianstruct ng_btsocket_hci_raw_node_stat {
128107120Sjulian	ng_hci_node_stat_ep	stat;
129107120Sjulian};
130107120Sjulian#define SIOC_HCI_RAW_NODE_GET_STAT \
131107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_STAT, \
132107120Sjulian		struct ng_btsocket_hci_raw_node_stat)
133107120Sjulian
134107120Sjulian/* Reset stat */
135107120Sjulian#define SIOC_HCI_RAW_NODE_RESET_STAT \
136114878Sjulian	_IO('b', NGM_HCI_NODE_RESET_STAT)
137107120Sjulian
138107120Sjulian/* Flush neighbor cache */
139107120Sjulian#define SIOC_HCI_RAW_NODE_FLUSH_NEIGHBOR_CACHE \
140114878Sjulian	_IO('b', NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE)
141107120Sjulian
142107120Sjulian/* Get neighbor cache */
143107120Sjulianstruct ng_btsocket_hci_raw_node_neighbor_cache {
144107120Sjulian	u_int32_t				 num_entries;
145107120Sjulian	ng_hci_node_neighbor_cache_entry_ep	*entries;
146107120Sjulian};
147107120Sjulian#define SIOC_HCI_RAW_NODE_GET_NEIGHBOR_CACHE \
148107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_NEIGHBOR_CACHE, \
149107120Sjulian		struct ng_btsocket_hci_raw_node_neighbor_cache)
150107120Sjulian
151107120Sjulian/* Get connection list */
152107120Sjulianstruct ng_btsocket_hci_raw_con_list {
153107120Sjulian	u_int32_t		 num_connections;
154107120Sjulian	ng_hci_node_con_ep	*connections;
155107120Sjulian};
156107120Sjulian#define SIOC_HCI_RAW_NODE_GET_CON_LIST \
157107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_CON_LIST, \
158107120Sjulian		struct ng_btsocket_hci_raw_con_list)
159107120Sjulian
160107120Sjulian/* Get/Set link policy settings mask */
161107120Sjulianstruct ng_btsocket_hci_raw_node_link_policy_mask {
162107120Sjulian	ng_hci_node_link_policy_mask_ep	policy_mask;
163107120Sjulian};
164107120Sjulian#define SIOC_HCI_RAW_NODE_GET_LINK_POLICY_MASK \
165107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK, \
166107120Sjulian		struct ng_btsocket_hci_raw_node_link_policy_mask)
167107120Sjulian#define SIOC_HCI_RAW_NODE_SET_LINK_POLICY_MASK \
168107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK, \
169107120Sjulian		struct ng_btsocket_hci_raw_node_link_policy_mask)
170107120Sjulian
171107120Sjulian/* Get/Set packet mask */
172107120Sjulianstruct ng_btsocket_hci_raw_node_packet_mask {
173107120Sjulian	ng_hci_node_packet_mask_ep	packet_mask;
174107120Sjulian};
175107120Sjulian#define SIOC_HCI_RAW_NODE_GET_PACKET_MASK \
176107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_PACKET_MASK, \
177107120Sjulian		struct ng_btsocket_hci_raw_node_packet_mask)
178107120Sjulian#define SIOC_HCI_RAW_NODE_SET_PACKET_MASK \
179107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_PACKET_MASK, \
180107120Sjulian		struct ng_btsocket_hci_raw_node_packet_mask)
181107120Sjulian
182114878Sjulian/* Get/Set role switch */
183114878Sjulianstruct ng_btsocket_hci_raw_node_role_switch {
184114878Sjulian	ng_hci_node_role_switch_ep	role_switch;
185114878Sjulian};
186114878Sjulian#define SIOC_HCI_RAW_NODE_GET_ROLE_SWITCH \
187114878Sjulian	_IOWR('b', NGM_HCI_NODE_GET_ROLE_SWITCH, \
188114878Sjulian		struct ng_btsocket_hci_raw_node_role_switch)
189114878Sjulian#define SIOC_HCI_RAW_NODE_SET_ROLE_SWITCH \
190114878Sjulian	_IOWR('b', NGM_HCI_NODE_SET_ROLE_SWITCH, \
191114878Sjulian		struct ng_btsocket_hci_raw_node_role_switch)
192114878Sjulian
193158672Semax/* Get list of HCI node names */
194158672Semaxstruct ng_btsocket_hci_raw_node_list_names {
195158672Semax	u_int32_t	 num_names;
196158672Semax	struct nodeinfo	*names;
197158672Semax};
198158672Semax#define SIOC_HCI_RAW_NODE_LIST_NAMES \
199158672Semax	_IOWR('b', NGM_HCI_NODE_LIST_NAMES, \
200158672Semax		struct ng_btsocket_hci_raw_node_list_names)
201158672Semax
202107120Sjulian/*
203107120Sjulian * XXX FIXME: probably does not belong here
204180399Semax * Bluetooth version of struct sockaddr for SCO sockets (SEQPACKET)
205180399Semax */
206180399Semax
207180399Semaxstruct sockaddr_sco {
208180399Semax	u_char		sco_len;	/* total length */
209180399Semax	u_char		sco_family;	/* address family */
210180399Semax	bdaddr_t	sco_bdaddr;	/* address */
211180399Semax};
212180399Semax
213180399Semax/* SCO socket options */
214180399Semax#define SOL_SCO		0x0209		/* socket options level */
215180399Semax
216180399Semax#define SO_SCO_MTU	1		/* get sockets mtu */
217180399Semax#define SO_SCO_CONNINFO	2		/* get HCI connection handle */
218180399Semax
219180399Semax/*
220180399Semax * XXX FIXME: probably does not belong here
221107120Sjulian * Bluetooth version of struct sockaddr for L2CAP sockets (RAW and SEQPACKET)
222107120Sjulian */
223107120Sjulian
224107120Sjulianstruct sockaddr_l2cap {
225107120Sjulian	u_char		l2cap_len;	/* total length */
226107120Sjulian	u_char		l2cap_family;	/* address family */
227107120Sjulian	u_int16_t	l2cap_psm;	/* PSM (Protocol/Service Multiplexor) */
228107120Sjulian	bdaddr_t	l2cap_bdaddr;	/* address */
229107120Sjulian};
230107120Sjulian
231107120Sjulian/* L2CAP socket options */
232107120Sjulian#define SOL_L2CAP		0x1609	/* socket option level */
233107120Sjulian
234107120Sjulian#define SO_L2CAP_IMTU		1	/* get/set incoming MTU */
235107120Sjulian#define SO_L2CAP_OMTU		2	/* get outgoing (peer incoming) MTU */
236107120Sjulian#define SO_L2CAP_IFLOW		3	/* get incoming flow spec. */
237107120Sjulian#define SO_L2CAP_OFLOW		4	/* get/set outgoing flow spec. */
238107120Sjulian#define SO_L2CAP_FLUSH		5	/* get/set flush timeout */
239107120Sjulian
240107120Sjulian/*
241107120Sjulian * Raw L2CAP sockets ioctl's
242107120Sjulian */
243107120Sjulian
244107120Sjulian/* Ping */
245107120Sjulianstruct ng_btsocket_l2cap_raw_ping {
246107120Sjulian	u_int32_t		 result;
247107120Sjulian	u_int32_t		 echo_size;
248107120Sjulian	u_int8_t		*echo_data;
249107120Sjulian};
250107120Sjulian#define SIOC_L2CAP_L2CA_PING \
251107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_PING, \
252107120Sjulian		struct ng_btsocket_l2cap_raw_ping)
253107120Sjulian
254107120Sjulian/* Get info */
255107120Sjulianstruct ng_btsocket_l2cap_raw_get_info {
256107120Sjulian	u_int32_t		 result;
257107120Sjulian	u_int32_t		 info_type;
258107120Sjulian	u_int32_t		 info_size;
259107120Sjulian	u_int8_t		*info_data;
260107120Sjulian};
261107120Sjulian#define SIOC_L2CAP_L2CA_GET_INFO \
262107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_GET_INFO, \
263107120Sjulian		struct ng_btsocket_l2cap_raw_get_info)
264107120Sjulian
265107120Sjulian/* Get flags */
266107120Sjulianstruct ng_btsocket_l2cap_raw_node_flags {
267107120Sjulian	ng_l2cap_node_flags_ep	flags;
268107120Sjulian};
269107120Sjulian#define SIOC_L2CAP_NODE_GET_FLAGS \
270107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_FLAGS, \
271107120Sjulian		struct ng_btsocket_l2cap_raw_node_flags)
272107120Sjulian
273107120Sjulian/* Get/Set debug level */
274107120Sjulianstruct ng_btsocket_l2cap_raw_node_debug {
275107120Sjulian	ng_l2cap_node_debug_ep	debug;
276107120Sjulian};
277107120Sjulian#define SIOC_L2CAP_NODE_GET_DEBUG \
278107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_DEBUG, \
279107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
280107120Sjulian#define SIOC_L2CAP_NODE_SET_DEBUG \
281107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_DEBUG, \
282107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
283107120Sjulian
284107120Sjulian/* Get connection list */
285107120Sjulianstruct ng_btsocket_l2cap_raw_con_list {
286107120Sjulian	u_int32_t		 num_connections;
287107120Sjulian	ng_l2cap_node_con_ep	*connections;
288107120Sjulian};
289107120Sjulian#define SIOC_L2CAP_NODE_GET_CON_LIST \
290107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CON_LIST, \
291107120Sjulian		struct ng_btsocket_l2cap_raw_con_list)
292107120Sjulian
293107120Sjulian/* Get channel list */
294107120Sjulianstruct ng_btsocket_l2cap_raw_chan_list {
295107120Sjulian	u_int32_t		 num_channels;
296107120Sjulian	ng_l2cap_node_chan_ep	*channels;
297107120Sjulian};
298107120Sjulian#define SIOC_L2CAP_NODE_GET_CHAN_LIST \
299107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CHAN_LIST, \
300107120Sjulian		struct ng_btsocket_l2cap_raw_chan_list)
301107120Sjulian
302114878Sjulian/* Get/Set auto disconnect timeout */
303114878Sjulianstruct ng_btsocket_l2cap_raw_auto_discon_timo
304114878Sjulian{
305114878Sjulian	ng_l2cap_node_auto_discon_ep	timeout;
306114878Sjulian};
307114878Sjulian#define SIOC_L2CAP_NODE_GET_AUTO_DISCON_TIMO \
308114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_AUTO_DISCON_TIMO, \
309114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
310114878Sjulian#define SIOC_L2CAP_NODE_SET_AUTO_DISCON_TIMO \
311114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_AUTO_DISCON_TIMO, \
312114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
313114878Sjulian
314114878Sjulian/*
315114878Sjulian * XXX FIXME: probably does not belong here
316114878Sjulian * Bluetooth version of struct sockaddr for RFCOMM sockets (STREAM)
317114878Sjulian */
318114878Sjulian
319114878Sjulianstruct sockaddr_rfcomm {
320114878Sjulian	u_char		rfcomm_len;	/* total length */
321114878Sjulian	u_char		rfcomm_family;	/* address family */
322114878Sjulian	bdaddr_t	rfcomm_bdaddr;	/* address */
323114878Sjulian	u_int8_t	rfcomm_channel;	/* channel */
324114878Sjulian};
325114878Sjulian
326114878Sjulian/* Flow control information */
327114878Sjulianstruct ng_btsocket_rfcomm_fc_info {
328114878Sjulian	u_int8_t	lmodem;		/* modem signals (local) */
329114878Sjulian	u_int8_t	rmodem;		/* modem signals (remote) */
330114878Sjulian	u_int8_t	tx_cred;	/* TX credits */
331114878Sjulian	u_int8_t	rx_cred;	/* RX credits */
332114878Sjulian	u_int8_t	cfc;		/* credit flow control */
333114878Sjulian	u_int8_t	reserved;
334114878Sjulian};
335114878Sjulian
336114878Sjulian/* STREAM RFCOMM socket options */
337114878Sjulian#define SOL_RFCOMM		0x0816	/* socket options level */
338114878Sjulian
339114878Sjulian#define SO_RFCOMM_MTU		1	/* get channel MTU */
340114878Sjulian#define SO_RFCOMM_FC_INFO	2	/* get flow control information */
341114878Sjulian
342107120Sjulian/*
343107120Sjulian * Netgraph node type name and cookie
344107120Sjulian */
345107120Sjulian
346107120Sjulian#define	NG_BTSOCKET_HCI_RAW_NODE_TYPE	"btsock_hci_raw"
347107120Sjulian#define	NG_BTSOCKET_L2CAP_RAW_NODE_TYPE	"btsock_l2c_raw"
348107120Sjulian#define	NG_BTSOCKET_L2CAP_NODE_TYPE	"btsock_l2c"
349180399Semax#define	NG_BTSOCKET_SCO_NODE_TYPE	"btsock_sco"
350107120Sjulian
351107120Sjulian/*
352107120Sjulian * Debug levels
353107120Sjulian */
354107120Sjulian
355107120Sjulian#define NG_BTSOCKET_ALERT_LEVEL	1
356107120Sjulian#define NG_BTSOCKET_ERR_LEVEL	2
357107120Sjulian#define NG_BTSOCKET_WARN_LEVEL	3
358107120Sjulian#define NG_BTSOCKET_INFO_LEVEL	4
359107120Sjulian
360107120Sjulian#endif /* _NETGRAPH_BTSOCKET_H_ */
361107120Sjulian
362