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 37878ed226SJulian Elischer /* 38878ed226SJulian Elischer * Version of the stack 39878ed226SJulian Elischer */ 40878ed226SJulian Elischer 41878ed226SJulian Elischer #define NG_BLUETOOTH_VERSION 1 42878ed226SJulian Elischer 43878ed226SJulian Elischer /* 44878ed226SJulian Elischer * Declare the base of the Bluetooth sysctl hierarchy, 45878ed226SJulian Elischer * but only if this file cares about sysctl's 46878ed226SJulian Elischer */ 47878ed226SJulian Elischer 48878ed226SJulian Elischer #ifdef SYSCTL_DECL 49878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth); 50878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth_hci); 51878ed226SJulian Elischer SYSCTL_DECL(_net_bluetooth_l2cap); 52f2bb1caeSJulian Elischer SYSCTL_DECL(_net_bluetooth_rfcomm); 53878ed226SJulian Elischer #endif /* SYSCTL_DECL */ 54878ed226SJulian Elischer 55878ed226SJulian Elischer /* 56878ed226SJulian Elischer * Mbuf qeueue and useful mbufq macros. We do not use ifqueue because we 57878ed226SJulian Elischer * do not need mutex and other locking stuff 58878ed226SJulian Elischer */ 59878ed226SJulian Elischer 60878ed226SJulian Elischer struct mbuf; 61878ed226SJulian Elischer 62878ed226SJulian Elischer struct ng_bt_mbufq { 63878ed226SJulian Elischer struct mbuf *head; /* first item in the queue */ 64878ed226SJulian Elischer struct mbuf *tail; /* last item in the queue */ 65878ed226SJulian Elischer u_int32_t len; /* number of items in the queue */ 66878ed226SJulian Elischer u_int32_t maxlen; /* maximal number of items in the queue */ 67878ed226SJulian Elischer u_int32_t drops; /* number if dropped items */ 68878ed226SJulian Elischer }; 69878ed226SJulian Elischer typedef struct ng_bt_mbufq ng_bt_mbufq_t; 70878ed226SJulian Elischer typedef struct ng_bt_mbufq * ng_bt_mbufq_p; 71878ed226SJulian Elischer 72878ed226SJulian Elischer #define NG_BT_MBUFQ_INIT(q, _maxlen) \ 73878ed226SJulian Elischer do { \ 74878ed226SJulian Elischer (q)->head = NULL; \ 75878ed226SJulian Elischer (q)->tail = NULL; \ 76878ed226SJulian Elischer (q)->len = 0; \ 77878ed226SJulian Elischer (q)->maxlen = (_maxlen); \ 78878ed226SJulian Elischer (q)->drops = 0; \ 79878ed226SJulian Elischer } while (0) 80878ed226SJulian Elischer 81878ed226SJulian Elischer #define NG_BT_MBUFQ_DESTROY(q) \ 82878ed226SJulian Elischer do { \ 83878ed226SJulian Elischer NG_BT_MBUFQ_DRAIN((q)); \ 84878ed226SJulian Elischer } while (0) 85878ed226SJulian Elischer 86878ed226SJulian Elischer #define NG_BT_MBUFQ_FIRST(q) (q)->head 87878ed226SJulian Elischer 88878ed226SJulian Elischer #define NG_BT_MBUFQ_LEN(q) (q)->len 89878ed226SJulian Elischer 90f2bb1caeSJulian Elischer #define NG_BT_MBUFQ_FULL(q) ((q)->len >= (q)->maxlen) 91878ed226SJulian Elischer 92878ed226SJulian Elischer #define NG_BT_MBUFQ_DROP(q) (q)->drops ++ 93878ed226SJulian Elischer 94878ed226SJulian Elischer #define NG_BT_MBUFQ_ENQUEUE(q, i) \ 95878ed226SJulian Elischer do { \ 96878ed226SJulian Elischer (i)->m_nextpkt = NULL; \ 97878ed226SJulian Elischer \ 98878ed226SJulian Elischer if ((q)->tail == NULL) \ 99878ed226SJulian Elischer (q)->head = (i); \ 100878ed226SJulian Elischer else \ 101878ed226SJulian Elischer (q)->tail->m_nextpkt = (i); \ 102878ed226SJulian Elischer \ 103878ed226SJulian Elischer (q)->tail = (i); \ 104878ed226SJulian Elischer (q)->len ++; \ 105878ed226SJulian Elischer } while (0) 106878ed226SJulian Elischer 107878ed226SJulian Elischer #define NG_BT_MBUFQ_DEQUEUE(q, i) \ 108878ed226SJulian Elischer do { \ 109878ed226SJulian Elischer (i) = (q)->head; \ 110878ed226SJulian Elischer if ((i) != NULL) { \ 111878ed226SJulian Elischer (q)->head = (q)->head->m_nextpkt; \ 112878ed226SJulian Elischer if ((q)->head == NULL) \ 113878ed226SJulian Elischer (q)->tail = NULL; \ 114878ed226SJulian Elischer \ 115878ed226SJulian Elischer (q)->len --; \ 116878ed226SJulian Elischer (i)->m_nextpkt = NULL; \ 117878ed226SJulian Elischer } \ 118878ed226SJulian Elischer } while (0) 119878ed226SJulian Elischer 120878ed226SJulian Elischer #define NG_BT_MBUFQ_PREPEND(q, i) \ 121878ed226SJulian Elischer do { \ 122878ed226SJulian Elischer (i)->m_nextpkt = (q)->head; \ 123878ed226SJulian Elischer if ((q)->tail == NULL) \ 124878ed226SJulian Elischer (q)->tail = (i); \ 125878ed226SJulian Elischer \ 126878ed226SJulian Elischer (q)->head = (i); \ 127878ed226SJulian Elischer (q)->len ++; \ 128878ed226SJulian Elischer } while (0) 129878ed226SJulian Elischer 130878ed226SJulian Elischer #define NG_BT_MBUFQ_DRAIN(q) \ 131878ed226SJulian Elischer do { \ 132878ed226SJulian Elischer struct mbuf *m = NULL; \ 133878ed226SJulian Elischer \ 134878ed226SJulian Elischer for (;;) { \ 135878ed226SJulian Elischer NG_BT_MBUFQ_DEQUEUE((q), m); \ 136878ed226SJulian Elischer if (m == NULL) \ 137878ed226SJulian Elischer break; \ 138878ed226SJulian Elischer \ 139878ed226SJulian Elischer NG_FREE_M(m); \ 140878ed226SJulian Elischer } \ 141878ed226SJulian Elischer } while (0) 142878ed226SJulian Elischer 143878ed226SJulian Elischer /* 144878ed226SJulian Elischer * Netgraph item queue and useful itemq macros 145878ed226SJulian Elischer */ 146878ed226SJulian Elischer 147878ed226SJulian Elischer struct ng_item; 148878ed226SJulian Elischer 149878ed226SJulian Elischer struct ng_bt_itemq { 150878ed226SJulian Elischer struct ng_item *head; /* first item in the queue */ 151878ed226SJulian Elischer struct ng_item *tail; /* last item in the queue */ 152878ed226SJulian Elischer u_int32_t len; /* number of items in the queue */ 153878ed226SJulian Elischer u_int32_t maxlen; /* maximal number of items in the queue */ 154878ed226SJulian Elischer u_int32_t drops; /* number if dropped items */ 155878ed226SJulian Elischer }; 156878ed226SJulian Elischer typedef struct ng_bt_itemq ng_bt_itemq_t; 157878ed226SJulian Elischer typedef struct ng_bt_itemq * ng_bt_itemq_p; 158878ed226SJulian Elischer 159878ed226SJulian Elischer #define NG_BT_ITEMQ_INIT(q, _maxlen) NG_BT_MBUFQ_INIT((q), (_maxlen)) 160878ed226SJulian Elischer 161878ed226SJulian Elischer #define NG_BT_ITEMQ_DESTROY(q) \ 162878ed226SJulian Elischer do { \ 163878ed226SJulian Elischer NG_BT_ITEMQ_DRAIN((q)); \ 164878ed226SJulian Elischer } while (0) 165878ed226SJulian Elischer 166878ed226SJulian Elischer #define NG_BT_ITEMQ_FIRST(q) NG_BT_MBUFQ_FIRST((q)) 167878ed226SJulian Elischer 168878ed226SJulian Elischer #define NG_BT_ITEMQ_LEN(q) NG_BT_MBUFQ_LEN((q)) 169878ed226SJulian Elischer 170878ed226SJulian Elischer #define NG_BT_ITEMQ_FULL(q) NG_BT_MBUFQ_FULL((q)) 171878ed226SJulian Elischer 172878ed226SJulian Elischer #define NG_BT_ITEMQ_DROP(q) NG_BT_MBUFQ_DROP((q)) 173878ed226SJulian Elischer 174878ed226SJulian Elischer #define NG_BT_ITEMQ_ENQUEUE(q, i) \ 175878ed226SJulian Elischer do { \ 176878ed226SJulian Elischer (i)->el_next = NULL; \ 177878ed226SJulian Elischer \ 178878ed226SJulian Elischer if ((q)->tail == NULL) \ 179878ed226SJulian Elischer (q)->head = (i); \ 180878ed226SJulian Elischer else \ 181878ed226SJulian Elischer (q)->tail->el_next = (i); \ 182878ed226SJulian Elischer \ 183878ed226SJulian Elischer (q)->tail = (i); \ 184878ed226SJulian Elischer (q)->len ++; \ 185878ed226SJulian Elischer } while (0) 186878ed226SJulian Elischer 187878ed226SJulian Elischer #define NG_BT_ITEMQ_DEQUEUE(q, i) \ 188878ed226SJulian Elischer do { \ 189878ed226SJulian Elischer (i) = (q)->head; \ 190878ed226SJulian Elischer if ((i) != NULL) { \ 191878ed226SJulian Elischer (q)->head = (q)->head->el_next; \ 192878ed226SJulian Elischer if ((q)->head == NULL) \ 193878ed226SJulian Elischer (q)->tail = NULL; \ 194878ed226SJulian Elischer \ 195878ed226SJulian Elischer (q)->len --; \ 196878ed226SJulian Elischer (i)->el_next = NULL; \ 197878ed226SJulian Elischer } \ 198878ed226SJulian Elischer } while (0) 199878ed226SJulian Elischer 200878ed226SJulian Elischer #define NG_BT_ITEMQ_PREPEND(q, i) \ 201878ed226SJulian Elischer do { \ 202878ed226SJulian Elischer (i)->el_next = (q)->head; \ 203878ed226SJulian Elischer if ((q)->tail == NULL) \ 204878ed226SJulian Elischer (q)->tail = (i); \ 205878ed226SJulian Elischer \ 206878ed226SJulian Elischer (q)->head = (i); \ 207878ed226SJulian Elischer (q)->len ++; \ 208878ed226SJulian Elischer } while (0) 209878ed226SJulian Elischer 210878ed226SJulian Elischer #define NG_BT_ITEMQ_DRAIN(q) \ 211878ed226SJulian Elischer do { \ 212878ed226SJulian Elischer struct ng_item *i = NULL; \ 213878ed226SJulian Elischer \ 214878ed226SJulian Elischer for (;;) { \ 215878ed226SJulian Elischer NG_BT_ITEMQ_DEQUEUE((q), i); \ 216878ed226SJulian Elischer if (i == NULL) \ 217878ed226SJulian Elischer break; \ 218878ed226SJulian Elischer \ 219878ed226SJulian Elischer NG_FREE_ITEM(i); \ 220878ed226SJulian Elischer } \ 221878ed226SJulian Elischer } while (0) 222878ed226SJulian Elischer 223878ed226SJulian Elischer /* 224878ed226SJulian Elischer * Get Bluetooth stack sysctl globals 225878ed226SJulian Elischer */ 226878ed226SJulian Elischer 227878ed226SJulian Elischer u_int32_t bluetooth_hci_command_timeout (void); 228878ed226SJulian Elischer u_int32_t bluetooth_hci_connect_timeout (void); 229878ed226SJulian Elischer u_int32_t bluetooth_hci_max_neighbor_age (void); 230878ed226SJulian Elischer u_int32_t bluetooth_l2cap_rtx_timeout (void); 231878ed226SJulian Elischer u_int32_t bluetooth_l2cap_ertx_timeout (void); 232878ed226SJulian Elischer 233878ed226SJulian Elischer #endif /* _NETGRAPH_BLUETOOTH_H_ */ 234878ed226SJulian Elischer 235