Statistics
| Branch: | Revision:

root / hw / bt-hci.c @ d7585251

History | View | Annotate | Download (67.8 kB)

1 4e38eb54 balrog
/*
2 4e38eb54 balrog
 * QEMU Bluetooth HCI logic.
3 4e38eb54 balrog
 *
4 4e38eb54 balrog
 * Copyright (C) 2007 OpenMoko, Inc.
5 4e38eb54 balrog
 * Copyright (C) 2008 Andrzej Zaborowski  <balrog@zabor.org>
6 4e38eb54 balrog
 *
7 4e38eb54 balrog
 * This program is free software; you can redistribute it and/or
8 4e38eb54 balrog
 * modify it under the terms of the GNU General Public License as
9 4e38eb54 balrog
 * published by the Free Software Foundation; either version 2 of
10 4e38eb54 balrog
 * the License, or (at your option) any later version.
11 4e38eb54 balrog
 *
12 4e38eb54 balrog
 * This program is distributed in the hope that it will be useful,
13 4e38eb54 balrog
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 4e38eb54 balrog
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 4e38eb54 balrog
 * GNU General Public License for more details.
16 4e38eb54 balrog
 *
17 4e38eb54 balrog
 * You should have received a copy of the GNU General Public License
18 4e38eb54 balrog
 * along with this program; if not, write to the Free Software
19 4e38eb54 balrog
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
20 4e38eb54 balrog
 * MA  02110-1301  USA
21 4e38eb54 balrog
 */
22 4e38eb54 balrog
23 4e38eb54 balrog
#include "qemu-common.h"
24 4e38eb54 balrog
#include "qemu-timer.h"
25 4e38eb54 balrog
#include "usb.h"
26 4e38eb54 balrog
#include "net.h"
27 4e38eb54 balrog
#include "bt.h"
28 4e38eb54 balrog
29 4e38eb54 balrog
struct bt_hci_s {
30 4e38eb54 balrog
    uint8_t *(*evt_packet)(void *opaque);
31 4e38eb54 balrog
    void (*evt_submit)(void *opaque, int len);
32 4e38eb54 balrog
    void *opaque;
33 4e38eb54 balrog
    uint8_t evt_buf[256];
34 4e38eb54 balrog
35 4e38eb54 balrog
    uint8_t acl_buf[4096];
36 4e38eb54 balrog
    int acl_len;
37 4e38eb54 balrog
38 4e38eb54 balrog
    uint16_t asb_handle;
39 4e38eb54 balrog
    uint16_t psb_handle;
40 4e38eb54 balrog
41 4e38eb54 balrog
    int last_cmd;        /* Note: Always little-endian */
42 4e38eb54 balrog
43 4e38eb54 balrog
    struct bt_device_s *conn_req_host;
44 4e38eb54 balrog
45 4e38eb54 balrog
    struct {
46 4e38eb54 balrog
        int inquire;
47 4e38eb54 balrog
        int periodic;
48 4e38eb54 balrog
        int responses_left;
49 4e38eb54 balrog
        int responses;
50 4e38eb54 balrog
        QEMUTimer *inquiry_done;
51 4e38eb54 balrog
        QEMUTimer *inquiry_next;
52 4e38eb54 balrog
        int inquiry_length;
53 4e38eb54 balrog
        int inquiry_period;
54 4e38eb54 balrog
        int inquiry_mode;
55 4e38eb54 balrog
56 4e38eb54 balrog
#define HCI_HANDLE_OFFSET        0x20
57 4e38eb54 balrog
#define HCI_HANDLES_MAX                0x10
58 4e38eb54 balrog
        struct bt_hci_master_link_s {
59 4e38eb54 balrog
            struct bt_link_s *link;
60 4e38eb54 balrog
            void (*lmp_acl_data)(struct bt_link_s *link,
61 4e38eb54 balrog
                            const uint8_t *data, int start, int len);
62 4e38eb54 balrog
            QEMUTimer *acl_mode_timer;
63 4e38eb54 balrog
        } handle[HCI_HANDLES_MAX];
64 4e38eb54 balrog
        uint32_t role_bmp;
65 4e38eb54 balrog
        int last_handle;
66 4e38eb54 balrog
        int connecting;
67 4e38eb54 balrog
        bdaddr_t awaiting_bdaddr[HCI_HANDLES_MAX];
68 4e38eb54 balrog
    } lm;
69 4e38eb54 balrog
70 4e38eb54 balrog
    uint8_t event_mask[8];
71 4e38eb54 balrog
    uint16_t voice_setting;        /* Notw: Always little-endian */
72 4e38eb54 balrog
    uint16_t conn_accept_tout;
73 4e38eb54 balrog
    QEMUTimer *conn_accept_timer;
74 4e38eb54 balrog
75 4e38eb54 balrog
    struct HCIInfo info;
76 4e38eb54 balrog
    struct bt_device_s device;
77 4e38eb54 balrog
};
78 4e38eb54 balrog
79 4e38eb54 balrog
#define DEFAULT_RSSI_DBM        20
80 4e38eb54 balrog
81 4e38eb54 balrog
#define hci_from_info(ptr)        container_of((ptr), struct bt_hci_s, info)
82 4e38eb54 balrog
#define hci_from_device(ptr)        container_of((ptr), struct bt_hci_s, device)
83 4e38eb54 balrog
84 4e38eb54 balrog
struct bt_hci_link_s {
85 4e38eb54 balrog
    struct bt_link_s btlink;
86 4e38eb54 balrog
    uint16_t handle;        /* Local */
87 4e38eb54 balrog
};
88 4e38eb54 balrog
89 4e38eb54 balrog
/* LMP layer emulation */
90 b1d8e52e blueswir1
#if 0
91 e820e3f4 balrog
static void bt_submit_lmp(struct bt_device_s *bt, int length, uint8_t *data)
92 4e38eb54 balrog
{
93 4e38eb54 balrog
    int resp, resplen, error, op, tr;
94 4e38eb54 balrog
    uint8_t respdata[17];
95 4e38eb54 balrog

96 4e38eb54 balrog
    if (length < 1)
97 4e38eb54 balrog
        return;
98 4e38eb54 balrog

99 4e38eb54 balrog
    tr = *data & 1;
100 4e38eb54 balrog
    op = *(data ++) >> 1;
101 4e38eb54 balrog
    resp = LMP_ACCEPTED;
102 4e38eb54 balrog
    resplen = 2;
103 4e38eb54 balrog
    respdata[1] = op;
104 4e38eb54 balrog
    error = 0;
105 4e38eb54 balrog
    length --;
106 4e38eb54 balrog

107 4e38eb54 balrog
    if (op >= 0x7c) {        /* Extended opcode */
108 4e38eb54 balrog
        op |= *(data ++) << 8;
109 4e38eb54 balrog
        resp = LMP_ACCEPTED_EXT;
110 4e38eb54 balrog
        resplen = 4;
111 4e38eb54 balrog
        respdata[0] = op >> 8;
112 4e38eb54 balrog
        respdata[1] = op & 0xff;
113 4e38eb54 balrog
        length --;
114 4e38eb54 balrog
    }
115 4e38eb54 balrog

116 4e38eb54 balrog
    switch (op) {
117 4e38eb54 balrog
    case LMP_ACCEPTED:
118 4e38eb54 balrog
        /* data[0]        Op code
119 4e38eb54 balrog
         */
120 4e38eb54 balrog
        if (length < 1) {
121 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
122 4e38eb54 balrog
            goto not_accepted;
123 4e38eb54 balrog
        }
124 4e38eb54 balrog
        resp = 0;
125 4e38eb54 balrog
        break;
126 4e38eb54 balrog

127 4e38eb54 balrog
    case LMP_ACCEPTED_EXT:
128 4e38eb54 balrog
        /* data[0]        Escape op code
129 4e38eb54 balrog
         * data[1]        Extended op code
130 4e38eb54 balrog
         */
131 4e38eb54 balrog
        if (length < 2) {
132 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
133 4e38eb54 balrog
            goto not_accepted;
134 4e38eb54 balrog
        }
135 4e38eb54 balrog
        resp = 0;
136 4e38eb54 balrog
        break;
137 4e38eb54 balrog

138 4e38eb54 balrog
    case LMP_NOT_ACCEPTED:
139 4e38eb54 balrog
        /* data[0]        Op code
140 4e38eb54 balrog
         * data[1]        Error code
141 4e38eb54 balrog
         */
142 4e38eb54 balrog
        if (length < 2) {
143 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
144 4e38eb54 balrog
            goto not_accepted;
145 4e38eb54 balrog
        }
146 4e38eb54 balrog
        resp = 0;
147 4e38eb54 balrog
        break;
148 4e38eb54 balrog

149 4e38eb54 balrog
    case LMP_NOT_ACCEPTED_EXT:
150 4e38eb54 balrog
        /* data[0]        Op code
151 4e38eb54 balrog
         * data[1]        Extended op code
152 4e38eb54 balrog
         * data[2]        Error code
153 4e38eb54 balrog
         */
154 4e38eb54 balrog
        if (length < 3) {
155 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
156 4e38eb54 balrog
            goto not_accepted;
157 4e38eb54 balrog
        }
158 4e38eb54 balrog
        resp = 0;
159 4e38eb54 balrog
        break;
160 4e38eb54 balrog

161 4e38eb54 balrog
    case LMP_HOST_CONNECTION_REQ:
162 4e38eb54 balrog
        break;
163 4e38eb54 balrog

164 4e38eb54 balrog
    case LMP_SETUP_COMPLETE:
165 4e38eb54 balrog
        resp = LMP_SETUP_COMPLETE;
166 4e38eb54 balrog
        resplen = 1;
167 4e38eb54 balrog
        bt->setup = 1;
168 4e38eb54 balrog
        break;
169 4e38eb54 balrog

170 4e38eb54 balrog
    case LMP_DETACH:
171 4e38eb54 balrog
        /* data[0]        Error code
172 4e38eb54 balrog
         */
173 4e38eb54 balrog
        if (length < 1) {
174 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
175 4e38eb54 balrog
            goto not_accepted;
176 4e38eb54 balrog
        }
177 4e38eb54 balrog
        bt->setup = 0;
178 4e38eb54 balrog
        resp = 0;
179 4e38eb54 balrog
        break;
180 4e38eb54 balrog

181 4e38eb54 balrog
    case LMP_SUPERVISION_TIMEOUT:
182 4e38eb54 balrog
        /* data[0,1]        Supervision timeout
183 4e38eb54 balrog
         */
184 4e38eb54 balrog
        if (length < 2) {
185 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
186 4e38eb54 balrog
            goto not_accepted;
187 4e38eb54 balrog
        }
188 4e38eb54 balrog
        resp = 0;
189 4e38eb54 balrog
        break;
190 4e38eb54 balrog

191 4e38eb54 balrog
    case LMP_QUALITY_OF_SERVICE:
192 4e38eb54 balrog
        resp = 0;
193 4e38eb54 balrog
        /* Fall through */
194 4e38eb54 balrog
    case LMP_QOS_REQ:
195 4e38eb54 balrog
        /* data[0,1]        Poll interval
196 4e38eb54 balrog
         * data[2]        N(BC)
197 4e38eb54 balrog
         */
198 4e38eb54 balrog
        if (length < 3) {
199 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
200 4e38eb54 balrog
            goto not_accepted;
201 4e38eb54 balrog
        }
202 4e38eb54 balrog
        break;
203 4e38eb54 balrog

204 4e38eb54 balrog
    case LMP_MAX_SLOT:
205 4e38eb54 balrog
        resp = 0;
206 4e38eb54 balrog
        /* Fall through */
207 4e38eb54 balrog
    case LMP_MAX_SLOT_REQ:
208 4e38eb54 balrog
        /* data[0]        Max slots
209 4e38eb54 balrog
         */
210 4e38eb54 balrog
        if (length < 1) {
211 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
212 4e38eb54 balrog
            goto not_accepted;
213 4e38eb54 balrog
        }
214 4e38eb54 balrog
        break;
215 4e38eb54 balrog

216 4e38eb54 balrog
    case LMP_AU_RAND:
217 4e38eb54 balrog
    case LMP_IN_RAND:
218 4e38eb54 balrog
    case LMP_COMB_KEY:
219 4e38eb54 balrog
        /* data[0-15]        Random number
220 4e38eb54 balrog
         */
221 4e38eb54 balrog
        if (length < 16) {
222 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
223 4e38eb54 balrog
            goto not_accepted;
224 4e38eb54 balrog
        }
225 4e38eb54 balrog
        if (op == LMP_AU_RAND) {
226 4e38eb54 balrog
            if (bt->key_present) {
227 4e38eb54 balrog
                resp = LMP_SRES;
228 4e38eb54 balrog
                resplen = 5;
229 4e38eb54 balrog
                /* XXX: [Part H] Section 6.1 on page 801 */
230 4e38eb54 balrog
            } else {
231 4e38eb54 balrog
                error = HCI_PIN_OR_KEY_MISSING;
232 4e38eb54 balrog
                goto not_accepted;
233 4e38eb54 balrog
            }
234 4e38eb54 balrog
        } else if (op == LMP_IN_RAND) {
235 4e38eb54 balrog
            error = HCI_PAIRING_NOT_ALLOWED;
236 4e38eb54 balrog
            goto not_accepted;
237 4e38eb54 balrog
        } else {
238 4e38eb54 balrog
            /* XXX: [Part H] Section 3.2 on page 779 */
239 4e38eb54 balrog
            resp = LMP_UNIT_KEY;
240 4e38eb54 balrog
            resplen = 17;
241 4e38eb54 balrog
            memcpy(respdata + 1, bt->key, 16);
242 4e38eb54 balrog

243 4e38eb54 balrog
            error = HCI_UNIT_LINK_KEY_USED;
244 4e38eb54 balrog
            goto not_accepted;
245 4e38eb54 balrog
        }
246 4e38eb54 balrog
        break;
247 4e38eb54 balrog

248 4e38eb54 balrog
    case LMP_UNIT_KEY:
249 4e38eb54 balrog
        /* data[0-15]        Key
250 4e38eb54 balrog
         */
251 4e38eb54 balrog
        if (length < 16) {
252 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
253 4e38eb54 balrog
            goto not_accepted;
254 4e38eb54 balrog
        }
255 4e38eb54 balrog
        memcpy(bt->key, data, 16);
256 4e38eb54 balrog
        bt->key_present = 1;
257 4e38eb54 balrog
        break;
258 4e38eb54 balrog

259 4e38eb54 balrog
    case LMP_SRES:
260 4e38eb54 balrog
        /* data[0-3]        Authentication response
261 4e38eb54 balrog
         */
262 4e38eb54 balrog
        if (length < 4) {
263 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
264 4e38eb54 balrog
            goto not_accepted;
265 4e38eb54 balrog
        }
266 4e38eb54 balrog
        break;
267 4e38eb54 balrog

268 4e38eb54 balrog
    case LMP_CLKOFFSET_REQ:
269 4e38eb54 balrog
        resp = LMP_CLKOFFSET_RES;
270 4e38eb54 balrog
        resplen = 3;
271 4e38eb54 balrog
        respdata[1] = 0x33;
272 4e38eb54 balrog
        respdata[2] = 0x33;
273 4e38eb54 balrog
        break;
274 4e38eb54 balrog

275 4e38eb54 balrog
    case LMP_CLKOFFSET_RES:
276 4e38eb54 balrog
        /* data[0,1]        Clock offset
277 4e38eb54 balrog
         * (Slave to master only)
278 4e38eb54 balrog
         */
279 4e38eb54 balrog
        if (length < 2) {
280 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
281 4e38eb54 balrog
            goto not_accepted;
282 4e38eb54 balrog
        }
283 4e38eb54 balrog
        break;
284 4e38eb54 balrog

285 4e38eb54 balrog
    case LMP_VERSION_REQ:
286 4e38eb54 balrog
    case LMP_VERSION_RES:
287 4e38eb54 balrog
        /* data[0]        VersNr
288 4e38eb54 balrog
         * data[1,2]        CompId
289 4e38eb54 balrog
         * data[3,4]        SubVersNr
290 4e38eb54 balrog
         */
291 4e38eb54 balrog
        if (length < 5) {
292 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
293 4e38eb54 balrog
            goto not_accepted;
294 4e38eb54 balrog
        }
295 4e38eb54 balrog
        if (op == LMP_VERSION_REQ) {
296 4e38eb54 balrog
            resp = LMP_VERSION_RES;
297 4e38eb54 balrog
            resplen = 6;
298 4e38eb54 balrog
            respdata[1] = 0x20;
299 4e38eb54 balrog
            respdata[2] = 0xff;
300 4e38eb54 balrog
            respdata[3] = 0xff;
301 4e38eb54 balrog
            respdata[4] = 0xff;
302 4e38eb54 balrog
            respdata[5] = 0xff;
303 4e38eb54 balrog
        } else
304 4e38eb54 balrog
            resp = 0;
305 4e38eb54 balrog
        break;
306 4e38eb54 balrog

307 4e38eb54 balrog
    case LMP_FEATURES_REQ:
308 4e38eb54 balrog
    case LMP_FEATURES_RES:
309 4e38eb54 balrog
        /* data[0-7]        Features
310 4e38eb54 balrog
         */
311 4e38eb54 balrog
        if (length < 8) {
312 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
313 4e38eb54 balrog
            goto not_accepted;
314 4e38eb54 balrog
        }
315 4e38eb54 balrog
        if (op == LMP_FEATURES_REQ) {
316 4e38eb54 balrog
            resp = LMP_FEATURES_RES;
317 4e38eb54 balrog
            resplen = 9;
318 4e38eb54 balrog
            respdata[1] = (bt->lmp_caps >> 0) & 0xff;
319 4e38eb54 balrog
            respdata[2] = (bt->lmp_caps >> 8) & 0xff;
320 4e38eb54 balrog
            respdata[3] = (bt->lmp_caps >> 16) & 0xff;
321 4e38eb54 balrog
            respdata[4] = (bt->lmp_caps >> 24) & 0xff;
322 4e38eb54 balrog
            respdata[5] = (bt->lmp_caps >> 32) & 0xff;
323 4e38eb54 balrog
            respdata[6] = (bt->lmp_caps >> 40) & 0xff;
324 4e38eb54 balrog
            respdata[7] = (bt->lmp_caps >> 48) & 0xff;
325 4e38eb54 balrog
            respdata[8] = (bt->lmp_caps >> 56) & 0xff;
326 4e38eb54 balrog
        } else
327 4e38eb54 balrog
            resp = 0;
328 4e38eb54 balrog
        break;
329 4e38eb54 balrog

330 4e38eb54 balrog
    case LMP_NAME_REQ:
331 4e38eb54 balrog
        /* data[0]        Name offset
332 4e38eb54 balrog
         */
333 4e38eb54 balrog
        if (length < 1) {
334 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
335 4e38eb54 balrog
            goto not_accepted;
336 4e38eb54 balrog
        }
337 4e38eb54 balrog
        resp = LMP_NAME_RES;
338 4e38eb54 balrog
        resplen = 17;
339 4e38eb54 balrog
        respdata[1] = data[0];
340 4e38eb54 balrog
        respdata[2] = strlen(bt->lmp_name);
341 4e38eb54 balrog
        memset(respdata + 3, 0x00, 14);
342 4e38eb54 balrog
        if (respdata[2] > respdata[1])
343 4e38eb54 balrog
            memcpy(respdata + 3, bt->lmp_name + respdata[1],
344 4e38eb54 balrog
                            respdata[2] - respdata[1]);
345 4e38eb54 balrog
        break;
346 4e38eb54 balrog

347 4e38eb54 balrog
    case LMP_NAME_RES:
348 4e38eb54 balrog
        /* data[0]        Name offset
349 4e38eb54 balrog
         * data[1]        Name length
350 4e38eb54 balrog
         * data[2-15]        Name fragment
351 4e38eb54 balrog
         */
352 4e38eb54 balrog
        if (length < 16) {
353 4e38eb54 balrog
            error = HCI_UNSUPPORTED_LMP_PARAMETER_VALUE;
354 4e38eb54 balrog
            goto not_accepted;
355 4e38eb54 balrog
        }
356 4e38eb54 balrog
        resp = 0;
357 4e38eb54 balrog
        break;
358 4e38eb54 balrog

359 4e38eb54 balrog
    default:
360 4e38eb54 balrog
        error = HCI_UNKNOWN_LMP_PDU;
361 4e38eb54 balrog
        /* Fall through */
362 4e38eb54 balrog
    not_accepted:
363 4e38eb54 balrog
        if (op >> 8) {
364 4e38eb54 balrog
            resp = LMP_NOT_ACCEPTED_EXT;
365 4e38eb54 balrog
            resplen = 5;
366 4e38eb54 balrog
            respdata[0] = op >> 8;
367 4e38eb54 balrog
            respdata[1] = op & 0xff;
368 4e38eb54 balrog
            respdata[2] = error;
369 4e38eb54 balrog
        } else {
370 4e38eb54 balrog
            resp = LMP_NOT_ACCEPTED;
371 4e38eb54 balrog
            resplen = 3;
372 4e38eb54 balrog
            respdata[0] = op & 0xff;
373 4e38eb54 balrog
            respdata[1] = error;
374 4e38eb54 balrog
        }
375 4e38eb54 balrog
    }
376 4e38eb54 balrog

377 4e38eb54 balrog
    if (resp == 0)
378 4e38eb54 balrog
        return;
379 4e38eb54 balrog

380 4e38eb54 balrog
    if (resp >> 8) {
381 4e38eb54 balrog
        respdata[0] = resp >> 8;
382 4e38eb54 balrog
        respdata[1] = resp & 0xff;
383 4e38eb54 balrog
    } else
384 4e38eb54 balrog
        respdata[0] = resp & 0xff;
385 4e38eb54 balrog

386 4e38eb54 balrog
    respdata[0] <<= 1;
387 4e38eb54 balrog
    respdata[0] |= tr;
388 4e38eb54 balrog
}
389 4e38eb54 balrog

