1 | /* $NetBSD: bluetooth.h,v 1.12 2014/05/18 14:46:16 rmind Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2005 Iain Hibbert. |
5 | * Copyright (c) 2006 Itronix Inc. |
6 | * All rights reserved. |
7 | * |
8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions |
10 | * are met: |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. |
13 | * 2. Redistributions in binary form must reproduce the above copyright |
14 | * notice, this list of conditions and the following disclaimer in the |
15 | * documentation and/or other materials provided with the distribution. |
16 | * 3. The name of Itronix Inc. may not be used to endorse |
17 | * or promote products derived from this software without specific |
18 | * prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND |
21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY |
24 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
25 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
26 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
27 | * ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
30 | * POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | #ifndef _NETBT_BLUETOOTH_H_ |
34 | #define _NETBT_BLUETOOTH_H_ |
35 | |
36 | #include <sys/socket.h> |
37 | #include <sys/types.h> |
38 | |
39 | /* |
40 | * Bluetooth Address Family Protocol Numbers |
41 | */ |
42 | #define BTPROTO_HCI 1 |
43 | #define BTPROTO_L2CAP 2 |
44 | #define BTPROTO_RFCOMM 3 |
45 | #define BTPROTO_SCO 4 |
46 | |
47 | /* All sizes are in bytes */ |
48 | #define BLUETOOTH_BDADDR_SIZE 6 |
49 | |
50 | /* |
51 | * Bluetooth device address |
52 | */ |
53 | typedef struct { |
54 | uint8_t b[BLUETOOTH_BDADDR_SIZE]; |
55 | } __packed bdaddr_t; |
56 | |
57 | /* |
58 | * bdaddr utility functions |
59 | */ |
60 | static __inline int |
61 | bdaddr_same(const bdaddr_t *a, const bdaddr_t *b) |
62 | { |
63 | |
64 | return (a->b[0] == b->b[0] && a->b[1] == b->b[1] |
65 | && a->b[2] == b->b[2] && a->b[3] == b->b[3] |
66 | && a->b[4] == b->b[4] && a->b[5] == b->b[5]); |
67 | } |
68 | |
69 | static __inline int |
70 | bdaddr_any(const bdaddr_t *a) |
71 | { |
72 | |
73 | return (a->b[0] == 0 && a->b[1] == 0 && a->b[2] == 0 |
74 | && a->b[3] == 0 && a->b[4] == 0 && a->b[5] == 0); |
75 | } |
76 | |
77 | static __inline void |
78 | bdaddr_copy(bdaddr_t *d, const bdaddr_t *s) |
79 | { |
80 | |
81 | d->b[0] = s->b[0]; |
82 | d->b[1] = s->b[1]; |
83 | d->b[2] = s->b[2]; |
84 | d->b[3] = s->b[3]; |
85 | d->b[4] = s->b[4]; |
86 | d->b[5] = s->b[5]; |
87 | } |
88 | |
89 | /* |
90 | * Socket address used by Bluetooth protocols |
91 | */ |
92 | struct sockaddr_bt { |
93 | uint8_t bt_len; |
94 | sa_family_t bt_family; |
95 | bdaddr_t bt_bdaddr; |
96 | uint16_t bt_psm; |
97 | uint8_t bt_channel; |
98 | uint8_t bt_zero[5]; |
99 | }; |
100 | |
101 | /* Note: this is actually 6 bytes including terminator */ |
102 | #define BDADDR_ANY ((const bdaddr_t *) "\000\000\000\000\000") |
103 | |
104 | #ifdef _KERNEL |
105 | |
106 | #include <sys/protosw.h> |
107 | |
108 | #include <sys/mallocvar.h> |
109 | MALLOC_DECLARE(M_BLUETOOTH); |
110 | |
111 | /* |
112 | * Bluetooth Protocol API callback methods |
113 | */ |
114 | struct mbuf; |
115 | struct btproto { |
116 | void (*connecting)(void *); |
117 | void (*connected)(void *); |
118 | void (*disconnected)(void *, int); |
119 | void *(*newconn)(void *, struct sockaddr_bt *, struct sockaddr_bt *); |
120 | void (*complete)(void *, int); |
121 | void (*linkmode)(void *, int); |
122 | void (*input)(void *, struct mbuf *); |
123 | }; |
124 | |
125 | extern const struct pr_usrreqs hci_usrreqs; |
126 | extern const struct pr_usrreqs sco_usrreqs; |
127 | extern const struct pr_usrreqs l2cap_usrreqs; |
128 | extern const struct pr_usrreqs rfcomm_usrreqs; |
129 | |
130 | extern kmutex_t *bt_lock; |
131 | |
132 | /* |
133 | * Debugging stuff |
134 | */ |
135 | #ifdef BLUETOOTH_DEBUG |
136 | extern int bluetooth_debug; |
137 | # define DPRINTF(...) do { \ |
138 | if (bluetooth_debug) { \ |
139 | printf("%s: ", __func__); \ |
140 | printf(__VA_ARGS__); \ |
141 | } \ |
142 | } while (/* CONSTCOND */0) |
143 | |
144 | # define DPRINTFN(n, ...) do { \ |
145 | if (bluetooth_debug > (n)) { \ |
146 | printf("%s: ", __func__); \ |
147 | printf(__VA_ARGS__); \ |
148 | } \ |
149 | } while (/* CONSTCOND */0) |
150 | |
151 | # define UNKNOWN(value) \ |
152 | printf("%s: %s = %d unknown!\n", __func__, #value, (value)); |
153 | #else |
154 | # define DPRINTF(...) ((void)0) |
155 | # define DPRINTFN(...) ((void)0) |
156 | # define UNKNOWN(x) ((void)0) |
157 | #endif /* BLUETOOTH_DEBUG */ |
158 | |
159 | #endif /* _KERNEL */ |
160 | |
161 | #endif /* _NETBT_BLUETOOTH_H_ */ |
162 | |