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