1/*
2 * bluetooth.h
3 */
4
5/*-
6 * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $Id: ng_bluetooth.h,v 1.4 2003/04/26 22:32:34 max Exp $
31 * $FreeBSD$
32 */
33
34#ifndef _NETGRAPH_BLUETOOTH_H_
35#define _NETGRAPH_BLUETOOTH_H_
36
37#include <sys/queue.h>
38
39/*
40 * Version of the stack
41 */
42
43#define NG_BLUETOOTH_VERSION	1
44
45/*
46 * Declare the base of the Bluetooth sysctl hierarchy,
47 * but only if this file cares about sysctl's
48 */
49
50#ifdef SYSCTL_DECL
51SYSCTL_DECL(_net_bluetooth);
52SYSCTL_DECL(_net_bluetooth_hci);
53SYSCTL_DECL(_net_bluetooth_l2cap);
54SYSCTL_DECL(_net_bluetooth_rfcomm);
55SYSCTL_DECL(_net_bluetooth_sco);
56#endif /* SYSCTL_DECL */
57
58/*
59 * Mbuf qeueue and useful mbufq macros. We do not use ifqueue because we
60 * do not need mutex and other locking stuff
61 */
62
63struct mbuf;
64
65struct ng_bt_mbufq {
66	struct mbuf	*head;   /* first item in the queue */
67	struct mbuf	*tail;   /* last item in the queue */
68	u_int32_t	 len;    /* number of items in the queue */
69	u_int32_t	 maxlen; /* maximal number of items in the queue */
70	u_int32_t	 drops;	 /* number if dropped items */
71};
72typedef struct ng_bt_mbufq	ng_bt_mbufq_t;
73typedef struct ng_bt_mbufq *	ng_bt_mbufq_p;
74
75#define NG_BT_MBUFQ_INIT(q, _maxlen)			\
76	do {						\
77		(q)->head = NULL;			\
78		(q)->tail = NULL;			\
79		(q)->len = 0;				\
80		(q)->maxlen = (_maxlen);		\
81		(q)->drops = 0;				\
82	} while (0)
83
84#define NG_BT_MBUFQ_DESTROY(q)				\
85	do {						\
86		NG_BT_MBUFQ_DRAIN((q));			\
87	} while (0)
88
89#define NG_BT_MBUFQ_FIRST(q)	(q)->head
90
91#define NG_BT_MBUFQ_LEN(q)	(q)->len
92
93#define NG_BT_MBUFQ_FULL(q)	((q)->len >= (q)->maxlen)
94
95#define NG_BT_MBUFQ_DROP(q)	(q)->drops ++
96
97#define NG_BT_MBUFQ_ENQUEUE(q, i)			\
98	do {						\
99		(i)->m_nextpkt = NULL;			\
100							\
101		if ((q)->tail == NULL)			\
102			(q)->head = (i);		\
103		else					\
104			(q)->tail->m_nextpkt = (i);	\
105							\
106		(q)->tail = (i);			\
107		(q)->len ++;				\
108	} while (0)
109
110#define NG_BT_MBUFQ_DEQUEUE(q, i)			\
111	do {						\
112		(i) = (q)->head;			\
113		if ((i) != NULL) {			\
114			(q)->head = (q)->head->m_nextpkt; \
115			if ((q)->head == NULL)		\
116				(q)->tail = NULL;	\
117							\
118			(q)->len --;			\
119			(i)->m_nextpkt = NULL;		\
120		} 					\
121	} while (0)
122
123#define NG_BT_MBUFQ_PREPEND(q, i)			\
124	do {						\
125		(i)->m_nextpkt = (q)->head;		\
126		if ((q)->tail == NULL)			\
127			(q)->tail = (i);		\
128							\
129		(q)->head = (i);			\
130		(q)->len ++;				\
131	} while (0)
132
133#define NG_BT_MBUFQ_DRAIN(q)				\
134	do { 						\
135        	struct mbuf	*m = NULL;		\
136							\
137		for (;;) { 				\
138			NG_BT_MBUFQ_DEQUEUE((q), m);	\
139			if (m == NULL) 			\
140				break; 			\
141							\
142			NG_FREE_M(m);	 		\
143		} 					\
144	} while (0)
145
146/*
147 * Netgraph item queue and useful itemq macros
148 */
149
150struct ng_item;
151
152struct ng_bt_itemq {
153	STAILQ_HEAD(, ng_item)	queue;	/* actually items queue */
154	u_int32_t	 len;    /* number of items in the queue */
155	u_int32_t	 maxlen; /* maximal number of items in the queue */
156	u_int32_t	 drops;  /* number if dropped items */
157};
158typedef struct ng_bt_itemq	ng_bt_itemq_t;
159typedef struct ng_bt_itemq *	ng_bt_itemq_p;
160
161#define NG_BT_ITEMQ_INIT(q, _maxlen)			\
162	do {						\
163		STAILQ_INIT(&(q)->queue);		\
164		(q)->len = 0;				\
165		(q)->maxlen = (_maxlen);		\
166		(q)->drops = 0;				\
167	} while (0)
168
169#define NG_BT_ITEMQ_DESTROY(q)				\
170	do {						\
171		NG_BT_ITEMQ_DRAIN((q));			\
172	} while (0)
173
174#define NG_BT_ITEMQ_FIRST(q)	STAILQ_FIRST(&(q)->queue)
175
176#define NG_BT_ITEMQ_LEN(q)	NG_BT_MBUFQ_LEN((q))
177
178#define NG_BT_ITEMQ_FULL(q)	NG_BT_MBUFQ_FULL((q))
179
180#define NG_BT_ITEMQ_DROP(q)	NG_BT_MBUFQ_DROP((q))
181
182#define NG_BT_ITEMQ_ENQUEUE(q, i)			\
183	do {						\
184		STAILQ_INSERT_TAIL(&(q)->queue, (i), el_next);	\
185		(q)->len ++;				\
186	} while (0)
187
188#define NG_BT_ITEMQ_DEQUEUE(q, i)			\
189	do {						\
190		(i) = STAILQ_FIRST(&(q)->queue);	\
191		if ((i) != NULL) {			\
192			STAILQ_REMOVE_HEAD(&(q)->queue, el_next);	\
193			(q)->len --;			\
194		} 					\
195	} while (0)
196
197#define NG_BT_ITEMQ_PREPEND(q, i)			\
198	do {						\
199		STAILQ_INSERT_HEAD(&(q)->queue, (i), el_next);	\
200		(q)->len ++;				\
201	} while (0)
202
203#define NG_BT_ITEMQ_DRAIN(q)				\
204	do { 						\
205        	struct ng_item	*i = NULL;		\
206							\
207		for (;;) { 				\
208			NG_BT_ITEMQ_DEQUEUE((q), i);	\
209			if (i == NULL) 			\
210				break; 			\
211							\
212			NG_FREE_ITEM(i); 		\
213		} 					\
214	} while (0)
215
216/*
217 * Get Bluetooth stack sysctl globals
218 */
219
220u_int32_t	bluetooth_hci_command_timeout	(void);
221u_int32_t	bluetooth_hci_connect_timeout	(void);
222u_int32_t	bluetooth_hci_max_neighbor_age	(void);
223u_int32_t	bluetooth_l2cap_rtx_timeout	(void);
224u_int32_t	bluetooth_l2cap_ertx_timeout	(void);
225u_int32_t      bluetooth_sco_rtx_timeout       (void);
226
227#endif /* _NETGRAPH_BLUETOOTH_H_ */
228
229