390 b1d8e52e blueswir1
static void bt_submit_raw_acl(struct bt_piconet_s *net, int length, uint8_t *data)
391 4e38eb54 balrog
{
392 4e38eb54 balrog
    struct bt_device_s *slave;
393 4e38eb54 balrog
    if (length < 1)
394 4e38eb54 balrog
        return;
395 4e38eb54 balrog

396 4e38eb54 balrog
    slave = 0;
397 4e38eb54 balrog
#if 0
398 4e38eb54 balrog
    slave = net->slave;
399 4e38eb54 balrog
#endif
400 4e38eb54 balrog
401 4e38eb54 balrog
    switch (data[0] & 3) {
402 4e38eb54 balrog
    case LLID_ACLC:
403 4e38eb54 balrog
        bt_submit_lmp(slave, length - 1, data + 1);
404 4e38eb54 balrog
        break;
405 4e38eb54 balrog
    case LLID_ACLU_START:
406 4e38eb54 balrog
#if 0
407 4e38eb54 balrog
        bt_sumbit_l2cap(slave, length - 1, data + 1, (data[0] >> 2) & 1);
408 4e38eb54 balrog
        breka;
409 4e38eb54 balrog
#endif
410 4e38eb54 balrog
    default:
411 4e38eb54 balrog
    case LLID_ACLU_CONT:
412 4e38eb54 balrog
        break;
413 4e38eb54 balrog
    }
414 4e38eb54 balrog
}
415 b1d8e52e blueswir1
#endif
416 4e38eb54 balrog
417 4e38eb54 balrog
/* HCI layer emulation */
418 4e38eb54 balrog
419 4e38eb54 balrog
/* Note: we could ignore endiannes because unswapped handles will still
420 4e38eb54 balrog
 * be valid as connection identifiers for the guest - they don't have to
421 4e38eb54 balrog
 * be continuously allocated.  We do it though, to preserve similar
422 4e38eb54 balrog
 * behaviour between hosts.  Some things, like the BD_ADDR cannot be
423 4e38eb54 balrog
 * preserved though (for example if a real hci is used).  */
424 4e38eb54 balrog
#ifdef WORDS_BIGENDIAN
425 4e38eb54 balrog
# define HNDL(raw)        bswap16(raw)
426 4e38eb54 balrog
#else
427 4e38eb54 balrog
# define HNDL(raw)        (raw)
428 4e38eb54 balrog
#endif
429 4e38eb54 balrog
430 4e38eb54 balrog
static const uint8_t bt_event_reserved_mask[8] = {
431 4e38eb54 balrog
    0xff, 0x9f, 0xfb, 0xff, 0x07, 0x18, 0x00, 0x00,
432 4e38eb54 balrog
};
433 4e38eb54 balrog
434 4e38eb54 balrog
static inline uint8_t *bt_hci_event_start(struct bt_hci_s *hci,
435 4e38eb54 balrog
                int evt, int len)
436 4e38eb54 balrog
{
437 4e38eb54 balrog
    uint8_t *packet, mask;
438 4e38eb54 balrog
    int mask_byte;
439 4e38eb54 balrog
440 4e38eb54 balrog
    if (len > 255) {
441 4e38eb54 balrog
        fprintf(stderr, "%s: HCI event params too long (%ib)\n",
442 4e38eb54 balrog
                        __FUNCTION__, len);
443 4e38eb54 balrog
        exit(-1);
444 4e38eb54 balrog
    }
445 4e38eb54 balrog
446 4e38eb54 balrog
    mask_byte = (evt - 1) >> 3;
447 4e38eb54 balrog
    mask = 1 << ((evt - 1) & 3);
448 4e38eb54 balrog
    if (mask & bt_event_reserved_mask[mask_byte] & ~hci->event_mask[mask_byte])
449 511d2b14 blueswir1
        return NULL;
450 4e38eb54 balrog
451 4e38eb54 balrog
    packet = hci->evt_packet(hci->opaque);
452 4e38eb54 balrog
    packet[0] = evt;
453 4e38eb54 balrog
    packet[1] = len;
454 4e38eb54 balrog
455 4e38eb54 balrog
    return &packet[2];
456 4e38eb54 balrog
}
457 4e38eb54 balrog
458 4e38eb54 balrog
static inline void bt_hci_event(struct bt_hci_s *hci, int evt,
459 4e38eb54 balrog
                void *params, int len)
460 4e38eb54 balrog
{
461 4e38eb54 balrog
    uint8_t *packet = bt_hci_event_start(hci, evt, len);
462 4e38eb54 balrog
463 4e38eb54 balrog
    if (!packet)
464 4e38eb54 balrog
        return;
465 4e38eb54 balrog
466 4e38eb54 balrog
    if (len)
467 4e38eb54 balrog
        memcpy(packet, params, len);
468 4e38eb54 balrog
469 4e38eb54 balrog
    hci->evt_submit(hci->opaque, len + 2);
470 4e38eb54 balrog
}
471 4e38eb54 balrog
472 4e38eb54 balrog
static inline void bt_hci_event_status(struct bt_hci_s *hci, int status)
473 4e38eb54 balrog
{
474 4e38eb54 balrog
    evt_cmd_status params = {
475 4e38eb54 balrog
        .status        = status,
476 4e38eb54 balrog
        .ncmd        = 1,
477 4e38eb54 balrog
        .opcode        = hci->last_cmd,
478 4e38eb54 balrog
    };
479 4e38eb54 balrog
480 4e38eb54 balrog
    bt_hci_event(hci, EVT_CMD_STATUS, &params, EVT_CMD_STATUS_SIZE);
481 4e38eb54 balrog
}
482 4e38eb54 balrog
483 4e38eb54 balrog
static inline void bt_hci_event_complete(struct bt_hci_s *hci,
484 4e38eb54 balrog
                void *ret, int len)
485 4e38eb54 balrog
{
486 4e38eb54 balrog
    uint8_t *packet = bt_hci_event_start(hci, EVT_CMD_COMPLETE,
487 4e38eb54 balrog
                    len + EVT_CMD_COMPLETE_SIZE);
488 4e38eb54 balrog
    evt_cmd_complete *params = (evt_cmd_complete *) packet;
489 4e38eb54 balrog
490 4e38eb54 balrog
    if (!packet)
491 4e38eb54 balrog
        return;
492 4e38eb54 balrog
493 4e38eb54 balrog
    params->ncmd        = 1;
494 4e38eb54 balrog
    params->opcode        = hci->last_cmd;
495 4e38eb54 balrog
    if (len)
496 4e38eb54 balrog
        memcpy(&packet[EVT_CMD_COMPLETE_SIZE], ret, len);
497 4e38eb54 balrog
498 4e38eb54 balrog
    hci->evt_submit(hci->opaque, len + EVT_CMD_COMPLETE_SIZE + 2);
499 4e38eb54 balrog
}
500 4e38eb54 balrog
501 4e38eb54 balrog
static void bt_hci_inquiry_done(void *opaque)
502 4e38eb54 balrog
{
503 4e38eb54 balrog
    struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
504 4e38eb54 balrog
    uint8_t status = HCI_SUCCESS;
505 4e38eb54 balrog
506 4e38eb54 balrog
    if (!hci->lm.periodic)
507 4e38eb54 balrog
        hci->lm.inquire = 0;
508 4e38eb54 balrog
509 4e38eb54 balrog
    /* The specification is inconsistent about this one.  Page 565 reads
510 4e38eb54 balrog
     * "The event parameters of Inquiry Complete event will have a summary
511 4e38eb54 balrog
     * of the result from the Inquiry process, which reports the number of
512 4e38eb54 balrog
     * nearby Bluetooth devices that responded [so hci->responses].", but
513 4e38eb54 balrog
     * Event Parameters (see page 729) has only Status.  */
514 4e38eb54 balrog
    bt_hci_event(hci, EVT_INQUIRY_COMPLETE, &status, 1);
515 4e38eb54 balrog
}
516 4e38eb54 balrog
517 4e38eb54 balrog
static void bt_hci_inquiry_result_standard(struct bt_hci_s *hci,
518 4e38eb54 balrog
                struct bt_device_s *slave)
519 4e38eb54 balrog
{
520 4e38eb54 balrog
    inquiry_info params = {
521 4e38eb54 balrog
        .num_responses                = 1,
522 4e38eb54 balrog
        .bdaddr                        = BAINIT(&slave->bd_addr),
523 4e38eb54 balrog
        .pscan_rep_mode                = 0x00,        /* R0 */
524 4e38eb54 balrog
        .pscan_period_mode        = 0x00,        /* P0 - deprecated */
525 4e38eb54 balrog
        .pscan_mode                = 0x00,        /* Standard scan - deprecated */
526 4e38eb54 balrog
        .dev_class[0]                = slave->class[0],
527 4e38eb54 balrog
        .dev_class[1]                = slave->class[1],
528 4e38eb54 balrog
        .dev_class[2]                = slave->class[2],
529 4e38eb54 balrog
        /* TODO: return the clkoff *differenece* */
530 4e38eb54 balrog
        .clock_offset                = slave->clkoff,        /* Note: no swapping */
531 4e38eb54 balrog
    };
532 4e38eb54 balrog
533 4e38eb54 balrog
    bt_hci_event(hci, EVT_INQUIRY_RESULT, &params, INQUIRY_INFO_SIZE);
534 4e38eb54 balrog
}
535 4e38eb54 balrog
536 4e38eb54 balrog
static void bt_hci_inquiry_result_with_rssi(struct bt_hci_s *hci,
537 4e38eb54 balrog
                struct bt_device_s *slave)
538 4e38eb54 balrog
{
539 4e38eb54 balrog
    inquiry_info_with_rssi params = {
540 4e38eb54 balrog
        .num_responses                = 1,
541 4e38eb54 balrog
        .bdaddr                        = BAINIT(&slave->bd_addr),
542 4e38eb54 balrog
        .pscan_rep_mode                = 0x00,        /* R0 */
543 4e38eb54 balrog
        .pscan_period_mode        = 0x00,        /* P0 - deprecated */
544 4e38eb54 balrog
        .dev_class[0]                = slave->class[0],
545 4e38eb54 balrog
        .dev_class[1]                = slave->class[1],
546 4e38eb54 balrog
        .dev_class[2]                = slave->class[2],
547 4e38eb54 balrog
        /* TODO: return the clkoff *differenece* */
548 4e38eb54 balrog
        .clock_offset                = slave->clkoff,        /* Note: no swapping */
549 4e38eb54 balrog
        .rssi                        = DEFAULT_RSSI_DBM,
550 4e38eb54 balrog
    };
551 4e38eb54 balrog
552 4e38eb54 balrog
    bt_hci_event(hci, EVT_INQUIRY_RESULT_WITH_RSSI,
553 4e38eb54 balrog
                    &params, INQUIRY_INFO_WITH_RSSI_SIZE);
554 4e38eb54 balrog
}
555 4e38eb54 balrog
556 4e38eb54 balrog
static void bt_hci_inquiry_result(struct bt_hci_s *hci,
557 4e38eb54 balrog
                struct bt_device_s *slave)
