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$
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
224281198Stakawatastruct sockaddr_l2cap_compat {
225281198Stakawata	u_char		l2cap_len;	/* total length */
226281198Stakawata	u_char		l2cap_family;	/* address family */
227281198Stakawata	u_int16_t	l2cap_psm;	/* PSM (Protocol/Service Multiplexor) */
228281198Stakawata	bdaddr_t	l2cap_bdaddr;	/* address */
229281198Stakawata};
230281198Stakawata
231281198Stakawata#define BDADDR_BREDR 0
232281198Stakawata#define BDADDR_LE_PUBLIC 1
233281198Stakawata#define BDADDR_LE_RANDOM 2
234281198Stakawata
235107120Sjulianstruct sockaddr_l2cap {
236107120Sjulian	u_char		l2cap_len;	/* total length */
237107120Sjulian	u_char		l2cap_family;	/* address family */
238107120Sjulian	u_int16_t	l2cap_psm;	/* PSM (Protocol/Service Multiplexor) */
239107120Sjulian	bdaddr_t	l2cap_bdaddr;	/* address */
240281198Stakawata	u_int16_t	l2cap_cid;      /*cid*/
241281198Stakawata	u_int8_t	l2cap_bdaddr_type; /*address type*/
242107120Sjulian};
243107120Sjulian
244281198Stakawata
245281198Stakawata#if !defined(L2CAP_SOCKET_CHECKED) && !defined(_KERNEL)
246281198Stakawata#warning "Make sure new member of socket address initialized"
247281198Stakawata#endif
248281198Stakawata
249281198Stakawata
250107120Sjulian/* L2CAP socket options */
251107120Sjulian#define SOL_L2CAP		0x1609	/* socket option level */
252107120Sjulian
253107120Sjulian#define SO_L2CAP_IMTU		1	/* get/set incoming MTU */
254107120Sjulian#define SO_L2CAP_OMTU		2	/* get outgoing (peer incoming) MTU */
255107120Sjulian#define SO_L2CAP_IFLOW		3	/* get incoming flow spec. */
256107120Sjulian#define SO_L2CAP_OFLOW		4	/* get/set outgoing flow spec. */
257107120Sjulian#define SO_L2CAP_FLUSH		5	/* get/set flush timeout */
258290038Stakawata#define SO_L2CAP_ENCRYPTED      6      /* get/set whether wait for encryptin on connect */
259107120Sjulian/*
260107120Sjulian * Raw L2CAP sockets ioctl's
261107120Sjulian */
262107120Sjulian
263107120Sjulian/* Ping */
264107120Sjulianstruct ng_btsocket_l2cap_raw_ping {
265107120Sjulian	u_int32_t		 result;
266107120Sjulian	u_int32_t		 echo_size;
267107120Sjulian	u_int8_t		*echo_data;
268107120Sjulian};
269107120Sjulian#define SIOC_L2CAP_L2CA_PING \
270107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_PING, \
271107120Sjulian		struct ng_btsocket_l2cap_raw_ping)
272107120Sjulian
273107120Sjulian/* Get info */
274107120Sjulianstruct ng_btsocket_l2cap_raw_get_info {
275107120Sjulian	u_int32_t		 result;
276107120Sjulian	u_int32_t		 info_type;
277107120Sjulian	u_int32_t		 info_size;
278107120Sjulian	u_int8_t		*info_data;
279107120Sjulian};
280107120Sjulian#define SIOC_L2CAP_L2CA_GET_INFO \
281107120Sjulian	_IOWR('b', NGM_L2CAP_L2CA_GET_INFO, \
282107120Sjulian		struct ng_btsocket_l2cap_raw_get_info)
283107120Sjulian
284107120Sjulian/* Get flags */
285107120Sjulianstruct ng_btsocket_l2cap_raw_node_flags {
286107120Sjulian	ng_l2cap_node_flags_ep	flags;
287107120Sjulian};
288107120Sjulian#define SIOC_L2CAP_NODE_GET_FLAGS \
289107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_FLAGS, \
290107120Sjulian		struct ng_btsocket_l2cap_raw_node_flags)
291107120Sjulian
292107120Sjulian/* Get/Set debug level */
293107120Sjulianstruct ng_btsocket_l2cap_raw_node_debug {
294107120Sjulian	ng_l2cap_node_debug_ep	debug;
295107120Sjulian};
296107120Sjulian#define SIOC_L2CAP_NODE_GET_DEBUG \
297107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_DEBUG, \
298107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
299107120Sjulian#define SIOC_L2CAP_NODE_SET_DEBUG \
300107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_DEBUG, \
301107120Sjulian		struct ng_btsocket_l2cap_raw_node_debug)
302107120Sjulian
303107120Sjulian/* Get connection list */
304107120Sjulianstruct ng_btsocket_l2cap_raw_con_list {
305107120Sjulian	u_int32_t		 num_connections;
306107120Sjulian	ng_l2cap_node_con_ep	*connections;
307107120Sjulian};
308107120Sjulian#define SIOC_L2CAP_NODE_GET_CON_LIST \
309107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CON_LIST, \
310107120Sjulian		struct ng_btsocket_l2cap_raw_con_list)
311107120Sjulian
312107120Sjulian/* Get channel list */
313107120Sjulianstruct ng_btsocket_l2cap_raw_chan_list {
314107120Sjulian	u_int32_t		 num_channels;
315107120Sjulian	ng_l2cap_node_chan_ep	*channels;
316107120Sjulian};
317107120Sjulian#define SIOC_L2CAP_NODE_GET_CHAN_LIST \
318107120Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_CHAN_LIST, \
319107120Sjulian		struct ng_btsocket_l2cap_raw_chan_list)
320107120Sjulian
321114878Sjulian/* Get/Set auto disconnect timeout */
322114878Sjulianstruct ng_btsocket_l2cap_raw_auto_discon_timo
323114878Sjulian{
324114878Sjulian	ng_l2cap_node_auto_discon_ep	timeout;
325114878Sjulian};
326114878Sjulian#define SIOC_L2CAP_NODE_GET_AUTO_DISCON_TIMO \
327114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_GET_AUTO_DISCON_TIMO, \
328114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
329114878Sjulian#define SIOC_L2CAP_NODE_SET_AUTO_DISCON_TIMO \
330114878Sjulian	_IOWR('b', NGM_L2CAP_NODE_SET_AUTO_DISCON_TIMO, \
331114878Sjulian		struct ng_btsocket_l2cap_raw_auto_discon_timo)
332114878Sjulian
333114878Sjulian/*
334114878Sjulian * XXX FIXME: probably does not belong here
335114878Sjulian * Bluetooth version of struct sockaddr for RFCOMM sockets (STREAM)
336114878Sjulian */
337114878Sjulian
338114878Sjulianstruct sockaddr_rfcomm {
339114878Sjulian	u_char		rfcomm_len;	/* total length */
340114878Sjulian	u_char		rfcomm_family;	/* address family */
341114878Sjulian	bdaddr_t	rfcomm_bdaddr;	/* address */
342114878Sjulian	u_int8_t	rfcomm_channel;	/* channel */
343114878Sjulian};
344114878Sjulian
345114878Sjulian/* Flow control information */
346114878Sjulianstruct ng_btsocket_rfcomm_fc_info {
347114878Sjulian	u_int8_t	lmodem;		/* modem signals (local) */
348114878Sjulian	u_int8_t	rmodem;		/* modem signals (remote) */
349114878Sjulian	u_int8_t	tx_cred;	/* TX credits */
350114878Sjulian	u_int8_t	rx_cred;	/* RX credits */
351114878Sjulian	u_int8_t	cfc;		/* credit flow control */
352114878Sjulian	u_int8_t	reserved;
353114878Sjulian};
354114878Sjulian
355114878Sjulian/* STREAM RFCOMM socket options */
356114878Sjulian#define SOL_RFCOMM		0x0816	/* socket options level */
357114878Sjulian
358114878Sjulian#define SO_RFCOMM_MTU		1	/* get channel MTU */
359114878Sjulian#define SO_RFCOMM_FC_INFO	2	/* get flow control information */
360114878Sjulian
361107120Sjulian/*
362107120Sjulian * Netgraph node type name and cookie
363107120Sjulian */
364107120Sjulian
365107120Sjulian#define	NG_BTSOCKET_HCI_RAW_NODE_TYPE	"btsock_hci_raw"
366107120Sjulian#define	NG_BTSOCKET_L2CAP_RAW_NODE_TYPE	"btsock_l2c_raw"
367107120Sjulian#define	NG_BTSOCKET_L2CAP_NODE_TYPE	"btsock_l2c"
368180399Semax#define	NG_BTSOCKET_SCO_NODE_TYPE	"btsock_sco"
369107120Sjulian
370107120Sjulian/*
371107120Sjulian * Debug levels
372107120Sjulian */
373107120Sjulian
374107120Sjulian#define NG_BTSOCKET_ALERT_LEVEL	1
375107120Sjulian#define NG_BTSOCKET_ERR_LEVEL	2
376107120Sjulian#define NG_BTSOCKET_WARN_LEVEL	3
377107120Sjulian#define NG_BTSOCKET_INFO_LEVEL	4
378107120Sjulian
379107120Sjulian#endif /* _NETGRAPH_BTSOCKET_H_ */
380107120Sjulian
381