summaryrefslogtreecommitdiff
path: root/sys/netbt/hci_link.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netbt/hci_link.c')
-rw-r--r--sys/netbt/hci_link.c92
1 files changed, 55 insertions, 37 deletions
diff --git a/sys/netbt/hci_link.c b/sys/netbt/hci_link.c
index 65efaf2f120..642d87af21d 100644
--- a/sys/netbt/hci_link.c
+++ b/sys/netbt/hci_link.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: hci_link.c,v 1.6 2007/09/17 01:33:33 krw Exp $ */
-/* $NetBSD: hci_link.c,v 1.11 2007/04/21 06:15:23 plunky Exp $ */
+/* $OpenBSD: hci_link.c,v 1.7 2008/02/24 21:34:48 uwe Exp $ */
+/* $NetBSD: hci_link.c,v 1.16 2007/11/10 23:12:22 plunky Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,8 +31,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
@@ -96,9 +94,9 @@ hci_acl_open(struct hci_unit *unit, bdaddr_t *bdaddr)
memo = hci_memo_find(unit, bdaddr);
if (memo != NULL) {
- cp.page_scan_rep_mode = memo->response.page_scan_rep_mode;
- cp.page_scan_mode = memo->response.page_scan_mode;
- cp.clock_offset = htole16(memo->response.clock_offset);
+ cp.page_scan_rep_mode = memo->page_scan_rep_mode;
+ cp.page_scan_mode = memo->page_scan_mode;
+ cp.clock_offset = memo->clock_offset;
}
if (unit->hci_link_policy & HCI_LINK_POLICY_ENABLE_ROLE_SWITCH)
@@ -257,8 +255,8 @@ hci_acl_setmode(struct hci_link *link)
&& !(link->hl_flags & HCI_LINK_AUTH)) {
hci_auth_req_cp cp;
- DPRINTF("requesting auth for handle #%d\n",
- link->hl_handle);
+ DPRINTF("(%s) requesting auth for handle #%d\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle);
link->hl_state = HCI_LINK_WAIT_AUTH;
cp.con_handle = htole16(link->hl_handle);
@@ -274,8 +272,8 @@ hci_acl_setmode(struct hci_link *link)
/* XXX we should check features for encryption capability */
- DPRINTF("requesting encryption for handle #%d\n",
- link->hl_handle);
+ DPRINTF("(%s) requesting encryption for handle #%d\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle);
link->hl_state = HCI_LINK_WAIT_ENCRYPT;
cp.con_handle = htole16(link->hl_handle);
@@ -293,8 +291,8 @@ hci_acl_setmode(struct hci_link *link)
/* always change link key for SECURE requests */
link->hl_flags &= ~HCI_LINK_SECURE;
- DPRINTF("changing link key for handle #%d\n",
- link->hl_handle);
+ DPRINTF("(%s) changing link key for handle #%d\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle);
link->hl_state = HCI_LINK_WAIT_SECURE;
cp.con_handle = htole16(link->hl_handle);
@@ -320,11 +318,11 @@ hci_acl_linkmode(struct hci_link *link)
struct l2cap_channel *chan, *next;
int err, mode = 0;
- DPRINTF("handle #%d, auth %s, encrypt %s, secure %s\n",
- link->hl_handle,
- (link->hl_flags & HCI_LINK_AUTH ? "on" : "off"),
- (link->hl_flags & HCI_LINK_ENCRYPT ? "on" : "off"),
- (link->hl_flags & HCI_LINK_SECURE ? "on" : "off"));
+ DPRINTF("(%s) handle #%d, auth %s, encrypt %s, secure %s\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle,
+ (link->hl_flags & HCI_LINK_AUTH ? "on" : "off"),
+ (link->hl_flags & HCI_LINK_ENCRYPT ? "on" : "off"),
+ (link->hl_flags & HCI_LINK_SECURE ? "on" : "off"));
if (link->hl_flags & HCI_LINK_AUTH)
mode |= L2CAP_LM_AUTH;
@@ -424,13 +422,15 @@ hci_acl_recv(struct mbuf *m, struct hci_unit *unit)
#ifdef DIAGNOSTIC
if (hdr.type != HCI_ACL_DATA_PKT) {
- printf("%s: bad ACL packet type\n", unit->hci_devname);
+ printf("%s: bad ACL packet type\n",
+ device_xname(unit->hci_dev));
goto bad;
}
if (m->m_pkthdr.len != letoh16(hdr.length)) {
printf("%s: bad ACL packet length (%d != %d)\n",
- unit->hci_devname, m->m_pkthdr.len, letoh16(hdr.length));
+ device_xname(unit->hci_dev), m->m_pkthdr.len,
+ letoh16(hdr.length));
goto bad;
}
#endif
@@ -445,7 +445,7 @@ hci_acl_recv(struct mbuf *m, struct hci_unit *unit)
hci_discon_cp cp;
DPRINTF("%s: dumping packet for unknown handle #%d\n",
- unit->hci_devname, handle);
+ device_xname(unit->hci_dev), handle);
/*
* There is no way to find out what this connection handle is
@@ -463,11 +463,11 @@ hci_acl_recv(struct mbuf *m, struct hci_unit *unit)
case HCI_PACKET_START:
if (link->hl_rxp != NULL)
printf("%s: dropped incomplete ACL packet\n",
- unit->hci_devname);
+ device_xname(unit->hci_dev));
if (m->m_pkthdr.len < sizeof(l2cap_hdr_t)) {
printf("%s: short ACL packet\n",
- unit->hci_devname);
+ device_xname(unit->hci_dev));
goto bad;
}
@@ -479,7 +479,7 @@ hci_acl_recv(struct mbuf *m, struct hci_unit *unit)
case HCI_PACKET_FRAGMENT:
if (link->hl_rxp == NULL) {
printf("%s: unexpected packet fragment\n",
- unit->hci_devname);
+ device_xname(unit->hci_dev));
goto bad;
}
@@ -492,7 +492,7 @@ hci_acl_recv(struct mbuf *m, struct hci_unit *unit)
default:
printf("%s: unknown packet type\n",
- unit->hci_devname);
+ device_xname(unit->hci_dev));
goto bad;
}
@@ -552,7 +552,7 @@ hci_acl_send(struct mbuf *m, struct hci_link *link,
mlen = link->hl_unit->hci_max_acl_size;
DPRINTFN(5, "%s: handle #%d, plen = %d, max = %d\n",
- link->hl_unit->hci_devname, link->hl_handle, plen, mlen);
+ device_xname(link->hl_unit->hci_dev), link->hl_handle, plen, mlen);
while (plen > 0) {
if (plen > mlen) {
@@ -566,7 +566,8 @@ hci_acl_send(struct mbuf *m, struct hci_link *link,
if (num++ == 0)
m->m_flags |= M_PROTO1; /* tag first fragment */
- DPRINTFN(10, "chunk of %d (plen = %d) bytes\n", mlen, plen);
+ DPRINTFN(10, "(%s) chunk of %d (plen = %d) bytes\n",
+ device_xname(link->hl_unit->hci_dev), mlen, plen);
IF_ENQUEUE(&pdu->lp_data, m);
m = n;
plen -= mlen;
@@ -700,15 +701,16 @@ hci_acl_complete(struct hci_link *link, int num)
struct l2cap_pdu *pdu;
struct l2cap_channel *chan;
- DPRINTFN(5, "handle #%d (%d)\n", link->hl_handle, num);
+ DPRINTFN(5, "(%s) handle #%d (%d)\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle, num);
while (num > 0) {
pdu = TAILQ_FIRST(&link->hl_txq);
if (pdu == NULL) {
printf("%s: %d packets completed on handle #%x "
- "but none pending!\n",
- link->hl_unit->hci_devname, num,
- link->hl_handle);
+ "but none pending!\n",
+ device_xname(link->hl_unit->hci_dev), num,
+ link->hl_handle);
return;
}
@@ -829,13 +831,14 @@ hci_sco_recv(struct mbuf *m, struct hci_unit *unit)
#ifdef DIAGNOSTIC
if (hdr.type != HCI_SCO_DATA_PKT) {
- printf("%s: bad SCO packet type\n", unit->hci_devname);
+ printf("%s: bad SCO packet type\n",
+ device_xname(unit->hci_dev));
goto bad;
}
if (m->m_pkthdr.len != hdr.length) {
printf("%s: bad SCO packet length (%d != %d)\n",
- unit->hci_devname, m->m_pkthdr.len, hdr.length);
+ device_xname(unit->hci_dev), m->m_pkthdr.len, hdr.length);
goto bad;
}
#endif
@@ -846,7 +849,7 @@ hci_sco_recv(struct mbuf *m, struct hci_unit *unit)
link = hci_link_lookup_handle(unit, handle);
if (link == NULL || link->hl_type == HCI_LINK_ACL) {
DPRINTF("%s: dumping packet for unknown handle #%d\n",
- unit->hci_devname, handle);
+ device_xname(unit->hci_dev), handle);
goto bad;
}
@@ -904,6 +907,9 @@ hci_link_alloc(struct hci_unit *unit)
link->hl_mtu = L2CAP_MTU_DEFAULT; /* L2CAP signal mtu */
link->hl_flush = L2CAP_FLUSH_TIMO_DEFAULT; /* flush timeout */
+ /* init SCO portion */
+ /* &link->hl_data is already zero-initialized. */
+
/* attach to unit */
TAILQ_INSERT_HEAD(&unit->hci_links, link, hl_next);
return link;
@@ -918,9 +924,9 @@ hci_link_free(struct hci_link *link, int err)
KASSERT(link != NULL);
- DPRINTF("#%d, type = %d, state = %d, refcnt = %d\n",
- link->hl_handle, link->hl_type,
- link->hl_state, link->hl_refcnt);
+ DPRINTF("(%s) #%d, type = %d, state = %d, refcnt = %d\n",
+ device_xname(link->hl_unit->hci_dev), link->hl_handle,
+ link->hl_type, link->hl_state, link->hl_refcnt);
/* ACL reference count */
if (link->hl_refcnt > 0) {
@@ -986,6 +992,18 @@ hci_link_free(struct hci_link *link, int err)
if (timeout_triggered(&link->hl_expire))
return;
+ /*
+ * If we made a note of clock offset, keep it in a memo
+ * to facilitate reconnections to this device
+ */
+ if (link->hl_clock != 0) {
+ struct hci_memo *memo;
+
+ memo = hci_memo_new(link->hl_unit, &link->hl_bdaddr);
+ if (memo != NULL)
+ memo->clock_offset = link->hl_clock;
+ }
+
TAILQ_REMOVE(&link->hl_unit->hci_links, link, hl_next);
free(link, M_BLUETOOTH);
}