558 4e38eb54 balrog
{
559 4e38eb54 balrog
    if (!slave->inquiry_scan || !hci->lm.responses_left)
560 4e38eb54 balrog
        return;
561 4e38eb54 balrog
562 4e38eb54 balrog
    hci->lm.responses_left --;
563 4e38eb54 balrog
    hci->lm.responses ++;
564 4e38eb54 balrog
565 4e38eb54 balrog
    switch (hci->lm.inquiry_mode) {
566 4e38eb54 balrog
    case 0x00:
567 7442511c blueswir1
        bt_hci_inquiry_result_standard(hci, slave);
568 7442511c blueswir1
        return;
569 4e38eb54 balrog
    case 0x01:
570 7442511c blueswir1
        bt_hci_inquiry_result_with_rssi(hci, slave);
571 7442511c blueswir1
        return;
572 4e38eb54 balrog
    default:
573 4e38eb54 balrog
        fprintf(stderr, "%s: bad inquiry mode %02x\n", __FUNCTION__,
574 4e38eb54 balrog
                        hci->lm.inquiry_mode);
575 4e38eb54 balrog
        exit(-1);
576 4e38eb54 balrog
    }
577 4e38eb54 balrog
}
578 4e38eb54 balrog
579 4e38eb54 balrog
static void bt_hci_mod_timer_1280ms(QEMUTimer *timer, int period)
580 4e38eb54 balrog
{
581 4e38eb54 balrog
    qemu_mod_timer(timer, qemu_get_clock(vm_clock) +
582 4e38eb54 balrog
                    muldiv64(period << 7, ticks_per_sec, 100));
583 4e38eb54 balrog
}
584 4e38eb54 balrog
585 4e38eb54 balrog
static void bt_hci_inquiry_start(struct bt_hci_s *hci, int length)
586 4e38eb54 balrog
{
587 4e38eb54 balrog
    struct bt_device_s *slave;
588 4e38eb54 balrog
589 4e38eb54 balrog
    hci->lm.inquiry_length = length;
590 4e38eb54 balrog
    for (slave = hci->device.net->slave; slave; slave = slave->next)
591 4e38eb54 balrog
        /* Don't uncover ourselves.  */
592 4e38eb54 balrog
        if (slave != &hci->device)
593 4e38eb54 balrog
            bt_hci_inquiry_result(hci, slave);
594 4e38eb54 balrog
595 4e38eb54 balrog
    /* TODO: register for a callback on a new device's addition to the
596 4e38eb54 balrog
     * scatternet so that if it's added before inquiry_length expires,
597 4e38eb54 balrog
     * an Inquiry Result is generated immediately.  Alternatively re-loop
598 4e38eb54 balrog
     * through the devices on the inquiry_length expiration and report
599 4e38eb54 balrog
     * devices not seen before.  */
600 4e38eb54 balrog
    if (hci->lm.responses_left)
601 4e38eb54 balrog
        bt_hci_mod_timer_1280ms(hci->lm.inquiry_done, hci->lm.inquiry_length);
602 4e38eb54 balrog
    else
603 4e38eb54 balrog
        bt_hci_inquiry_done(hci);
604 4e38eb54 balrog
605 4e38eb54 balrog
    if (hci->lm.periodic)
606 4e38eb54 balrog
        bt_hci_mod_timer_1280ms(hci->lm.inquiry_next, hci->lm.inquiry_period);
607 4e38eb54 balrog
}
608 4e38eb54 balrog
609 4e38eb54 balrog
static void bt_hci_inquiry_next(void *opaque)
610 4e38eb54 balrog
{
611 4e38eb54 balrog
    struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
612 4e38eb54 balrog
613 4e38eb54 balrog
    hci->lm.responses_left += hci->lm.responses;
614 4e38eb54 balrog
    hci->lm.responses = 0;
615 4e38eb54 balrog
    bt_hci_inquiry_start(hci,  hci->lm.inquiry_length);
616 4e38eb54 balrog
}
617 4e38eb54 balrog
618 4e38eb54 balrog
static inline int bt_hci_handle_bad(struct bt_hci_s *hci, uint16_t handle)
619 4e38eb54 balrog
{
620 4e38eb54 balrog
    return !(handle & HCI_HANDLE_OFFSET) ||
621 4e38eb54 balrog
            handle >= (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX) ||
622 4e38eb54 balrog
            !hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
623 4e38eb54 balrog
}
624 4e38eb54 balrog
625 4e38eb54 balrog
static inline int bt_hci_role_master(struct bt_hci_s *hci, uint16_t handle)
626 4e38eb54 balrog
{
627 4e38eb54 balrog
    return !!(hci->lm.role_bmp & (1 << (handle & ~HCI_HANDLE_OFFSET)));
628 4e38eb54 balrog
}
629 4e38eb54 balrog
630 4e38eb54 balrog
static inline struct bt_device_s *bt_hci_remote_dev(struct bt_hci_s *hci,
631 4e38eb54 balrog
                uint16_t handle)
632 4e38eb54 balrog
{
633 4e38eb54 balrog
    struct bt_link_s *link = hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
634 4e38eb54 balrog
635 4e38eb54 balrog
    return bt_hci_role_master(hci, handle) ? link->slave : link->host;
636 4e38eb54 balrog
}
637 4e38eb54 balrog
638 4e38eb54 balrog
static void bt_hci_mode_tick(void *opaque);
639 4e38eb54 balrog
static void bt_hci_lmp_link_establish(struct bt_hci_s *hci,
640 4e38eb54 balrog
                struct bt_link_s *link, int master)
641 4e38eb54 balrog
{
642 4e38eb54 balrog
    hci->lm.handle[hci->lm.last_handle].link = link;
643 4e38eb54 balrog
644 4e38eb54 balrog
    if (master) {
645 4e38eb54 balrog
        /* We are the master side of an ACL link */
646 4e38eb54 balrog
        hci->lm.role_bmp |= 1 << hci->lm.last_handle;
647 4e38eb54 balrog
648 4e38eb54 balrog
        hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
649 4e38eb54 balrog
                link->slave->lmp_acl_data;
650 4e38eb54 balrog
    } else {
651 4e38eb54 balrog
        /* We are the slave side of an ACL link */
652 4e38eb54 balrog
        hci->lm.role_bmp &= ~(1 << hci->lm.last_handle);
653 4e38eb54 balrog
654 4e38eb54 balrog
        hci->lm.handle[hci->lm.last_handle].lmp_acl_data =
655 4e38eb54 balrog
                link->host->lmp_acl_resp;
656 4e38eb54 balrog
    }
657 4e38eb54 balrog
658 4e38eb54 balrog
    /* Mode */
659 4e38eb54 balrog
    if (master) {
660 4e38eb54 balrog
        link->acl_mode = acl_active;
661 4e38eb54 balrog
        hci->lm.handle[hci->lm.last_handle].acl_mode_timer =
662 4e38eb54 balrog
                qemu_new_timer(vm_clock, bt_hci_mode_tick, link);
663 4e38eb54 balrog
    }
664 4e38eb54 balrog
}
665 4e38eb54 balrog
666 4e38eb54 balrog
static void bt_hci_lmp_link_teardown(struct bt_hci_s *hci, uint16_t handle)
667 4e38eb54 balrog
{
668 4e38eb54 balrog
    handle &= ~HCI_HANDLE_OFFSET;
669 511d2b14 blueswir1
    hci->lm.handle[handle].link = NULL;
670 4e38eb54 balrog
671 4e38eb54 balrog
    if (bt_hci_role_master(hci, handle)) {
672 4e38eb54 balrog
        qemu_del_timer(hci->lm.handle[handle].acl_mode_timer);
673 4e38eb54 balrog
        qemu_free_timer(hci->lm.handle[handle].acl_mode_timer);
674 4e38eb54 balrog
    }
675 4e38eb54 balrog
}
676 4e38eb54 balrog
677 4e38eb54 balrog
static int bt_hci_connect(struct bt_hci_s *hci, bdaddr_t *bdaddr)
678 4e38eb54 balrog
{
679 4e38eb54 balrog
    struct bt_device_s *slave;
680 4e38eb54 balrog
    struct bt_link_s link;
681 4e38eb54 balrog
682 4e38eb54 balrog
    for (slave = hci->device.net->slave; slave; slave = slave->next)
683 4e38eb54 balrog
        if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
684 4e38eb54 balrog
            break;
685 4e38eb54 balrog
    if (!slave || slave == &hci->device)
686 4e38eb54 balrog
        return -ENODEV;
687 4e38eb54 balrog
688 4e38eb54 balrog
    bacpy(&hci->lm.awaiting_bdaddr[hci->lm.connecting ++], &slave->bd_addr);
689 4e38eb54 balrog
690 4e38eb54 balrog
    link.slave = slave;
691 4e38eb54 balrog
    link.host = &hci->device;
692 4e38eb54 balrog
    link.slave->lmp_connection_request(&link);        /* Always last */
693 4e38eb54 balrog
694 4e38eb54 balrog
    return 0;
695 4e38eb54 balrog
}
696 4e38eb54 balrog
697 4e38eb54 balrog
static void bt_hci_connection_reject(struct bt_hci_s *hci,
698 4e38eb54 balrog
                struct bt_device_s *host, uint8_t because)
699 4e38eb54 balrog
{
700 4e38eb54 balrog
    struct bt_link_s link = {
701 4e38eb54 balrog
        .slave        = &hci->device,
702 4e38eb54 balrog
        .host        = host,
703 4e38eb54 balrog
        /* Rest uninitialised */
704 4e38eb54 balrog
    };
705 4e38eb54 balrog
706 4e38eb54 balrog
    host->reject_reason = because;
707 4e38eb54 balrog
    host->lmp_connection_complete(&link);
708 4e38eb54 balrog
}
709 4e38eb54 balrog
710 4e38eb54 balrog
static void bt_hci_connection_reject_event(struct bt_hci_s *hci,
711 4e38eb54 balrog
                bdaddr_t *bdaddr)
712 4e38eb54 balrog
{
713 4e38eb54 balrog
    evt_conn_complete params;
714 4e38eb54 balrog
715 4e38eb54 balrog
    params.status        = HCI_NO_CONNECTION;
716 4e38eb54 balrog
    params.handle        = 0;
717 4e38eb54 balrog
    bacpy(&params.bdaddr, bdaddr);
718 4e38eb54 balrog
    params.link_type        = ACL_LINK;
719 4e38eb54 balrog
    params.encr_mode        = 0x00;                /* Encryption not required */
720 4e38eb54 balrog
    bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
721 4e38eb54 balrog
}
722 4e38eb54 balrog
723 4e38eb54 balrog
static void bt_hci_connection_accept(struct bt_hci_s *hci,
724 4e38eb54 balrog
                struct bt_device_s *host)
725 4e38eb54 balrog
{
726 4e38eb54 balrog
    struct bt_hci_link_s *link = qemu_mallocz(sizeof(struct bt_hci_link_s));
727 4e38eb54 balrog
    evt_conn_complete params;
728 4e38eb54 balrog
    uint16_t handle;
729 4e38eb54 balrog
    uint8_t status = HCI_SUCCESS;
730 4e38eb54 balrog
    int tries = HCI_HANDLES_MAX;
731 4e38eb54 balrog
732 4e38eb54 balrog
    /* Make a connection handle */
733 4e38eb54 balrog
    do {
734 4e38eb54 balrog
        while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
735 4e38eb54 balrog
            hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
736 4e38eb54 balrog
        handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
737 4e38eb54 balrog
    } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
738 4e38eb54 balrog
            tries);
739 4e38eb54 balrog
740 4e38eb54 balrog
    if (!tries) {
741 4e38eb54 balrog
        qemu_free(link);
742 4e38eb54 balrog
        bt_hci_connection_reject(hci, host, HCI_REJECTED_LIMITED_RESOURCES);
743 4e38eb54 balrog
        status = HCI_NO_CONNECTION;
744 4e38eb54 balrog
        goto complete;
745 4e38eb54 balrog
    }
746 4e38eb54 balrog
747 4e38eb54 balrog
    link->btlink.slave        = &hci->device;
748 4e38eb54 balrog
    link->btlink.host        = host;
749 4e38eb54 balrog
    link->handle = handle;
750 4e38eb54 balrog
751 4e38eb54 balrog
    /* Link established */
752 4e38eb54 balrog
    bt_hci_lmp_link_establish(hci, &link->btlink, 0);
753 4e38eb54 balrog
754 4e38eb54 balrog
complete:
755 4e38eb54 balrog
    params.status        = status;
756 4e38eb54 balrog
    params.handle        = HNDL(handle);
757 4e38eb54 balrog
    bacpy(&params.bdaddr, &host->bd_addr);
758 4e38eb54 balrog
    params.link_type        = ACL_LINK;
759 4e38eb54 balrog
    params.encr_mode        = 0x00;                /* Encryption not required */
760 4e38eb54 balrog
    bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
761 4e38eb54 balrog
762 4e38eb54 balrog
    /* Neets to be done at the very end because it can trigger a (nested)
763 4e38eb54 balrog
     * disconnected, in case the other and had cancelled the request
764 4e38eb54 balrog
     * locally.  */
765 4e38eb54 balrog
    if (status == HCI_SUCCESS) {
766 4e38eb54 balrog
        host->reject_reason = 0;
767 4e38eb54 balrog
        host->lmp_connection_complete(&link->btlink);
768 4e38eb54 balrog
    }
769 4e38eb54 balrog
}
770 4e38eb54 balrog
771 4e38eb54 balrog
static void bt_hci_lmp_connection_request(struct bt_link_s *link)
772 4e38eb54 balrog
{
773 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(link->slave);
774 4e38eb54 balrog
    evt_conn_request params;
775 4e38eb54 balrog
776 7442511c blueswir1
    if (hci->conn_req_host) {
777 7442511c blueswir1
        bt_hci_connection_reject(hci, link->host,
778 7442511c blueswir1
                                 HCI_REJECTED_LIMITED_RESOURCES);
779 7442511c blueswir1
        return;
780 7442511c blueswir1
    }
781 4e38eb54 balrog
    hci->conn_req_host = link->host;
782 4e38eb54 balrog
    /* TODO: if masked and auto-accept, then auto-accept,
783 4e38eb54 balrog
     * if masked and not auto-accept, then auto-reject */
784 4e38eb54 balrog
    /* TODO: kick the hci->conn_accept_timer, timeout after
785 4e38eb54 balrog
     * hci->conn_accept_tout * 0.625 msec */
786 4e38eb54 balrog
787 4e38eb54 balrog
    bacpy(&params.bdaddr, &link->host->bd_addr);
788 4e38eb54 balrog
    memcpy(&params.dev_class, &link->host->class, sizeof(params.dev_class));
789 4e38eb54 balrog
    params.link_type        = ACL_LINK;
790 4e38eb54 balrog
    bt_hci_event(hci, EVT_CONN_REQUEST, &params, EVT_CONN_REQUEST_SIZE);
791 4e38eb54 balrog
    return;
792 4e38eb54 balrog
}
793 4e38eb54 balrog
794 4e38eb54 balrog
static void bt_hci_conn_accept_timeout(void *opaque)
795 4e38eb54 balrog
{
796 4e38eb54 balrog
    struct bt_hci_s *hci = (struct bt_hci_s *) opaque;
797 4e38eb54 balrog
798 4e38eb54 balrog
    if (!hci->conn_req_host)
799 4e38eb54 balrog
        /* Already accepted or rejected.  If the other end cancelled the
800 4e38eb54 balrog
         * connection request then we still have to reject or accept it
801 4e38eb54 balrog
         * and then we'll get a disconnect.  */
802 4e38eb54 balrog
        return;
803 4e38eb54 balrog
804 4e38eb54 balrog
    /* TODO */
805 4e38eb54 balrog
}
806 4e38eb54 balrog
807 4e38eb54 balrog
/* Remove from the list of devices which we wanted to connect to and
808 4e38eb54 balrog
 * are awaiting a response from.  If the callback sees a response from
809 4e38eb54 balrog
 * a device which is not on the list it will assume it's a connection
810 4e38eb54 balrog
 * that's been cancelled by the host in the meantime and immediately
811 4e38eb54 balrog
 * try to detach the link and send a Connection Complete.  */
812 4e38eb54 balrog
static int bt_hci_lmp_connection_ready(struct bt_hci_s *hci,
813 4e38eb54 balrog
                bdaddr_t *bdaddr)
814 4e38eb54 balrog
{
815 4e38eb54 balrog
    int i;
816 4e38eb54 balrog
817 4e38eb54 balrog
    for (i = 0; i < hci->lm.connecting; i ++)
818 4e38eb54 balrog
        if (!bacmp(&hci->lm.awaiting_bdaddr[i], bdaddr)) {
819 4e38eb54 balrog
            if (i < -- hci->lm.connecting)
820 4e38eb54 balrog
                bacpy(&hci->lm.awaiting_bdaddr[i],
821 4e38eb54 balrog
                                &hci->lm.awaiting_bdaddr[hci->lm.connecting]);
822 4e38eb54 balrog
            return 0;
823 4e38eb54 balrog
        }
824 4e38eb54 balrog
825 4e38eb54 balrog
    return 1;
826 4e38eb54 balrog
}
827 4e38eb54 balrog
828 4e38eb54 balrog
static void bt_hci_lmp_connection_complete(struct bt_link_s *link)
829 4e38eb54 balrog
{
830 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(link->host);
831 4e38eb54 balrog
    evt_conn_complete params;
832 4e38eb54 balrog
    uint16_t handle;
833 4e38eb54 balrog
    uint8_t status = HCI_SUCCESS;
834 4e38eb54 balrog
    int tries = HCI_HANDLES_MAX;
835 4e38eb54 balrog
836 4e38eb54 balrog
    if (bt_hci_lmp_connection_ready(hci, &link->slave->bd_addr)) {
837 4e38eb54 balrog
        if (!hci->device.reject_reason)
838 4e38eb54 balrog
            link->slave->lmp_disconnect_slave(link);
839 4e38eb54 balrog
        handle = 0;
840 4e38eb54 balrog
        status = HCI_NO_CONNECTION;
841 4e38eb54 balrog
        goto complete;
842 4e38eb54 balrog
    }
843 4e38eb54 balrog
844 4e38eb54 balrog
    if (hci->device.reject_reason) {
845 4e38eb54 balrog
        handle = 0;
846 4e38eb54 balrog
        status = hci->device.reject_reason;
847 4e38eb54 balrog
        goto complete;
848 4e38eb54 balrog
    }
849 4e38eb54 balrog
850 4e38eb54 balrog
    /* Make a connection handle */
851 4e38eb54 balrog
    do {
852 4e38eb54 balrog
        while (hci->lm.handle[++ hci->lm.last_handle].link && -- tries)
853 4e38eb54 balrog
            hci->lm.last_handle &= HCI_HANDLES_MAX - 1;
854 4e38eb54 balrog
        handle = hci->lm.last_handle | HCI_HANDLE_OFFSET;
855 4e38eb54 balrog
    } while ((handle == hci->asb_handle || handle == hci->psb_handle) &&
856 4e38eb54 balrog
            tries);
857 4e38eb54 balrog
858 4e38eb54 balrog
    if (!tries) {
859 4e38eb54 balrog
        link->slave->lmp_disconnect_slave(link);
860 4e38eb54 balrog
        status = HCI_NO_CONNECTION;
861 4e38eb54 balrog
        goto complete;
862 4e38eb54 balrog
    }
863 4e38eb54 balrog
864 4e38eb54 balrog
    /* Link established */
865 4e38eb54 balrog
    link->handle = handle;
866 4e38eb54 balrog
    bt_hci_lmp_link_establish(hci, link, 1);
867 4e38eb54 balrog
868 4e38eb54 balrog
complete:
869 4e38eb54 balrog
    params.status        = status;
870 4e38eb54 balrog
    params.handle        = HNDL(handle);
871 4e38eb54 balrog
    params.link_type        = ACL_LINK;
872 4e38eb54 balrog
    bacpy(&params.bdaddr, &link->slave->bd_addr);
873 4e38eb54 balrog
    params.encr_mode        = 0x00;                /* Encryption not required */
874 4e38eb54 balrog
    bt_hci_event(hci, EVT_CONN_COMPLETE, &params, EVT_CONN_COMPLETE_SIZE);
875 4e38eb54 balrog
}
876 4e38eb54 balrog
877 4e38eb54 balrog
static void bt_hci_disconnect(struct bt_hci_s *hci,
878 4e38eb54 balrog
                uint16_t handle, int reason)
