Home | History | Annotate | Download | only in src
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2006-2010  Nokia Corporation
      6  *  Copyright (C) 2004-2010  Marcel Holtmann <marcel (at) holtmann.org>
      7  *
      8  *
      9  *  This program is free software; you can redistribute it and/or modify
     10  *  it under the terms of the GNU General Public License as published by
     11  *  the Free Software Foundation; either version 2 of the License, or
     12  *  (at your option) any later version.
     13  *
     14  *  This program is distributed in the hope that it will be useful,
     15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  *  GNU General Public License for more details.
     18  *
     19  *  You should have received a copy of the GNU General Public License
     20  *  along with this program; if not, write to the Free Software
     21  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     22  *
     23  */
     24 
     25 #ifdef HAVE_CONFIG_H
     26 #include <config.h>
     27 #endif
     28 
     29 #define _GNU_SOURCE
     30 #include <stdio.h>
     31 #include <ctype.h>
     32 #include <errno.h>
     33 #include <unistd.h>
     34 #include <stdlib.h>
     35 #include <string.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/sdp.h>
     42 
     43 #include <glib.h>
     44 #include <dbus/dbus.h>
     45 #include <gdbus.h>
     46 
     47 #include "log.h"
     48 #include "textfile.h"
     49 
     50 #include "hcid.h"
     51 #include "adapter.h"
     52 #include "manager.h"
     53 #include "device.h"
     54 #include "error.h"
     55 #include "glib-helper.h"
     56 #include "dbus-common.h"
     57 #include "agent.h"
     58 #include "storage.h"
     59 #include "event.h"
     60 #include "sdpd.h"
     61 #include "eir.h"
     62 
     63 static gboolean get_adapter_and_device(bdaddr_t *src, bdaddr_t *dst,
     64 					struct btd_adapter **adapter,
     65 					struct btd_device **device,
     66 					gboolean create)
     67 {
     68 	DBusConnection *conn = get_dbus_connection();
     69 	char peer_addr[18];
     70 
     71 	*adapter = manager_find_adapter(src);
     72 	if (!*adapter) {
     73 		error("Unable to find matching adapter");
     74 		return FALSE;
     75 	}
     76 
     77 	ba2str(dst, peer_addr);
     78 
     79 	if (create)
     80 		*device = adapter_get_device(conn, *adapter, peer_addr);
     81 	else
     82 		*device = adapter_find_device(*adapter, peer_addr);
     83 
     84 	if (create && !*device) {
     85 		error("Unable to get device object!");
     86 		return FALSE;
     87 	}
     88 
     89 	return TRUE;
     90 }
     91 
     92 /*****************************************************************
     93  *
     94  *  Section reserved to HCI commands confirmation handling and low
     95  *  level events(eg: device attached/dettached.
     96  *
     97  *****************************************************************/
     98 
     99 static size_t decode_hex(const char *pin, char *out)
    100 {
    101 	size_t i;
    102 
    103 	for (i = 0; i < 16 && pin[i * 2] && pin[i * 2 + 1]; i++)
    104 		sscanf(&pin[i * 2], "%02hhX", &out[i]);
    105 
    106 	return i;
    107 }
    108 
    109 static size_t decode_pin(const char *pin, char *out)
    110 {
    111 	size_t len;
    112 
    113 	if (!pin)
    114 		return 0;
    115 
    116 	if (pin[0] == '$') {
    117 		len = decode_hex(&pin[1], out);
    118 	} else {
    119 		len = strnlen(pin, 16);
    120 		memcpy(out, pin, len);
    121 	}
    122 
    123 	return len;
    124 }
    125 
    126 static void pincode_cb(struct agent *agent, DBusError *derr,
    127 				const char *pincode, struct btd_device *device)
    128 {
    129 	struct btd_adapter *adapter = device_get_adapter(device);
    130 	bdaddr_t dba;
    131 	int err;
    132 	size_t len;
    133 	char rawpin[16];
    134 
    135 	device_get_address(device, &dba);
    136 
    137 	len = decode_pin(pincode, rawpin);
    138 	if (derr || !len) {
    139 		err = btd_adapter_pincode_reply(adapter, &dba, NULL, 0);
    140 		if (err < 0)
    141 			goto fail;
    142 		return;
    143 	}
    144 
    145 	err = btd_adapter_pincode_reply(adapter, &dba, rawpin, len);
    146 	if (err < 0)
    147 		goto fail;
    148 
    149 	return;
    150 
    151 fail:
    152 	error("Sending PIN code reply failed: %s (%d)", strerror(-err), -err);
    153 }
    154 
    155 int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
    156 {
    157 	struct btd_adapter *adapter;
    158 	struct btd_device *device;
    159 	char pin[17];
    160 	int pinlen;
    161 
    162 	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
    163 		return -ENODEV;
    164 
    165 	memset(pin, 0, sizeof(pin));
    166 	pinlen = read_pin_code(sba, dba, pin);
    167 	if (pinlen > 0) {
    168 		btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
    169 		return 0;
    170 	}
    171 
    172 	return device_request_authentication(device, AUTH_TYPE_PINCODE, 0,
    173 								pincode_cb);
    174 }
    175 
    176 static int confirm_reply(struct btd_adapter *adapter,
    177 				struct btd_device *device, gboolean success)
    178 {
    179 	bdaddr_t bdaddr;
    180 
    181 	device_get_address(device, &bdaddr);
    182 
    183 	return btd_adapter_confirm_reply(adapter, &bdaddr, success);
    184 }
    185 
    186 static void confirm_cb(struct agent *agent, DBusError *err, void *user_data)
    187 {
    188 	struct btd_device *device = user_data;
    189 	struct btd_adapter *adapter = device_get_adapter(device);
    190 	gboolean success = (err == NULL) ? TRUE : FALSE;
    191 
    192 	confirm_reply(adapter, device, success);
    193 }
    194 
    195 static void passkey_cb(struct agent *agent, DBusError *err, uint32_t passkey,
    196 			void *user_data)
    197 {
    198 	struct btd_device *device = user_data;
    199 	struct btd_adapter *adapter = device_get_adapter(device);
    200 	bdaddr_t bdaddr;
    201 
    202 	device_get_address(device, &bdaddr);
    203 
    204 	if (err)
    205 		passkey = INVALID_PASSKEY;
    206 
    207 	btd_adapter_passkey_reply(adapter, &bdaddr, passkey);
    208 }
    209 
    210 int btd_event_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey)
    211 {
    212 	struct btd_adapter *adapter;
    213 	struct btd_device *device;
    214 
    215 	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
    216 		return -ENODEV;
    217 
    218 	return device_request_authentication(device, AUTH_TYPE_CONFIRM,
    219 							passkey, confirm_cb);
    220 }
    221 
    222 int btd_event_user_consent(bdaddr_t *sba, bdaddr_t *dba)
    223 {
    224 	struct btd_adapter *adapter;
    225 	struct btd_device *device;
    226 
    227 	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
    228 		return -ENODEV;
    229 
    230 	return device_request_authentication(device, AUTH_TYPE_PAIRING_CONSENT,
    231 						0, confirm_cb);
    232 }
    233 
    234 int btd_event_user_passkey(bdaddr_t *sba, bdaddr_t *dba)
    235 {
    236 	struct btd_adapter *adapter;
    237 	struct btd_device *device;
    238 
    239 	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
    240 		return -ENODEV;
    241 
    242 	return device_request_authentication(device, AUTH_TYPE_PASSKEY, 0,
    243 								passkey_cb);
    244 }
    245 
    246 int btd_event_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey)
    247 {
    248 	struct btd_adapter *adapter;
    249 	struct btd_device *device;
    250 
    251 	if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
    252 		return -ENODEV;
    253 
    254 	return device_request_authentication(device, AUTH_TYPE_NOTIFY,
    255 								passkey, NULL);
    256 }
    257 
    258 void btd_event_bonding_complete(bdaddr_t *local, bdaddr_t *peer,
    259 							uint8_t status)
    260 {
    261 	struct btd_adapter *adapter;
    262 	struct btd_device *device;
    263 	gboolean create;
    264 
    265 	DBG("status 0x%02x", status);
    266 
    267 	create = status ? FALSE : TRUE;
    268 
    269 	if (!get_adapter_and_device(local, peer, &adapter, &device, create))
    270 		return;
    271 
    272 	if (device)
    273 		device_bonding_complete(device, status);
    274 }
    275 
    276 void btd_event_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer,
    277 								uint8_t status)
    278 {
    279 	struct btd_adapter *adapter;
    280 	struct btd_device *device;
    281 	gboolean create;
    282 
    283 	DBG("status=%02x", status);
    284 
    285 	create = status ? FALSE : TRUE;
    286 
    287 	if (!get_adapter_and_device(local, peer, &adapter, &device, create))
    288 		return;
    289 
    290 	if (!device)
    291 		return;
    292 
    293 	device_simple_pairing_complete(device, status);
    294 }
    295 
    296 static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba)
    297 {
    298 	time_t t;
    299 	struct tm *tm;
    300 
    301 	t = time(NULL);
    302 	tm = gmtime(&t);
    303 
    304 	write_lastseen_info(sba, dba, tm);
    305 }
    306 
    307 static void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
    308 {
    309 	time_t t;
    310 	struct tm *tm;
    311 
    312 	t = time(NULL);
    313 	tm = gmtime(&t);
    314 
    315 	write_lastused_info(sba, dba, tm);
    316 }
    317 
    318 void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
    319 				int8_t rssi, uint8_t *data)
    320 {
    321 	struct btd_adapter *adapter;
    322 
    323 	adapter = manager_find_adapter(local);
    324 	if (!adapter) {
    325 		error("No matching adapter found");
    326 		return;
    327 	}
    328 
    329 	update_lastseen(local, peer);
    330 	write_remote_class(local, peer, class);
    331 
    332 	if (data)
    333 		write_remote_eir(local, peer, data);
    334 
    335 	adapter_update_found_devices(adapter, peer, class, rssi, data);
    336 }
    337 
    338 void btd_event_set_legacy_pairing(bdaddr_t *local, bdaddr_t *peer,
    339 							gboolean legacy)
    340 {
    341 	struct btd_adapter *adapter;
    342 	struct remote_dev_info *dev, match;
    343 
    344 	adapter = manager_find_adapter(local);
    345 	if (!adapter) {
    346 		error("No matching adapter found");
    347 		return;
    348 	}
    349 
    350 	memset(&match, 0, sizeof(struct remote_dev_info));
    351 	bacpy(&match.bdaddr, peer);
    352 	match.name_status = NAME_ANY;
    353 
    354 	dev = adapter_search_found_devices(adapter, &match);
    355 	if (dev)
    356 		dev->legacy = legacy;
    357 }
    358 
    359 void btd_event_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class)
    360 {
    361 	struct btd_adapter *adapter;
    362 	struct btd_device *device;
    363 	uint32_t old_class = 0;
    364 
    365 	read_remote_class(local, peer, &old_class);
    366 
    367 	if (old_class == class)
    368 		return;
    369 
    370 	write_remote_class(local, peer, class);
    371 
    372 	if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
    373 		return;
    374 
    375 	if (!device)
    376 		return;
    377 
    378 	device_set_class(device, class);
    379 }
    380 
    381 void btd_event_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
    382 				char *name)
    383 {
    384 	struct btd_adapter *adapter;
    385 	char srcaddr[18], dstaddr[18];
    386 	struct btd_device *device;
    387 	struct remote_dev_info match, *dev_info;
    388 
    389 	if (status == 0) {
    390 		if (!g_utf8_validate(name, -1, NULL)) {
    391 			int i;
    392 
    393 			/* Assume ASCII, and replace all non-ASCII with
    394 			 * spaces */
    395 			for (i = 0; name[i] != '\0'; i++) {
    396 				if (!isascii(name[i]))
    397 					name[i] = ' ';
    398 			}
    399 			/* Remove leading and trailing whitespace characters */
    400 			g_strstrip(name);
    401 		}
    402 
    403 		write_device_name(local, peer, name);
    404 	}
    405 
    406 	if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
    407 		return;
    408 
    409 	ba2str(local, srcaddr);
    410 	ba2str(peer, dstaddr);
    411 
    412 	if (status != 0)
    413 		goto proceed;
    414 
    415 	bacpy(&match.bdaddr, peer);
    416 	match.name_status = NAME_ANY;
    417 
    418 	dev_info = adapter_search_found_devices(adapter, &match);
    419 	if (dev_info) {
    420 		g_free(dev_info->name);
    421 		dev_info->name = g_strdup(name);
    422 		adapter_emit_device_found(adapter, dev_info);
    423 	}
    424 
    425 	if (device)
    426 		device_set_name(device, name);
    427 
    428 proceed:
    429 	/* remove from remote name request list */
    430 	adapter_remove_found_device(adapter, peer);
    431 
    432 	/* check if there is more devices to request names */
    433 	if (adapter_resolve_names(adapter) == 0)
    434 		return;
    435 
    436 	adapter_set_state(adapter, STATE_IDLE);
    437 }
    438 
    439 int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
    440 				uint8_t *key, uint8_t key_type,
    441 				uint8_t pin_length)
    442 {
    443 	struct btd_adapter *adapter;
    444 	struct btd_device *device;
    445 	int ret;
    446 
    447 	if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
    448 		return -ENODEV;
    449 
    450 	DBG("storing link key of type 0x%02x", key_type);
    451 
    452 	ret = write_link_key(local, peer, key, key_type, pin_length);
    453 
    454 	if (ret == 0) {
    455 		device_set_bonded(device, TRUE);
    456 
    457 		if (device_is_temporary(device))
    458 			device_set_temporary(device, FALSE);
    459 	}
    460 
    461 	return ret;
    462 }
    463 
    464 void btd_event_conn_complete(bdaddr_t *local, bdaddr_t *peer)
    465 {
    466 	struct btd_adapter *adapter;
    467 	struct btd_device *device;
    468 
    469 	if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
    470 		return;
    471 
    472 	update_lastused(local, peer);
    473 
    474 	adapter_add_connection(adapter, device);
    475 }
    476 
    477 void btd_event_conn_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t status)
    478 {
    479 	struct btd_adapter *adapter;
    480 	struct btd_device *device;
    481 	DBusConnection *conn = get_dbus_connection();
    482 
    483 	DBG("status 0x%02x", status);
    484 
    485 	if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
    486 		return;
    487 
    488 	if (!device)
    489 		return;
    490 
    491 	if (device_is_temporary(device))
    492 		adapter_remove_device(conn, adapter, device, TRUE);
    493 }
    494 
    495 void btd_event_disconn_complete(bdaddr_t *local, bdaddr_t *peer)
    496 {
    497 	struct btd_adapter *adapter;
    498 	struct btd_device *device;
    499 
    500 	DBG("");
    501 
    502 	if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
    503 		return;
    504 
    505 	if (!device)
    506 		return;
    507 
    508 	adapter_remove_connection(adapter, device);
    509 }
    510 
    511 /* Section reserved to device HCI callbacks */
    512 
    513 void btd_event_returned_link_key(bdaddr_t *local, bdaddr_t *peer)
    514 {
    515 	struct btd_adapter *adapter;
    516 	struct btd_device *device;
    517 
    518 	if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
    519 		return;
    520 
    521 	device_set_paired(device, TRUE);
    522 }
    523