Annotation of sys/netbt/hci_misc.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: hci_misc.c,v 1.1 2007/05/30 03:42:53 uwe Exp $ */
2: /* $NetBSD: hci_misc.c,v 1.1 2006/06/19 15:44:45 gdamore Exp $ */
3:
4: /*-
5: * Copyright (c) 2005 Iain Hibbert.
6: * Copyright (c) 2006 Itronix Inc.
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. The name of Itronix Inc. may not be used to endorse
18: * or promote products derived from this software without specific
19: * prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
25: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28: * ON ANY THEORY OF LIABILITY, WHETHER IN
29: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31: * POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: #include <sys/cdefs.h>
35:
36: #include <sys/param.h>
37: #include <sys/kernel.h>
38: #include <sys/malloc.h>
39: #include <sys/mbuf.h>
40: #include <sys/proc.h>
41: #include <sys/queue.h>
42: #include <sys/systm.h>
43:
44: #include <netbt/bluetooth.h>
45: #include <netbt/hci.h>
46:
47: /*
48: * cache Inquiry Responses for this number of seconds for routing
49: * purposes [sysctl]
50: */
51: int hci_memo_expiry = 600;
52:
53: /*
54: * set 'src' address for routing to 'dest'
55: */
56: int
57: hci_route_lookup(bdaddr_t *src, bdaddr_t *dest)
58: {
59: struct hci_unit *unit;
60: struct hci_link *link;
61: struct hci_memo *memo;
62:
63: /*
64: * Walk the ACL connections, if we have a connection
65: * to 'dest' already then thats best..
66: */
67: TAILQ_FOREACH(unit, &hci_unit_list, hci_next) {
68: if ((unit->hci_flags & BTF_UP) == 0)
69: continue;
70:
71: TAILQ_FOREACH(link, &unit->hci_links, hl_next) {
72: if (link->hl_type != HCI_LINK_ACL)
73: continue;
74:
75: if (bdaddr_same(&link->hl_bdaddr, dest))
76: goto found;
77: }
78: }
79:
80: /*
81: * Now check all the memos to see if there has been an
82: * inquiry repsonse..
83: */
84: TAILQ_FOREACH(unit, &hci_unit_list, hci_next) {
85: if ((unit->hci_flags & BTF_UP) == 0)
86: continue;
87:
88: memo = hci_memo_find(unit, dest);
89: if (memo)
90: goto found;
91: }
92:
93: /*
94: * Last ditch effort, lets use the first unit we find
95: * thats up and running. (XXX settable default route?)
96: */
97: TAILQ_FOREACH(unit, &hci_unit_list, hci_next) {
98: if ((unit->hci_flags & BTF_UP) == 0)
99: continue;
100:
101: goto found;
102: }
103:
104: return EHOSTUNREACH;
105:
106: found:
107: bdaddr_copy(src, &unit->hci_bdaddr);
108: return 0;
109: }
110:
111: /*
112: * find unit memo from bdaddr
113: */
114: struct hci_memo *
115: hci_memo_find(struct hci_unit *unit, bdaddr_t *bdaddr)
116: {
117: struct hci_memo *memo, *m0;
118: struct timeval now;
119:
120: microtime(&now);
121:
122: m0 = LIST_FIRST(&unit->hci_memos);
123: while ((memo = m0) != NULL) {
124: m0 = LIST_NEXT(memo, next);
125:
126: if (now.tv_sec > memo->time.tv_sec + hci_memo_expiry) {
127: DPRINTF("memo %p too old (expiring)\n", memo);
128: hci_memo_free(memo);
129: continue;
130: }
131:
132: if (bdaddr_same(bdaddr, &memo->response.bdaddr)) {
133: DPRINTF("memo %p found\n", memo);
134: return memo;
135: }
136: }
137:
138: DPRINTF("no memo found\n");
139: return NULL;
140: }
141:
142: void
143: hci_memo_free(struct hci_memo *memo)
144: {
145:
146: LIST_REMOVE(memo, next);
147: free(memo, M_BLUETOOTH);
148: }
CVSweb