879 4e38eb54 balrog
{
880 4e38eb54 balrog
    struct bt_link_s *btlink =
881 4e38eb54 balrog
            hci->lm.handle[handle & ~HCI_HANDLE_OFFSET].link;
882 4e38eb54 balrog
    struct bt_hci_link_s *link;
883 4e38eb54 balrog
    evt_disconn_complete params;
884 4e38eb54 balrog
885 4e38eb54 balrog
    if (bt_hci_role_master(hci, handle)) {
886 4e38eb54 balrog
        btlink->slave->reject_reason = reason;
887 4e38eb54 balrog
        btlink->slave->lmp_disconnect_slave(btlink);
888 4e38eb54 balrog
        /* The link pointer is invalid from now on */
889 4e38eb54 balrog
890 4e38eb54 balrog
        goto complete;
891 4e38eb54 balrog
    }
892 4e38eb54 balrog
893 4e38eb54 balrog
    btlink->host->reject_reason = reason;
894 4e38eb54 balrog
    btlink->host->lmp_disconnect_master(btlink);
895 4e38eb54 balrog
896 4e38eb54 balrog
    /* We are the slave, we get to clean this burden */
897 4e38eb54 balrog
    link = (struct bt_hci_link_s *) btlink;
898 4e38eb54 balrog
    qemu_free(link);
899 4e38eb54 balrog
900 4e38eb54 balrog
complete:
901 4e38eb54 balrog
    bt_hci_lmp_link_teardown(hci, handle);
902 4e38eb54 balrog
903 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
904 4e38eb54 balrog
    params.handle        = HNDL(handle);
905 4e38eb54 balrog
    params.reason        = HCI_CONNECTION_TERMINATED;
906 4e38eb54 balrog
    bt_hci_event(hci, EVT_DISCONN_COMPLETE,
907 4e38eb54 balrog
                    &params, EVT_DISCONN_COMPLETE_SIZE);
908 4e38eb54 balrog
}
909 4e38eb54 balrog
910 4e38eb54 balrog
/* TODO: use only one function */
911 4e38eb54 balrog
static void bt_hci_lmp_disconnect_host(struct bt_link_s *link)
912 4e38eb54 balrog
{
913 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(link->host);
914 4e38eb54 balrog
    uint16_t handle = link->handle;
915 4e38eb54 balrog
    evt_disconn_complete params;
916 4e38eb54 balrog
917 4e38eb54 balrog
    bt_hci_lmp_link_teardown(hci, handle);
918 4e38eb54 balrog
919 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
920 4e38eb54 balrog
    params.handle        = HNDL(handle);
921 4e38eb54 balrog
    params.reason        = hci->device.reject_reason;
922 4e38eb54 balrog
    bt_hci_event(hci, EVT_DISCONN_COMPLETE,
923 4e38eb54 balrog
                    &params, EVT_DISCONN_COMPLETE_SIZE);
924 4e38eb54 balrog
}
925 4e38eb54 balrog
926 4e38eb54 balrog
static void bt_hci_lmp_disconnect_slave(struct bt_link_s *btlink)
927 4e38eb54 balrog
{
928 4e38eb54 balrog
    struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
929 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(btlink->slave);
930 4e38eb54 balrog
    uint16_t handle = link->handle;
931 4e38eb54 balrog
    evt_disconn_complete params;
932 4e38eb54 balrog
933 4e38eb54 balrog
    qemu_free(link);
934 4e38eb54 balrog
935 4e38eb54 balrog
    bt_hci_lmp_link_teardown(hci, handle);
936 4e38eb54 balrog
937 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
938 4e38eb54 balrog
    params.handle        = HNDL(handle);
939 4e38eb54 balrog
    params.reason        = hci->device.reject_reason;
940 4e38eb54 balrog
    bt_hci_event(hci, EVT_DISCONN_COMPLETE,
941 4e38eb54 balrog
                    &params, EVT_DISCONN_COMPLETE_SIZE);
942 4e38eb54 balrog
}
943 4e38eb54 balrog
944 4e38eb54 balrog
static int bt_hci_name_req(struct bt_hci_s *hci, bdaddr_t *bdaddr)
945 4e38eb54 balrog
{
946 4e38eb54 balrog
    struct bt_device_s *slave;
947 4e38eb54 balrog
    evt_remote_name_req_complete params;
948 4e38eb54 balrog
    int len;
949 4e38eb54 balrog
950 4e38eb54 balrog
    for (slave = hci->device.net->slave; slave; slave = slave->next)
951 4e38eb54 balrog
        if (slave->page_scan && !bacmp(&slave->bd_addr, bdaddr))
952 4e38eb54 balrog
            break;
953 4e38eb54 balrog
    if (!slave)
954 4e38eb54 balrog
        return -ENODEV;
955 4e38eb54 balrog
956 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
957 4e38eb54 balrog
958 4e38eb54 balrog
    params.status       = HCI_SUCCESS;
959 4e38eb54 balrog
    bacpy(&params.bdaddr, &slave->bd_addr);
960 4e38eb54 balrog
    len = snprintf(params.name, sizeof(params.name),
961 4e38eb54 balrog
                    "%s", slave->lmp_name ?: "");
962 4e38eb54 balrog
    memset(params.name + len, 0, sizeof(params.name) - len);
963 4e38eb54 balrog
    bt_hci_event(hci, EVT_REMOTE_NAME_REQ_COMPLETE,
964 4e38eb54 balrog
                    &params, EVT_REMOTE_NAME_REQ_COMPLETE_SIZE);
965 4e38eb54 balrog
966 4e38eb54 balrog
    return 0;
967 4e38eb54 balrog
}
968 4e38eb54 balrog
969 4e38eb54 balrog
static int bt_hci_features_req(struct bt_hci_s *hci, uint16_t handle)
970 4e38eb54 balrog
{
971 4e38eb54 balrog
    struct bt_device_s *slave;
972 4e38eb54 balrog
    evt_read_remote_features_complete params;
973 4e38eb54 balrog
974 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle))
975 4e38eb54 balrog
        return -ENODEV;
976 4e38eb54 balrog
977 4e38eb54 balrog
    slave = bt_hci_remote_dev(hci, handle);
978 4e38eb54 balrog
979 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
980 4e38eb54 balrog
981 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
982 4e38eb54 balrog
    params.handle        = HNDL(handle);
983 4e38eb54 balrog
    params.features[0]        = (slave->lmp_caps >>  0) & 0xff;
984 4e38eb54 balrog
    params.features[1]        = (slave->lmp_caps >>  8) & 0xff;
985 4e38eb54 balrog
    params.features[2]        = (slave->lmp_caps >> 16) & 0xff;
986 4e38eb54 balrog
    params.features[3]        = (slave->lmp_caps >> 24) & 0xff;
987 4e38eb54 balrog
    params.features[4]        = (slave->lmp_caps >> 32) & 0xff;
988 4e38eb54 balrog
    params.features[5]        = (slave->lmp_caps >> 40) & 0xff;
989 4e38eb54 balrog
    params.features[6]        = (slave->lmp_caps >> 48) & 0xff;
990 4e38eb54 balrog
    params.features[7]        = (slave->lmp_caps >> 56) & 0xff;
991 4e38eb54 balrog
    bt_hci_event(hci, EVT_READ_REMOTE_FEATURES_COMPLETE,
992 4e38eb54 balrog
                    &params, EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE);
993 4e38eb54 balrog
994 4e38eb54 balrog
    return 0;
995 4e38eb54 balrog
}
996 4e38eb54 balrog
997 4e38eb54 balrog
static int bt_hci_version_req(struct bt_hci_s *hci, uint16_t handle)
998 4e38eb54 balrog
{
999 4e38eb54 balrog
    struct bt_device_s *slave;
1000 4e38eb54 balrog
    evt_read_remote_version_complete params;
1001 4e38eb54 balrog
1002 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle))
1003 4e38eb54 balrog
        return -ENODEV;
1004 4e38eb54 balrog
1005 4e38eb54 balrog
    slave = bt_hci_remote_dev(hci, handle);
1006 4e38eb54 balrog
1007 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
1008 4e38eb54 balrog
1009 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
1010 4e38eb54 balrog
    params.handle        = HNDL(handle);
1011 4e38eb54 balrog
    params.lmp_ver        = 0x03;
1012 4e38eb54 balrog
    params.manufacturer        = cpu_to_le16(0xa000);
1013 4e38eb54 balrog
    params.lmp_subver        = cpu_to_le16(0xa607);
1014 4e38eb54 balrog
    bt_hci_event(hci, EVT_READ_REMOTE_VERSION_COMPLETE,
1015 4e38eb54 balrog
                    &params, EVT_READ_REMOTE_VERSION_COMPLETE_SIZE);
1016 4e38eb54 balrog
1017 4e38eb54 balrog
    return 0;
1018 4e38eb54 balrog
}
1019 4e38eb54 balrog
1020 4e38eb54 balrog
static int bt_hci_clkoffset_req(struct bt_hci_s *hci, uint16_t handle)
1021 4e38eb54 balrog
{
1022 4e38eb54 balrog
    struct bt_device_s *slave;
1023 4e38eb54 balrog
    evt_read_clock_offset_complete params;
1024 4e38eb54 balrog
1025 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle))
1026 4e38eb54 balrog
        return -ENODEV;
1027 4e38eb54 balrog
1028 4e38eb54 balrog
    slave = bt_hci_remote_dev(hci, handle);
1029 4e38eb54 balrog
1030 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
1031 4e38eb54 balrog
1032 4e38eb54 balrog
    params.status        = HCI_SUCCESS;
1033 4e38eb54 balrog
    params.handle        = HNDL(handle);
1034 4e38eb54 balrog
    /* TODO: return the clkoff *differenece* */
1035 4e38eb54 balrog
    params.clock_offset        = slave->clkoff;        /* Note: no swapping */
1036 4e38eb54 balrog
    bt_hci_event(hci, EVT_READ_CLOCK_OFFSET_COMPLETE,
1037 4e38eb54 balrog
                    &params, EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE);
1038 4e38eb54 balrog
1039 4e38eb54 balrog
    return 0;
1040 4e38eb54 balrog
}
1041 4e38eb54 balrog
1042 4e38eb54 balrog
static void bt_hci_event_mode(struct bt_hci_s *hci, struct bt_link_s *link,
1043 4e38eb54 balrog
                uint16_t handle)
1044 4e38eb54 balrog
{
1045 4e38eb54 balrog
    evt_mode_change params = {
1046 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1047 4e38eb54 balrog
        .handle                = HNDL(handle),
1048 4e38eb54 balrog
        .mode                = link->acl_mode,
1049 4e38eb54 balrog
        .interval        = cpu_to_le16(link->acl_interval),
1050 4e38eb54 balrog
    };
1051 4e38eb54 balrog
1052 4e38eb54 balrog
    bt_hci_event(hci, EVT_MODE_CHANGE, &params, EVT_MODE_CHANGE_SIZE);
1053 4e38eb54 balrog
}
1054 4e38eb54 balrog
1055 4e38eb54 balrog
static void bt_hci_lmp_mode_change_master(struct bt_hci_s *hci,
1056 4e38eb54 balrog
                struct bt_link_s *link, int mode, uint16_t interval)
1057 4e38eb54 balrog
{
1058 4e38eb54 balrog
    link->acl_mode = mode;
1059 4e38eb54 balrog
    link->acl_interval = interval;
1060 4e38eb54 balrog
1061 4e38eb54 balrog
    bt_hci_event_mode(hci, link, link->handle);
1062 4e38eb54 balrog
1063 4e38eb54 balrog
    link->slave->lmp_mode_change(link);
1064 4e38eb54 balrog
}
1065 4e38eb54 balrog
1066 4e38eb54 balrog
static void bt_hci_lmp_mode_change_slave(struct bt_link_s *btlink)
1067 4e38eb54 balrog
{
1068 4e38eb54 balrog
    struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
1069 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(btlink->slave);
1070 4e38eb54 balrog
1071 4e38eb54 balrog
    bt_hci_event_mode(hci, btlink, link->handle);
1072 4e38eb54 balrog
}
1073 4e38eb54 balrog
1074 4e38eb54 balrog
static int bt_hci_mode_change(struct bt_hci_s *hci, uint16_t handle,
1075 4e38eb54 balrog
                int interval, int mode)
1076 4e38eb54 balrog
{
1077 4e38eb54 balrog
    struct bt_hci_master_link_s *link;
1078 4e38eb54 balrog
1079 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1080 4e38eb54 balrog
        return -ENODEV;
1081 4e38eb54 balrog
1082 4e38eb54 balrog
    link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1083 4e38eb54 balrog
    if (link->link->acl_mode != acl_active) {
1084 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1085 4e38eb54 balrog
        return 0;
1086 4e38eb54 balrog
    }
1087 4e38eb54 balrog
1088 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
1089 4e38eb54 balrog
1090 4e38eb54 balrog
    qemu_mod_timer(link->acl_mode_timer, qemu_get_clock(vm_clock) +
1091 4e38eb54 balrog
                            muldiv64(interval * 625, ticks_per_sec, 1000000));
1092 4e38eb54 balrog
    bt_hci_lmp_mode_change_master(hci, link->link, mode, interval);
1093 4e38eb54 balrog
1094 4e38eb54 balrog
    return 0;
1095 4e38eb54 balrog
}
1096 4e38eb54 balrog
1097 4e38eb54 balrog
static int bt_hci_mode_cancel(struct bt_hci_s *hci, uint16_t handle, int mode)
1098 4e38eb54 balrog
{
1099 4e38eb54 balrog
    struct bt_hci_master_link_s *link;
1100 4e38eb54 balrog
1101 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle) || !bt_hci_role_master(hci, handle))
1102 4e38eb54 balrog
        return -ENODEV;
1103 4e38eb54 balrog
1104 4e38eb54 balrog
    link = &hci->lm.handle[handle & ~HCI_HANDLE_OFFSET];
1105 4e38eb54 balrog
    if (link->link->acl_mode != mode) {
1106 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_COMMAND_DISALLOWED);
1107 4e38eb54 balrog
1108 4e38eb54 balrog
        return 0;
1109 4e38eb54 balrog
    }
1110 4e38eb54 balrog
1111 4e38eb54 balrog
    bt_hci_event_status(hci, HCI_SUCCESS);
1112 4e38eb54 balrog
1113 4e38eb54 balrog
    qemu_del_timer(link->acl_mode_timer);
1114 4e38eb54 balrog
    bt_hci_lmp_mode_change_master(hci, link->link, acl_active, 0);
1115 4e38eb54 balrog
1116 4e38eb54 balrog
    return 0;
