Home | History | Annotate | Download | only in src
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2000-2001  Qualcomm Incorporated
      6  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk (at) qualcomm.com>
      7  *  Copyright (C) 2002-2009  Marcel Holtmann <marcel (at) holtmann.org>
      8  *
      9  *
     10  *  This program is free software; you can redistribute it and/or modify
     11  *  it under the terms of the GNU General Public License as published by
     12  *  the Free Software Foundation; either version 2 of the License, or
     13  *  (at your option) any later version.
     14  *
     15  *  This program is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  *  GNU General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU General Public License
     21  *  along with this program; if not, write to the Free Software
     22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23  *
     24  */
     25 
     26 #ifdef HAVE_CONFIG_H
     27 #include <config.h>
     28 #endif
     29 
     30 #include <stdio.h>
     31 #include <errno.h>
     32 #include <stdlib.h>
     33 #include <time.h>
     34 #include <unistd.h>
     35 #include <sys/time.h>
     36 #include <sys/param.h>
     37 #include <sys/ioctl.h>
     38 #include <sys/socket.h>
     39 
     40 #include <bluetooth/bluetooth.h>
     41 #include <bluetooth/hci.h>
     42 #include <bluetooth/hci_lib.h>
     43 #include <bluetooth/sdp.h>
     44 
     45 #include <glib.h>
     46 
     47 #include <dbus/dbus.h>
     48 
     49 #include "hcid.h"
     50 #include "logging.h"
     51 #include "textfile.h"
     52 
     53 #include "adapter.h"
     54 #include "dbus-hci.h"
     55 #include "storage.h"
     56 #include "manager.h"
     57 
     58 typedef enum {
     59 	REQ_PENDING,
     60 	REQ_SENT
     61 } req_status_t;
     62 
     63 struct hci_req_data {
     64 	int dev_id;
     65 	int event;
     66 	req_status_t status;
     67 	bdaddr_t dba;
     68 	uint16_t ogf;
     69 	uint16_t ocf;
     70 	void *cparam;
     71 	int clen;
     72 };
     73 
     74 struct g_io_info {
     75 	GIOChannel	*channel;
     76 	int		watch_id;
     77 	int		pin_length;
     78 };
     79 
     80 static struct g_io_info io_data[HCI_MAX_DEV];
     81 
     82 static GSList *hci_req_queue = NULL;
     83 
     84 static struct hci_req_data *hci_req_data_new(int dev_id, const bdaddr_t *dba,
     85 					uint16_t ogf, uint16_t ocf, int event,
     86 					const void *cparam, int clen)
     87 {
     88 	struct hci_req_data *data;
     89 
     90 	data = g_new0(struct hci_req_data, 1);
     91 
     92 	data->cparam = g_malloc(clen);
     93 	memcpy(data->cparam, cparam, clen);
     94 
     95 	bacpy(&data->dba, dba);
     96 
     97 	data->dev_id = dev_id;
     98 	data->status = REQ_PENDING;
     99 	data->ogf    = ogf;
    100 	data->ocf    = ocf;
    101 	data->event  = event;
    102 	data->clen   = clen;
    103 
    104 	return data;
    105 }
    106 
    107 static int hci_req_find_by_devid(const void *data, const void *user_data)
    108 {
    109 	const struct hci_req_data *req = data;
    110 	const int *dev_id = user_data;
    111 
    112 	return (*dev_id - req->dev_id);
    113 }
    114 
    115 static void hci_req_queue_process(int dev_id)
    116 {
    117 	int dd, ret_val;
    118 
    119 	/* send the next pending cmd */
    120 	dd = hci_open_dev(dev_id);
    121 	if (dd < 0) {
    122 		error("hci_open_dev(%d): %s (%d)", dev_id, strerror(errno),
    123 									errno);
    124 		return;
    125 	}
    126 
    127 	do {
    128 		struct hci_req_data *data;
    129 		GSList *l = g_slist_find_custom(hci_req_queue, &dev_id, hci_req_find_by_devid);
    130 
    131 		if (!l)
    132 			break;
    133 
    134 		data = l->data;
    135 		data->status = REQ_SENT;
    136 
    137 		ret_val = hci_send_cmd(dd, data->ogf, data->ocf, data->clen, data->cparam);
    138 		if (ret_val < 0) {
    139 			hci_req_queue = g_slist_remove(hci_req_queue, data);
    140 			g_free(data->cparam);
    141 			g_free(data);
    142 		}
    143 
    144 	} while (ret_val < 0);
    145 
    146 	hci_close_dev(dd);
    147 }
    148 
    149 static void hci_req_queue_append(struct hci_req_data *data)
    150 {
    151 	GSList *l;
    152 	struct hci_req_data *match;
    153 
    154 
    155 	hci_req_queue = g_slist_append(hci_req_queue, data);
    156 
    157 	l = g_slist_find_custom(hci_req_queue, &data->dev_id, hci_req_find_by_devid);
    158 	match = l->data;
    159 
    160 	if (match->status == REQ_SENT)
    161 		return;
    162 
    163 	hci_req_queue_process(data->dev_id);
    164 }
    165 
    166 void hci_req_queue_remove(int dev_id, bdaddr_t *dba)
    167 {
    168 	GSList *cur, *next;
    169 	struct hci_req_data *req;
    170 
    171 	for (cur = hci_req_queue; cur != NULL; cur = next) {
    172 		req = cur->data;
    173 		next = cur->next;
    174 		if ((req->dev_id != dev_id) || (bacmp(&req->dba, dba)))
    175 			continue;
    176 
    177 		hci_req_queue = g_slist_remove(hci_req_queue, req);
    178 		g_free(req->cparam);
    179 		g_free(req);
    180 	}
    181 }
    182 
    183 static void check_pending_hci_req(int dev_id, int event)
    184 {
    185 	struct hci_req_data *data;
    186 	GSList *l;
    187 
    188 	if (!hci_req_queue)
    189 		return;
    190 
    191 	/* find the first element(pending)*/
    192 	l = g_slist_find_custom(hci_req_queue, &dev_id, hci_req_find_by_devid);
    193 
    194 	if (!l)
    195 		return;
    196 
    197 	data = l->data;
    198 
    199 	/* skip if there is pending confirmation */
    200 	if (data->status == REQ_SENT) {
    201 		if (data->event != event)
    202 			return;
    203 
    204 		/* remove the confirmed cmd */
    205 		hci_req_queue = g_slist_remove(hci_req_queue, data);
    206 		g_free(data->cparam);
    207 		g_free(data);
    208 	}
    209 
    210 	hci_req_queue_process(dev_id);
    211 }
    212 
    213 static int get_handle(int dev, bdaddr_t *sba, bdaddr_t *dba, uint16_t *handle)
    214 {
    215 	struct hci_conn_list_req *cl;
    216 	struct hci_conn_info *ci;
    217 	char addr[18];
    218 	int i;
    219 
    220 	cl = g_malloc0(10 * sizeof(*ci) + sizeof(*cl));
    221 
    222 	ba2str(sba, addr);
    223 	cl->dev_id = hci_devid(addr);
    224 	cl->conn_num = 10;
    225 	ci = cl->conn_info;
    226 
    227 	if (ioctl(dev, HCIGETCONNLIST, (void *) cl) < 0) {
    228 		g_free(cl);
    229 		return -EIO;
    230 	}
    231 
    232 	for (i = 0; i < cl->conn_num; i++, ci++) {
    233 		if (bacmp(&ci->bdaddr, dba) == 0) {
    234 			*handle = ci->handle;
    235 			g_free(cl);
    236 			return 0;
    237 		}
    238 	}
    239 
    240 	g_free(cl);
    241 
    242 	return -ENOENT;
    243 }
    244 
    245 static inline int get_bdaddr(int dev, bdaddr_t *sba, uint16_t handle, bdaddr_t *dba)
    246 {
    247 	struct hci_conn_list_req *cl;
    248 	struct hci_conn_info *ci;
    249 	char addr[18];
    250 	int i;
    251 
    252 	cl = g_malloc0(10 * sizeof(*ci) + sizeof(*cl));
    253 
    254 	ba2str(sba, addr);
    255 	cl->dev_id = hci_devid(addr);
    256 	cl->conn_num = 10;
    257 	ci = cl->conn_info;
    258 
    259 	if (ioctl(dev, HCIGETCONNLIST, (void *) cl) < 0) {
    260 		g_free(cl);
    261 		return -EIO;
    262 	}
    263 
    264 	for (i = 0; i < cl->conn_num; i++, ci++)
    265 		if (ci->handle == handle) {
    266 			bacpy(dba, &ci->bdaddr);
    267 			g_free(cl);
    268 			return 0;
    269 		}
    270 
    271 	g_free(cl);
    272 
    273 	return -ENOENT;
    274 }
    275 
    276 static inline void update_lastseen(bdaddr_t *sba, bdaddr_t *dba)
    277 {
    278 	time_t t;
    279 	struct tm *tm;
    280 
    281 	t = time(NULL);
    282 	tm = gmtime(&t);
    283 
    284 	write_lastseen_info(sba, dba, tm);
    285 }
    286 
    287 static inline void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
    288 {
    289 	time_t t;
    290 	struct tm *tm;
    291 
    292 	t = time(NULL);
    293 	tm = gmtime(&t);
    294 
    295 	write_lastused_info(sba, dba, tm);
    296 }
    297 
    298 /* Link Key handling */
    299 
    300 static void link_key_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
    301 {
    302 	struct hci_auth_info_req req;
    303 	unsigned char key[16];
    304 	char sa[18], da[18];
    305 	uint8_t type;
    306 	int err;
    307 
    308 	ba2str(sba, sa); ba2str(dba, da);
    309 	info("link_key_request (sba=%s, dba=%s)", sa, da);
    310 
    311 	memset(&req, 0, sizeof(req));
    312 	bacpy(&req.bdaddr, dba);
    313 
    314 	err = ioctl(dev, HCIGETAUTHINFO, (unsigned long) &req);
    315 	if (err < 0) {
    316 		if (errno != EINVAL)
    317 			debug("HCIGETAUTHINFO failed %s (%d)",
    318 						strerror(errno), errno);
    319 		req.type = 0x00;
    320 	}
    321 
    322 	debug("kernel auth requirements = 0x%02x", req.type);
    323 
    324 	err = read_link_key(sba, dba, key, &type);
    325 	if (err < 0) {
    326 		/* Link key not found */
    327 		hci_send_cmd(dev, OGF_LINK_CTL, OCF_LINK_KEY_NEG_REPLY, 6, dba);
    328 	} else {
    329 		/* Link key found */
    330 		link_key_reply_cp lr;
    331 		memcpy(lr.link_key, key, 16);
    332 		bacpy(&lr.bdaddr, dba);
    333 
    334 		debug("stored link key type = 0x%02x", type);
    335 
    336 		/* Don't use debug link keys (0x03) and also don't use
    337 		 * unauthenticated combination keys if MITM is required */
    338 		if (type == 0x03 || (type == 0x04 && req.type != 0xff &&
    339 							(req.type & 0x01)))
    340 			hci_send_cmd(dev, OGF_LINK_CTL,
    341 					OCF_LINK_KEY_NEG_REPLY, 6, dba);
    342 		else
    343 			hci_send_cmd(dev, OGF_LINK_CTL, OCF_LINK_KEY_REPLY,
    344 						LINK_KEY_REPLY_CP_SIZE, &lr);
    345 	}
    346 }
    347 
    348 static void link_key_notify(int dev, bdaddr_t *sba, void *ptr)
    349 {
    350 	evt_link_key_notify *evt = ptr;
    351 	bdaddr_t *dba = &evt->bdaddr;
    352 	char sa[18], da[18];
    353 	int dev_id, err;
    354 	unsigned char old_key[16];
    355 	uint8_t old_key_type;
    356 
    357 	ba2str(sba, sa); ba2str(dba, da);
    358 	info("link_key_notify (sba=%s, dba=%s, type=%d)", sa, da,
    359 							evt->key_type);
    360 
    361 	err = read_link_key(sba, dba, old_key, &old_key_type);
    362 	if (err < 0)
    363 		old_key_type = 0xff;
    364 
    365 	dev_id = hci_devid(sa);
    366 	if (dev_id < 0)
    367 		err = -errno;
    368 	else
    369 		err = hcid_dbus_link_key_notify(sba, dba, evt->link_key,
    370 						evt->key_type,
    371 						io_data[dev_id].pin_length,
    372 						old_key_type);
    373 	if (err < 0) {
    374 		uint16_t handle;
    375 
    376 		if (err == -ENODEV)
    377 			hcid_dbus_bonding_process_complete(sba, dba,
    378 							HCI_OE_LOW_RESOURCES);
    379 		else
    380 			hcid_dbus_bonding_process_complete(sba, dba,
    381 							HCI_MEMORY_FULL);
    382 
    383 		if (get_handle(dev, sba, dba, &handle) == 0) {
    384 			disconnect_cp cp;
    385 
    386 			memset(&cp, 0, sizeof(cp));
    387 			cp.handle = htobs(handle);
    388 			cp.reason = HCI_OE_LOW_RESOURCES;
    389 
    390 			hci_send_cmd(dev, OGF_LINK_CTL, OCF_DISCONNECT,
    391 						DISCONNECT_CP_SIZE, &cp);
    392 		}
    393 	}
    394 
    395 	io_data[dev_id].pin_length = -1;
    396 }
    397 
    398 static void return_link_keys(int dev, bdaddr_t *sba, void *ptr)
    399 {
    400 	evt_return_link_keys *evt = ptr;
    401 	uint8_t num = evt->num_keys;
    402 	unsigned char key[16];
    403 	char sa[18], da[18];
    404 	bdaddr_t dba;
    405 	int i;
    406 
    407 	ba2str(sba, sa);
    408 	ptr++;
    409 
    410 	for (i = 0; i < num; i++) {
    411 		bacpy(&dba, ptr); ba2str(&dba, da);
    412 		memcpy(key, ptr + 6, 16);
    413 
    414 		info("return_link_keys (sba=%s, dba=%s)", sa, da);
    415 
    416 		ptr += 22;
    417 	}
    418 }
    419 
    420 /* Simple Pairing handling */
    421 
    422 static void user_confirm_request(int dev, bdaddr_t *sba, void *ptr)
    423 {
    424 	evt_user_confirm_request *req = ptr;
    425 
    426 	if (hcid_dbus_user_confirm(sba, &req->bdaddr,
    427 					btohl(req->passkey)) < 0)
    428 		hci_send_cmd(dev, OGF_LINK_CTL,
    429 				OCF_USER_CONFIRM_NEG_REPLY, 6, ptr);
    430 }
    431 
    432 static void user_passkey_request(int dev, bdaddr_t *sba, void *ptr)
    433 {
    434 	evt_user_passkey_request *req = ptr;
    435 
    436 	if (hcid_dbus_user_passkey(sba, &req->bdaddr) < 0)
    437 		hci_send_cmd(dev, OGF_LINK_CTL,
    438 				OCF_USER_PASSKEY_NEG_REPLY, 6, ptr);
    439 }
    440 
    441 static void user_passkey_notify(int dev, bdaddr_t *sba, void *ptr)
    442 {
    443 	evt_user_passkey_notify *req = ptr;
    444 
    445 	hcid_dbus_user_notify(sba, &req->bdaddr, btohl(req->passkey));
    446 }
    447 
    448 static void remote_oob_data_request(int dev, bdaddr_t *sba, void *ptr)
    449 {
    450 	hci_send_cmd(dev, OGF_LINK_CTL, OCF_REMOTE_OOB_DATA_NEG_REPLY, 6, ptr);
    451 }
    452 
    453 static void io_capa_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
    454 {
    455 	char sa[18], da[18];
    456 	uint8_t cap, auth;
    457 
    458 	ba2str(sba, sa); ba2str(dba, da);
    459 	info("io_capa_request (sba=%s, dba=%s)", sa, da);
    460 
    461 	if (hcid_dbus_get_io_cap(sba, dba, &cap, &auth) < 0) {
    462 		io_capability_neg_reply_cp cp;
    463 		memset(&cp, 0, sizeof(cp));
    464 		bacpy(&cp.bdaddr, dba);
    465 		cp.reason = HCI_PAIRING_NOT_ALLOWED;
    466 		hci_send_cmd(dev, OGF_LINK_CTL, OCF_IO_CAPABILITY_NEG_REPLY,
    467 					IO_CAPABILITY_NEG_REPLY_CP_SIZE, &cp);
    468 	} else {
    469 		io_capability_reply_cp cp;
    470 		memset(&cp, 0, sizeof(cp));
    471 		bacpy(&cp.bdaddr, dba);
    472 		cp.capability = cap;
    473 		cp.oob_data = 0x00;
    474 		cp.authentication = auth;
    475 		hci_send_cmd(dev, OGF_LINK_CTL, OCF_IO_CAPABILITY_REPLY,
    476 					IO_CAPABILITY_REPLY_CP_SIZE, &cp);
    477 	}
    478 }
    479 
    480 static void io_capa_response(int dev, bdaddr_t *sba, void *ptr)
    481 {
    482 	evt_io_capability_response *evt = ptr;
    483 	char sa[18], da[18];
    484 
    485 	ba2str(sba, sa); ba2str(&evt->bdaddr, da);
    486 	info("io_capa_response (sba=%s, dba=%s)", sa, da);
    487 
    488 	hcid_dbus_set_io_cap(sba, &evt->bdaddr,
    489 				evt->capability, evt->authentication);
    490 }
    491 
    492 /* PIN code handling */
    493 
    494 void set_pin_length(bdaddr_t *sba, int length)
    495 {
    496 	char addr[18];
    497 	int dev_id;
    498 
    499 	ba2str(sba, addr);
    500 	dev_id = hci_devid(addr);
    501 
    502 	if (dev_id >= 0)
    503 		io_data[dev_id].pin_length = length;
    504 }
    505 
    506 static void pin_code_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
    507 {
    508 	pin_code_reply_cp pr;
    509 	struct hci_conn_info_req *cr;
    510 	struct hci_conn_info *ci;
    511 	char sa[18], da[18], pin[17];
    512 	int pinlen;
    513 
    514 	memset(&pr, 0, sizeof(pr));
    515 	bacpy(&pr.bdaddr, dba);
    516 
    517 	ba2str(sba, sa); ba2str(dba, da);
    518 	info("pin_code_request (sba=%s, dba=%s)", sa, da);
    519 
    520 	cr = g_malloc0(sizeof(*cr) + sizeof(*ci));
    521 
    522 	bacpy(&cr->bdaddr, dba);
    523 	cr->type = ACL_LINK;
    524 	if (ioctl(dev, HCIGETCONNINFO, (unsigned long) cr) < 0) {
    525 		error("Can't get conn info: %s (%d)", strerror(errno), errno);
    526 		goto reject;
    527 	}
    528 	ci = cr->conn_info;
    529 
    530 	memset(pin, 0, sizeof(pin));
    531 	pinlen = read_pin_code(sba, dba, pin);
    532 
    533 	if (pinlen > 0) {
    534 		set_pin_length(sba, pinlen);
    535 		memcpy(pr.pin_code, pin, pinlen);
    536 		pr.pin_len = pinlen;
    537 		hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,
    538 				PIN_CODE_REPLY_CP_SIZE, &pr);
    539 	} else {
    540 		/* Request PIN from passkey agent */
    541 		if (hcid_dbus_request_pin(dev, sba, ci) < 0)
    542 			goto reject;
    543 	}
    544 
    545 	g_free(cr);
    546 
    547 	return;
    548 
    549 reject:
    550 	g_free(cr);
    551 
    552 	hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba);
    553 }
    554 
    555 static void start_inquiry(bdaddr_t *local, uint8_t status, gboolean periodic)
    556 {
    557 	struct btd_adapter *adapter;
    558 	int state;
    559 
    560 	/* Don't send the signal if the cmd failed */
    561 	if (status) {
    562 		error("Inquiry Failed with status 0x%02x", status);
    563 		return;
    564 	}
    565 
    566 	adapter = manager_find_adapter(local);
    567 	if (!adapter) {
    568 		error("Unable to find matching adapter");
    569 		return;
    570 	}
    571 
    572 	state = adapter_get_state(adapter);
    573 
    574 	/* Disable name resolution for non D-Bus clients */
    575 	if (!adapter_has_discov_sessions(adapter))
    576 		state &= ~RESOLVE_NAME;
    577 
    578 	if (periodic) {
    579 		state |= PERIODIC_INQUIRY;
    580 		adapter_set_state(adapter, state);
    581 		return;
    582 	}
    583 
    584 	state |= STD_INQUIRY;
    585 	adapter_set_state(adapter, state);
    586 
    587 	/*
    588 	 * Cancel pending remote name request and clean the device list
    589 	 * when inquiry is supported in periodic inquiry idle state.
    590 	 */
    591 	if (adapter_get_state(adapter) & PERIODIC_INQUIRY) {
    592 		pending_remote_name_cancel(adapter);
    593 
    594 		clear_found_devices_list(adapter);
    595 	}
    596 }
    597 
    598 static void inquiry_complete(bdaddr_t *local, uint8_t status, gboolean periodic)
    599 {
    600 	struct btd_adapter *adapter;
    601 	int state;
    602 
    603 	/* Don't send the signal if the cmd failed */
    604 	if (status) {
    605 		error("Inquiry Failed with status 0x%02x", status);
    606 		return;
    607 	}
    608 
    609 	adapter = manager_find_adapter(local);
    610 	if (!adapter) {
    611 		error("Unable to find matching adapter");
    612 		return;
    613 	}
    614 
    615 	/*
    616 	 * The following scenarios can happen:
    617 	 * 1. standard inquiry: always send discovery completed signal
    618 	 * 2. standard inquiry + name resolving: send discovery completed
    619 	 *    after name resolving
    620 	 * 3. periodic inquiry: skip discovery completed signal
    621 	 * 4. periodic inquiry + standard inquiry: always send discovery
    622 	 *    completed signal
    623 	 *
    624 	 * Keep in mind that non D-Bus requests can arrive.
    625 	 */
    626 	if (periodic) {
    627 		state = adapter_get_state(adapter);
    628 		state &= ~PERIODIC_INQUIRY;
    629 		adapter_set_state(adapter, state);
    630 		return;
    631 	}
    632 
    633 	if (adapter_resolve_names(adapter) == 0)
    634 		return;
    635 
    636 	state = adapter_get_state(adapter);
    637 	/*
    638 	 * workaround to identify situation when there is no devices around
    639 	 * but periodic inquiry is active.
    640 	 */
    641 	if (!(state & STD_INQUIRY) && !(state & PERIODIC_INQUIRY)) {
    642 		state |= PERIODIC_INQUIRY;
    643 		adapter_set_state(adapter, state);
    644 		return;
    645 	}
    646 
    647 	/* reset the discover type to be able to handle D-Bus and non D-Bus
    648 	 * requests */
    649 	state &= ~STD_INQUIRY;
    650 	state &= ~PERIODIC_INQUIRY;
    651 	adapter_set_state(adapter, state);
    652 }
    653 
    654 static inline void cmd_status(int dev, bdaddr_t *sba, void *ptr)
    655 {
    656 	evt_cmd_status *evt = ptr;
    657 	uint16_t opcode = btohs(evt->opcode);
    658 
    659 	if (opcode == cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY))
    660 		start_inquiry(sba, evt->status, FALSE);
    661 }
    662 
    663 static inline void cmd_complete(int dev, bdaddr_t *sba, void *ptr)
    664 {
    665 	evt_cmd_complete *evt = ptr;
    666 	uint16_t opcode = btohs(evt->opcode);
    667 	uint8_t status = *((uint8_t *) ptr + EVT_CMD_COMPLETE_SIZE);
    668 
    669 	switch (opcode) {
    670 	case cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY):
    671 		start_inquiry(sba, status, TRUE);
    672 		break;
    673 	case cmd_opcode_pack(OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY):
    674 		inquiry_complete(sba, status, TRUE);
    675 		break;
    676 	case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
    677 		inquiry_complete(sba, status, FALSE);
    678 		break;
    679 	case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
    680 		adapter_setname_complete(sba, status);
    681 		break;
    682 	case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE):
    683 		hcid_dbus_setscan_enable_complete(sba);
    684 		break;
    685 	case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV):
    686 		hcid_dbus_write_class_complete(sba);
    687 		break;
    688 	case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SIMPLE_PAIRING_MODE):
    689 		hcid_dbus_write_simple_pairing_mode_complete(sba);
    690 		break;
    691 	case cmd_opcode_pack(OGF_HOST_CTL, OCF_READ_LOCAL_NAME):
    692 		ptr += sizeof(evt_cmd_complete);
    693 		adapter_update_local_name(sba, status, ptr);
    694 		break;
    695 	};
    696 }
    697 
    698 static inline void remote_name_information(int dev, bdaddr_t *sba, void *ptr)
    699 {
    700 	evt_remote_name_req_complete *evt = ptr;
    701 	bdaddr_t dba;
    702 	char name[MAX_NAME_LENGTH + 1];
    703 
    704 	memset(name, 0, sizeof(name));
    705 	bacpy(&dba, &evt->bdaddr);
    706 
    707 	if (!evt->status) {
    708 		char *end;
    709 		memcpy(name, evt->name, MAX_NAME_LENGTH);
    710 		/* It's ok to cast end between const and non-const since
    711 		 * we know it points to inside of name which is non-const */
    712 		if (!g_utf8_validate(name, -1, (const char **) &end))
    713 			*end = '\0';
    714 		write_device_name(sba, &dba, name);
    715 	}
    716 
    717 	hcid_dbus_remote_name(sba, &dba, evt->status, name);
    718 }
    719 
    720 static inline void remote_version_information(int dev, bdaddr_t *sba, void *ptr)
    721 {
    722 	evt_read_remote_version_complete *evt = ptr;
    723 	bdaddr_t dba;
    724 
    725 	if (evt->status)
    726 		return;
    727 
    728 	if (get_bdaddr(dev, sba, btohs(evt->handle), &dba) < 0)
    729 		return;
    730 
    731 	write_version_info(sba, &dba, btohs(evt->manufacturer),
    732 				evt->lmp_ver, btohs(evt->lmp_subver));
    733 }
    734 
    735 static inline void inquiry_result(int dev, bdaddr_t *sba, int plen, void *ptr)
    736 {
    737 	uint8_t num = *(uint8_t *) ptr++;
    738 	int i;
    739 
    740 	for (i = 0; i < num; i++) {
    741 		inquiry_info *info = ptr;
    742 		uint32_t class = info->dev_class[0]
    743 			| (info->dev_class[1] << 8)
    744 			| (info->dev_class[2] << 16);
    745 
    746 		hcid_dbus_inquiry_result(sba, &info->bdaddr, class, 0, NULL);
    747 
    748 		update_lastseen(sba, &info->bdaddr);
    749 
    750 		ptr += INQUIRY_INFO_SIZE;
    751 	}
    752 }
    753 
    754 static inline void inquiry_result_with_rssi(int dev, bdaddr_t *sba, int plen, void *ptr)
    755 {
    756 	uint8_t num = *(uint8_t *) ptr++;
    757 	int i;
    758 
    759 	if (!num)
    760 		return;
    761 
    762 	if ((plen - 1) / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
    763 		for (i = 0; i < num; i++) {
    764 			inquiry_info_with_rssi_and_pscan_mode *info = ptr;
    765 			uint32_t class = info->dev_class[0]
    766 				| (info->dev_class[1] << 8)
    767 				| (info->dev_class[2] << 16);
    768 
    769 			hcid_dbus_inquiry_result(sba, &info->bdaddr,
    770 						class, info->rssi, NULL);
    771 
    772 			update_lastseen(sba, &info->bdaddr);
    773 
    774 			ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
    775 		}
    776 	} else {
    777 		for (i = 0; i < num; i++) {
    778 			inquiry_info_with_rssi *info = ptr;
    779 			uint32_t class = info->dev_class[0]
    780 				| (info->dev_class[1] << 8)
    781 				| (info->dev_class[2] << 16);
    782 
    783 			hcid_dbus_inquiry_result(sba, &info->bdaddr,
    784 						class, info->rssi, NULL);
    785 
    786 			update_lastseen(sba, &info->bdaddr);
    787 
    788 			ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
    789 		}
    790 	}
    791 }
    792 
    793 static inline void extended_inquiry_result(int dev, bdaddr_t *sba, int plen, void *ptr)
    794 {
    795 	uint8_t num = *(uint8_t *) ptr++;
    796 	int i;
    797 
    798 	for (i = 0; i < num; i++) {
    799 		extended_inquiry_info *info = ptr;
    800 		uint32_t class = info->dev_class[0]
    801 			| (info->dev_class[1] << 8)
    802 			| (info->dev_class[2] << 16);
    803 
    804 		hcid_dbus_inquiry_result(sba, &info->bdaddr, class,
    805 						info->rssi, info->data);
    806 
    807 		update_lastseen(sba, &info->bdaddr);
    808 
    809 		ptr += EXTENDED_INQUIRY_INFO_SIZE;
    810 	}
    811 }
    812 
    813 static inline void remote_features_information(int dev, bdaddr_t *sba, void *ptr)
    814 {
    815 	evt_read_remote_features_complete *evt = ptr;
    816 	bdaddr_t dba;
    817 
    818 	if (evt->status)
    819 		return;
    820 
    821 	if (get_bdaddr(dev, sba, btohs(evt->handle), &dba) < 0)
    822 		return;
    823 
    824 	write_features_info(sba, &dba, evt->features);
    825 }
    826 
    827 static inline void conn_complete(int dev, int dev_id, bdaddr_t *sba, void *ptr)
    828 {
    829 	evt_conn_complete *evt = ptr;
    830 	char filename[PATH_MAX];
    831 	remote_name_req_cp cp_name;
    832 	struct hci_req_data *data;
    833 	char local_addr[18], peer_addr[18], *str;
    834 
    835 	if (evt->link_type != ACL_LINK)
    836 		return;
    837 
    838 	hcid_dbus_conn_complete(sba, evt->status, btohs(evt->handle),
    839 				&evt->bdaddr);
    840 
    841 	if (evt->status)
    842 		return;
    843 
    844 	update_lastused(sba, &evt->bdaddr);
    845 
    846 	/* Request remote name */
    847 	memset(&cp_name, 0, sizeof(cp_name));
    848 	bacpy(&cp_name.bdaddr, &evt->bdaddr);
    849 	cp_name.pscan_rep_mode = 0x02;
    850 
    851 	data = hci_req_data_new(dev_id, &evt->bdaddr, OGF_LINK_CTL,
    852 				OCF_REMOTE_NAME_REQ, EVT_REMOTE_NAME_REQ_COMPLETE,
    853 				&cp_name, REMOTE_NAME_REQ_CP_SIZE);
    854 
    855 	hci_req_queue_append(data);
    856 
    857 	/* check if the remote version needs be requested */
    858 	ba2str(sba, local_addr);
    859 	ba2str(&evt->bdaddr, peer_addr);
    860 
    861 	create_name(filename, sizeof(filename), STORAGEDIR, local_addr, "manufacturers");
    862 
    863 	str = textfile_get(filename, peer_addr);
    864 	if (!str) {
    865 		read_remote_version_cp cp;
    866 
    867 		memset(&cp, 0, sizeof(cp));
    868 		cp.handle = evt->handle;
    869 
    870 		data = hci_req_data_new(dev_id, &evt->bdaddr, OGF_LINK_CTL,
    871 					OCF_READ_REMOTE_VERSION, EVT_READ_REMOTE_VERSION_COMPLETE,
    872 					&cp, READ_REMOTE_VERSION_CP_SIZE);
    873 
    874 		hci_req_queue_append(data);
    875 	} else
    876 		free(str);
    877 }
    878 
    879 static inline void disconn_complete(int dev, bdaddr_t *sba, void *ptr)
    880 {
    881 	evt_disconn_complete *evt = ptr;
    882 
    883 	hcid_dbus_disconn_complete(sba, evt->status, btohs(evt->handle),
    884 					evt->reason);
    885 }
    886 
    887 static inline void auth_complete(int dev, bdaddr_t *sba, void *ptr)
    888 {
    889 	evt_auth_complete *evt = ptr;
    890 	bdaddr_t dba;
    891 
    892 	if (get_bdaddr(dev, sba, btohs(evt->handle), &dba) < 0)
    893 		return;
    894 
    895 	hcid_dbus_bonding_process_complete(sba, &dba, evt->status);
    896 }
    897 
    898 static inline void simple_pairing_complete(int dev, bdaddr_t *sba, void *ptr)
    899 {
    900 	evt_simple_pairing_complete *evt = ptr;
    901 
    902 	hcid_dbus_simple_pairing_complete(sba, &evt->bdaddr, evt->status);
    903 }
    904 
    905 static inline void conn_request(int dev, bdaddr_t *sba, void *ptr)
    906 {
    907 	evt_conn_request *evt = ptr;
    908 	uint32_t class = evt->dev_class[0] | (evt->dev_class[1] << 8)
    909 				| (evt->dev_class[2] << 16);
    910 
    911 	hcid_dbus_remote_class(sba, &evt->bdaddr, class);
    912 
    913 	write_remote_class(sba, &evt->bdaddr, class);
    914 }
    915 
    916 static void delete_channel(GIOChannel *chan)
    917 {
    918 	int i;
    919 
    920 	/* Look for the GIOChannel in the table */
    921 	for (i = 0; i < HCI_MAX_DEV; i++)
    922 		if (io_data[i].channel == chan) {
    923 			stop_security_manager(i);
    924 			return;
    925 		}
    926 
    927 	error("IO channel not found in the io_data table");
    928 }
    929 
    930 static gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data)
    931 {
    932 	unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr = buf;
    933 	struct hci_dev_info *di = data;
    934 	int type, dev;
    935 	size_t len;
    936 	hci_event_hdr *eh;
    937 	GIOError err;
    938 	evt_cmd_status *evt;
    939 
    940 	if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
    941 		delete_channel(chan);
    942 		return FALSE;
    943 	}
    944 
    945 	if ((err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len))) {
    946 		if (err == G_IO_ERROR_AGAIN)
    947 			return TRUE;
    948 		delete_channel(chan);
    949 		return FALSE;
    950 	}
    951 
    952 	type = *ptr++;
    953 
    954 	if (type != HCI_EVENT_PKT)
    955 		return TRUE;
    956 
    957 	eh = (hci_event_hdr *) ptr;
    958 	ptr += HCI_EVENT_HDR_SIZE;
    959 
    960 	dev = g_io_channel_unix_get_fd(chan);
    961 
    962 	ioctl(dev, HCIGETDEVINFO, (void *) di);
    963 
    964 	if (hci_test_bit(HCI_RAW, &di->flags))
    965 		return TRUE;
    966 
    967 	switch (eh->evt) {
    968 	case EVT_CMD_STATUS:
    969 		cmd_status(dev, &di->bdaddr, ptr);
    970 		break;
    971 
    972 	case EVT_CMD_COMPLETE:
    973 		cmd_complete(dev, &di->bdaddr, ptr);
    974 		break;
    975 
    976 	case EVT_REMOTE_NAME_REQ_COMPLETE:
    977 		remote_name_information(dev, &di->bdaddr, ptr);
    978 		break;
    979 
    980 	case EVT_READ_REMOTE_VERSION_COMPLETE:
    981 		remote_version_information(dev, &di->bdaddr, ptr);
    982 		break;
    983 
    984 	case EVT_READ_REMOTE_FEATURES_COMPLETE:
    985 		remote_features_information(dev, &di->bdaddr, ptr);
    986 		break;
    987 
    988 	case EVT_INQUIRY_COMPLETE:
    989 		evt = (evt_cmd_status *) ptr;
    990 		inquiry_complete(&di->bdaddr, evt->status, FALSE);
    991 		break;
    992 
    993 	case EVT_INQUIRY_RESULT:
    994 		inquiry_result(dev, &di->bdaddr, eh->plen, ptr);
    995 		break;
    996 
    997 	case EVT_INQUIRY_RESULT_WITH_RSSI:
    998 		inquiry_result_with_rssi(dev, &di->bdaddr, eh->plen, ptr);
    999 		break;
   1000 
   1001 	case EVT_EXTENDED_INQUIRY_RESULT:
   1002 		extended_inquiry_result(dev, &di->bdaddr, eh->plen, ptr);
   1003 		break;
   1004 
   1005 	case EVT_CONN_COMPLETE:
   1006 		conn_complete(dev, di->dev_id, &di->bdaddr, ptr);
   1007 		break;
   1008 
   1009 	case EVT_DISCONN_COMPLETE:
   1010 		disconn_complete(dev, &di->bdaddr, ptr);
   1011 		break;
   1012 
   1013 	case EVT_AUTH_COMPLETE:
   1014 		auth_complete(dev, &di->bdaddr, ptr);
   1015 		break;
   1016 
   1017 	case EVT_SIMPLE_PAIRING_COMPLETE:
   1018 		simple_pairing_complete(dev, &di->bdaddr, ptr);
   1019 		break;
   1020 
   1021 	case EVT_CONN_REQUEST:
   1022 		conn_request(dev, &di->bdaddr, ptr);
   1023 		break;
   1024 	}
   1025 
   1026 	/* Check for pending command request */
   1027 	check_pending_hci_req(di->dev_id, eh->evt);
   1028 
   1029 	switch (eh->evt) {
   1030 	case EVT_PIN_CODE_REQ:
   1031 		pin_code_request(dev, &di->bdaddr, (bdaddr_t *) ptr);
   1032 		break;
   1033 
   1034 	case EVT_LINK_KEY_REQ:
   1035 		link_key_request(dev, &di->bdaddr, (bdaddr_t *) ptr);
   1036 		break;
   1037 
   1038 	case EVT_LINK_KEY_NOTIFY:
   1039 		link_key_notify(dev, &di->bdaddr, ptr);
   1040 		break;
   1041 
   1042 	case EVT_RETURN_LINK_KEYS:
   1043 		return_link_keys(dev, &di->bdaddr, ptr);
   1044 		break;
   1045 
   1046 	case EVT_IO_CAPABILITY_REQUEST:
   1047 		io_capa_request(dev, &di->bdaddr, (bdaddr_t *) ptr);
   1048 		break;
   1049 
   1050 	case EVT_IO_CAPABILITY_RESPONSE:
   1051 		io_capa_response(dev, &di->bdaddr, ptr);
   1052 		break;
   1053 
   1054 	case EVT_USER_CONFIRM_REQUEST:
   1055 		user_confirm_request(dev, &di->bdaddr, ptr);
   1056 		break;
   1057 
   1058 	case EVT_USER_PASSKEY_REQUEST:
   1059 		user_passkey_request(dev, &di->bdaddr, ptr);
   1060 		break;
   1061 
   1062 	case EVT_USER_PASSKEY_NOTIFY:
   1063 		user_passkey_notify(dev, &di->bdaddr, ptr);
   1064 		break;
   1065 
   1066 	case EVT_REMOTE_OOB_DATA_REQUEST:
   1067 		remote_oob_data_request(dev, &di->bdaddr, ptr);
   1068 		break;
   1069 	}
   1070 
   1071 	return TRUE;
   1072 }
   1073 
   1074 void start_security_manager(int hdev)
   1075 {
   1076 	GIOChannel *chan = io_data[hdev].channel;
   1077 	struct hci_dev_info *di;
   1078 	struct hci_filter flt;
   1079 	read_stored_link_key_cp cp;
   1080 	int dev;
   1081 
   1082 	if (chan)
   1083 		return;
   1084 
   1085 	info("Starting security manager %d", hdev);
   1086 
   1087 	if ((dev = hci_open_dev(hdev)) < 0) {
   1088 		error("Can't open device hci%d: %s (%d)",
   1089 						hdev, strerror(errno), errno);
   1090 		return;
   1091 	}
   1092 
   1093 	/* Set filter */
   1094 	hci_filter_clear(&flt);
   1095 	hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
   1096 	hci_filter_set_event(EVT_CMD_STATUS, &flt);
   1097 	hci_filter_set_event(EVT_CMD_COMPLETE, &flt);
   1098 	hci_filter_set_event(EVT_PIN_CODE_REQ, &flt);
   1099 	hci_filter_set_event(EVT_LINK_KEY_REQ, &flt);
   1100 	hci_filter_set_event(EVT_LINK_KEY_NOTIFY, &flt);
   1101 	hci_filter_set_event(EVT_RETURN_LINK_KEYS, &flt);
   1102 	hci_filter_set_event(EVT_IO_CAPABILITY_REQUEST, &flt);
   1103 	hci_filter_set_event(EVT_IO_CAPABILITY_RESPONSE, &flt);
   1104 	hci_filter_set_event(EVT_USER_CONFIRM_REQUEST, &flt);
   1105 	hci_filter_set_event(EVT_USER_PASSKEY_REQUEST, &flt);
   1106 	hci_filter_set_event(EVT_REMOTE_OOB_DATA_REQUEST, &flt);
   1107 	hci_filter_set_event(EVT_USER_PASSKEY_NOTIFY, &flt);
   1108 	hci_filter_set_event(EVT_KEYPRESS_NOTIFY, &flt);
   1109 	hci_filter_set_event(EVT_SIMPLE_PAIRING_COMPLETE, &flt);
   1110 	hci_filter_set_event(EVT_AUTH_COMPLETE, &flt);
   1111 	hci_filter_set_event(EVT_REMOTE_NAME_REQ_COMPLETE, &flt);
   1112 	hci_filter_set_event(EVT_READ_REMOTE_VERSION_COMPLETE, &flt);
   1113 	hci_filter_set_event(EVT_READ_REMOTE_FEATURES_COMPLETE, &flt);
   1114 	hci_filter_set_event(EVT_REMOTE_HOST_FEATURES_NOTIFY, &flt);
   1115 	hci_filter_set_event(EVT_INQUIRY_COMPLETE, &flt);
   1116 	hci_filter_set_event(EVT_INQUIRY_RESULT, &flt);
   1117 	hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &flt);
   1118 	hci_filter_set_event(EVT_EXTENDED_INQUIRY_RESULT, &flt);
   1119 	hci_filter_set_event(EVT_CONN_REQUEST, &flt);
   1120 	hci_filter_set_event(EVT_CONN_COMPLETE, &flt);
   1121 	hci_filter_set_event(EVT_DISCONN_COMPLETE, &flt);
   1122 	if (setsockopt(dev, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
   1123 		error("Can't set filter on hci%d: %s (%d)",
   1124 						hdev, strerror(errno), errno);
   1125 		close(dev);
   1126 		return;
   1127 	}
   1128 
   1129 	di = g_new(struct hci_dev_info, 1);
   1130 	if (hci_devinfo(hdev, di) < 0) {
   1131 		error("Can't get device info: %s (%d)",
   1132 							strerror(errno), errno);
   1133 		close(dev);
   1134 		g_free(di);
   1135 		return;
   1136 	}
   1137 
   1138 	chan = g_io_channel_unix_new(dev);
   1139 	g_io_channel_set_close_on_unref(chan, TRUE);
   1140 	io_data[hdev].watch_id = g_io_add_watch_full(chan, G_PRIORITY_HIGH,
   1141 						G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
   1142 						io_security_event, di, (GDestroyNotify) g_free);
   1143 	io_data[hdev].channel = chan;
   1144 	io_data[hdev].pin_length = -1;
   1145 
   1146 	if (hci_test_bit(HCI_RAW, &di->flags))
   1147 		return;
   1148 
   1149 	bacpy(&cp.bdaddr, BDADDR_ANY);
   1150 	cp.read_all = 1;
   1151 
   1152 	hci_send_cmd(dev, OGF_HOST_CTL, OCF_READ_STORED_LINK_KEY,
   1153 			READ_STORED_LINK_KEY_CP_SIZE, (void *) &cp);
   1154 }
   1155 
   1156 void stop_security_manager(int hdev)
   1157 {
   1158 	GIOChannel *chan = io_data[hdev].channel;
   1159 
   1160 	if (!chan)
   1161 		return;
   1162 
   1163 	info("Stopping security manager %d", hdev);
   1164 
   1165 	g_source_remove(io_data[hdev].watch_id);
   1166 	g_io_channel_unref(io_data[hdev].channel);
   1167 	io_data[hdev].watch_id = -1;
   1168 	io_data[hdev].channel = NULL;
   1169 	io_data[hdev].pin_length = -1;
   1170 }
   1171 
   1172