1 /* $DragonFly: src/sys/netbt/bt_proto.c,v 1.7 2008/11/01 04:22:15 sephe Exp $ */
2 /* $OpenBSD: bt_proto.c,v 1.4 2007/06/24 20:55:27 uwe Exp $ */
5 * Copyright (c) 2004 Alexander Yurchenko <grange@openbsd.org>
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <sys/param.h>
21 #include <sys/domain.h>
22 #include <sys/protosw.h>
23 #include <sys/socket.h>
24 #include <sys/socketvar.h>
25 #include <sys/queue.h>
26 #include <sys/kernel.h>
28 #include <sys/sysctl.h>
30 #include <sys/malloc.h>
32 #include <net/pf/pfvar.h>
34 #include <netbt/bluetooth.h>
35 #include <netbt/hci.h>
36 #include <netbt/l2cap.h>
37 #include <netbt/rfcomm.h>
38 #include <netbt/sco.h>
40 MALLOC_DEFINE(M_BLUETOOTH, "Bluetooth", "Bluetooth system memory");
42 extern struct pr_usrreqs hci_usrreqs;
45 netbt_modevent(module_t mod, int type, void *data)
59 static moduledata_t netbt_mod = {
65 DECLARE_MODULE(netbt, netbt_mod, SI_SUB_EXEC, SI_ORDER_ANY);
66 MODULE_VERSION(netbt, 1);
68 struct domain btdomain;
70 struct protosw btsw[] = {
71 { /* raw HCI commands */
73 .pr_domain = &btdomain,
74 .pr_protocol = BTPROTO_HCI,
75 .pr_flags = (PR_ADDR | PR_ATOMIC),
79 .pr_ctloutput = hci_ctloutput,
85 .pr_usrreqs = &hci_usrreqs
87 { /* HCI SCO data (audio) */
88 .pr_type = SOCK_SEQPACKET,
89 .pr_domain = &btdomain,
90 .pr_protocol = BTPROTO_SCO,
91 .pr_flags = (PR_CONNREQUIRED | PR_ATOMIC ),
95 .pr_ctloutput = sco_ctloutput,
101 .pr_usrreqs = &sco_usrreqs
104 { /* L2CAP Connection Oriented */
105 .pr_type = SOCK_SEQPACKET,
106 .pr_domain = &btdomain,
107 .pr_protocol = BTPROTO_L2CAP,
108 .pr_flags = (PR_CONNREQUIRED | PR_ATOMIC ),
112 .pr_ctloutput = l2cap_ctloutput,
118 .pr_usrreqs = &l2cap_usrreqs
121 .pr_type = SOCK_STREAM,
122 .pr_domain = &btdomain,
123 .pr_protocol = BTPROTO_RFCOMM,
124 .pr_flags = (PR_CONNREQUIRED | PR_WANTRCVD),
128 .pr_ctloutput = rfcomm_ctloutput,
134 .pr_usrreqs = &rfcomm_usrreqs
139 netbt_dispose(struct mbuf* m)
141 ZONE_DESTROY(l2cap_pdu_pool);
142 ZONE_DESTROY(l2cap_req_pool);
143 ZONE_DESTROY(rfcomm_credit_pool);
151 ZONE_CREATE(l2cap_pdu_pool, struct l2cap_pdu, "l2cap_pdu");
152 ZONE_CREATE(l2cap_req_pool, struct l2cap_req, "l2cap_req");
153 ZONE_CREATE(rfcomm_credit_pool, struct rfcomm_credit,
160 panic("Can't create vm_zones");
164 struct domain btdomain = {
165 .dom_family = AF_BLUETOOTH,
166 .dom_name = "bluetooth",
167 .dom_init = netbt_init,
168 .dom_externalize = NULL,
169 .dom_dispose = netbt_dispose,
171 .dom_protoswNPROTOSW = &btsw[sizeof(btsw)/sizeof(btsw[0])],
172 .dom_next = SLIST_ENTRY_INITIALIZER,
175 .dom_maxrtkey = sizeof(struct sockaddr_bt),
181 SYSCTL_NODE(_net, OID_AUTO, bluetooth, CTLFLAG_RD, 0,
182 "Bluetooth Protocol Family");
185 SYSCTL_NODE(_net_bluetooth, OID_AUTO, hci, CTLFLAG_RD, 0,
186 "Host Controller Interface");
187 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, sendspace, CTLFLAG_RW, &hci_sendspace,
188 0, "Socket Send Buffer Size");
189 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, recvspace, CTLFLAG_RW, &hci_recvspace,
190 0, "Socket Receive Buffer Size");
191 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, acl_expiry, CTLFLAG_RW,
192 &hci_acl_expiry, 0, "ACL Connection Expiry Time");
193 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, memo_expiry, CTLFLAG_RW,
194 &hci_memo_expiry, 0, "Memo Expiry Time");
195 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, eventq_max, CTLFLAG_RW,
196 &hci_eventq_max, 0, "Max Event queue length");
197 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, aclrxq_max, CTLFLAG_RW,
198 &hci_aclrxq_max, 0, "Max ACL rx queue length");
199 SYSCTL_INT(_net_bluetooth_hci, OID_AUTO, scorxq_max, CTLFLAG_RW,
200 &hci_scorxq_max, 0, "Max SCO rx queue length");
203 SYSCTL_NODE(_net_bluetooth, OID_AUTO, l2cap, CTLFLAG_RD, 0,
204 "Logical Link Control & Adaptation Protocol");
205 SYSCTL_INT(_net_bluetooth_l2cap, OID_AUTO, sendspace, CTLFLAG_RW,
206 &l2cap_sendspace, 0, "Socket Send Buffer Size");
207 SYSCTL_INT(_net_bluetooth_l2cap, OID_AUTO, recvspace, CTLFLAG_RW,
208 &l2cap_recvspace, 0, "Socket Receive Buffer Size");
209 SYSCTL_INT(_net_bluetooth_l2cap, OID_AUTO, rtx, CTLFLAG_RW,
210 &l2cap_response_timeout, 0, "Response Timeout");
211 SYSCTL_INT(_net_bluetooth_l2cap, OID_AUTO, ertx, CTLFLAG_RW,
212 &l2cap_response_extended_timeout, 0, "Extended Response Timeout");
215 SYSCTL_NODE(_net_bluetooth, OID_AUTO, rfcomm, CTLFLAG_RD, 0,
216 "Serial Cable Emulation");
217 SYSCTL_INT(_net_bluetooth_rfcomm, OID_AUTO, sendspace, CTLFLAG_RW,
218 &rfcomm_sendspace, 0, "Socket Send Buffer Size");
219 SYSCTL_INT(_net_bluetooth_rfcomm, OID_AUTO, recvspace, CTLFLAG_RW,
220 &rfcomm_recvspace, 0, "Socket Receive Buffer Size");
221 SYSCTL_INT(_net_bluetooth_rfcomm, OID_AUTO, mtu_default, CTLFLAG_RW,
222 &rfcomm_mtu_default, 0, "Default MTU");
223 SYSCTL_INT(_net_bluetooth_rfcomm, OID_AUTO, ack_timeout, CTLFLAG_RW,
224 &rfcomm_ack_timeout, 0, "Acknowledgement Timer");
225 SYSCTL_INT(_net_bluetooth_rfcomm, OID_AUTO, mcc_timeout, CTLFLAG_RW,
226 &rfcomm_mcc_timeout, 0, "Response Timeout for Multiplexer Control Channel");
229 SYSCTL_NODE(_net_bluetooth, OID_AUTO, sco, CTLFLAG_RD, 0, "SCO data");
230 SYSCTL_INT(_net_bluetooth_sco, OID_AUTO, sendspace, CTLFLAG_RW, &sco_sendspace,
231 0, "Socket Send Buffer Size");
232 SYSCTL_INT(_net_bluetooth_sco, OID_AUTO, recvspace, CTLFLAG_RW, &sco_recvspace,
233 0, "Socket Receive Buffer Size");
236 netisr_netbt_setup(void *dummy __unused)
238 netisr_register(NETISR_BLUETOOTH, btintr, NULL);
241 SYSINIT(netbt_setup, SI_BOOT2_KLD, SI_ORDER_ANY, netisr_netbt_setup, NULL);