1 /* $OpenBSD: bt_proto.c,v 1.4 2007/06/24 20:55:27 uwe Exp $ */
4 * Copyright (c) 2004 Alexander Yurchenko <grange@openbsd.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/param.h>
20 #include <sys/domain.h>
21 #include <sys/protosw.h>
22 #include <sys/socket.h>
23 #include <sys/socketvar.h>
24 #include <sys/queue.h>
25 #include <sys/kernel.h>
27 #include <sys/sysctl.h>
29 #include <sys/malloc.h>
32 #include <netbt/bluetooth.h>
33 #include <netbt/hci.h>
34 #include <netbt/l2cap.h>
35 #include <netbt/rfcomm.h>
36 #include <netbt/sco.h>
38 MALLOC_DEFINE(M_BLUETOOTH
, "Bluetooth", "Bluetooth system memory");
40 extern struct pr_usrreqs hci_usrreqs
;
43 netbt_modevent(module_t mod
, int type
, void *data
)
57 static moduledata_t netbt_mod
= {
63 DECLARE_MODULE(netbt
, netbt_mod
, SI_SUB_EXEC
, SI_ORDER_ANY
);
64 MODULE_VERSION(netbt
, 1);
66 struct domain btdomain
;
68 struct protosw btsw
[] = {
69 { /* raw HCI commands */
71 .pr_domain
= &btdomain
,
72 .pr_protocol
= BTPROTO_HCI
,
73 .pr_flags
= (PR_ADDR
| PR_ATOMIC
),
77 .pr_ctloutput
= hci_ctloutput
,
83 .pr_usrreqs
= &hci_usrreqs
85 { /* HCI SCO data (audio) */
86 .pr_type
= SOCK_SEQPACKET
,
87 .pr_domain
= &btdomain
,
88 .pr_protocol
= BTPROTO_SCO
,
89 .pr_flags
= (PR_CONNREQUIRED
| PR_ATOMIC
),
93 .pr_ctloutput
= sco_ctloutput
,
99 .pr_usrreqs
= &sco_usrreqs
102 { /* L2CAP Connection Oriented */
103 .pr_type
= SOCK_SEQPACKET
,
104 .pr_domain
= &btdomain
,
105 .pr_protocol
= BTPROTO_L2CAP
,
106 .pr_flags
= (PR_CONNREQUIRED
| PR_ATOMIC
),
110 .pr_ctloutput
= l2cap_ctloutput
,
116 .pr_usrreqs
= &l2cap_usrreqs
119 .pr_type
= SOCK_STREAM
,
120 .pr_domain
= &btdomain
,
121 .pr_protocol
= BTPROTO_RFCOMM
,
122 .pr_flags
= (PR_CONNREQUIRED
| PR_WANTRCVD
),
126 .pr_ctloutput
= rfcomm_ctloutput
,
132 .pr_usrreqs
= &rfcomm_usrreqs
137 netbt_dispose(struct mbuf
* m
)
139 zdestroy(l2cap_pdu_pool
);
140 zdestroy(l2cap_req_pool
);
141 zdestroy(rfcomm_credit_pool
);
147 l2cap_pdu_pool
= zinit("l2cap_pdu", sizeof(struct l2cap_pdu
), 1,
148 ZONE_DESTROYABLE
, 1);
149 if (l2cap_pdu_pool
== NULL
)
151 l2cap_req_pool
= zinit("l2cap_req", sizeof(struct l2cap_req
), 1,
152 ZONE_DESTROYABLE
, 1);
153 if (l2cap_req_pool
== NULL
)
155 rfcomm_credit_pool
= zinit("rfcomm_credit",
156 sizeof(struct rfcomm_credit
), 1, ZONE_DESTROYABLE
, 1);
157 if (rfcomm_credit_pool
== NULL
)
162 panic("Can't create vm_zones");
165 struct domain btdomain
= {
166 .dom_family
= AF_BLUETOOTH
,
167 .dom_name
= "bluetooth",
168 .dom_init
= netbt_init
,
169 .dom_externalize
= NULL
,
170 .dom_dispose
= netbt_dispose
,
172 .dom_protoswNPROTOSW
= &btsw
[NELEM(btsw
)],
173 .dom_next
= SLIST_ENTRY_INITIALIZER
,
176 .dom_maxrtkey
= sizeof(struct sockaddr_bt
),
182 SYSCTL_NODE(_net
, OID_AUTO
, bluetooth
, CTLFLAG_RD
, 0,
183 "Bluetooth Protocol Family");
186 SYSCTL_NODE(_net_bluetooth
, OID_AUTO
, hci
, CTLFLAG_RD
, 0,
187 "Host Controller Interface");
188 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, sendspace
, CTLFLAG_RW
, &hci_sendspace
,
189 0, "Socket Send Buffer Size");
190 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, recvspace
, CTLFLAG_RW
, &hci_recvspace
,
191 0, "Socket Receive Buffer Size");
192 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, acl_expiry
, CTLFLAG_RW
,
193 &hci_acl_expiry
, 0, "ACL Connection Expiry Time");
194 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, memo_expiry
, CTLFLAG_RW
,
195 &hci_memo_expiry
, 0, "Memo Expiry Time");
196 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, eventq_max
, CTLFLAG_RW
,
197 &hci_eventq_max
, 0, "Max Event queue length");
198 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, aclrxq_max
, CTLFLAG_RW
,
199 &hci_aclrxq_max
, 0, "Max ACL rx queue length");
200 SYSCTL_INT(_net_bluetooth_hci
, OID_AUTO
, scorxq_max
, CTLFLAG_RW
,
201 &hci_scorxq_max
, 0, "Max SCO rx queue length");
204 SYSCTL_NODE(_net_bluetooth
, OID_AUTO
, l2cap
, CTLFLAG_RD
, 0,
205 "Logical Link Control & Adaptation Protocol");
206 SYSCTL_INT(_net_bluetooth_l2cap
, OID_AUTO
, sendspace
, CTLFLAG_RW
,
207 &l2cap_sendspace
, 0, "Socket Send Buffer Size");
208 SYSCTL_INT(_net_bluetooth_l2cap
, OID_AUTO
, recvspace
, CTLFLAG_RW
,
209 &l2cap_recvspace
, 0, "Socket Receive Buffer Size");
210 SYSCTL_INT(_net_bluetooth_l2cap
, OID_AUTO
, rtx
, CTLFLAG_RW
,
211 &l2cap_response_timeout
, 0, "Response Timeout");
212 SYSCTL_INT(_net_bluetooth_l2cap
, OID_AUTO
, ertx
, CTLFLAG_RW
,
213 &l2cap_response_extended_timeout
, 0, "Extended Response Timeout");
216 SYSCTL_NODE(_net_bluetooth
, OID_AUTO
, rfcomm
, CTLFLAG_RD
, 0,
217 "Serial Cable Emulation");
218 SYSCTL_INT(_net_bluetooth_rfcomm
, OID_AUTO
, sendspace
, CTLFLAG_RW
,
219 &rfcomm_sendspace
, 0, "Socket Send Buffer Size");
220 SYSCTL_INT(_net_bluetooth_rfcomm
, OID_AUTO
, recvspace
, CTLFLAG_RW
,
221 &rfcomm_recvspace
, 0, "Socket Receive Buffer Size");
222 SYSCTL_INT(_net_bluetooth_rfcomm
, OID_AUTO
, mtu_default
, CTLFLAG_RW
,
223 &rfcomm_mtu_default
, 0, "Default MTU");
224 SYSCTL_INT(_net_bluetooth_rfcomm
, OID_AUTO
, ack_timeout
, CTLFLAG_RW
,
225 &rfcomm_ack_timeout
, 0, "Acknowledgement Timer");
226 SYSCTL_INT(_net_bluetooth_rfcomm
, OID_AUTO
, mcc_timeout
, CTLFLAG_RW
,
227 &rfcomm_mcc_timeout
, 0, "Response Timeout for Multiplexer Control Channel");
230 SYSCTL_NODE(_net_bluetooth
, OID_AUTO
, sco
, CTLFLAG_RD
, 0, "SCO data");
231 SYSCTL_INT(_net_bluetooth_sco
, OID_AUTO
, sendspace
, CTLFLAG_RW
, &sco_sendspace
,
232 0, "Socket Send Buffer Size");
233 SYSCTL_INT(_net_bluetooth_sco
, OID_AUTO
, recvspace
, CTLFLAG_RW
, &sco_recvspace
,
234 0, "Socket Receive Buffer Size");
237 netisr_netbt_setup(void *dummy __unused
)
239 netisr_register(NETISR_BLUETOOTH
, btintr
, NULL
);
242 SYSINIT(netbt_setup
, SI_BOOT2_KLD
, SI_ORDER_ANY
, netisr_netbt_setup
, NULL
);