1878ed226SJulian Elischer /* 2878ed226SJulian Elischer * bluetooth.h 3c398230bSWarner Losh */ 4c398230bSWarner Losh 5c398230bSWarner Losh /*- 6878ed226SJulian Elischer * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com> 7878ed226SJulian Elischer * All rights reserved. 8878ed226SJulian Elischer * 9878ed226SJulian Elischer * Redistribution and use in source and binary forms, with or without 10878ed226SJulian Elischer * modification, are permitted provided that the following conditions 11878ed226SJulian Elischer * are met: 12878ed226SJulian Elischer * 1. Redistributions of source code must retain the above copyright 13878ed226SJulian Elischer * notice, this list of conditions and the following disclaimer. 14878ed226SJulian Elischer * 2. Redistributions in binary form must reproduce the above copyright 15878ed226SJulian Elischer * notice, this list of conditions and the following disclaimer in the 16878ed226SJulian Elischer * documentation and/or other materials provided with the distribution. 17878ed226SJulian Elischer * 18878ed226SJulian Elischer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19878ed226SJulian Elischer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20878ed226SJulian Elischer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21878ed226SJulian Elischer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22878ed226SJulian Elischer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23878ed226SJulian Elischer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24878ed226SJulian Elischer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25878ed226SJulian Elischer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26878ed226SJulian Elischer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27878ed226SJulian Elischer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28878ed226SJulian Elischer * SUCH DAMAGE. 29878ed226SJulian Elischer * 30f2bb1caeSJulian Elischer * $Id: ng_bluetooth.h,v 1.4 2003/04/26 22:32:34 max Exp $ 31878ed226SJulian Elischer * $FreeBSD$ 32878ed226SJulian Elischer */ 33878ed226SJulian Elischer 34878ed226SJulian Elischer #ifndef _NETGRAPH_BLUETOOTH_H_ 35f21fff6cSMaksim Yevmenkin #define _NETGRAPH_BLUETOOTH_H_ 36878ed226SJulian Elischer 379852972bSAlexander Motin #include <sys/queue.h> 389852972bSAlexander Motin 39878ed226SJulian Elischer /* 40878ed226SJulian Elischer * Version of the stack 41878ed226SJulian Elischer */ 42878ed226SJulian Elischer 43878ed226SJulian Elischer #define NG_BLUETOOTH_VERSION 1 44878ed226SJulian Elischer 45878ed226SJulian Elischer /* 46878ed226SJulian Elischer * Declare the base of the Bluetooth sysctl hierarchy, 47878ed226SJulian Elischer * but only if this file cares about sysctl's 48878ed226SJulian Elischer */ 49878ed226SJulian Elischer 50878ed226SJulian Elischer #ifdef SYSCTL_DECL 51878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth); 52878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth_hci); 53878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth_l2cap); 54f2bb1caeSJulian Elischer SYSCTL_DECL(_net_bluetooth_rfcomm); 55fb8bcdc0SMaksim Yevmenkin SYSCTL_DECL(_net_bluetooth_sco); 56878ed226SJulian Elischer #endif /* SYSCTL_DECL */ 57878ed226SJulian Elischer 58878ed226SJulian Elischer /* 59878ed226SJulian Elischer * Mbuf qeueue and useful mbufq macros. We do not use ifqueue because we 60878ed226SJulian Elischer * do not need mutex and other locking stuff 61878ed226SJulian Elischer */ 62878ed226SJulian Elischer 63878ed226SJulian Elischer struct mbuf; 64878ed226SJulian Elischer 65878ed226SJulian Elischer struct ng_bt_mbufq { 66878ed226SJulian Elischer struct mbuf *head; /* first item in the queue */ 67878ed226SJulian Elischer struct mbuf *tail; /* last item in the queue */ 68878ed226SJulian Elischer u_int32_t len; /* number of items in the queue */ 69878ed226SJulian Elischer u_int32_t maxlen; /* maximal number of items in the queue */ 70878ed226SJulian Elischer u_int32_t drops; /* number if dropped items */ 71878ed226SJulian Elischer }; 72878ed226SJulian Elischer typedef struct ng_bt_mbufq ng_bt_mbufq_t; 73878ed226SJulian Elischer typedef struct ng_bt_mbufq * ng_bt_mbufq_p; 74878ed226SJulian Elischer 75878ed226SJulian Elischer #define NG_BT_MBUFQ_INIT(q, _maxlen) \ 76878ed226SJulian Elischer do { \ 77878ed226SJulian Elischer (q)->head = NULL; \ 78878ed226SJulian Elischer (q)->tail = NULL; \ 79878ed226SJulian Elischer (q)->len = 0; \ 80878ed226SJulian Elischer (q)->maxlen = (_maxlen); \ 81878ed226SJulian Elischer (q)->drops = 0; \ 82878ed226SJulian Elischer } while (0) 83878ed226SJulian Elischer 84878ed226SJulian Elischer #define NG_BT_MBUFQ_DESTROY(q) \ 85878ed226SJulian Elischer do { \ 86878ed226SJulian Elischer NG_BT_MBUFQ_DRAIN((q)); \ 87878ed226SJulian Elischer } while (0) 88878ed226SJulian Elischer 89878ed226SJulian Elischer #define NG_BT_MBUFQ_FIRST(q) (q)->head 90878ed226SJulian Elischer 91878ed226SJulian Elischer #define NG_BT_MBUFQ_LEN(q) (q)->len 92878ed226SJulian Elischer 93f2bb1caeSJulian Elischer #define NG_BT_MBUFQ_FULL(q) ((q)->len >= (q)->maxlen) 94878ed226SJulian Elischer 95878ed226SJulian Elischer #define NG_BT_MBUFQ_DROP(q) (q)->drops ++ 96878ed226SJulian Elischer 97878ed226SJulian Elischer #define NG_BT_MBUFQ_ENQUEUE(q, i) \ 98878ed226SJulian Elischer do { \ 99878ed226SJulian Elischer (i)->m_nextpkt = NULL; \ 100878ed226SJulian Elischer \ 101878ed226SJulian Elischer if ((q)->tail == NULL) \ 102878ed226SJulian Elischer (q)->head = (i); \ 103878ed226SJulian Elischer else \ 104878ed226SJulian Elischer (q)->tail->m_nextpkt = (i); \ 105878ed226SJulian Elischer \ 106878ed226SJulian Elischer (q)->tail = (i); \ 107878ed226SJulian Elischer (q)->len ++; \ 108878ed226SJulian Elischer } while (0) 109878ed226SJulian Elischer 110878ed226SJulian Elischer #define NG_BT_MBUFQ_DEQUEUE(q, i) \ 111878ed226SJulian Elischer do { \ 112878ed226SJulian Elischer (i) = (q)->head; \ 113878ed226SJulian Elischer if ((i) != NULL) { \ 114878ed226SJulian Elischer (q)->head = (q)->head->m_nextpkt; \ 115878ed226SJulian Elischer if ((q)->head == NULL) \ 116878ed226SJulian Elischer (q)->tail = NULL; \ 117878ed226SJulian Elischer \ 118878ed226SJulian Elischer (q)->len --; \ 119878ed226SJulian Elischer (i)->m_nextpkt = NULL; \ 120878ed226SJulian Elischer } \ 121878ed226SJulian Elischer } while (0) 122878ed226SJulian Elischer 123878ed226SJulian Elischer #define NG_BT_MBUFQ_PREPEND(q, i) \ 124878ed226SJulian Elischer do { \ 125878ed226SJulian Elischer (i)->m_nextpkt = (q)->head; \ 126878ed226SJulian Elischer if ((q)->tail == NULL) \ 127878ed226SJulian Elischer (q)->tail = (i); \ 128878ed226SJulian Elischer \ 129878ed226SJulian Elischer (q)->head = (i); \ 130878ed226SJulian Elischer (q)->len ++; \ 131878ed226SJulian Elischer } while (0) 132878ed226SJulian Elischer 133878ed226SJulian Elischer #define NG_BT_MBUFQ_DRAIN(q) \ 134878ed226SJulian Elischer do { \ 135878ed226SJulian Elischer struct mbuf *m = NULL; \ 136878ed226SJulian Elischer \ 137878ed226SJulian Elischer for (;;) { \ 138878ed226SJulian Elischer NG_BT_MBUFQ_DEQUEUE((q), m); \ 139878ed226SJulian Elischer if (m == NULL) \ 140878ed226SJulian Elischer break; \ 141878ed226SJulian Elischer \ 142878ed226SJulian Elischer NG_FREE_M(m); \ 143878ed226SJulian Elischer } \ 144878ed226SJulian Elischer } while (0) 145878ed226SJulian Elischer 146878ed226SJulian Elischer /* 147878ed226SJulian Elischer * Netgraph item queue and useful itemq macros 148878ed226SJulian Elischer */ 149878ed226SJulian Elischer 150878ed226SJulian Elischer struct ng_item; 151878ed226SJulian Elischer 152878ed226SJulian Elischer struct ng_bt_itemq { 1539852972bSAlexander Motin STAILQ_HEAD(, ng_item) queue; /* actually items queue */ 154878ed226SJulian Elischer u_int32_t len; /* number of items in the queue */ 155878ed226SJulian Elischer u_int32_t maxlen; /* maximal number of items in the queue */ 156878ed226SJulian Elischer u_int32_t drops; /* number if dropped items */ 157878ed226SJulian Elischer }; 158878ed226SJulian Elischer typedef struct ng_bt_itemq ng_bt_itemq_t; 159878ed226SJulian Elischer typedef struct ng_bt_itemq * ng_bt_itemq_p; 160878ed226SJulian Elischer 1619852972bSAlexander Motin #define NG_BT_ITEMQ_INIT(q, _maxlen) \ 1629852972bSAlexander Motin do { \ 1639852972bSAlexander Motin STAILQ_INIT(&(q)->queue); \ 1649852972bSAlexander Motin (q)->len = 0; \ 1659852972bSAlexander Motin (q)->maxlen = (_maxlen); \ 1669852972bSAlexander Motin (q)->drops = 0; \ 1679852972bSAlexander Motin } while (0) 168878ed226SJulian Elischer 169878ed226SJulian Elischer #define NG_BT_ITEMQ_DESTROY(q) \ 170878ed226SJulian Elischer do { \ 171878ed226SJulian Elischer NG_BT_ITEMQ_DRAIN((q)); \ 172878ed226SJulian Elischer } while (0) 173878ed226SJulian Elischer 1749852972bSAlexander Motin #define NG_BT_ITEMQ_FIRST(q) STAILQ_FIRST(&(q)->queue) 175878ed226SJulian Elischer 176878ed226SJulian Elischer #define NG_BT_ITEMQ_LEN(q) NG_BT_MBUFQ_LEN((q)) 177878ed226SJulian Elischer 178878ed226SJulian Elischer #define NG_BT_ITEMQ_FULL(q) NG_BT_MBUFQ_FULL((q)) 179878ed226SJulian Elischer 180878ed226SJulian Elischer #define NG_BT_ITEMQ_DROP(q) NG_BT_MBUFQ_DROP((q)) 181878ed226SJulian Elischer 182878ed226SJulian Elischer #define NG_BT_ITEMQ_ENQUEUE(q, i) \ 183878ed226SJulian Elischer do { \ 1849852972bSAlexander Motin STAILQ_INSERT_TAIL(&(q)->queue, (i), el_next); \ 185878ed226SJulian Elischer (q)->len ++; \ 186878ed226SJulian Elischer } while (0) 187878ed226SJulian Elischer 188878ed226SJulian Elischer #define NG_BT_ITEMQ_DEQUEUE(q, i) \ 189878ed226SJulian Elischer do { \ 1909852972bSAlexander Motin (i) = STAILQ_FIRST(&(q)->queue); \ 191878ed226SJulian Elischer if ((i) != NULL) { \ 1929852972bSAlexander Motin STAILQ_REMOVE_HEAD(&(q)->queue, el_next); \ 193878ed226SJulian Elischer (q)->len --; \ 194878ed226SJulian Elischer } \ 195878ed226SJulian Elischer } while (0) 196878ed226SJulian Elischer 197878ed226SJulian Elischer #define NG_BT_ITEMQ_PREPEND(q, i) \ 198878ed226SJulian Elischer do { \ 1999852972bSAlexander Motin STAILQ_INSERT_HEAD(&(q)->queue, (i), el_next); \ 200878ed226SJulian Elischer (q)->len ++; \ 201878ed226SJulian Elischer } while (0) 202878ed226SJulian Elischer 203878ed226SJulian Elischer #define NG_BT_ITEMQ_DRAIN(q) \ 204878ed226SJulian Elischer do { \ 205878ed226SJulian Elischer struct ng_item *i = NULL; \ 206878ed226SJulian Elischer \ 207878ed226SJulian Elischer for (;;) { \ 208878ed226SJulian Elischer NG_BT_ITEMQ_DEQUEUE((q), i); \ 209878ed226SJulian Elischer if (i == NULL) \ 210878ed226SJulian Elischer break; \ 211878ed226SJulian Elischer \ 212878ed226SJulian Elischer NG_FREE_ITEM(i); \ 213878ed226SJulian Elischer } \ 214878ed226SJulian Elischer } while (0) 215878ed226SJulian Elischer 216878ed226SJulian Elischer /* 217878ed226SJulian Elischer * Get Bluetooth stack sysctl globals 218878ed226SJulian Elischer */ 219878ed226SJulian Elischer 220878ed226SJulian Elischer u_int32_t bluetooth_hci_command_timeout (void); 221878ed226SJulian Elischer u_int32_t bluetooth_hci_connect_timeout (void); 222878ed226SJulian Elischer u_int32_t bluetooth_hci_max_neighbor_age (void); 223878ed226SJulian Elischer u_int32_t bluetooth_l2cap_rtx_timeout (void); 224878ed226SJulian Elischer u_int32_t bluetooth_l2cap_ertx_timeout (void); 225fb8bcdc0SMaksim Yevmenkin u_int32_t bluetooth_sco_rtx_timeout (void); 226878ed226SJulian Elischer 227*4aa92fe2STakanori Watanabe #define BDADDR_BREDR 0 228*4aa92fe2STakanori Watanabe #define BDADDR_LE_PUBLIC 1 229*4aa92fe2STakanori Watanabe #define BDADDR_LE_RANDOM 2 230*4aa92fe2STakanori Watanabe 231878ed226SJulian Elischer #endif /* _NETGRAPH_BLUETOOTH_H_ */ 232878ed226SJulian Elischer 233