1117 4e38eb54 balrog
}
1118 4e38eb54 balrog
1119 4e38eb54 balrog
static void bt_hci_mode_tick(void *opaque)
1120 4e38eb54 balrog
{
1121 4e38eb54 balrog
    struct bt_link_s *link = opaque;
1122 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(link->host);
1123 4e38eb54 balrog
1124 4e38eb54 balrog
    bt_hci_lmp_mode_change_master(hci, link, acl_active, 0);
1125 4e38eb54 balrog
}
1126 4e38eb54 balrog
1127 b1d8e52e blueswir1
static void bt_hci_reset(struct bt_hci_s *hci)
1128 4e38eb54 balrog
{
1129 4e38eb54 balrog
    hci->acl_len = 0;
1130 4e38eb54 balrog
    hci->last_cmd = 0;
1131 4e38eb54 balrog
    hci->lm.connecting = 0;
1132 4e38eb54 balrog
1133 4e38eb54 balrog
    hci->event_mask[0] = 0xff;
1134 4e38eb54 balrog
    hci->event_mask[1] = 0xff;
1135 4e38eb54 balrog
    hci->event_mask[2] = 0xff;
1136 4e38eb54 balrog
    hci->event_mask[3] = 0xff;
1137 4e38eb54 balrog
    hci->event_mask[4] = 0xff;
1138 4e38eb54 balrog
    hci->event_mask[5] = 0x1f;
1139 4e38eb54 balrog
    hci->event_mask[6] = 0x00;
1140 4e38eb54 balrog
    hci->event_mask[7] = 0x00;
1141 4e38eb54 balrog
    hci->device.inquiry_scan = 0;
1142 4e38eb54 balrog
    hci->device.page_scan = 0;
1143 4e38eb54 balrog
    if (hci->device.lmp_name)
1144 ac4b0d0c balrog
        qemu_free((void *) hci->device.lmp_name);
1145 511d2b14 blueswir1
    hci->device.lmp_name = NULL;
1146 4e38eb54 balrog
    hci->device.class[0] = 0x00;
1147 4e38eb54 balrog
    hci->device.class[1] = 0x00;
1148 4e38eb54 balrog
    hci->device.class[2] = 0x00;
1149 4e38eb54 balrog
    hci->voice_setting = 0x0000;
1150 4e38eb54 balrog
    hci->conn_accept_tout = 0x1f40;
1151 4e38eb54 balrog
    hci->lm.inquiry_mode = 0x00;
1152 4e38eb54 balrog
1153 4e38eb54 balrog
    hci->psb_handle = 0x000;
1154 4e38eb54 balrog
    hci->asb_handle = 0x000;
1155 4e38eb54 balrog
1156 4e38eb54 balrog
    /* XXX: qemu_del_timer(sl->acl_mode_timer); for all links */
1157 4e38eb54 balrog
    qemu_del_timer(hci->lm.inquiry_done);
1158 4e38eb54 balrog
    qemu_del_timer(hci->lm.inquiry_next);
1159 4e38eb54 balrog
    qemu_del_timer(hci->conn_accept_timer);
1160 4e38eb54 balrog
}
1161 4e38eb54 balrog
1162 4e38eb54 balrog
static void bt_hci_read_local_version_rp(struct bt_hci_s *hci)
1163 4e38eb54 balrog
{
1164 4e38eb54 balrog
    read_local_version_rp lv = {
1165 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1166 4e38eb54 balrog
        .hci_ver        = 0x03,
1167 4e38eb54 balrog
        .hci_rev        = cpu_to_le16(0xa607),
1168 4e38eb54 balrog
        .lmp_ver        = 0x03,
1169 4e38eb54 balrog
        .manufacturer        = cpu_to_le16(0xa000),
1170 4e38eb54 balrog
        .lmp_subver        = cpu_to_le16(0xa607),
1171 4e38eb54 balrog
    };
1172 4e38eb54 balrog
1173 4e38eb54 balrog
    bt_hci_event_complete(hci, &lv, READ_LOCAL_VERSION_RP_SIZE);
1174 4e38eb54 balrog
}
1175 4e38eb54 balrog
1176 4e38eb54 balrog
static void bt_hci_read_local_commands_rp(struct bt_hci_s *hci)
1177 4e38eb54 balrog
{
1178 4e38eb54 balrog
    read_local_commands_rp lc = {
1179 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1180 4e38eb54 balrog
        .commands        = {
1181 4e38eb54 balrog
            /* Keep updated! */
1182 4e38eb54 balrog
            /* Also, keep in sync with hci->device.lmp_caps in bt_new_hci */
1183 4e38eb54 balrog
            0xbf, 0x80, 0xf9, 0x03, 0xb2, 0xc0, 0x03, 0xc3,
1184 4e38eb54 balrog
            0x00, 0x0f, 0x80, 0x00, 0xc0, 0x00, 0xe8, 0x13,
1185 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1189 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1190 4e38eb54 balrog
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1191 4e38eb54 balrog
        },
1192 4e38eb54 balrog
    };
1193 4e38eb54 balrog
1194 4e38eb54 balrog
    bt_hci_event_complete(hci, &lc, READ_LOCAL_COMMANDS_RP_SIZE);
1195 4e38eb54 balrog
}
1196 4e38eb54 balrog
1197 4e38eb54 balrog
static void bt_hci_read_local_features_rp(struct bt_hci_s *hci)
1198 4e38eb54 balrog
{
1199 4e38eb54 balrog
    read_local_features_rp lf = {
1200 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1201 4e38eb54 balrog
        .features        = {
1202 4e38eb54 balrog
            (hci->device.lmp_caps >>  0) & 0xff,
1203 4e38eb54 balrog
            (hci->device.lmp_caps >>  8) & 0xff,
1204 4e38eb54 balrog
            (hci->device.lmp_caps >> 16) & 0xff,
1205 4e38eb54 balrog
            (hci->device.lmp_caps >> 24) & 0xff,
1206 4e38eb54 balrog
            (hci->device.lmp_caps >> 32) & 0xff,
1207 4e38eb54 balrog
            (hci->device.lmp_caps >> 40) & 0xff,
1208 4e38eb54 balrog
            (hci->device.lmp_caps >> 48) & 0xff,
1209 4e38eb54 balrog
            (hci->device.lmp_caps >> 56) & 0xff,
1210 4e38eb54 balrog
        },
1211 4e38eb54 balrog
    };
1212 4e38eb54 balrog
1213 4e38eb54 balrog
    bt_hci_event_complete(hci, &lf, READ_LOCAL_FEATURES_RP_SIZE);
1214 4e38eb54 balrog
}
1215 4e38eb54 balrog
1216 4e38eb54 balrog
static void bt_hci_read_local_ext_features_rp(struct bt_hci_s *hci, int page)
1217 4e38eb54 balrog
{
1218 4e38eb54 balrog
    read_local_ext_features_rp lef = {
1219 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1220 4e38eb54 balrog
        .page_num        = page,
1221 4e38eb54 balrog
        .max_page_num        = 0x00,
1222 4e38eb54 balrog
        .features        = {
1223 4e38eb54 balrog
            /* Keep updated! */
1224 4e38eb54 balrog
            0x5f, 0x35, 0x85, 0x7e, 0x9b, 0x19, 0x00, 0x80,
1225 4e38eb54 balrog
        },
1226 4e38eb54 balrog
    };
1227 4e38eb54 balrog
    if (page)
1228 4e38eb54 balrog
        memset(lef.features, 0, sizeof(lef.features));
1229 4e38eb54 balrog
1230 4e38eb54 balrog
    bt_hci_event_complete(hci, &lef, READ_LOCAL_EXT_FEATURES_RP_SIZE);
1231 4e38eb54 balrog
}
1232 4e38eb54 balrog
1233 4e38eb54 balrog
static void bt_hci_read_buffer_size_rp(struct bt_hci_s *hci)
1234 4e38eb54 balrog
{
1235 4e38eb54 balrog
    read_buffer_size_rp bs = {
1236 4e38eb54 balrog
        /* This can be made configurable, for one standard USB dongle HCI
1237 4e38eb54 balrog
         * the four values are cpu_to_le16(0x0180), 0x40,
1238 4e38eb54 balrog
         * cpu_to_le16(0x0008), cpu_to_le16(0x0008).  */
1239 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1240 4e38eb54 balrog
        .acl_mtu        = cpu_to_le16(0x0200),
1241 4e38eb54 balrog
        .sco_mtu        = 0,
1242 4e38eb54 balrog
        .acl_max_pkt        = cpu_to_le16(0x0001),
1243 4e38eb54 balrog
        .sco_max_pkt        = cpu_to_le16(0x0000),
1244 4e38eb54 balrog
    };
1245 4e38eb54 balrog
1246 4e38eb54 balrog
    bt_hci_event_complete(hci, &bs, READ_BUFFER_SIZE_RP_SIZE);
1247 4e38eb54 balrog
}
1248 4e38eb54 balrog
1249 4e38eb54 balrog
/* Deprecated in V2.0 (page 661) */
1250 4e38eb54 balrog
static void bt_hci_read_country_code_rp(struct bt_hci_s *hci)
1251 4e38eb54 balrog
{
1252 4e38eb54 balrog
    read_country_code_rp cc ={
1253 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1254 4e38eb54 balrog
        .country_code        = 0x00,        /* North America & Europe^1 and Japan */
1255 4e38eb54 balrog
    };
1256 4e38eb54 balrog
1257 4e38eb54 balrog
    bt_hci_event_complete(hci, &cc, READ_COUNTRY_CODE_RP_SIZE);
1258 4e38eb54 balrog
1259 4e38eb54 balrog
    /* ^1. Except France, sorry */
1260 4e38eb54 balrog
}
1261 4e38eb54 balrog
1262 4e38eb54 balrog
static void bt_hci_read_bd_addr_rp(struct bt_hci_s *hci)
1263 4e38eb54 balrog
{
1264 4e38eb54 balrog
    read_bd_addr_rp ba = {
1265 4e38eb54 balrog
        .status = HCI_SUCCESS,
1266 4e38eb54 balrog
        .bdaddr = BAINIT(&hci->device.bd_addr),
1267 4e38eb54 balrog
    };
1268 4e38eb54 balrog
1269 4e38eb54 balrog
    bt_hci_event_complete(hci, &ba, READ_BD_ADDR_RP_SIZE);
1270 4e38eb54 balrog
}
1271 4e38eb54 balrog
1272 4e38eb54 balrog
static int bt_hci_link_quality_rp(struct bt_hci_s *hci, uint16_t handle)
1273 4e38eb54 balrog
{
1274 4e38eb54 balrog
    read_link_quality_rp lq = {
1275 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1276 4e38eb54 balrog
        .handle                = HNDL(handle),
1277 4e38eb54 balrog
        .link_quality        = 0xff,
1278 4e38eb54 balrog
    };
1279 4e38eb54 balrog
1280 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle))
1281 4e38eb54 balrog
        lq.status = HCI_NO_CONNECTION;
1282 4e38eb54 balrog
1283 4e38eb54 balrog
    bt_hci_event_complete(hci, &lq, READ_LINK_QUALITY_RP_SIZE);
1284 4e38eb54 balrog
    return 0;
1285 4e38eb54 balrog
}
1286 4e38eb54 balrog
1287 4e38eb54 balrog
/* Generate a Command Complete event with only the Status parameter */
1288 4e38eb54 balrog
static inline void bt_hci_event_complete_status(struct bt_hci_s *hci,
1289 4e38eb54 balrog
                uint8_t status)
1290 4e38eb54 balrog
{
1291 4e38eb54 balrog
    bt_hci_event_complete(hci, &status, 1);
1292 4e38eb54 balrog
}
1293 4e38eb54 balrog
1294 4e38eb54 balrog
static inline void bt_hci_event_complete_conn_cancel(struct bt_hci_s *hci,
1295 4e38eb54 balrog
                uint8_t status, bdaddr_t *bd_addr)
1296 4e38eb54 balrog
{
1297 4e38eb54 balrog
    create_conn_cancel_rp params = {
1298 4e38eb54 balrog
        .status = status,
1299 4e38eb54 balrog
        .bdaddr = BAINIT(bd_addr),
1300 4e38eb54 balrog
    };
1301 4e38eb54 balrog
1302 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, CREATE_CONN_CANCEL_RP_SIZE);
1303 4e38eb54 balrog
}
1304 4e38eb54 balrog
1305 4e38eb54 balrog
static inline void bt_hci_event_auth_complete(struct bt_hci_s *hci,
1306 4e38eb54 balrog
                uint16_t handle)
1307 4e38eb54 balrog
{
1308 4e38eb54 balrog
    evt_auth_complete params = {
1309 4e38eb54 balrog
        .status = HCI_SUCCESS,
1310 4e38eb54 balrog
        .handle = HNDL(handle),
1311 4e38eb54 balrog
    };
1312 4e38eb54 balrog
1313 4e38eb54 balrog
    bt_hci_event(hci, EVT_AUTH_COMPLETE, &params, EVT_AUTH_COMPLETE_SIZE);
1314 4e38eb54 balrog
}
1315 4e38eb54 balrog
1316 4e38eb54 balrog
static inline void bt_hci_event_encrypt_change(struct bt_hci_s *hci,
1317 4e38eb54 balrog
                uint16_t handle, uint8_t mode)
1318 4e38eb54 balrog
{
1319 4e38eb54 balrog
    evt_encrypt_change params = {
1320 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1321 4e38eb54 balrog
        .handle                = HNDL(handle),
1322 4e38eb54 balrog
        .encrypt        = mode,
1323 4e38eb54 balrog
    };
1324 4e38eb54 balrog
1325 4e38eb54 balrog
    bt_hci_event(hci, EVT_ENCRYPT_CHANGE, &params, EVT_ENCRYPT_CHANGE_SIZE);
1326 4e38eb54 balrog
}
1327 4e38eb54 balrog
1328 4e38eb54 balrog
static inline void bt_hci_event_complete_name_cancel(struct bt_hci_s *hci,
1329 4e38eb54 balrog
                bdaddr_t *bd_addr)
1330 4e38eb54 balrog
{
1331 4e38eb54 balrog
    remote_name_req_cancel_rp params = {
1332 4e38eb54 balrog
        .status = HCI_INVALID_PARAMETERS,
1333 4e38eb54 balrog
        .bdaddr = BAINIT(bd_addr),
1334 4e38eb54 balrog
    };
1335 4e38eb54 balrog
1336 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, REMOTE_NAME_REQ_CANCEL_RP_SIZE);
1337 4e38eb54 balrog
}
1338 4e38eb54 balrog
1339 4e38eb54 balrog
static inline void bt_hci_event_read_remote_ext_features(struct bt_hci_s *hci,
1340 4e38eb54 balrog
                uint16_t handle)
1341 4e38eb54 balrog
{
1342 4e38eb54 balrog
    evt_read_remote_ext_features_complete params = {
1343 4e38eb54 balrog
        .status = HCI_UNSUPPORTED_FEATURE,
1344 4e38eb54 balrog
        .handle = HNDL(handle),
1345 4e38eb54 balrog
        /* Rest uninitialised */
1346 4e38eb54 balrog
    };
1347 4e38eb54 balrog
1348 4e38eb54 balrog
    bt_hci_event(hci, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE,
1349 4e38eb54 balrog
                    &params, EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE);
1350 4e38eb54 balrog
}
1351 4e38eb54 balrog
1352 4e38eb54 balrog
static inline void bt_hci_event_complete_lmp_handle(struct bt_hci_s *hci,
1353 4e38eb54 balrog
                uint16_t handle)
1354 4e38eb54 balrog
{
1355 4e38eb54 balrog
    read_lmp_handle_rp params = {
1356 4e38eb54 balrog
        .status                = HCI_NO_CONNECTION,
1357 4e38eb54 balrog
        .handle                = HNDL(handle),
1358 4e38eb54 balrog
        .reserved        = 0,
1359 4e38eb54 balrog
        /* Rest uninitialised */
1360 4e38eb54 balrog
    };
1361 4e38eb54 balrog
1362 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_LMP_HANDLE_RP_SIZE);
1363 4e38eb54 balrog
}
1364 4e38eb54 balrog
1365 4e38eb54 balrog
static inline void bt_hci_event_complete_role_discovery(struct bt_hci_s *hci,
1366 4e38eb54 balrog
                int status, uint16_t handle, int master)
1367 4e38eb54 balrog
{
1368 4e38eb54 balrog
    role_discovery_rp params = {
1369 4e38eb54 balrog
        .status                = status,
1370 4e38eb54 balrog
        .handle                = HNDL(handle),
1371 4e38eb54 balrog
        .role                = master ? 0x00 : 0x01,
1372 4e38eb54 balrog
    };
1373 4e38eb54 balrog
1374 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, ROLE_DISCOVERY_RP_SIZE);
1375 4e38eb54 balrog
}
1376 4e38eb54 balrog
1377 4e38eb54 balrog
static inline void bt_hci_event_complete_flush(struct bt_hci_s *hci,
1378 4e38eb54 balrog
                int status, uint16_t handle)
1379 4e38eb54 balrog
{
1380 4e38eb54 balrog
    flush_rp params = {
1381 4e38eb54 balrog
        .status                = status,
1382 4e38eb54 balrog
        .handle                = HNDL(handle),
1383 4e38eb54 balrog
    };
1384 4e38eb54 balrog
1385 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, FLUSH_RP_SIZE);
1386 4e38eb54 balrog
}
1387 4e38eb54 balrog
1388 4e38eb54 balrog
static inline void bt_hci_event_complete_read_local_name(struct bt_hci_s *hci)
1389 4e38eb54 balrog
{
1390 4e38eb54 balrog
    read_local_name_rp params;
1391 4e38eb54 balrog
    params.status = HCI_SUCCESS;
1392 4e38eb54 balrog
    memset(params.name, 0, sizeof(params.name));
1393 4e38eb54 balrog
    if (hci->device.lmp_name)
1394 793a10a2 balrog
        strncpy(params.name, hci->device.lmp_name, sizeof(params.name));
1395 4e38eb54 balrog
1396 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_LOCAL_NAME_RP_SIZE);
1397 4e38eb54 balrog
}
1398 4e38eb54 balrog
1399 4e38eb54 balrog
static inline void bt_hci_event_complete_read_conn_accept_timeout(
1400 4e38eb54 balrog
                struct bt_hci_s *hci)
