1107120Sjulian/*
2107120Sjulian * bluetooth.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_bluetooth.h,v 1.4 2003/04/26 22:32:34 max Exp $
31107120Sjulian * $FreeBSD$
32107120Sjulian */
33107120Sjulian
34107120Sjulian#ifndef _NETGRAPH_BLUETOOTH_H_
35122634Semax#define _NETGRAPH_BLUETOOTH_H_
36107120Sjulian
37178228Smav#include <sys/queue.h>
38178228Smav
39107120Sjulian/*
40107120Sjulian * Version of the stack
41107120Sjulian */
42107120Sjulian
43107120Sjulian#define NG_BLUETOOTH_VERSION	1
44107120Sjulian
45107120Sjulian/*
46107120Sjulian * Declare the base of the Bluetooth sysctl hierarchy,
47107120Sjulian * but only if this file cares about sysctl's
48107120Sjulian */
49107120Sjulian
50107120Sjulian#ifdef SYSCTL_DECL
51107120SjulianSYSCTL_DECL(_net_bluetooth);
52107120SjulianSYSCTL_DECL(_net_bluetooth_hci);
53107120SjulianSYSCTL_DECL(_net_bluetooth_l2cap);
54114878SjulianSYSCTL_DECL(_net_bluetooth_rfcomm);
55180399SemaxSYSCTL_DECL(_net_bluetooth_sco);
56107120Sjulian#endif /* SYSCTL_DECL */
57107120Sjulian
58107120Sjulian/*
59107120Sjulian * Mbuf qeueue and useful mbufq macros. We do not use ifqueue because we
60107120Sjulian * do not need mutex and other locking stuff
61107120Sjulian */
62107120Sjulian
63107120Sjulianstruct mbuf;
64107120Sjulian
65107120Sjulianstruct ng_bt_mbufq {
66107120Sjulian	struct mbuf	*head;   /* first item in the queue */
67107120Sjulian	struct mbuf	*tail;   /* last item in the queue */
68107120Sjulian	u_int32_t	 len;    /* number of items in the queue */
69107120Sjulian	u_int32_t	 maxlen; /* maximal number of items in the queue */
70107120Sjulian	u_int32_t	 drops;	 /* number if dropped items */
71107120Sjulian};
72107120Sjuliantypedef struct ng_bt_mbufq	ng_bt_mbufq_t;
73107120Sjuliantypedef struct ng_bt_mbufq *	ng_bt_mbufq_p;
74107120Sjulian
75107120Sjulian#define NG_BT_MBUFQ_INIT(q, _maxlen)			\
76107120Sjulian	do {						\
77107120Sjulian		(q)->head = NULL;			\
78107120Sjulian		(q)->tail = NULL;			\
79107120Sjulian		(q)->len = 0;				\
80107120Sjulian		(q)->maxlen = (_maxlen);		\
81107120Sjulian		(q)->drops = 0;				\
82107120Sjulian	} while (0)
83107120Sjulian
84107120Sjulian#define NG_BT_MBUFQ_DESTROY(q)				\
85107120Sjulian	do {						\
86107120Sjulian		NG_BT_MBUFQ_DRAIN((q));			\
87107120Sjulian	} while (0)
88107120Sjulian
89107120Sjulian#define NG_BT_MBUFQ_FIRST(q)	(q)->head
90107120Sjulian
91107120Sjulian#define NG_BT_MBUFQ_LEN(q)	(q)->len
92107120Sjulian
93114878Sjulian#define NG_BT_MBUFQ_FULL(q)	((q)->len >= (q)->maxlen)
94107120Sjulian
95107120Sjulian#define NG_BT_MBUFQ_DROP(q)	(q)->drops ++
96107120Sjulian
97107120Sjulian#define NG_BT_MBUFQ_ENQUEUE(q, i)			\
98107120Sjulian	do {						\
99107120Sjulian		(i)->m_nextpkt = NULL;			\
100107120Sjulian							\
101107120Sjulian		if ((q)->tail == NULL)			\
102107120Sjulian			(q)->head = (i);		\
103107120Sjulian		else					\
104107120Sjulian			(q)->tail->m_nextpkt = (i);	\
105107120Sjulian							\
106107120Sjulian		(q)->tail = (i);			\
107107120Sjulian		(q)->len ++;				\
108107120Sjulian	} while (0)
109107120Sjulian
110107120Sjulian#define NG_BT_MBUFQ_DEQUEUE(q, i)			\
111107120Sjulian	do {						\
112107120Sjulian		(i) = (q)->head;			\
113107120Sjulian		if ((i) != NULL) {			\
114107120Sjulian			(q)->head = (q)->head->m_nextpkt; \
115107120Sjulian			if ((q)->head == NULL)		\
116107120Sjulian				(q)->tail = NULL;	\
117107120Sjulian							\
118107120Sjulian			(q)->len --;			\
119107120Sjulian			(i)->m_nextpkt = NULL;		\
120107120Sjulian		} 					\
121107120Sjulian	} while (0)
122107120Sjulian
123107120Sjulian#define NG_BT_MBUFQ_PREPEND(q, i)			\
124107120Sjulian	do {						\
125107120Sjulian		(i)->m_nextpkt = (q)->head;		\
126107120Sjulian		if ((q)->tail == NULL)			\
127107120Sjulian			(q)->tail = (i);		\
128107120Sjulian							\
129107120Sjulian		(q)->head = (i);			\
130107120Sjulian		(q)->len ++;				\
131107120Sjulian	} while (0)
132107120Sjulian
133107120Sjulian#define NG_BT_MBUFQ_DRAIN(q)				\
134107120Sjulian	do { 						\
135107120Sjulian        	struct mbuf	*m = NULL;		\
136107120Sjulian							\
137107120Sjulian		for (;;) { 				\
138107120Sjulian			NG_BT_MBUFQ_DEQUEUE((q), m);	\
139107120Sjulian			if (m == NULL) 			\
140107120Sjulian				break; 			\
141107120Sjulian							\
142107120Sjulian			NG_FREE_M(m);	 		\
143107120Sjulian		} 					\
144107120Sjulian	} while (0)
145107120Sjulian
146107120Sjulian/*
147107120Sjulian * Netgraph item queue and useful itemq macros
148107120Sjulian */
149107120Sjulian
150107120Sjulianstruct ng_item;
151107120Sjulian
152107120Sjulianstruct ng_bt_itemq {
153178228Smav	STAILQ_HEAD(, ng_item)	queue;	/* actually items queue */
154107120Sjulian	u_int32_t	 len;    /* number of items in the queue */
155107120Sjulian	u_int32_t	 maxlen; /* maximal number of items in the queue */
156107120Sjulian	u_int32_t	 drops;  /* number if dropped items */
157107120Sjulian};
158107120Sjuliantypedef struct ng_bt_itemq	ng_bt_itemq_t;
159107120Sjuliantypedef struct ng_bt_itemq *	ng_bt_itemq_p;
160107120Sjulian
161178228Smav#define NG_BT_ITEMQ_INIT(q, _maxlen)			\
162178228Smav	do {						\
163178228Smav		STAILQ_INIT(&(q)->queue);		\
164178228Smav		(q)->len = 0;				\
165178228Smav		(q)->maxlen = (_maxlen);		\
166178228Smav		(q)->drops = 0;				\
167178228Smav	} while (0)
168107120Sjulian
169107120Sjulian#define NG_BT_ITEMQ_DESTROY(q)				\
170107120Sjulian	do {						\
171107120Sjulian		NG_BT_ITEMQ_DRAIN((q));			\
172107120Sjulian	} while (0)
173107120Sjulian
174178228Smav#define NG_BT_ITEMQ_FIRST(q)	STAILQ_FIRST(&(q)->queue)
175107120Sjulian
176107120Sjulian#define NG_BT_ITEMQ_LEN(q)	NG_BT_MBUFQ_LEN((q))
177107120Sjulian
178107120Sjulian#define NG_BT_ITEMQ_FULL(q)	NG_BT_MBUFQ_FULL((q))
179107120Sjulian
180107120Sjulian#define NG_BT_ITEMQ_DROP(q)	NG_BT_MBUFQ_DROP((q))
181107120Sjulian
182107120Sjulian#define NG_BT_ITEMQ_ENQUEUE(q, i)			\
183107120Sjulian	do {						\
184178228Smav		STAILQ_INSERT_TAIL(&(q)->queue, (i), el_next);	\
185107120Sjulian		(q)->len ++;				\
186107120Sjulian	} while (0)
187107120Sjulian
188107120Sjulian#define NG_BT_ITEMQ_DEQUEUE(q, i)			\
189107120Sjulian	do {						\
190178228Smav		(i) = STAILQ_FIRST(&(q)->queue);	\
191107120Sjulian		if ((i) != NULL) {			\
192178228Smav			STAILQ_REMOVE_HEAD(&(q)->queue, el_next);	\
193107120Sjulian			(q)->len --;			\
194107120Sjulian		} 					\
195107120Sjulian	} while (0)
196107120Sjulian
197107120Sjulian#define NG_BT_ITEMQ_PREPEND(q, i)			\
198107120Sjulian	do {						\
199178228Smav		STAILQ_INSERT_HEAD(&(q)->queue, (i), el_next);	\
200107120Sjulian		(q)->len ++;				\
201107120Sjulian	} while (0)
202107120Sjulian
203107120Sjulian#define NG_BT_ITEMQ_DRAIN(q)				\
204107120Sjulian	do { 						\
205107120Sjulian        	struct ng_item	*i = NULL;		\
206107120Sjulian							\
207107120Sjulian		for (;;) { 				\
208107120Sjulian			NG_BT_ITEMQ_DEQUEUE((q), i);	\
209107120Sjulian			if (i == NULL) 			\
210107120Sjulian				break; 			\
211107120Sjulian							\
212107120Sjulian			NG_FREE_ITEM(i); 		\
213107120Sjulian		} 					\
214107120Sjulian	} while (0)
215107120Sjulian
216107120Sjulian/*
217107120Sjulian * Get Bluetooth stack sysctl globals
218107120Sjulian */
219107120Sjulian
220107120Sjulianu_int32_t	bluetooth_hci_command_timeout	(void);
221107120Sjulianu_int32_t	bluetooth_hci_connect_timeout	(void);
222107120Sjulianu_int32_t	bluetooth_hci_max_neighbor_age	(void);
223107120Sjulianu_int32_t	bluetooth_l2cap_rtx_timeout	(void);
224107120Sjulianu_int32_t	bluetooth_l2cap_ertx_timeout	(void);
225180399Semaxu_int32_t      bluetooth_sco_rtx_timeout       (void);
226107120Sjulian
227107120Sjulian#endif /* _NETGRAPH_BLUETOOTH_H_ */
228107120Sjulian
229