Statistics
| Branch: | Revision:

root / hw / bt-hci.c @ 74382217

History | View | Annotate | Download (67.6 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 8167ee88 Blue Swirl
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 4e38eb54 balrog
 */
20 4e38eb54 balrog
21 4e38eb54 balrog
#include "qemu-common.h"
22 4e38eb54 balrog
#include "qemu-timer.h"
23 4e38eb54 balrog
#include "usb.h"
24 4e38eb54 balrog
#include "net.h"
25 4e38eb54 balrog
#include "bt.h"
26 4e38eb54 balrog
27 4e38eb54 balrog
struct bt_hci_s {
28 4e38eb54 balrog
    uint8_t *(*evt_packet)(void *opaque);
29 4e38eb54 balrog
    void (*evt_submit)(void *opaque, int len);
30 4e38eb54 balrog
    void *opaque;
31 4e38eb54 balrog
    uint8_t evt_buf[256];
32 4e38eb54 balrog
33 4e38eb54 balrog
    uint8_t acl_buf[4096];
34 4e38eb54 balrog
    int acl_len;
35 4e38eb54 balrog
36 4e38eb54 balrog
    uint16_t asb_handle;
37 4e38eb54 balrog
    uint16_t psb_handle;
38 4e38eb54 balrog
39 4e38eb54 balrog
    int last_cmd;        /* Note: Always little-endian */
40 4e38eb54 balrog
41 4e38eb54 balrog
    struct bt_device_s *conn_req_host;
42 4e38eb54 balrog
43 4e38eb54 balrog
    struct {
44 4e38eb54 balrog
        int inquire;
45 4e38eb54 balrog
        int periodic;
46 4e38eb54 balrog
        int responses_left;
47 4e38eb54 balrog
        int responses;
48 4e38eb54 balrog
        QEMUTimer *inquiry_done;
49 4e38eb54 balrog
        QEMUTimer *inquiry_next;
50 4e38eb54 balrog
        int inquiry_length;
51 4e38eb54 balrog
        int inquiry_period;
52 4e38eb54 balrog
        int inquiry_mode;
53 4e38eb54 balrog
54 4e38eb54 balrog
#define HCI_HANDLE_OFFSET        0x20
55 4e38eb54 balrog
#define HCI_HANDLES_MAX                0x10
56 4e38eb54 balrog
        struct bt_hci_master_link_s {
57 4e38eb54 balrog
            struct bt_link_s *link;
58 4e38eb54 balrog
            void (*lmp_acl_data)(struct bt_link_s *link,
59 4e38eb54 balrog
                            const uint8_t *data, int start, int len);
60 4e38eb54 balrog
            QEMUTimer *acl_mode_timer;
61 4e38eb54 balrog
        } handle[HCI_HANDLES_MAX];
62 4e38eb54 balrog
        uint32_t role_bmp;
63 4e38eb54 balrog
        int last_handle;
64 4e38eb54 balrog
        int connecting;
65 c227f099 Anthony Liguori
        bdaddr_t awaiting_bdaddr[HCI_HANDLES_MAX];
66 4e38eb54 balrog
    } lm;
67 4e38eb54 balrog
68 4e38eb54 balrog
    uint8_t event_mask[8];
69 4e38eb54 balrog
    uint16_t voice_setting;        /* Notw: Always little-endian */
70 4e38eb54 balrog
    uint16_t conn_accept_tout;
71 4e38eb54 balrog
    QEMUTimer *conn_accept_timer;
72 4e38eb54 balrog
73 4e38eb54 balrog
    struct HCIInfo info;
74 4e38eb54 balrog
    struct bt_device_s device;
75 4e38eb54 balrog
};
76 4e38eb54 balrog
77 4e38eb54 balrog
#define DEFAULT_RSSI_DBM        20
78 4e38eb54 balrog
79 4e38eb54 balrog
#define hci_from_info(ptr)        container_of((ptr), struct bt_hci_s, info)
80 4e38eb54 balrog
#define hci_from_device(ptr)        container_of((ptr), struct bt_hci_s, device)
81 4e38eb54 balrog
82 4e38eb54 balrog
struct bt_hci_link_s {
83 4e38eb54 balrog
    struct bt_link_s btlink;
84 4e38eb54 balrog
    uint16_t handle;        /* Local */
85 4e38eb54 balrog
};
86 4e38eb54 balrog
87 4e38eb54 balrog
/* LMP layer emulation */
88 b1d8e52e blueswir1
#if 0
89 e820e3f4 balrog
static void bt_submit_lmp(struct bt_device_s *bt, int length, uint8_t *data)
90 4e38eb54 balrog
{
91 4e38eb54 balrog
    int resp, resplen, error, op, tr;
92 4e38eb54 balrog
    uint8_t respdata[17];
93 4e38eb54 balrog

94 4e38eb54 balrog
    if (length < 1)
95 4e38eb54 balrog
        return;
96 4e38eb54 balrog

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

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

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

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

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

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

159 4e38eb54 balrog
    case LMP_HOST_CONNECTION_REQ:
160 4e38eb54 balrog
        break;
161 4e38eb54 balrog

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

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

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

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

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

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

241 4e38eb54 balrog
            error = HCI_UNIT_LINK_KEY_USED;
242 4e38eb54 balrog
            goto not_accepted;
243 4e38eb54 balrog
        }
244 4e38eb54 balrog
        break;
245 4e38eb54 balrog

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

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

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

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

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

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

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

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

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

375 4e38eb54 balrog
    if (resp == 0)
376 4e38eb54 balrog
        return;
377 4e38eb54 balrog

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

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

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

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