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