1401 4e38eb54 balrog
{
1402 4e38eb54 balrog
    read_conn_accept_timeout_rp params = {
1403 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1404 4e38eb54 balrog
        .timeout        = cpu_to_le16(hci->conn_accept_tout),
1405 4e38eb54 balrog
    };
1406 4e38eb54 balrog
1407 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_CONN_ACCEPT_TIMEOUT_RP_SIZE);
1408 4e38eb54 balrog
}
1409 4e38eb54 balrog
1410 4e38eb54 balrog
static inline void bt_hci_event_complete_read_scan_enable(struct bt_hci_s *hci)
1411 4e38eb54 balrog
{
1412 4e38eb54 balrog
    read_scan_enable_rp params = {
1413 4e38eb54 balrog
        .status = HCI_SUCCESS,
1414 4e38eb54 balrog
        .enable =
1415 4e38eb54 balrog
                (hci->device.inquiry_scan ? SCAN_INQUIRY : 0) |
1416 4e38eb54 balrog
                (hci->device.page_scan ? SCAN_PAGE : 0),
1417 4e38eb54 balrog
    };
1418 4e38eb54 balrog
1419 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_SCAN_ENABLE_RP_SIZE);
1420 4e38eb54 balrog
}
1421 4e38eb54 balrog
1422 4e38eb54 balrog
static inline void bt_hci_event_complete_read_local_class(struct bt_hci_s *hci)
1423 4e38eb54 balrog
{
1424 4e38eb54 balrog
    read_class_of_dev_rp params;
1425 4e38eb54 balrog
1426 4e38eb54 balrog
    params.status = HCI_SUCCESS;
1427 4e38eb54 balrog
    memcpy(params.dev_class, hci->device.class, sizeof(params.dev_class));
1428 4e38eb54 balrog
1429 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_CLASS_OF_DEV_RP_SIZE);
1430 4e38eb54 balrog
}
1431 4e38eb54 balrog
1432 4e38eb54 balrog
static inline void bt_hci_event_complete_voice_setting(struct bt_hci_s *hci)
1433 4e38eb54 balrog
{
1434 4e38eb54 balrog
    read_voice_setting_rp params = {
1435 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1436 4e38eb54 balrog
        .voice_setting        = hci->voice_setting,        /* Note: no swapping */
1437 4e38eb54 balrog
    };
1438 4e38eb54 balrog
1439 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_VOICE_SETTING_RP_SIZE);
1440 4e38eb54 balrog
}
1441 4e38eb54 balrog
1442 4e38eb54 balrog
static inline void bt_hci_event_complete_read_inquiry_mode(
1443 4e38eb54 balrog
                struct bt_hci_s *hci)
1444 4e38eb54 balrog
{
1445 4e38eb54 balrog
    read_inquiry_mode_rp params = {
1446 4e38eb54 balrog
        .status                = HCI_SUCCESS,
1447 4e38eb54 balrog
        .mode                = hci->lm.inquiry_mode,
1448 4e38eb54 balrog
    };
1449 4e38eb54 balrog
1450 4e38eb54 balrog
    bt_hci_event_complete(hci, &params, READ_INQUIRY_MODE_RP_SIZE);
1451 4e38eb54 balrog
}
1452 4e38eb54 balrog
1453 4e38eb54 balrog
static inline void bt_hci_event_num_comp_pkts(struct bt_hci_s *hci,
1454 4e38eb54 balrog
                uint16_t handle, int packets)
1455 4e38eb54 balrog
{
1456 4e38eb54 balrog
    uint16_t buf[EVT_NUM_COMP_PKTS_SIZE(1) / 2 + 1];
1457 4e38eb54 balrog
    evt_num_comp_pkts *params = (void *) ((uint8_t *) buf + 1);
1458 4e38eb54 balrog
1459 4e38eb54 balrog
    params->num_hndl                        = 1;
1460 4e38eb54 balrog
    params->connection->handle                = HNDL(handle);
1461 4e38eb54 balrog
    params->connection->num_packets        = cpu_to_le16(packets);
1462 4e38eb54 balrog
1463 4e38eb54 balrog
    bt_hci_event(hci, EVT_NUM_COMP_PKTS, params, EVT_NUM_COMP_PKTS_SIZE(1));
1464 4e38eb54 balrog
}
1465 4e38eb54 balrog
1466 4e38eb54 balrog
static void bt_submit_hci(struct HCIInfo *info,
1467 4e38eb54 balrog
                const uint8_t *data, int length)
1468 4e38eb54 balrog
{
1469 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_info(info);
1470 4e38eb54 balrog
    uint16_t cmd;
1471 4e38eb54 balrog
    int paramlen, i;
1472 4e38eb54 balrog
1473 4e38eb54 balrog
    if (length < HCI_COMMAND_HDR_SIZE)
1474 4e38eb54 balrog
        goto short_hci;
1475 4e38eb54 balrog
1476 4e38eb54 balrog
    memcpy(&hci->last_cmd, data, 2);
1477 4e38eb54 balrog
1478 4e38eb54 balrog
    cmd = (data[1] << 8) | data[0];
1479 4e38eb54 balrog
    paramlen = data[2];
1480 4e38eb54 balrog
    if (cmd_opcode_ogf(cmd) == 0 || cmd_opcode_ocf(cmd) == 0)        /* NOP */
1481 4e38eb54 balrog
        return;
1482 4e38eb54 balrog
1483 4e38eb54 balrog
    data += HCI_COMMAND_HDR_SIZE;
1484 4e38eb54 balrog
    length -= HCI_COMMAND_HDR_SIZE;
1485 4e38eb54 balrog
1486 4e38eb54 balrog
    if (paramlen > length)
1487 4e38eb54 balrog
        return;
1488 4e38eb54 balrog
1489 4e38eb54 balrog
#define PARAM(cmd, param)        (((cmd##_cp *) data)->param)
1490 4e38eb54 balrog
#define PARAM16(cmd, param)        le16_to_cpup(&PARAM(cmd, param))
1491 4e38eb54 balrog
#define PARAMHANDLE(cmd)        HNDL(PARAM(cmd, handle))
1492 4e38eb54 balrog
#define LENGTH_CHECK(cmd)        if (length < sizeof(cmd##_cp)) goto short_hci
1493 4e38eb54 balrog
    /* Note: the supported commands bitmask in bt_hci_read_local_commands_rp
1494 4e38eb54 balrog
     * needs to be updated every time a command is implemented here!  */
1495 4e38eb54 balrog
    switch (cmd) {
1496 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY):
1497 4e38eb54 balrog
        LENGTH_CHECK(inquiry);
1498 4e38eb54 balrog
1499 4e38eb54 balrog
        if (PARAM(inquiry, length) < 1) {
1500 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1501 4e38eb54 balrog
            break;
1502 4e38eb54 balrog
        }
1503 4e38eb54 balrog
1504 4e38eb54 balrog
        hci->lm.inquire = 1;
1505 4e38eb54 balrog
        hci->lm.periodic = 0;
1506 4e38eb54 balrog
        hci->lm.responses_left = PARAM(inquiry, num_rsp) ?: INT_MAX;
1507 4e38eb54 balrog
        hci->lm.responses = 0;
1508 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1509 4e38eb54 balrog
        bt_hci_inquiry_start(hci, PARAM(inquiry, length));
1510 4e38eb54 balrog
        break;
1511 4e38eb54 balrog
1512 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
1513 4e38eb54 balrog
        if (!hci->lm.inquire || hci->lm.periodic) {
1514 4e38eb54 balrog
            fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1515 4e38eb54 balrog
                            "the Inquiry command has been issued, a Command "
1516 4e38eb54 balrog
                            "Status event has been received for the Inquiry "
1517 4e38eb54 balrog
                            "command, and before the Inquiry Complete event "
1518 4e38eb54 balrog
                            "occurs", __FUNCTION__);
1519 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1520 4e38eb54 balrog
            break;
1521 4e38eb54 balrog
        }
1522 4e38eb54 balrog
1523 4e38eb54 balrog
        hci->lm.inquire = 0;
1524 4e38eb54 balrog
        qemu_del_timer(hci->lm.inquiry_done);
1525 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1526 4e38eb54 balrog
        break;
1527 4e38eb54 balrog
1528 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY):
1529 4e38eb54 balrog
        LENGTH_CHECK(periodic_inquiry);
1530 4e38eb54 balrog
1531 4e38eb54 balrog
        if (!(PARAM(periodic_inquiry, length) <
1532 4e38eb54 balrog
                                PARAM16(periodic_inquiry, min_period) &&
1533 4e38eb54 balrog
                                PARAM16(periodic_inquiry, min_period) <
1534 4e38eb54 balrog
                                PARAM16(periodic_inquiry, max_period)) ||
1535 4e38eb54 balrog
                        PARAM(periodic_inquiry, length) < 1 ||
1536 4e38eb54 balrog
                        PARAM16(periodic_inquiry, min_period) < 2 ||
1537 4e38eb54 balrog
                        PARAM16(periodic_inquiry, max_period) < 3) {
1538 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1539 4e38eb54 balrog
            break;
1540 4e38eb54 balrog
        }
1541 4e38eb54 balrog
1542 4e38eb54 balrog
        hci->lm.inquire = 1;
1543 4e38eb54 balrog
        hci->lm.periodic = 1;
1544 4e38eb54 balrog
        hci->lm.responses_left = PARAM(periodic_inquiry, num_rsp);
1545 4e38eb54 balrog
        hci->lm.responses = 0;
1546 4e38eb54 balrog
        hci->lm.inquiry_period = PARAM16(periodic_inquiry, max_period);
1547 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1548 4e38eb54 balrog
        bt_hci_inquiry_start(hci, PARAM(periodic_inquiry, length));
1549 4e38eb54 balrog
        break;
1550 4e38eb54 balrog
1551 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY):
1552 4e38eb54 balrog
        if (!hci->lm.inquire || !hci->lm.periodic) {
1553 4e38eb54 balrog
            fprintf(stderr, "%s: Inquiry Cancel should only be issued after "
1554 4e38eb54 balrog
                            "the Inquiry command has been issued, a Command "
1555 4e38eb54 balrog
                            "Status event has been received for the Inquiry "
1556 4e38eb54 balrog
                            "command, and before the Inquiry Complete event "
1557 4e38eb54 balrog
                            "occurs", __FUNCTION__);
1558 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_COMMAND_DISALLOWED);
1559 4e38eb54 balrog
            break;
1560 4e38eb54 balrog
        }
1561 4e38eb54 balrog
        hci->lm.inquire = 0;
1562 4e38eb54 balrog
        qemu_del_timer(hci->lm.inquiry_done);
1563 4e38eb54 balrog
        qemu_del_timer(hci->lm.inquiry_next);
1564 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1565 4e38eb54 balrog
        break;
1566 4e38eb54 balrog
1567 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN):
1568 4e38eb54 balrog
        LENGTH_CHECK(create_conn);
1569 4e38eb54 balrog
1570 4e38eb54 balrog
        if (hci->lm.connecting >= HCI_HANDLES_MAX) {
1571 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_REJECTED_LIMITED_RESOURCES);
1572 4e38eb54 balrog
            break;
1573 4e38eb54 balrog
        }
1574 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1575 4e38eb54 balrog
1576 4e38eb54 balrog
        if (bt_hci_connect(hci, &PARAM(create_conn, bdaddr)))
1577 4e38eb54 balrog
            bt_hci_connection_reject_event(hci, &PARAM(create_conn, bdaddr));
1578 4e38eb54 balrog
        break;
1579 4e38eb54 balrog
1580 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_DISCONNECT):
1581 4e38eb54 balrog
        LENGTH_CHECK(disconnect);
1582 4e38eb54 balrog
1583 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(disconnect))) {
1584 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1585 4e38eb54 balrog
            break;
1586 4e38eb54 balrog
        }
1587 4e38eb54 balrog
1588 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1589 4e38eb54 balrog
        bt_hci_disconnect(hci, PARAMHANDLE(disconnect),
1590 4e38eb54 balrog
                        PARAM(disconnect, reason));
1591 4e38eb54 balrog
        break;
1592 4e38eb54 balrog
1593 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_CREATE_CONN_CANCEL):
1594 4e38eb54 balrog
        LENGTH_CHECK(create_conn_cancel);
1595 4e38eb54 balrog
1596 4e38eb54 balrog
        if (bt_hci_lmp_connection_ready(hci,
1597 4e38eb54 balrog
                                &PARAM(create_conn_cancel, bdaddr))) {
1598 4e38eb54 balrog
            for (i = 0; i < HCI_HANDLES_MAX; i ++)
1599 4e38eb54 balrog
                if (bt_hci_role_master(hci, i) && hci->lm.handle[i].link &&
1600 4e38eb54 balrog
                                !bacmp(&hci->lm.handle[i].link->slave->bd_addr,
1601 4e38eb54 balrog
                                        &PARAM(create_conn_cancel, bdaddr)))
1602 4e38eb54 balrog
                   break;
1603 4e38eb54 balrog
1604 4e38eb54 balrog
            bt_hci_event_complete_conn_cancel(hci, i < HCI_HANDLES_MAX ?
1605 4e38eb54 balrog
                            HCI_ACL_CONNECTION_EXISTS : HCI_NO_CONNECTION,
1606 4e38eb54 balrog
                            &PARAM(create_conn_cancel, bdaddr));
1607 4e38eb54 balrog
        } else
1608 4e38eb54 balrog
            bt_hci_event_complete_conn_cancel(hci, HCI_SUCCESS,
1609 4e38eb54 balrog
                            &PARAM(create_conn_cancel, bdaddr));
1610 4e38eb54 balrog
        break;
1611 4e38eb54 balrog
1612 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ):
1613 4e38eb54 balrog
        LENGTH_CHECK(accept_conn_req);
1614 4e38eb54 balrog
1615 4e38eb54 balrog
        if (!hci->conn_req_host ||
1616 4e38eb54 balrog
                        bacmp(&PARAM(accept_conn_req, bdaddr),
1617 4e38eb54 balrog
                                &hci->conn_req_host->bd_addr)) {
1618 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1619 4e38eb54 balrog
            break;
1620 4e38eb54 balrog
        }
1621 4e38eb54 balrog
1622 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1623 4e38eb54 balrog
        bt_hci_connection_accept(hci, hci->conn_req_host);
1624 511d2b14 blueswir1
        hci->conn_req_host = NULL;
1625 4e38eb54 balrog
        break;
1626 4e38eb54 balrog
1627 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_REJECT_CONN_REQ):
1628 4e38eb54 balrog
        LENGTH_CHECK(reject_conn_req);
1629 4e38eb54 balrog
1630 4e38eb54 balrog
        if (!hci->conn_req_host ||
1631 4e38eb54 balrog
                        bacmp(&PARAM(reject_conn_req, bdaddr),
1632 4e38eb54 balrog
                                &hci->conn_req_host->bd_addr)) {
1633 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1634 4e38eb54 balrog
            break;
1635 4e38eb54 balrog
        }
1636 4e38eb54 balrog
1637 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1638 4e38eb54 balrog
        bt_hci_connection_reject(hci, hci->conn_req_host,
1639 4e38eb54 balrog
                        PARAM(reject_conn_req, reason));
1640 4e38eb54 balrog
        bt_hci_connection_reject_event(hci, &hci->conn_req_host->bd_addr);
1641 511d2b14 blueswir1
        hci->conn_req_host = NULL;
1642 4e38eb54 balrog
        break;
1643 4e38eb54 balrog
1644 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_AUTH_REQUESTED):
1645 4e38eb54 balrog
        LENGTH_CHECK(auth_requested);
1646 4e38eb54 balrog
1647 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(auth_requested)))
1648 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1649 4e38eb54 balrog
        else {
1650 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_SUCCESS);
1651 4e38eb54 balrog
            bt_hci_event_auth_complete(hci, PARAMHANDLE(auth_requested));
1652 4e38eb54 balrog
        }
1653 4e38eb54 balrog
        break;
1654 4e38eb54 balrog
1655 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT):
1656 4e38eb54 balrog
        LENGTH_CHECK(set_conn_encrypt);
1657 4e38eb54 balrog
1658 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(set_conn_encrypt)))
1659 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1660 4e38eb54 balrog
        else {
1661 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_SUCCESS);
1662 4e38eb54 balrog
            bt_hci_event_encrypt_change(hci,
1663 4e38eb54 balrog
                            PARAMHANDLE(set_conn_encrypt),
1664 4e38eb54 balrog
                            PARAM(set_conn_encrypt, encrypt));
1665 4e38eb54 balrog
        }
1666 4e38eb54 balrog
        break;
1667 4e38eb54 balrog
1668 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ):
1669 4e38eb54 balrog
        LENGTH_CHECK(remote_name_req);
1670 4e38eb54 balrog
1671 4e38eb54 balrog
        if (bt_hci_name_req(hci, &PARAM(remote_name_req, bdaddr)))
1672 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1673 4e38eb54 balrog
        break;
1674 4e38eb54 balrog
1675 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_REMOTE_NAME_REQ_CANCEL):
1676 4e38eb54 balrog
        LENGTH_CHECK(remote_name_req_cancel);
1677 4e38eb54 balrog
1678 4e38eb54 balrog
        bt_hci_event_complete_name_cancel(hci,
1679 4e38eb54 balrog
                        &PARAM(remote_name_req_cancel, bdaddr));
1680 4e38eb54 balrog
        break;
1681 4e38eb54 balrog
1682 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_FEATURES):
1683 4e38eb54 balrog
        LENGTH_CHECK(read_remote_features);
