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