135
153
GSList *connections;
158
static inline int get_state(int index)
160
struct dev_info *dev = &devs[index];
162
return dev->discov_state;
165
static inline gboolean is_resolvname_enabled(void)
167
return main_opts.name_resolv ? TRUE : FALSE;
170
static void set_state(int index, int state)
172
struct btd_adapter *adapter;
173
struct dev_info *dev = &devs[index];
175
if (dev->discov_state == state)
178
adapter = manager_find_adapter_by_id(index);
180
error("No matching adapter found");
184
dev->discov_state = state;
186
DBG("hci%d: new state %d", index, dev->discov_state);
188
switch (dev->discov_state) {
190
if (adapter_get_state(adapter) == STATE_SUSPENDED)
193
if (is_resolvname_enabled() &&
194
adapter_has_discov_sessions(adapter))
195
adapter_set_state(adapter, STATE_RESOLVNAME);
197
adapter_set_state(adapter, STATE_IDLE);
201
adapter_set_state(adapter, STATE_DISCOV);
206
static inline gboolean is_le_capable(int index)
208
struct dev_info *dev = &devs[index];
210
return (main_opts.le && dev->features[4] & LMP_LE &&
211
dev->extfeatures[0] & LMP_HOST_LE) ? TRUE : FALSE;
214
static inline gboolean is_bredr_capable(int index)
216
struct dev_info *dev = &devs[index];
218
return (dev->features[4] & LMP_NO_BREDR) == 0 ? TRUE : FALSE;
221
static int get_adapter_type(int index)
223
if (is_le_capable(index) && is_bredr_capable(index))
225
else if (is_le_capable(index))
227
else if (is_bredr_capable(index))
138
233
static int ignore_device(struct hci_dev_info *di)
140
235
return hci_test_bit(HCI_RAW, &di->flags) || di->type >> 4 != HCI_BREDR;
472
568
static int hciops_stop_inquiry(int index)
474
570
struct dev_info *dev = &devs[index];
475
struct hci_dev_info di;
478
572
DBG("hci%d", index);
480
if (hci_devinfo(index, &di) < 0)
574
if (hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_INQUIRY_CANCEL, 0, 0) < 0)
483
if (hci_test_bit(HCI_INQUIRY, &di.flags))
484
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
485
OCF_INQUIRY_CANCEL, 0, 0);
487
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
488
OCF_EXIT_PERIODIC_INQUIRY, 0, 0);
495
580
static gboolean init_adapter(int index)
1271
1356
hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba);
1274
static void start_inquiry(bdaddr_t *local, uint8_t status, gboolean periodic)
1276
struct btd_adapter *adapter;
1279
/* Don't send the signal if the cmd failed */
1281
error("Inquiry Failed with status 0x%02x", status);
1285
adapter = manager_find_adapter(local);
1287
error("Unable to find matching adapter");
1291
state = adapter_get_state(adapter);
1294
state |= STATE_PINQ;
1296
state |= STATE_STDINQ;
1298
adapter_set_state(adapter, state);
1301
static void inquiry_complete(bdaddr_t *local, uint8_t status,
1304
struct btd_adapter *adapter;
1307
/* Don't send the signal if the cmd failed */
1309
error("Inquiry Failed with status 0x%02x", status);
1313
adapter = manager_find_adapter(local);
1315
error("Unable to find matching adapter");
1319
state = adapter_get_state(adapter);
1320
state &= ~(STATE_STDINQ | STATE_PINQ);
1321
adapter_set_state(adapter, state);
1324
1359
static inline void remote_features_notify(int index, void *ptr)
1326
1361
struct dev_info *dev = &devs[index];
1396
1431
init_adapter(index);
1399
#define SIZEOF_UUID128 16
1401
static void eir_generate_uuid128(GSList *list, uint8_t *ptr, uint16_t *eir_len)
1403
int i, k, uuid_count = 0;
1404
uint16_t len = *eir_len;
1406
gboolean truncated = FALSE;
1408
/* Store UUIDs in place, skip 2 bytes to write type and length later */
1411
for (; list; list = list->next) {
1412
struct uuid_info *uuid = list->data;
1413
uint8_t *uuid128_data = uuid->uuid.value.uuid128.data;
1415
if (uuid->uuid.type != SDP_UUID128)
1418
/* Stop if not enough space to put next UUID128 */
1419
if ((len + 2 + SIZEOF_UUID128) > EIR_DATA_LENGTH) {
1424
/* Check for duplicates, EIR data is Little Endian */
1425
for (i = 0; i < uuid_count; i++) {
1426
for (k = 0; k < SIZEOF_UUID128; k++) {
1427
if (uuid128[i * SIZEOF_UUID128 + k] !=
1428
uuid128_data[SIZEOF_UUID128 - 1 - k])
1431
if (k == SIZEOF_UUID128)
1438
/* EIR data is Little Endian */
1439
for (k = 0; k < SIZEOF_UUID128; k++)
1440
uuid128[uuid_count * SIZEOF_UUID128 + k] =
1441
uuid128_data[SIZEOF_UUID128 - 1 - k];
1443
len += SIZEOF_UUID128;
1447
if (uuid_count > 0 || truncated) {
1448
/* EIR Data length */
1449
ptr[0] = (uuid_count * SIZEOF_UUID128) + 1;
1451
ptr[1] = truncated ? EIR_UUID128_SOME : EIR_UUID128_ALL;
1457
static void create_ext_inquiry_response(int index, uint8_t *data)
1459
struct dev_info *dev = &devs[index];
1461
uint8_t *ptr = data;
1462
uint16_t eir_len = 0;
1463
uint16_t uuid16[EIR_DATA_LENGTH / 2];
1464
int i, uuid_count = 0;
1465
gboolean truncated = FALSE;
1468
name_len = strlen(dev->name);
1472
if (name_len > 48) {
1474
ptr[1] = EIR_NAME_SHORT;
1476
ptr[1] = EIR_NAME_COMPLETE;
1478
/* EIR Data length */
1479
ptr[0] = name_len + 1;
1481
memcpy(ptr + 2, dev->name, name_len);
1483
eir_len += (name_len + 2);
1484
ptr += (name_len + 2);
1487
if (dev->tx_power != 0) {
1489
*ptr++ = EIR_TX_POWER;
1490
*ptr++ = (uint8_t) dev->tx_power;
1494
if (dev->did_vendor != 0x0000) {
1495
uint16_t source = 0x0002;
1497
*ptr++ = EIR_DEVICE_ID;
1498
*ptr++ = (source & 0x00ff);
1499
*ptr++ = (source & 0xff00) >> 8;
1500
*ptr++ = (dev->did_vendor & 0x00ff);
1501
*ptr++ = (dev->did_vendor & 0xff00) >> 8;
1502
*ptr++ = (dev->did_product & 0x00ff);
1503
*ptr++ = (dev->did_product & 0xff00) >> 8;
1504
*ptr++ = (dev->did_version & 0x00ff);
1505
*ptr++ = (dev->did_version & 0xff00) >> 8;
1509
/* Group all UUID16 types */
1510
for (l = dev->uuids; l != NULL; l = g_slist_next(l)) {
1511
struct uuid_info *uuid = l->data;
1513
if (uuid->uuid.type != SDP_UUID16)
1516
if (uuid->uuid.value.uuid16 < 0x1100)
1519
if (uuid->uuid.value.uuid16 == PNP_INFO_SVCLASS_ID)
1522
/* Stop if not enough space to put next UUID16 */
1523
if ((eir_len + 2 + sizeof(uint16_t)) > EIR_DATA_LENGTH) {
1528
/* Check for duplicates */
1529
for (i = 0; i < uuid_count; i++)
1530
if (uuid16[i] == uuid->uuid.value.uuid16)
1536
uuid16[uuid_count++] = uuid->uuid.value.uuid16;
1537
eir_len += sizeof(uint16_t);
1540
if (uuid_count > 0) {
1541
/* EIR Data length */
1542
ptr[0] = (uuid_count * sizeof(uint16_t)) + 1;
1544
ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
1549
for (i = 0; i < uuid_count; i++) {
1550
*ptr++ = (uuid16[i] & 0x00ff);
1551
*ptr++ = (uuid16[i] & 0xff00) >> 8;
1555
/* Group all UUID128 types */
1556
if (eir_len <= EIR_DATA_LENGTH - 2)
1557
eir_generate_uuid128(dev->uuids, ptr, &eir_len);
1560
1434
static void update_ext_inquiry_response(int index)
1562
1436
struct dev_info *dev = &devs[index];
1671
1546
static void read_local_ext_features_complete(int index,
1672
1547
const read_local_ext_features_rp *rp)
1674
struct btd_adapter *adapter;
1549
struct dev_info *dev = &devs[index];
1676
1551
DBG("hci%d status %u", index, rp->status);
1678
1553
if (rp->status)
1681
adapter = manager_find_adapter_by_id(index);
1683
error("No matching adapter found");
1687
1556
/* Local Extended feature page number is 1 */
1688
1557
if (rp->page_num != 1)
1691
btd_adapter_update_local_ext_features(adapter, rp->features);
1560
memcpy(dev->extfeatures, rp->features, sizeof(dev->extfeatures));
1694
1563
static void read_bd_addr_complete(int index, read_bd_addr_rp *rp)
1713
1582
init_adapter(index);
1585
static inline void cs_inquiry_evt(int index, uint8_t status)
1588
error("Inquiry Failed with status 0x%02x", status);
1592
set_state(index, DISCOV_INQ);
1716
1595
static inline void cmd_status(int index, void *ptr)
1718
struct dev_info *dev = &devs[index];
1719
1597
evt_cmd_status *evt = ptr;
1720
1598
uint16_t opcode = btohs(evt->opcode);
1722
1600
if (opcode == cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY))
1723
start_inquiry(&dev->bdaddr, evt->status, FALSE);
1601
cs_inquiry_evt(index, evt->status);
1726
1604
static void read_scan_complete(int index, uint8_t status, void *ptr)
1841
1719
oob_read_local_data_complete(adapter, rp->hash, rp->randomizer);
1722
static inline void inquiry_complete_evt(int index, uint8_t status)
1725
struct btd_adapter *adapter;
1728
error("Inquiry Failed with status 0x%02x", status);
1732
adapter = manager_find_adapter_by_id(index);
1734
error("No matching adapter found");
1738
adapter_type = get_adapter_type(index);
1740
if (adapter_type == BR_EDR_LE &&
1741
adapter_has_discov_sessions(adapter)) {
1742
int err = hciops_start_scanning(index, TIMEOUT_BR_LE_SCAN);
1744
set_state(index, DISCOV_HALTED);
1746
set_state(index, DISCOV_HALTED);
1750
static inline void cc_inquiry_cancel(int index, uint8_t status)
1753
error("Inquiry Cancel Failed with status 0x%02x", status);
1757
set_state(index, DISCOV_HALTED);
1760
static inline void cc_le_set_scan_enable(int index, uint8_t status)
1765
error("LE Set Scan Enable Failed with status 0x%02x", status);
1769
state = get_state(index);
1770
if (state == DISCOV_SCAN)
1771
set_state(index, DISCOV_HALTED);
1773
set_state(index, DISCOV_SCAN);
1844
1776
static inline void cmd_complete(int index, void *ptr)
1846
1778
struct dev_info *dev = &devs[index];
1865
1797
ptr += sizeof(evt_cmd_complete);
1866
1798
read_bd_addr_complete(index, ptr);
1868
case cmd_opcode_pack(OGF_LINK_CTL, OCF_PERIODIC_INQUIRY):
1869
start_inquiry(&dev->bdaddr, status, TRUE);
1871
case cmd_opcode_pack(OGF_LINK_CTL, OCF_EXIT_PERIODIC_INQUIRY):
1872
inquiry_complete(&dev->bdaddr, status, TRUE);
1874
1800
case cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY_CANCEL):
1875
inquiry_complete(&dev->bdaddr, status, FALSE);
1801
cc_inquiry_cancel(index, status);
1877
1803
case cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_LE_HOST_SUPPORTED):
1878
1804
write_le_host_complete(index, status);
1880
1806
case cmd_opcode_pack(OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE):
1881
btd_event_le_set_scan_enable_complete(&dev->bdaddr, status);
1807
cc_le_set_scan_enable(index, status);
1883
1809
case cmd_opcode_pack(OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME):
2242
2172
struct dev_info *dev = &devs[index];
2243
2173
le_advertising_info *info;
2244
uint8_t num_reports;
2174
uint8_t num_reports, rssi, eir[HCI_MAX_EIR_LENGTH];
2245
2175
const uint8_t RSSI_SIZE = 1;
2247
2177
num_reports = meta->data[0];
2249
2179
info = (le_advertising_info *) &meta->data[1];
2250
btd_event_advertising_report(&dev->bdaddr, info);
2180
rssi = *(info->data + info->length);
2182
memset(eir, 0, sizeof(eir));
2183
memcpy(eir, info->data, info->length);
2185
btd_event_device_found(&dev->bdaddr, &info->bdaddr, 0, rssi, eir);
2253
2189
while (num_reports--) {
2254
2190
info = (le_advertising_info *) (info->data + info->length +
2256
btd_event_advertising_report(&dev->bdaddr, info);
2192
rssi = *(info->data + info->length);
2194
memset(eir, 0, sizeof(eir));
2195
memcpy(eir, info->data, info->length);
2197
btd_event_device_found(&dev->bdaddr, &info->bdaddr, 0, rssi,
2979
static int hciops_start_inquiry(int index, uint8_t length, gboolean periodic)
2922
static int hciops_start_inquiry(int index, uint8_t length)
2981
2924
struct dev_info *dev = &devs[index];
2982
2925
uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
2985
DBG("hci%d length %u periodic %d", index, length, periodic);
2988
periodic_inquiry_cp cp;
2990
memset(&cp, 0, sizeof(cp));
2991
memcpy(&cp.lap, lap, 3);
2992
cp.max_period = htobs(24);
2993
cp.min_period = htobs(16);
2997
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
2998
OCF_PERIODIC_INQUIRY,
2999
PERIODIC_INQUIRY_CP_SIZE, &cp);
3003
memset(&inq_cp, 0, sizeof(inq_cp));
3004
memcpy(&inq_cp.lap, lap, 3);
3005
inq_cp.length = length;
3006
inq_cp.num_rsp = 0x00;
3008
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
3009
OCF_INQUIRY, INQUIRY_CP_SIZE, &inq_cp);
2928
DBG("hci%d length %u", index, length);
2930
memset(&inq_cp, 0, sizeof(inq_cp));
2931
memcpy(&inq_cp.lap, lap, 3);
2932
inq_cp.length = length;
2933
inq_cp.num_rsp = 0x00;
2935
if (hci_send_cmd(dev->sk, OGF_LINK_CTL,
2936
OCF_INQUIRY, INQUIRY_CP_SIZE, &inq_cp) < 0)
3018
2942
static int le_set_scan_enable(int index, uint8_t enable)
3053
2992
LE_SET_SCAN_PARAMETERS_CP_SIZE, &cp) < 0)
3056
return le_set_scan_enable(index, 1);
2995
err = le_set_scan_enable(index, 1);
2999
/* Schedule a le scan disable in 'timeout' milliseconds */
3000
dev->stop_scan_id = g_timeout_add(timeout, stop_le_scan_cb, dev);
3059
3005
static int hciops_stop_scanning(int index)
3007
struct dev_info *dev = &devs[index];
3061
3009
DBG("hci%d", index);
3011
if (dev->stop_scan_id > 0) {
3012
g_source_remove(dev->stop_scan_id);
3013
dev->stop_scan_id = 0;
3063
3016
return le_set_scan_enable(index, 0);
3078
static int hciops_start_discovery(int index)
3080
int adapter_type = get_adapter_type(index);
3082
switch (adapter_type) {
3084
return hciops_start_inquiry(index, LENGTH_BR_LE_INQ);
3086
return hciops_start_inquiry(index, LENGTH_BR_INQ);
3088
return hciops_start_scanning(index, TIMEOUT_LE_SCAN);
3094
static int hciops_stop_discovery(int index)
3096
struct dev_info *dev = &devs[index];
3098
DBG("index %d", index);
3100
switch (dev->discov_state) {
3102
return hciops_stop_inquiry(index);
3104
return hciops_stop_scanning(index);
3125
3110
static int hciops_fast_connectable(int index, gboolean enable)
3127
3112
struct dev_info *dev = &devs[index];
3289
3275
pin_code_reply_cp pr;
3290
size_t len = strlen(pin);
3292
dev->pin_length = len;
3277
dev->pin_length = pin_len;
3294
3279
memset(&pr, 0, sizeof(pr));
3295
3280
bacpy(&pr.bdaddr, bdaddr);
3296
memcpy(pr.pin_code, pin, len);
3281
memcpy(pr.pin_code, pin, pin_len);
3282
pr.pin_len = pin_len;
3298
3283
err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
3299
3284
OCF_PIN_CODE_REPLY,
3300
3285
PIN_CODE_REPLY_CP_SIZE, &pr);
3671
3656
.set_discoverable = hciops_set_discoverable,
3672
3657
.set_pairable = hciops_set_pairable,
3673
3658
.set_limited_discoverable = hciops_set_limited_discoverable,
3674
.start_inquiry = hciops_start_inquiry,
3675
.stop_inquiry = hciops_stop_inquiry,
3676
.start_scanning = hciops_start_scanning,
3677
.stop_scanning = hciops_stop_scanning,
3659
.start_discovery = hciops_start_discovery,
3660
.stop_discovery = hciops_stop_discovery,
3678
3661
.resolve_name = hciops_resolve_name,
3679
3662
.cancel_resolve_name = hciops_cancel_resolve_name,
3680
3663
.set_name = hciops_set_name,