1684 4e38eb54 balrog
1685 4e38eb54 balrog
        if (bt_hci_features_req(hci, PARAMHANDLE(read_remote_features)))
1686 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1687 4e38eb54 balrog
        break;
1688 4e38eb54 balrog
1689 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_EXT_FEATURES):
1690 4e38eb54 balrog
        LENGTH_CHECK(read_remote_ext_features);
1691 4e38eb54 balrog
1692 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(read_remote_ext_features)))
1693 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1694 4e38eb54 balrog
        else {
1695 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_SUCCESS);
1696 4e38eb54 balrog
            bt_hci_event_read_remote_ext_features(hci,
1697 4e38eb54 balrog
                            PARAMHANDLE(read_remote_ext_features));
1698 4e38eb54 balrog
        }
1699 4e38eb54 balrog
        break;
1700 4e38eb54 balrog
1701 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_REMOTE_VERSION):
1702 4e38eb54 balrog
        LENGTH_CHECK(read_remote_version);
1703 4e38eb54 balrog
1704 4e38eb54 balrog
        if (bt_hci_version_req(hci, PARAMHANDLE(read_remote_version)))
1705 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1706 4e38eb54 balrog
        break;
1707 4e38eb54 balrog
1708 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_CLOCK_OFFSET):
1709 4e38eb54 balrog
        LENGTH_CHECK(read_clock_offset);
1710 4e38eb54 balrog
1711 4e38eb54 balrog
        if (bt_hci_clkoffset_req(hci, PARAMHANDLE(read_clock_offset)))
1712 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1713 4e38eb54 balrog
        break;
1714 4e38eb54 balrog
1715 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_CTL, OCF_READ_LMP_HANDLE):
1716 4e38eb54 balrog
        LENGTH_CHECK(read_lmp_handle);
1717 4e38eb54 balrog
1718 4e38eb54 balrog
        /* TODO: */
1719 4e38eb54 balrog
        bt_hci_event_complete_lmp_handle(hci, PARAMHANDLE(read_lmp_handle));
1720 4e38eb54 balrog
        break;
1721 4e38eb54 balrog
1722 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_POLICY, OCF_HOLD_MODE):
1723 4e38eb54 balrog
        LENGTH_CHECK(hold_mode);
1724 4e38eb54 balrog
1725 4e38eb54 balrog
        if (PARAM16(hold_mode, min_interval) >
1726 4e38eb54 balrog
                        PARAM16(hold_mode, max_interval) ||
1727 4e38eb54 balrog
                        PARAM16(hold_mode, min_interval) < 0x0002 ||
1728 4e38eb54 balrog
                        PARAM16(hold_mode, max_interval) > 0xff00 ||
1729 4e38eb54 balrog
                        (PARAM16(hold_mode, min_interval) & 1) ||
1730 4e38eb54 balrog
                        (PARAM16(hold_mode, max_interval) & 1)) {
1731 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1732 4e38eb54 balrog
            break;
1733 4e38eb54 balrog
        }
1734 4e38eb54 balrog
1735 4e38eb54 balrog
        if (bt_hci_mode_change(hci, PARAMHANDLE(hold_mode),
1736 4e38eb54 balrog
                                PARAM16(hold_mode, max_interval),
1737 4e38eb54 balrog
                                acl_hold))
1738 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1739 4e38eb54 balrog
        break;
1740 4e38eb54 balrog
1741 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_POLICY, OCF_PARK_MODE):
1742 4e38eb54 balrog
        LENGTH_CHECK(park_mode);
1743 4e38eb54 balrog
1744 4e38eb54 balrog
        if (PARAM16(park_mode, min_interval) >
1745 4e38eb54 balrog
                        PARAM16(park_mode, max_interval) ||
1746 4e38eb54 balrog
                        PARAM16(park_mode, min_interval) < 0x000e ||
1747 4e38eb54 balrog
                        (PARAM16(park_mode, min_interval) & 1) ||
1748 4e38eb54 balrog
                        (PARAM16(park_mode, max_interval) & 1)) {
1749 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1750 4e38eb54 balrog
            break;
1751 4e38eb54 balrog
        }
1752 4e38eb54 balrog
1753 4e38eb54 balrog
        if (bt_hci_mode_change(hci, PARAMHANDLE(park_mode),
1754 4e38eb54 balrog
                                PARAM16(park_mode, max_interval),
1755 4e38eb54 balrog
                                acl_parked))
1756 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1757 4e38eb54 balrog
        break;
1758 4e38eb54 balrog
1759 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_POLICY, OCF_EXIT_PARK_MODE):
1760 4e38eb54 balrog
        LENGTH_CHECK(exit_park_mode);
1761 4e38eb54 balrog
1762 4e38eb54 balrog
        if (bt_hci_mode_cancel(hci, PARAMHANDLE(exit_park_mode),
1763 4e38eb54 balrog
                                acl_parked))
1764 4e38eb54 balrog
            bt_hci_event_status(hci, HCI_NO_CONNECTION);
1765 4e38eb54 balrog
        break;
1766 4e38eb54 balrog
1767 4e38eb54 balrog
    case cmd_opcode_pack(OGF_LINK_POLICY, OCF_ROLE_DISCOVERY):
1768 4e38eb54 balrog
        LENGTH_CHECK(role_discovery);
1769 4e38eb54 balrog
1770 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(role_discovery)))
1771 4e38eb54 balrog
            bt_hci_event_complete_role_discovery(hci,
1772 4e38eb54 balrog
                            HCI_NO_CONNECTION, PARAMHANDLE(role_discovery), 0);
1773 4e38eb54 balrog
        else
1774 4e38eb54 balrog
            bt_hci_event_complete_role_discovery(hci,
1775 4e38eb54 balrog
                            HCI_SUCCESS, PARAMHANDLE(role_discovery),
1776 4e38eb54 balrog
                            bt_hci_role_master(hci,
1777 4e38eb54 balrog
                                    PARAMHANDLE(role_discovery)));
1778 4e38eb54 balrog
        break;
1779 4e38eb54 balrog
1780 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_MASK):
1781 4e38eb54 balrog
        LENGTH_CHECK(set_event_mask);
1782 4e38eb54 balrog
1783 4e38eb54 balrog
        memcpy(hci->event_mask, PARAM(set_event_mask, mask), 8);
1784 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1785 4e38eb54 balrog
        break;
1786 4e38eb54 balrog
1787 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_RESET):
1788 4e38eb54 balrog
        bt_hci_reset(hci);
1789 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_SUCCESS);
1790 4e38eb54 balrog
        break;
1791 4e38eb54 balrog
1792 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_SET_EVENT_FLT):
1793 4e38eb54 balrog
        if (length >= 1 && PARAM(set_event_flt, flt_type) == FLT_CLEAR_ALL)
1794 4e38eb54 balrog
            /* No length check */;
1795 4e38eb54 balrog
        else
1796 4e38eb54 balrog
            LENGTH_CHECK(set_event_flt);
1797 4e38eb54 balrog
1798 4e38eb54 balrog
        /* Filters are not implemented */
1799 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1800 4e38eb54 balrog
        break;
1801 4e38eb54 balrog
1802 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_FLUSH):
1803 4e38eb54 balrog
        LENGTH_CHECK(flush);
1804 4e38eb54 balrog
1805 4e38eb54 balrog
        if (bt_hci_handle_bad(hci, PARAMHANDLE(flush)))
1806 4e38eb54 balrog
            bt_hci_event_complete_flush(hci,
1807 4e38eb54 balrog
                            HCI_NO_CONNECTION, PARAMHANDLE(flush));
1808 4e38eb54 balrog
        else {
1809 4e38eb54 balrog
            /* TODO: ordering? */
1810 4e38eb54 balrog
            bt_hci_event(hci, EVT_FLUSH_OCCURRED,
1811 4e38eb54 balrog
                            &PARAM(flush, handle),
1812 4e38eb54 balrog
                            EVT_FLUSH_OCCURRED_SIZE);
1813 4e38eb54 balrog
            bt_hci_event_complete_flush(hci,
1814 4e38eb54 balrog
                            HCI_SUCCESS, PARAMHANDLE(flush));
1815 4e38eb54 balrog
        }
1816 4e38eb54 balrog
        break;
1817 4e38eb54 balrog
1818 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
1819 4e38eb54 balrog
        LENGTH_CHECK(change_local_name);
1820 4e38eb54 balrog
1821 4e38eb54 balrog
        if (hci->device.lmp_name)
1822 ac4b0d0c balrog
            qemu_free((void *) hci->device.lmp_name);
1823 ac4b0d0c balrog
        hci->device.lmp_name = qemu_strndup(PARAM(change_local_name, name),
1824 4e38eb54 balrog
                        sizeof(PARAM(change_local_name, name)));
1825 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1826 4e38eb54 balrog
        break;
1827 4e38eb54 balrog
1828 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_LOCAL_NAME):
1829 4e38eb54 balrog
        bt_hci_event_complete_read_local_name(hci);
1830 4e38eb54 balrog
        break;
1831 4e38eb54 balrog
1832 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CONN_ACCEPT_TIMEOUT):
1833 4e38eb54 balrog
        bt_hci_event_complete_read_conn_accept_timeout(hci);
1834 4e38eb54 balrog
        break;
1835 4e38eb54 balrog
1836 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CONN_ACCEPT_TIMEOUT):
1837 4e38eb54 balrog
        /* TODO */
1838 4e38eb54 balrog
        LENGTH_CHECK(write_conn_accept_timeout);
1839 4e38eb54 balrog
1840 4e38eb54 balrog
        if (PARAM16(write_conn_accept_timeout, timeout) < 0x0001 ||
1841 4e38eb54 balrog
                        PARAM16(write_conn_accept_timeout, timeout) > 0xb540) {
1842 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1843 4e38eb54 balrog
            break;
1844 4e38eb54 balrog
        }
1845 4e38eb54 balrog
1846 4e38eb54 balrog
        hci->conn_accept_tout = PARAM16(write_conn_accept_timeout, timeout);
1847 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1848 4e38eb54 balrog
        break;
1849 4e38eb54 balrog
1850 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_SCAN_ENABLE):
1851 4e38eb54 balrog
        bt_hci_event_complete_read_scan_enable(hci);
1852 4e38eb54 balrog
        break;
1853 4e38eb54 balrog
1854 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE):
1855 4e38eb54 balrog
        LENGTH_CHECK(write_scan_enable);
1856 4e38eb54 balrog
1857 4e38eb54 balrog
        /* TODO: check that the remaining bits are all 0 */
1858 4e38eb54 balrog
        hci->device.inquiry_scan =
1859 4e38eb54 balrog
                !!(PARAM(write_scan_enable, scan_enable) & SCAN_INQUIRY);
1860 4e38eb54 balrog
        hci->device.page_scan =
1861 4e38eb54 balrog
                !!(PARAM(write_scan_enable, scan_enable) & SCAN_PAGE);
1862 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1863 4e38eb54 balrog
        break;
1864 4e38eb54 balrog
1865 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_CLASS_OF_DEV):
1866 4e38eb54 balrog
        bt_hci_event_complete_read_local_class(hci);
1867 4e38eb54 balrog
        break;
1868 4e38eb54 balrog
1869 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV):
1870 4e38eb54 balrog
        LENGTH_CHECK(write_class_of_dev);
1871 4e38eb54 balrog
1872 4e38eb54 balrog
        memcpy(hci->device.class, PARAM(write_class_of_dev, dev_class),
1873 4e38eb54 balrog
                        sizeof(PARAM(write_class_of_dev, dev_class)));
1874 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1875 4e38eb54 balrog
        break;
1876 4e38eb54 balrog
1877 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_VOICE_SETTING):
1878 4e38eb54 balrog
        bt_hci_event_complete_voice_setting(hci);
1879 4e38eb54 balrog
        break;
1880 4e38eb54 balrog
1881 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING):
1882 4e38eb54 balrog
        LENGTH_CHECK(write_voice_setting);
1883 4e38eb54 balrog
1884 4e38eb54 balrog
        hci->voice_setting = PARAM(write_voice_setting, voice_setting);
1885 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1886 4e38eb54 balrog
        break;
1887 4e38eb54 balrog
1888 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_HOST_NUMBER_OF_COMPLETED_PACKETS):
1889 4e38eb54 balrog
        if (length < data[0] * 2 + 1)
1890 4e38eb54 balrog
            goto short_hci;
1891 4e38eb54 balrog
1892 4e38eb54 balrog
        for (i = 0; i < data[0]; i ++)
1893 4e38eb54 balrog
            if (bt_hci_handle_bad(hci,
1894 4e38eb54 balrog
                                    data[i * 2 + 1] | (data[i * 2 + 2] << 8)))
1895 4e38eb54 balrog
                bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1896 4e38eb54 balrog
        break;
1897 4e38eb54 balrog
1898 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_INQUIRY_MODE):
1899 4e38eb54 balrog
        /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x40)
1900 4e38eb54 balrog
         * else
1901 4e38eb54 balrog
         *     goto unknown_command */
1902 4e38eb54 balrog
        bt_hci_event_complete_read_inquiry_mode(hci);
1903 4e38eb54 balrog
        break;
1904 4e38eb54 balrog
1905 4e38eb54 balrog
    case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE):
1906 4e38eb54 balrog
        /* Only if (local_features[3] & 0x40) && (local_commands[12] & 0x80)
1907 4e38eb54 balrog
         * else
1908 4e38eb54 balrog
         *     goto unknown_command */
1909 4e38eb54 balrog
        LENGTH_CHECK(write_inquiry_mode);
1910 4e38eb54 balrog
1911 4e38eb54 balrog
        if (PARAM(write_inquiry_mode, mode) > 0x01) {
1912 4e38eb54 balrog
            bt_hci_event_complete_status(hci, HCI_INVALID_PARAMETERS);
1913 4e38eb54 balrog
            break;
1914 4e38eb54 balrog
        }
1915 4e38eb54 balrog
1916 4e38eb54 balrog
        hci->lm.inquiry_mode = PARAM(write_inquiry_mode, mode);
1917 4e38eb54 balrog
        bt_hci_event_complete_status(hci, HCI_SUCCESS);
1918 4e38eb54 balrog
        break;
1919 4e38eb54 balrog
1920 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION):
1921 4e38eb54 balrog
        bt_hci_read_local_version_rp(hci);
1922 4e38eb54 balrog
        break;
1923 4e38eb54 balrog
1924 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_COMMANDS):
1925 4e38eb54 balrog
        bt_hci_read_local_commands_rp(hci);
1926 4e38eb54 balrog
        break;
1927 4e38eb54 balrog
1928 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES):
1929 4e38eb54 balrog
        bt_hci_read_local_features_rp(hci);
1930 4e38eb54 balrog
        break;
1931 4e38eb54 balrog
1932 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_EXT_FEATURES):
1933 4e38eb54 balrog
        LENGTH_CHECK(read_local_ext_features);
1934 4e38eb54 balrog
1935 4e38eb54 balrog
        bt_hci_read_local_ext_features_rp(hci,
1936 4e38eb54 balrog
                        PARAM(read_local_ext_features, page_num));
1937 4e38eb54 balrog
        break;
1938 4e38eb54 balrog
1939 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE):
1940 4e38eb54 balrog
        bt_hci_read_buffer_size_rp(hci);
1941 4e38eb54 balrog
        break;
1942 4e38eb54 balrog
1943 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_COUNTRY_CODE):
1944 4e38eb54 balrog
        bt_hci_read_country_code_rp(hci);
1945 4e38eb54 balrog
        break;
1946 4e38eb54 balrog
1947 4e38eb54 balrog
    case cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BD_ADDR):
1948 4e38eb54 balrog
        bt_hci_read_bd_addr_rp(hci);
1949 4e38eb54 balrog
        break;
1950 4e38eb54 balrog
1951 4e38eb54 balrog
    case cmd_opcode_pack(OGF_STATUS_PARAM, OCF_READ_LINK_QUALITY):
1952 4e38eb54 balrog
        LENGTH_CHECK(read_link_quality);
1953 4e38eb54 balrog
1954 4e38eb54 balrog
        bt_hci_link_quality_rp(hci, PARAMHANDLE(read_link_quality));
1955 4e38eb54 balrog
        break;
1956 4e38eb54 balrog
1957 4e38eb54 balrog
    default:
1958 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_UNKNOWN_COMMAND);
1959 4e38eb54 balrog
        break;
1960 4e38eb54 balrog
1961 4e38eb54 balrog
    short_hci:
1962 4e38eb54 balrog
        fprintf(stderr, "%s: HCI packet too short (%iB)\n",
1963 4e38eb54 balrog
                        __FUNCTION__, length);
1964 4e38eb54 balrog
        bt_hci_event_status(hci, HCI_INVALID_PARAMETERS);
1965 4e38eb54 balrog
        break;
1966 4e38eb54 balrog
    }
1967 4e38eb54 balrog
}
1968 4e38eb54 balrog
1969 4e38eb54 balrog
/* We could perform fragmentation here, we can't do "recombination" because
1970 4e38eb54 balrog
 * at this layer the length of the payload is not know ahead, so we only
1971 4e38eb54 balrog
 * know that a packet contained the last fragment of the SDU when the next
1972 4e38eb54 balrog
 * SDU starts.  */
1973 4e38eb54 balrog
static inline void bt_hci_lmp_acl_data(struct bt_hci_s *hci, uint16_t handle,
1974 4e38eb54 balrog
                const uint8_t *data, int start, int len)
