1 /* $OpenBSD: bt_proto.c,v 1.4 2007/06/24 20:55:27 uwe Exp $ */
2 /* $DragonFly: src/sys/netbt/bt_proto.c,v 1.1 2007/12/30 20:02:56 hasso 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
);
67 struct domain btdomain
;
69 struct protosw btsw
[] = {
70 { /* raw HCI commands */
72 .pr_domain
= &btdomain
,
73 .pr_protocol
= BTPROTO_HCI
,
74 .pr_flags
= (PR_ADDR
| PR_ATOMIC
),
78 .pr_ctloutput
= hci_ctloutput
,
79 .pr_mport
= cpu0_soport
,
84 .pr_usrreqs
= &hci_usrreqs
86 { /* HCI SCO data (audio) */
87 .pr_type
= SOCK_SEQPACKET
,
88 .pr_domain
= &btdomain
,
89 .pr_protocol
= BTPROTO_SCO
,
90 .pr_flags
= (PR_CONNREQUIRED
| PR_ATOMIC
),
94 .pr_ctloutput
= sco_ctloutput
,
95 .pr_mport
= cpu0_soport
,
100 .pr_usrreqs
= &sco_usrreqs
103 { /* L2CAP Connection Oriented */
104 .pr_type
= SOCK_SEQPACKET
,
105 .pr_domain
= &btdomain
,
106 .pr_protocol
= BTPROTO_L2CAP
,
107 .pr_flags
= (PR_CONNREQUIRED
| PR_ATOMIC
),
111 .pr_ctloutput
= l2cap_ctloutput
,
112 .pr_mport
= cpu0_soport
,
117 .pr_usrreqs
= &l2cap_usrreqs
120 .pr_type
= SOCK_STREAM
,
121 .pr_domain
= &btdomain
,
122 .pr_protocol
= BTPROTO_RFCOMM
,
123 .pr_flags
= (PR_CONNREQUIRED
| PR_WANTRCVD
),
127 .pr_ctloutput
= rfcomm_ctloutput
,
128 .pr_mport
= cpu0_soport
,
133 .pr_usrreqs
= &rfcomm_usrreqs
138 netbt_dispose(struct mbuf
* m
)
140 ZONE_DESTROY(l2cap_pdu_pool
);
141 ZONE_DESTROY(l2cap_req_pool
);
142 ZONE_DESTROY(rfcomm_credit_pool
);
150 ZONE_CREATE(l2cap_pdu_pool
, struct l2cap_pdu
, "l2cap_pdu");
151 ZONE_CREATE(l2cap_req_pool
, struct l2cap_req
, "l2cap_req");
152 ZONE_CREATE(rfcomm_credit_pool
, struct rfcomm_credit
,
159 panic("Can't create vm_zones");
163 struct domain btdomain
= {
164 .dom_family
= AF_BLUETOOTH
,
165 .dom_name
= "bluetooth",
166 .dom_init
= netbt_init
,
167 .dom_externalize
= NULL
,
168 .dom_dispose
= netbt_dispose
,
170 .dom_protoswNPROTOSW
= &btsw
[sizeof(btsw
)/sizeof(btsw
[0])],
171 .dom_next
= SLIST_ENTRY_INITIALIZER
,
174 .dom_maxrtkey
= sizeof(struct sockaddr_bt
),
180 SYSCTL_NODE(_net
, PF_BLUETOOTH
, bt
, CTLFLAG_RW
, 0, "Bluetooth protocol");
181 SYSCTL_NODE(_net_bt
, BTPROTO_HCI
, hci_unit
, CTLFLAG_RW
, 0,
182 "Bluetooth HCI protocol");
185 netisr_netbt_setup(void *dummy __unused
)
187 netisr_register(NETISR_BLUETOOTH
, cpu0_portfn
, btintr
);
190 SYSINIT(netbt_setup
, SI_BOOT2_KLD
, SI_ORDER_ANY
, netisr_netbt_setup
, NULL
);