ng_btsocket.h revision 158672
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: head/sys/netgraph/bluetooth/include/ng_btsocket.h 158672 2006-05-17 00:13:07Z 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 */
44107120Sjulian
45107120Sjulian/*
46107120Sjulian * Bluetooth version of struct sockaddr for raw HCI sockets
47107120Sjulian */
48107120Sjulian
49107120Sjulianstruct sockaddr_hci {
50107120Sjulian	u_char		hci_len;	/* total length */
51107120Sjulian	u_char		hci_family;	/* address family */
52134057Sjulian	char		hci_node[32];	/* address (size == NG_NODESIZ ) */
53107120Sjulian};
54107120Sjulian
55107120Sjulian/* Raw HCI socket options */
56107120Sjulian#define SOL_HCI_RAW		0x0802	/* socket options level */
57107120Sjulian
58107120Sjulian#define SO_HCI_RAW_FILTER	1	/* get/set filter on socket */
59107120Sjulian#define SO_HCI_RAW_DIRECTION	2	/* turn on/off direction info */
60107120Sjulian#define SCM_HCI_RAW_DIRECTION	SO_HCI_RAW_DIRECTION /* cmsg_type  */
61107120Sjulian
62107120Sjulian/*
63107120Sjulian * Raw HCI socket filter.
64107120Sjulian *
65107120Sjulian * For packet mask use (1 << (HCI packet indicator - 1))
66107120Sjulian * For event mask use (1 << (Event - 1))
67107120Sjulian */
68107120Sjulian
69107120Sjulianstruct ng_btsocket_hci_raw_filter {
70107120Sjulian	bitstr_t	bit_decl(packet_mask, 32);
71107120Sjulian	bitstr_t	bit_decl(event_mask, (NG_HCI_EVENT_MASK_SIZE * 8));
72107120Sjulian};
73107120Sjulian
74107120Sjulian/*
75107120Sjulian * Raw HCI sockets ioctl's
76107120Sjulian */
77107120Sjulian
78107120Sjulian/* Get state */
79107120Sjulianstruct ng_btsocket_hci_raw_node_state {
80107120Sjulian	ng_hci_node_state_ep	state;
81107120Sjulian};
82107120Sjulian#define SIOC_HCI_RAW_NODE_GET_STATE \
83107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_STATE, \
84107120Sjulian		struct ng_btsocket_hci_raw_node_state)
85107120Sjulian
86107120Sjulian/* Initialize */
87107120Sjulian#define SIOC_HCI_RAW_NODE_INIT \
88114878Sjulian	_IO('b', NGM_HCI_NODE_INIT)
89107120Sjulian
90107120Sjulian/* Get/Set debug level */
91107120Sjulianstruct ng_btsocket_hci_raw_node_debug {
92107120Sjulian	ng_hci_node_debug_ep	debug;
93107120Sjulian};
94107120Sjulian#define SIOC_HCI_RAW_NODE_GET_DEBUG \
95107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_DEBUG, \
96107120Sjulian		struct ng_btsocket_hci_raw_node_debug)
97107120Sjulian#define SIOC_HCI_RAW_NODE_SET_DEBUG \
98107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_DEBUG, \
99107120Sjulian		struct ng_btsocket_hci_raw_node_debug)
100107120Sjulian
101107120Sjulian/* Get buffer info */
102107120Sjulianstruct ng_btsocket_hci_raw_node_buffer {
103107120Sjulian	ng_hci_node_buffer_ep	buffer;
104107120Sjulian};
105107120Sjulian#define SIOC_HCI_RAW_NODE_GET_BUFFER \
106107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_BUFFER, \
107107120Sjulian		struct ng_btsocket_hci_raw_node_buffer)
108107120Sjulian
109107120Sjulian/* Get BD_ADDR */
110107120Sjulianstruct ng_btsocket_hci_raw_node_bdaddr {
111107120Sjulian	bdaddr_t	bdaddr;
112107120Sjulian};
113107120Sjulian#define SIOC_HCI_RAW_NODE_GET_BDADDR \
114107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_BDADDR, \
115107120Sjulian		struct ng_btsocket_hci_raw_node_bdaddr)
116107120Sjulian
117107120Sjulian/* Get features */
118107120Sjulianstruct ng_btsocket_hci_raw_node_features {
119107120Sjulian	u_int8_t	features[NG_HCI_FEATURES_SIZE];
120107120Sjulian};
121107120Sjulian#define SIOC_HCI_RAW_NODE_GET_FEATURES \
122107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_FEATURES, \
123107120Sjulian		struct ng_btsocket_hci_raw_node_features)
124107120Sjulian
125107120Sjulian/* Get stat */
126107120Sjulianstruct ng_btsocket_hci_raw_node_stat {
127107120Sjulian	ng_hci_node_stat_ep	stat;
128107120Sjulian};
129107120Sjulian#define SIOC_HCI_RAW_NODE_GET_STAT \
130107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_STAT, \
131107120Sjulian		struct ng_btsocket_hci_raw_node_stat)
132107120Sjulian
133107120Sjulian/* Reset stat */
134107120Sjulian#define SIOC_HCI_RAW_NODE_RESET_STAT \
135114878Sjulian	_IO('b', NGM_HCI_NODE_RESET_STAT)
136107120Sjulian
137107120Sjulian/* Flush neighbor cache */
138107120Sjulian#define SIOC_HCI_RAW_NODE_FLUSH_NEIGHBOR_CACHE \
139114878Sjulian	_IO('b', NGM_HCI_NODE_FLUSH_NEIGHBOR_CACHE)
140107120Sjulian
141107120Sjulian/* Get neighbor cache */
142107120Sjulianstruct ng_btsocket_hci_raw_node_neighbor_cache {
143107120Sjulian	u_int32_t				 num_entries;
144107120Sjulian	ng_hci_node_neighbor_cache_entry_ep	*entries;
145107120Sjulian};
146107120Sjulian#define SIOC_HCI_RAW_NODE_GET_NEIGHBOR_CACHE \
147107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_NEIGHBOR_CACHE, \
148107120Sjulian		struct ng_btsocket_hci_raw_node_neighbor_cache)
149107120Sjulian
150107120Sjulian/* Get connection list */
151107120Sjulianstruct ng_btsocket_hci_raw_con_list {
152107120Sjulian	u_int32_t		 num_connections;
153107120Sjulian	ng_hci_node_con_ep	*connections;
154107120Sjulian};
155107120Sjulian#define SIOC_HCI_RAW_NODE_GET_CON_LIST \
156107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_CON_LIST, \
157107120Sjulian		struct ng_btsocket_hci_raw_con_list)
158107120Sjulian
159107120Sjulian/* Get/Set link policy settings mask */
160107120Sjulianstruct ng_btsocket_hci_raw_node_link_policy_mask {
161107120Sjulian	ng_hci_node_link_policy_mask_ep	policy_mask;
162107120Sjulian};
163107120Sjulian#define SIOC_HCI_RAW_NODE_GET_LINK_POLICY_MASK \
164107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_LINK_POLICY_SETTINGS_MASK, \
165107120Sjulian		struct ng_btsocket_hci_raw_node_link_policy_mask)
166107120Sjulian#define SIOC_HCI_RAW_NODE_SET_LINK_POLICY_MASK \
167107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_LINK_POLICY_SETTINGS_MASK, \
168107120Sjulian		struct ng_btsocket_hci_raw_node_link_policy_mask)
169107120Sjulian
170107120Sjulian/* Get/Set packet mask */
171107120Sjulianstruct ng_btsocket_hci_raw_node_packet_mask {
172107120Sjulian	ng_hci_node_packet_mask_ep	packet_mask;
173107120Sjulian};
174107120Sjulian#define SIOC_HCI_RAW_NODE_GET_PACKET_MASK \
175107120Sjulian	_IOWR('b', NGM_HCI_NODE_GET_PACKET_MASK, \
176107120Sjulian		struct ng_btsocket_hci_raw_node_packet_mask)
177107120Sjulian#define SIOC_HCI_RAW_NODE_SET_PACKET_MASK \
178107120Sjulian	_IOWR('b', NGM_HCI_NODE_SET_PACKET_MASK, \
179107120Sjulian		struct ng_btsocket_hci_raw_node_packet_mask)
180107120Sjulian
181114878Sjulian/* Get/Set role switch */
182114878Sjulianstruct ng_btsocket_hci_raw_node_role_switch {
183114878Sjulian	ng_hci_node_role_switch_ep	role_switch;
184114878Sjulian};
185114878Sjulian#define SIOC_HCI_RAW_NODE_GET_ROLE_SWITCH \
186114878Sjulian	_IOWR('b', NGM_HCI_NODE_GET_ROLE_SWITCH, \
187114878Sjulian		struct ng_btsocket_hci_raw_node_role_switch)
188114878Sjulian#define SIOC_HCI_RAW_NODE_SET_ROLE_SWITCH \
189114878Sjulian	_IOWR('b', NGM_HCI_NODE_SET_ROLE_SWITCH, \
190114878Sjulian		struct ng_btsocket_hci_raw_node_role_switch)
191114878Sjulian
192158672Semax/* Get list of HCI node names */
193158672Semaxstruct ng_btsocket_hci_raw_node_list_names {
194158672Semax	u_int32_t	 num_names;
195158672Semax	struct nodeinfo	*names;
196158672Semax};
197158672Semax#define SIOC_HCI_RAW_NODE_LIST_NAMES \
198158672Semax	_IOWR('b', NGM_HCI_NODE_LIST_NAMES, \
199158672Semax		struct ng_btsocket_hci_raw_node_list_names)
200158672Semax
201107120Sjulian/*
202107120Sjulian * XXX FIXME: probably does not belong here
203107120Sjulian * Bluetooth version of struct sockaddr for L2CAP sockets (RAW and SEQPACKET)
204107120Sjulian */
205107120Sjulian
206107120Sjulianstruct sockaddr_l2cap {
207107120Sjulian	u_char		l2cap_len;	/* total length */
208107120Sjulian	u_char		l2cap_family;	/* address family */
209107120Sjulian	u_int16_t	l2cap_psm;	/* PSM (Protocol/Service Multiplexor) */
210107120Sjulian	bdaddr_t	l2cap_bdaddr;	/* address */
211107120Sjulian};
212107120Sjulian
213107120Sjulian/* L2CAP socket options */
214107120Sjulian#define SOL_L2CAP		0x1609	/* socket option level */
215107120Sjulian
216107120Sjulian#define SO_L2CAP_IMTU		1	/* get/set incoming MTU */
217107120Sjulian#define SO_L2CAP_OMTU		2	/* get outgoing (peer incoming) MTU */
218107120Sjulian#define SO_L2CAP_IFLOW		3	/* get incoming flow spec. */
219107120Sjulian#define SO_L2CAP_OFLOW		4	/* get/set outgoing flow spec. */
220107120Sjulian#define SO_L2CAP_FLUSH		5	/* get/set flush timeout */
221107120Sjulian
222107120Sjulian/*
223107120Sjulian * Raw L2CAP sockets ioctl's
224107120Sjulian */
225107120Sjulian
226107120Sjulian/* Ping */
227107120Sjulianstruct ng_btsocket_l2cap_raw_ping {
228107120Sjulian	u_int32_t		 result;
229107120Sjulian	u_int32_t		 echo_size;
230107120Sjulian	u_int8_t		*echo_data;
231107120Sjulian};
232107120Sjulian#define SIOC_L2CAP_L2CA_PING \
233107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_PING, \
234107120Sjulian		struct ng_btsocket_l2cap_raw_ping)
235107120Sjulian
236107120Sjulian/* Get info */
237107120Sjulianstruct ng_btsocket_l2cap_raw_get_info {
238107120Sjulian	u_int32_t		 result;
239107120Sjulian	u_int32_t		 info_type;
240107120Sjulian	u_int32_t		 info_size;
241107120Sjulian	u_int8_t		*info_data;
242107120Sjulian};
243107120Sjulian#define SIOC_L2CAP_L2CA_GET_INFO \
244107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_GET_INFO, \
245107120Sjulian		struct ng_btsocket_l2cap_raw_get_info)
246107120Sjulian
247107120Sjulian/* Get flags */
248107120Sjulianstruct ng_btsocket_l2cap_raw_node_flags {
249107120Sjulian	ng_l2cap_node_flags_ep	flags;
250107120Sjulian};
251107120Sjulian#define SIOC_L2CAP_NODE_GET_FLAGS \
252107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_FLAGS, \
253107120Sjulian		struct ng_btsocket_l2cap_raw_node_flags)
254107120Sjulian
255107120Sjulian/* Get/Set debug level */
256107120Sjulianstruct ng_btsocket_l2cap_raw_node_debug {
257107120Sjulian	ng_l2cap_node_debug_ep	debug;
258107120Sjulian};
259107120Sjulian#define SIOC_L2CAP_NODE_GET_DEBUG \
260107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_DEBUG, \
261107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
262107120Sjulian#define SIOC_L2CAP_NODE_SET_DEBUG \
263107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_DEBUG, \
264107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
265107120Sjulian
266107120Sjulian/* Get connection list */
267107120Sjulianstruct ng_btsocket_l2cap_raw_con_list {
268107120Sjulian	u_int32_t		 num_connections;
269107120Sjulian	ng_l2cap_node_con_ep	*connections;
270107120Sjulian};
271107120Sjulian#define SIOC_L2CAP_NODE_GET_CON_LIST \
272107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CON_LIST, \
273107120Sjulian		struct ng_btsocket_l2cap_raw_con_list)
274107120Sjulian
275107120Sjulian/* Get channel list */
276107120Sjulianstruct ng_btsocket_l2cap_raw_chan_list {
277107120Sjulian	u_int32_t		 num_channels;
278107120Sjulian	ng_l2cap_node_chan_ep	*channels;
279107120Sjulian};
280107120Sjulian#define SIOC_L2CAP_NODE_GET_CHAN_LIST \
281107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CHAN_LIST, \
282107120Sjulian		struct ng_btsocket_l2cap_raw_chan_list)
283107120Sjulian
284114878Sjulian/* Get/Set auto disconnect timeout */
285114878Sjulianstruct ng_btsocket_l2cap_raw_auto_discon_timo
286114878Sjulian{
287114878Sjulian	ng_l2cap_node_auto_discon_ep	timeout;
288114878Sjulian};
289114878Sjulian#define SIOC_L2CAP_NODE_GET_AUTO_DISCON_TIMO \
290114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_AUTO_DISCON_TIMO, \
291114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
292114878Sjulian#define SIOC_L2CAP_NODE_SET_AUTO_DISCON_TIMO \
293114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_AUTO_DISCON_TIMO, \
294114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
295114878Sjulian
296114878Sjulian/*
297114878Sjulian * XXX FIXME: probably does not belong here
298114878Sjulian * Bluetooth version of struct sockaddr for RFCOMM sockets (STREAM)
299114878Sjulian */
300114878Sjulian
301114878Sjulianstruct sockaddr_rfcomm {
302114878Sjulian	u_char		rfcomm_len;	/* total length */
303114878Sjulian	u_char		rfcomm_family;	/* address family */
304114878Sjulian	bdaddr_t	rfcomm_bdaddr;	/* address */
305114878Sjulian	u_int8_t	rfcomm_channel;	/* channel */
306114878Sjulian};
307114878Sjulian
308114878Sjulian/* Flow control information */
309114878Sjulianstruct ng_btsocket_rfcomm_fc_info {
310114878Sjulian	u_int8_t	lmodem;		/* modem signals (local) */
311114878Sjulian	u_int8_t	rmodem;		/* modem signals (remote) */
312114878Sjulian	u_int8_t	tx_cred;	/* TX credits */
313114878Sjulian	u_int8_t	rx_cred;	/* RX credits */
314114878Sjulian	u_int8_t	cfc;		/* credit flow control */
315114878Sjulian	u_int8_t	reserved;
316114878Sjulian};
317114878Sjulian
318114878Sjulian/* STREAM RFCOMM socket options */
319114878Sjulian#define SOL_RFCOMM		0x0816	/* socket options level */
320114878Sjulian
321114878Sjulian#define SO_RFCOMM_MTU		1	/* get channel MTU */
322114878Sjulian#define SO_RFCOMM_FC_INFO	2	/* get flow control information */
323114878Sjulian
324107120Sjulian/*
325107120Sjulian * Netgraph node type name and cookie
326107120Sjulian */
327107120Sjulian
328107120Sjulian#define	NG_BTSOCKET_HCI_RAW_NODE_TYPE	"btsock_hci_raw"
329107120Sjulian#define	NG_BTSOCKET_L2CAP_RAW_NODE_TYPE	"btsock_l2c_raw"
330107120Sjulian#define	NG_BTSOCKET_L2CAP_NODE_TYPE	"btsock_l2c"
331107120Sjulian
332107120Sjulian/*
333107120Sjulian * Debug levels
334107120Sjulian */
335107120Sjulian
336107120Sjulian#define NG_BTSOCKET_ALERT_LEVEL	1
337107120Sjulian#define NG_BTSOCKET_ERR_LEVEL	2
338107120Sjulian#define NG_BTSOCKET_WARN_LEVEL	3
339107120Sjulian#define NG_BTSOCKET_INFO_LEVEL	4
340107120Sjulian
341107120Sjulian#endif /* _NETGRAPH_BTSOCKET_H_ */
342107120Sjulian
343