1975 4e38eb54 balrog
{
1976 4e38eb54 balrog
    struct hci_acl_hdr *pkt = (void *) hci->acl_buf;
1977 4e38eb54 balrog
1978 4e38eb54 balrog
    /* TODO: packet flags */
1979 4e38eb54 balrog
    /* TODO: avoid memcpy'ing */
1980 4e38eb54 balrog
1981 4e38eb54 balrog
    if (len + HCI_ACL_HDR_SIZE > sizeof(hci->acl_buf)) {
1982 4e38eb54 balrog
        fprintf(stderr, "%s: can't take ACL packets %i bytes long\n",
1983 4e38eb54 balrog
                        __FUNCTION__, len);
1984 4e38eb54 balrog
        return;
1985 4e38eb54 balrog
    }
1986 4e38eb54 balrog
    memcpy(hci->acl_buf + HCI_ACL_HDR_SIZE, data, len);
1987 4e38eb54 balrog
1988 4e38eb54 balrog
    pkt->handle = cpu_to_le16(
1989 4e38eb54 balrog
                    acl_handle_pack(handle, start ? ACL_START : ACL_CONT));
1990 4e38eb54 balrog
    pkt->dlen = cpu_to_le16(len);
1991 4e38eb54 balrog
    hci->info.acl_recv(hci->info.opaque,
1992 4e38eb54 balrog
                    hci->acl_buf, len + HCI_ACL_HDR_SIZE);
1993 4e38eb54 balrog
}
1994 4e38eb54 balrog
1995 4e38eb54 balrog
static void bt_hci_lmp_acl_data_slave(struct bt_link_s *btlink,
1996 4e38eb54 balrog
                const uint8_t *data, int start, int len)
1997 4e38eb54 balrog
{
1998 4e38eb54 balrog
    struct bt_hci_link_s *link = (struct bt_hci_link_s *) btlink;
1999 4e38eb54 balrog
2000 4e38eb54 balrog
    bt_hci_lmp_acl_data(hci_from_device(btlink->slave),
2001 4e38eb54 balrog
                    link->handle, data, start, len);
2002 4e38eb54 balrog
}
2003 4e38eb54 balrog
2004 4e38eb54 balrog
static void bt_hci_lmp_acl_data_host(struct bt_link_s *link,
2005 4e38eb54 balrog
                const uint8_t *data, int start, int len)
2006 4e38eb54 balrog
{
2007 4e38eb54 balrog
    bt_hci_lmp_acl_data(hci_from_device(link->host),
2008 4e38eb54 balrog
                    link->handle, data, start, len);
2009 4e38eb54 balrog
}
2010 4e38eb54 balrog
2011 4e38eb54 balrog
static void bt_submit_acl(struct HCIInfo *info,
2012 4e38eb54 balrog
                const uint8_t *data, int length)
2013 4e38eb54 balrog
{
2014 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_info(info);
2015 4e38eb54 balrog
    uint16_t handle;
2016 4e38eb54 balrog
    int datalen, flags;
2017 4e38eb54 balrog
    struct bt_link_s *link;
2018 4e38eb54 balrog
2019 4e38eb54 balrog
    if (length < HCI_ACL_HDR_SIZE) {
2020 4e38eb54 balrog
        fprintf(stderr, "%s: ACL packet too short (%iB)\n",
2021 4e38eb54 balrog
                        __FUNCTION__, length);
2022 4e38eb54 balrog
        return;
2023 4e38eb54 balrog
    }
2024 4e38eb54 balrog
2025 4e38eb54 balrog
    handle = acl_handle((data[1] << 8) | data[0]);
2026 4e38eb54 balrog
    flags = acl_flags((data[1] << 8) | data[0]);
2027 4e38eb54 balrog
    datalen = (data[3] << 8) | data[2];
2028 4e38eb54 balrog
    data += HCI_ACL_HDR_SIZE;
2029 4e38eb54 balrog
    length -= HCI_ACL_HDR_SIZE;
2030 4e38eb54 balrog
2031 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle)) {
2032 4e38eb54 balrog
        fprintf(stderr, "%s: invalid ACL handle %03x\n",
2033 4e38eb54 balrog
                        __FUNCTION__, handle);
2034 4e38eb54 balrog
        /* TODO: signal an error */
2035 4e38eb54 balrog
        return;
2036 4e38eb54 balrog
    }
2037 4e38eb54 balrog
    handle &= ~HCI_HANDLE_OFFSET;
2038 4e38eb54 balrog
2039 4e38eb54 balrog
    if (datalen > length) {
2040 4e38eb54 balrog
        fprintf(stderr, "%s: ACL packet too short (%iB < %iB)\n",
2041 4e38eb54 balrog
                        __FUNCTION__, length, datalen);
2042 4e38eb54 balrog
        return;
2043 4e38eb54 balrog
    }
2044 4e38eb54 balrog
2045 4e38eb54 balrog
    link = hci->lm.handle[handle].link;
2046 4e38eb54 balrog
2047 4e38eb54 balrog
    if ((flags & ~3) == ACL_ACTIVE_BCAST) {
2048 4e38eb54 balrog
        if (!hci->asb_handle)
2049 4e38eb54 balrog
            hci->asb_handle = handle;
2050 4e38eb54 balrog
        else if (handle != hci->asb_handle) {
2051 4e38eb54 balrog
            fprintf(stderr, "%s: Bad handle %03x in Active Slave Broadcast\n",
2052 4e38eb54 balrog
                            __FUNCTION__, handle);
2053 4e38eb54 balrog
            /* TODO: signal an error */
2054 4e38eb54 balrog
            return;
2055 4e38eb54 balrog
        }
2056 4e38eb54 balrog
2057 4e38eb54 balrog
        /* TODO */
2058 4e38eb54 balrog
    }
2059 4e38eb54 balrog
2060 4e38eb54 balrog
    if ((flags & ~3) == ACL_PICO_BCAST) {
2061 4e38eb54 balrog
        if (!hci->psb_handle)
2062 4e38eb54 balrog
            hci->psb_handle = handle;
2063 4e38eb54 balrog
        else if (handle != hci->psb_handle) {
2064 4e38eb54 balrog
            fprintf(stderr, "%s: Bad handle %03x in Parked Slave Broadcast\n",
2065 4e38eb54 balrog
                            __FUNCTION__, handle);
2066 4e38eb54 balrog
            /* TODO: signal an error */
2067 4e38eb54 balrog
            return;
2068 4e38eb54 balrog
        }
2069 4e38eb54 balrog
2070 4e38eb54 balrog
        /* TODO */
2071 4e38eb54 balrog
    }
2072 4e38eb54 balrog
2073 4e38eb54 balrog
    /* TODO: increase counter and send EVT_NUM_COMP_PKTS */
2074 4e38eb54 balrog
    bt_hci_event_num_comp_pkts(hci, handle | HCI_HANDLE_OFFSET, 1);
2075 4e38eb54 balrog
2076 4e38eb54 balrog
    /* Do this last as it can trigger further events even in this HCI */
2077 4e38eb54 balrog
    hci->lm.handle[handle].lmp_acl_data(link, data,
2078 4e38eb54 balrog
                    (flags & 3) == ACL_START, length);
2079 4e38eb54 balrog
}
2080 4e38eb54 balrog
2081 4e38eb54 balrog
static void bt_submit_sco(struct HCIInfo *info,
2082 4e38eb54 balrog
                const uint8_t *data, int length)
2083 4e38eb54 balrog
{
2084 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_info(info);
2085 4e38eb54 balrog
    struct bt_link_s *link;
2086 4e38eb54 balrog
    uint16_t handle;
2087 4e38eb54 balrog
    int datalen;
2088 4e38eb54 balrog
2089 4e38eb54 balrog
    if (length < 3)
2090 4e38eb54 balrog
        return;
2091 4e38eb54 balrog
2092 4e38eb54 balrog
    handle = acl_handle((data[1] << 8) | data[0]);
2093 4e38eb54 balrog
    datalen = data[2];
2094 4e38eb54 balrog
    data += 3;
2095 4e38eb54 balrog
    length -= 3;
2096 4e38eb54 balrog
2097 4e38eb54 balrog
    if (bt_hci_handle_bad(hci, handle)) {
2098 4e38eb54 balrog
        fprintf(stderr, "%s: invalid SCO handle %03x\n",
2099 4e38eb54 balrog
                        __FUNCTION__, handle);
2100 4e38eb54 balrog
        return;
2101 4e38eb54 balrog
    }
2102 4e38eb54 balrog
    handle &= ~HCI_HANDLE_OFFSET;
2103 4e38eb54 balrog
2104 4e38eb54 balrog
    if (datalen > length) {
2105 4e38eb54 balrog
        fprintf(stderr, "%s: SCO packet too short (%iB < %iB)\n",
2106 4e38eb54 balrog
                        __FUNCTION__, length, datalen);
2107 4e38eb54 balrog
        return;
2108 4e38eb54 balrog
    }
2109 4e38eb54 balrog
2110 4e38eb54 balrog
    link = hci->lm.handle[handle].link;
2111 4e38eb54 balrog
    /* TODO */
2112 4e38eb54 balrog
2113 4e38eb54 balrog
    /* TODO: increase counter and send EVT_NUM_COMP_PKTS if synchronous
2114 4e38eb54 balrog
     * Flow Control is enabled.
2115 4e38eb54 balrog
     * (See Read/Write_Synchronous_Flow_Control_Enable on page 513 and
2116 4e38eb54 balrog
     * page 514.)  */
2117 4e38eb54 balrog
}
2118 4e38eb54 balrog
2119 4e38eb54 balrog
static uint8_t *bt_hci_evt_packet(void *opaque)
2120 4e38eb54 balrog
{
2121 4e38eb54 balrog
    /* TODO: allocate a packet from upper layer */
2122 4e38eb54 balrog
    struct bt_hci_s *s = opaque;
2123 4e38eb54 balrog
2124 4e38eb54 balrog
    return s->evt_buf;
2125 4e38eb54 balrog
}
2126 4e38eb54 balrog
2127 4e38eb54 balrog
static void bt_hci_evt_submit(void *opaque, int len)
2128 4e38eb54 balrog
{
2129 4e38eb54 balrog
    /* TODO: notify upper layer */
2130 4e38eb54 balrog
    struct bt_hci_s *s = opaque;
2131 4e38eb54 balrog
2132 7442511c blueswir1
    s->info.evt_recv(s->info.opaque, s->evt_buf, len);
2133 4e38eb54 balrog
}
2134 4e38eb54 balrog
2135 4e38eb54 balrog
static int bt_hci_bdaddr_set(struct HCIInfo *info, const uint8_t *bd_addr)
2136 4e38eb54 balrog
{
2137 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_info(info);
2138 4e38eb54 balrog
2139 4e38eb54 balrog
    bacpy(&hci->device.bd_addr, (const bdaddr_t *) bd_addr);
2140 4e38eb54 balrog
    return 0;
2141 4e38eb54 balrog
}
2142 4e38eb54 balrog
2143 e820e3f4 balrog
static void bt_hci_done(struct HCIInfo *info);
2144 4e38eb54 balrog
static void bt_hci_destroy(struct bt_device_s *dev)
2145 4e38eb54 balrog
{
2146 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_device(dev);
2147 4e38eb54 balrog
2148 7442511c blueswir1
    bt_hci_done(&hci->info);
2149 4e38eb54 balrog
}
2150 4e38eb54 balrog
2151 4e38eb54 balrog
struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net)
2152 4e38eb54 balrog
{
2153 4e38eb54 balrog
    struct bt_hci_s *s = qemu_mallocz(sizeof(struct bt_hci_s));
2154 4e38eb54 balrog
2155 4e38eb54 balrog
    s->lm.inquiry_done = qemu_new_timer(vm_clock, bt_hci_inquiry_done, s);
2156 4e38eb54 balrog
    s->lm.inquiry_next = qemu_new_timer(vm_clock, bt_hci_inquiry_next, s);
2157 4e38eb54 balrog
    s->conn_accept_timer =
2158 4e38eb54 balrog
            qemu_new_timer(vm_clock, bt_hci_conn_accept_timeout, s);
2159 4e38eb54 balrog
2160 4e38eb54 balrog
    s->evt_packet = bt_hci_evt_packet;
2161 4e38eb54 balrog
    s->evt_submit = bt_hci_evt_submit;
2162 4e38eb54 balrog
    s->opaque = s;
2163 4e38eb54 balrog
2164 4e38eb54 balrog
    bt_device_init(&s->device, net);
2165 4e38eb54 balrog
    s->device.lmp_connection_request = bt_hci_lmp_connection_request;
2166 4e38eb54 balrog
    s->device.lmp_connection_complete = bt_hci_lmp_connection_complete;
2167 4e38eb54 balrog
    s->device.lmp_disconnect_master = bt_hci_lmp_disconnect_host;
2168 4e38eb54 balrog
    s->device.lmp_disconnect_slave = bt_hci_lmp_disconnect_slave;
2169 4e38eb54 balrog
    s->device.lmp_acl_data = bt_hci_lmp_acl_data_slave;
2170 4e38eb54 balrog
    s->device.lmp_acl_resp = bt_hci_lmp_acl_data_host;
2171 4e38eb54 balrog
    s->device.lmp_mode_change = bt_hci_lmp_mode_change_slave;
2172 4e38eb54 balrog
2173 4e38eb54 balrog
    /* Keep updated! */
2174 4e38eb54 balrog
    /* Also keep in sync with supported commands bitmask in
2175 4e38eb54 balrog
     * bt_hci_read_local_commands_rp */
2176 4e38eb54 balrog
    s->device.lmp_caps = 0x8000199b7e85355fll;
2177 4e38eb54 balrog
2178 4e38eb54 balrog
    bt_hci_reset(s);
2179 4e38eb54 balrog
2180 4e38eb54 balrog
    s->info.cmd_send = bt_submit_hci;
2181 4e38eb54 balrog
    s->info.sco_send = bt_submit_sco;
2182 4e38eb54 balrog
    s->info.acl_send = bt_submit_acl;
2183 4e38eb54 balrog
    s->info.bdaddr_set = bt_hci_bdaddr_set;
2184 4e38eb54 balrog
2185 4e38eb54 balrog
    s->device.handle_destroy = bt_hci_destroy;
2186 4e38eb54 balrog
2187 4e38eb54 balrog
    return &s->info;
2188 4e38eb54 balrog
}
2189 4e38eb54 balrog
2190 e820e3f4 balrog
static void bt_hci_done(struct HCIInfo *info)
2191 4e38eb54 balrog
{
2192 4e38eb54 balrog
    struct bt_hci_s *hci = hci_from_info(info);
2193 4e38eb54 balrog
    int handle;
2194 4e38eb54 balrog
2195 4e38eb54 balrog
    bt_device_done(&hci->device);
2196 4e38eb54 balrog
2197 4e38eb54 balrog
    if (hci->device.lmp_name)
2198 ac4b0d0c balrog
        qemu_free((void *) hci->device.lmp_name);
2199 4e38eb54 balrog
2200 4e38eb54 balrog
    /* Be gentle and send DISCONNECT to all connected peers and those
2201 4e38eb54 balrog
     * currently waiting for us to accept or reject a connection request.
2202 4e38eb54 balrog
     * This frees the links.  */
2203 7442511c blueswir1
    if (hci->conn_req_host) {
2204 7442511c blueswir1
        bt_hci_connection_reject(hci,
2205 7442511c blueswir1
                                 hci->conn_req_host, HCI_OE_POWER_OFF);
2206 7442511c blueswir1
        return;
2207 7442511c blueswir1
    }
2208 4e38eb54 balrog
2209 4e38eb54 balrog
    for (handle = HCI_HANDLE_OFFSET;
2210 4e38eb54 balrog
                    handle < (HCI_HANDLE_OFFSET | HCI_HANDLES_MAX); handle ++)
2211 4e38eb54 balrog
        if (!bt_hci_handle_bad(hci, handle))
2212 4e38eb54 balrog
            bt_hci_disconnect(hci, handle, HCI_OE_POWER_OFF);
2213 4e38eb54 balrog
2214 4e38eb54 balrog
    /* TODO: this is not enough actually, there may be slaves from whom
2215 4e38eb54 balrog
     * we have requested a connection who will soon (or not) respond with
2216 4e38eb54 balrog
     * an accept or a reject, so we should also check if hci->lm.connecting
2217 4e38eb54 balrog
     * is non-zero and if so, avoid freeing the hci but otherwise disappear
2218 4e38eb54 balrog
     * from all qemu social life (e.g. stop scanning and request to be
2219 4e38eb54 balrog
     * removed from s->device.net) and arrange for
2220 4e38eb54 balrog
     * s->device.lmp_connection_complete to free the remaining bits once
2221 4e38eb54 balrog
     * hci->lm.awaiting_bdaddr[] is empty.  */
2222 4e38eb54 balrog
2223 4e38eb54 balrog
    qemu_free_timer(hci->lm.inquiry_done);
2224 4e38eb54 balrog
    qemu_free_timer(hci->lm.inquiry_next);
2225 4e38eb54 balrog
    qemu_free_timer(hci->conn_accept_timer);
2226 4e38eb54 balrog
2227 4e38eb54 balrog
    qemu_free(hci);
2228 4e38eb54 balrog
}