diff --git a/attrib/client.c b/attrib/client.c
index bfe5877..e5d6ed2 100644
--- a/attrib/client.c
+++ b/attrib/client.c
adapter = device_get_adapter(device);
adapter_get_address(adapter, sba);
- device_get_address(device, dba);
+ device_get_address(device, dba, NULL);
}
static int characteristic_handle_cmp(gconstpointer a, gconstpointer b)
diff --git a/audio/manager.c b/audio/manager.c
index 8de5515..e9187ce 100644
--- a/audio/manager.c
+++ b/audio/manager.c
struct audio_device *audio_dev;
adapter_get_address(adapter, &src);
- device_get_address(device, &dst);
+ device_get_address(device, &dst, NULL);
audio_dev = manager_get_device(&src, &dst, TRUE);
if (!audio_dev) {
diff --git a/health/hdp.c b/health/hdp.c
index acd35e4..812352f 100644
--- a/health/hdp.c
+++ b/health/hdp.c
const struct hdp_device *device = a;
bdaddr_t addr;
- device_get_address(device->dev, &addr);
+ device_get_address(device->dev, &addr, NULL);
return bacmp(&addr, dst);
}
diff --git a/health/hdp_util.c b/health/hdp_util.c
index f49cb6e..3b48e44 100644
--- a/health/hdp_util.c
+++ b/health/hdp_util.c
bdaddr_t dst, src;
uuid_t uuid;
- device_get_address(device->dev, &dst);
+ device_get_address(device->dev, &dst, NULL);
adapter_get_address(device_get_adapter(device->dev), &src);
mdep_data = g_new0(struct get_mdep_data, 1);
conn_data = con_mcl_data_ref(conn_data);
- device_get_address(conn_data->dev->dev, &dst);
+ device_get_address(conn_data->dev->dev, &dst, NULL);
if (!mcap_create_mcl(conn_data->dev->hdp_adapter->mi, &dst, ccpsm,
create_mcl_cb, conn_data,
destroy_con_mcl_data, &gerr)) {
bdaddr_t dst, src;
uuid_t uuid;
- device_get_address(device->dev, &dst);
+ device_get_address(device->dev, &dst, NULL);
adapter_get_address(device_get_adapter(device->dev), &src);
conn_data = g_new0(struct conn_mcl_data, 1);
bdaddr_t dst, src;
uuid_t uuid;
- device_get_address(device->dev, &dst);
+ device_get_address(device->dev, &dst, NULL);
adapter_get_address(device_get_adapter(device->dev), &src);
dcpsm_data = g_new0(struct get_dcpsm_data, 1);
diff --git a/input/manager.c b/input/manager.c
index 496f497..ede06be 100644
--- a/input/manager.c
+++ b/input/manager.c
return -1;
adapter_get_address(adapter, &src);
- device_get_address(device, &dst);
+ device_get_address(device, &dst, NULL);
return input_device_register(connection, device, path, &src, &dst,
HID_UUID, rec->handle, idle_timeout * 60);
}
adapter_get_address(adapter, &src);
- device_get_address(device, &dst);
+ device_get_address(device, &dst, NULL);
return fake_input_register(connection, device, path, &src, &dst,
HSP_HS_UUID, ch);
diff --git a/network/manager.c b/network/manager.c
index 321640b..00a55aa 100644
--- a/network/manager.c
+++ b/network/manager.c
DBG("path %s", path);
adapter_get_address(adapter, &src);
- device_get_address(device, &dst);
+ device_get_address(device, &dst, NULL);
return connection_register(device, path, &src, &dst, id);
}
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 6d6c6f0..f3115a1 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
(info->dev_class[1] << 8) |
(info->dev_class[2] << 16);
- btd_event_device_found(&dev->bdaddr, &info->bdaddr, class,
- 0, 0, NULL, 0);
+ btd_event_device_found(&dev->bdaddr, &info->bdaddr,
+ ADDR_TYPE_BREDR, class, 0, 0, NULL, 0);
ptr += INQUIRY_INFO_SIZE;
}
}
| (info->dev_class[2] << 16);
btd_event_device_found(&dev->bdaddr, &info->bdaddr,
- class, info->rssi, 0, NULL, 0);
+ ADDR_TYPE_BREDR, class,
+ info->rssi, 0, NULL, 0);
ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
}
} else {
| (info->dev_class[2] << 16);
btd_event_device_found(&dev->bdaddr, &info->bdaddr,
- class, info->rssi, 0, NULL, 0);
+ ADDR_TYPE_BREDR, class,
+ info->rssi, 0, NULL, 0);
ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
}
}
| (info->dev_class[1] << 8)
| (info->dev_class[2] << 16);
- btd_event_device_found(&dev->bdaddr, &info->bdaddr, class,
- info->rssi, 0, info->data,
- HCI_MAX_EIR_LENGTH);
+ btd_event_device_found(&dev->bdaddr, &info->bdaddr,
+ ADDR_TYPE_BREDR, class, info->rssi,
+ 0, info->data, HCI_MAX_EIR_LENGTH);
ptr += EXTENDED_INQUIRY_INFO_SIZE;
}
}
btd_event_remote_class(&dev->bdaddr, &evt->bdaddr, class);
}
+static inline addr_type_t le_addr_type(uint8_t bdaddr_type)
+{
+ switch (bdaddr_type) {
+ case LE_RANDOM_ADDRESS:
+ return ADDR_TYPE_LE_RANDOM;
+ case LE_PUBLIC_ADDRESS:
+ default:
+ return ADDR_TYPE_LE_PUBLIC;
+ }
+}
+
static inline void le_advertising_report(int index, evt_le_meta_event *meta)
{
struct dev_info *dev = &devs[index];
info = (le_advertising_info *) &meta->data[1];
rssi = *(info->data + info->length);
- btd_event_device_found(&dev->bdaddr, &info->bdaddr, 0, rssi,
- 0, info->data, info->length);
+ btd_event_device_found(&dev->bdaddr, &info->bdaddr,
+ le_addr_type(info->bdaddr_type), 0, rssi, 0,
+ info->data, info->length);
num_reports--;
RSSI_SIZE);
rssi = *(info->data + info->length);
- btd_event_device_found(&dev->bdaddr, &info->bdaddr, 0, rssi,
- 0, info->data, info->length);
+ btd_event_device_found(&dev->bdaddr, &info->bdaddr,
+ le_addr_type(info->bdaddr_type),
+ 0, rssi, 0, info->data, info->length);
}
}
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 6d5862e..94b721f 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
adapter_name_changed(adapter, (char *) ev->name);
}
+static inline addr_type_t mgmt_addr_type(uint8_t mgmt_addr_type)
+{
+ switch (mgmt_addr_type) {
+ case MGMT_ADDR_BREDR:
+ return ADDR_TYPE_BREDR;
+ case MGMT_ADDR_LE_PUBLIC:
+ return ADDR_TYPE_LE_PUBLIC;
+ case MGMT_ADDR_LE_RANDOM:
+ return ADDR_TYPE_LE_RANDOM;
+ default:
+ return ADDR_TYPE_BREDR;
+ }
+}
+
static void mgmt_device_found(int sk, uint16_t index, void *buf, size_t len)
{
struct mgmt_ev_device_found *ev = buf;
DBG("hci%u addr %s, class %u rssi %d %s", index, addr, cls,
ev->rssi, eir ? "eir" : "");
- btd_event_device_found(&info->bdaddr, &ev->addr.bdaddr, cls,
- ev->rssi, ev->confirm_name,
- eir, HCI_MAX_EIR_LENGTH);
+ btd_event_device_found(&info->bdaddr, &ev->addr.bdaddr,
+ mgmt_addr_type(ev->addr.type), cls,
+ ev->rssi, ev->confirm_name,
+ eir, HCI_MAX_EIR_LENGTH);
}
static void mgmt_remote_name(int sk, uint16_t index, void *buf, size_t len)
diff --git a/proximity/monitor.c b/proximity/monitor.c
index 29ae425..76020ee 100644
--- a/proximity/monitor.c
+++ b/proximity/monitor.c
monitor->linklosslevel = g_strdup(level);
adapter_get_address(device_get_adapter(device), &sba);
- device_get_address(device, &dba);
+ device_get_address(device, &dba, NULL);
write_proximity_config(&sba, &dba, "LinkLossAlertLevel", level);
char *level;
adapter_get_address(device_get_adapter(device), &sba);
- device_get_address(device, &dba);
+ device_get_address(device, &dba, NULL);
level = read_proximity_config(&sba, &dba, "LinkLossAlertLevel");
diff --git a/serial/manager.c b/serial/manager.c
index e97f1a9..b609054 100644
--- a/serial/manager.c
+++ b/serial/manager.c
}
adapter_get_address(adapter, &src);
- device_get_address(device, &dst);
+ device_get_address(device, &dst, NULL);
return port_register(connection, path, &src, &dst, uuid, ch);
}
diff --git a/src/adapter.c b/src/adapter.c
index a776997..8b2a6d8 100644
--- a/src/adapter.c
+++ b/src/adapter.c
for (l = all, le = NULL; l; l = l->next) {
struct remote_dev_info *dev = l->data;
- if (dev->le == FALSE) {
+ if (dev->type == ADDR_TYPE_BREDR) {
dev_info_free(dev);
continue;
}
static struct btd_device *adapter_create_device(DBusConnection *conn,
struct btd_adapter *adapter,
const char *address,
- device_type_t type)
+ addr_type_t type)
{
struct btd_device *device;
const char *path;
return device;
return adapter_create_device(conn, adapter, address,
- DEVICE_TYPE_BREDR);
+ ADDR_TYPE_BREDR);
}
static int start_discovery(struct btd_adapter *adapter)
static struct btd_device *create_device_internal(DBusConnection *conn,
struct btd_adapter *adapter,
- const gchar *address, int *err)
+ const char *address, int *err)
{
struct remote_dev_info *dev, match;
struct btd_device *device;
- device_type_t type;
+ addr_type_t type;
memset(&match, 0, sizeof(struct remote_dev_info));
str2ba(address, &match.bdaddr);
match.name_status = NAME_ANY;
dev = adapter_search_found_devices(adapter, &match);
- if (dev && dev->le)
- type = DEVICE_TYPE_LE;
+ if (dev)
+ type = dev->type;
else
- type = DEVICE_TYPE_BREDR;
+ type = ADDR_TYPE_BREDR;
device = adapter_create_device(conn, adapter, address, type);
if (!device && err)
if (!device)
goto failed;
- if (device_get_type(device) != DEVICE_TYPE_LE)
+ if (device_is_bredr(device))
err = device_browse_sdp(device, conn, msg, NULL, FALSE);
else
err = device_browse_primary(device, conn, msg, FALSE);
return btd_error_failed(msg, strerror(-err));
}
- if (device_get_type(device) != DEVICE_TYPE_LE)
+ if (device_is_bredr(device))
return device_create_bonding(device, conn, msg,
agent_path, cap);
key, (GCompareFunc) device_address_cmp))
return;
- device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
+ device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
if (!device)
return;
(GCompareFunc) device_address_cmp))
return;
- device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
+ device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
if (device) {
device_set_temporary(device, FALSE);
adapter->devices = g_slist_append(adapter->devices, device);
key, (GCompareFunc) device_address_cmp))
return;
- device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
+ device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
if (device) {
device_set_temporary(device, FALSE);
adapter->devices = g_slist_append(adapter->devices, device);
key, (GCompareFunc) device_address_cmp))
return;
- device = device_create(connection, adapter, key, DEVICE_TYPE_LE);
+ /* FIXME: Get the correct LE addr type (public/random) */
+ device = device_create(connection, adapter, key, ADDR_TYPE_LE_PUBLIC);
if (!device)
return;
} else
alias = g_strdup(dev->alias);
- if (dev->le) {
+ if (dev->type != ADDR_TYPE_BREDR) {
gboolean broadcaster;
if (dev->flags & (EIR_LIM_DISC | EIR_GEN_DISC))
}
static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
- gboolean le, const char *name,
+ addr_type_t type, const char *name,
const char *alias, uint32_t class,
gboolean legacy, name_status_t status,
int flags)
dev = g_new0(struct remote_dev_info, 1);
bacpy(&dev->bdaddr, bdaddr);
- dev->le = le;
+ dev->type = type;
dev->name = g_strdup(name);
dev->alias = g_strdup(alias);
dev->class = class;
}
void adapter_update_found_devices(struct btd_adapter *adapter,
- bdaddr_t *bdaddr, uint32_t class,
- int8_t rssi, uint8_t confirm_name,
+ bdaddr_t *bdaddr, addr_type_t type,
+ uint32_t class, int8_t rssi,
+ uint8_t confirm_name,
uint8_t *data, uint8_t data_len)
{
struct remote_dev_info *dev, match;
struct eir_data eir_data;
char *alias, *name;
- gboolean legacy, le;
+ gboolean legacy;
name_status_t name_status;
int err;
name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
- if (eir_data.flags < 0) {
- le = FALSE;
-
+ if (type == ADDR_TYPE_BREDR) {
legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
name);
else
name_status = NAME_NOT_REQUIRED;
} else {
- le = TRUE;
legacy = FALSE;
name_status = NAME_NOT_REQUIRED;
}
alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
- dev = found_device_new(bdaddr, le, name, alias, class, legacy,
+ dev = found_device_new(bdaddr, type, name, alias, class, legacy,
name_status, eir_data.flags);
free(name);
free(alias);
}
adapter_get_address(adapter, &sba);
- device_get_address(dev, &dba);
+ device_get_address(dev, &dba, NULL);
return read_pin_code(&sba, &dba, pin_buf);
}
diff --git a/src/adapter.h b/src/adapter.h
index 23bc8a5..50e27d4 100644
--- a/src/adapter.h
+++ b/src/adapter.h
NAME_REQUESTED, /* HCI remote name request was sent */
} name_status_t;
+typedef enum {
+ ADDR_TYPE_BREDR,
+ ADDR_TYPE_LE_PUBLIC,
+ ADDR_TYPE_LE_RANDOM,
+} addr_type_t;
+
struct btd_adapter;
struct link_key_info {
struct remote_dev_info {
bdaddr_t bdaddr;
+ addr_type_t type;
int8_t rssi;
uint32_t class;
char *name;
char *alias;
dbus_bool_t legacy;
name_status_t name_status;
- gboolean le;
char **uuids;
size_t uuid_count;
GSList *services;
struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
struct remote_dev_info *match);
void adapter_update_found_devices(struct btd_adapter *adapter,
- bdaddr_t *bdaddr, uint32_t class,
- int8_t rssi, uint8_t confirm_name,
+ bdaddr_t *bdaddr, addr_type_t type,
+ uint32_t class, int8_t rssi,
+ uint8_t confirm_name,
uint8_t *data, uint8_t data_len);
int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr);
void adapter_emit_device_found(struct btd_adapter *adapter,
diff --git a/src/device.c b/src/device.c
index bb97089..e49e9bc 100644
--- a/src/device.c
+++ b/src/device.c
struct btd_device {
bdaddr_t bdaddr;
- device_type_t type;
+ addr_type_t type;
gchar *path;
char name[MAX_NAME_LENGTH + 1];
char *alias;
g_free(device);
}
+gboolean device_is_bredr(struct btd_device *device)
+{
+ return (device->type == ADDR_TYPE_BREDR);
+}
+
+gboolean device_is_le(struct btd_device *device)
+{
+ return (device->type != ADDR_TYPE_BREDR);
+}
+
gboolean device_is_paired(struct btd_device *device)
{
return device->paired;
struct btd_device *device_create(DBusConnection *conn,
struct btd_adapter *adapter,
- const gchar *address, device_type_t type)
+ const gchar *address, addr_type_t type)
{
gchar *address_up;
struct btd_device *device;
strncpy(name, device->name, len);
}
-device_type_t device_get_type(struct btd_device *device)
-{
- return device->type;
-}
-
uint16_t btd_device_get_vendor(struct btd_device *device)
{
return device->vendor;
bdaddr_t sba, dba;
adapter_get_address(device->adapter, &sba);
- device_get_address(device, &dba);
+ device_get_address(device, &dba, NULL);
store_profiles(device);
}
char *str = primary_list_to_string(device->primaries);
adapter_get_address(adapter, &sba);
- device_get_address(device, &dba);
+ device_get_address(device, &dba, NULL);
write_device_services(&sba, &dba, str);
DBG("Connection attempt to: %s", addr);
- if (device->type != DEVICE_TYPE_LE) {
+ if (device_is_bredr(device)) {
io = bt_io_connect(BT_IO_L2CAP, att_connect_cb,
device, NULL, &gerr,
BT_IO_OPT_SOURCE_BDADDR, &sba,
return device->adapter;
}
-void device_get_address(struct btd_device *device, bdaddr_t *bdaddr)
+void device_get_address(struct btd_device *device, bdaddr_t *bdaddr,
+ addr_type_t *type)
{
bacpy(bdaddr, &device->bdaddr);
+ if (type != NULL)
+ *type = device->type;
}
const gchar *device_get_path(struct btd_device *device)
att_connect_dispatched);
}
-void device_set_type(struct btd_device *device, device_type_t type)
-{
- if (!device)
- return;
-
- device->type = type;
-}
-
static gboolean start_discovery(gpointer user_data)
{
struct btd_device *device = user_data;
diff --git a/src/device.h b/src/device.h
index 1ea5ce4..13005ae 100644
--- a/src/device.h
+++ b/src/device.h
AUTH_TYPE_NOTIFY,
} auth_type_t;
-typedef enum {
- DEVICE_TYPE_UNKNOWN,
- DEVICE_TYPE_BREDR,
- DEVICE_TYPE_LE,
- DEVICE_TYPE_DUALMODE
-} device_type_t;
-
struct btd_device *device_create(DBusConnection *conn,
- struct btd_adapter *adapter,
- const gchar *address, device_type_t type);
+ struct btd_adapter *adapter,
+ const char *address, addr_type_t type);
void device_set_name(struct btd_device *device, const char *name);
void device_get_name(struct btd_device *device, char *name, size_t len);
-device_type_t device_get_type(struct btd_device *device);
uint16_t btd_device_get_vendor(struct btd_device *device);
uint16_t btd_device_get_product(struct btd_device *device);
uint16_t btd_device_get_version(struct btd_device *device);
GSList *profiles);
void btd_device_add_uuid(struct btd_device *device, const char *uuid);
struct btd_adapter *device_get_adapter(struct btd_device *device);
-void device_get_address(struct btd_device *device, bdaddr_t *bdaddr);
+void device_get_address(struct btd_device *device, bdaddr_t *bdaddr,
+ addr_type_t *type);
const gchar *device_get_path(struct btd_device *device);
struct agent *device_get_agent(struct btd_device *device);
+gboolean device_is_bredr(struct btd_device *device);
+gboolean device_is_le(struct btd_device *device);
gboolean device_is_busy(struct btd_device *device);
gboolean device_is_temporary(struct btd_device *device);
gboolean device_is_paired(struct btd_device *device);
gboolean device_is_trusted(struct btd_device *device);
void device_set_paired(struct btd_device *device, gboolean paired);
void device_set_temporary(struct btd_device *device, gboolean temporary);
-void device_set_type(struct btd_device *device, device_type_t type);
void device_set_bonded(struct btd_device *device, gboolean bonded);
void device_set_auto_connect(struct btd_device *device, gboolean enable);
gboolean device_is_connected(struct btd_device *device);
diff --git a/src/event.c b/src/event.c
index 4540560..cc0e85f 100644
--- a/src/event.c
+++ b/src/event.c
bdaddr_t dba;
int err;
- device_get_address(device, &dba);
+ device_get_address(device, &dba, NULL);
if (derr) {
err = btd_adapter_pincode_reply(adapter, &dba, NULL, 0);
{
bdaddr_t bdaddr;
- device_get_address(device, &bdaddr);
+ device_get_address(device, &bdaddr, NULL);
return btd_adapter_confirm_reply(adapter, &bdaddr, success);
}
struct btd_adapter *adapter = device_get_adapter(device);
bdaddr_t bdaddr;
- device_get_address(device, &bdaddr);
+ device_get_address(device, &bdaddr, NULL);
if (err)
passkey = INVALID_PASSKEY;
write_lastused_info(sba, dba, tm);
}
-void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
- int8_t rssi, uint8_t confirm_name,
- uint8_t *data, uint8_t data_len)
+void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, addr_type_t type,
+ uint32_t class, int8_t rssi,
+ uint8_t confirm_name, uint8_t *data,
+ uint8_t data_len)
{
struct btd_adapter *adapter;
if (data)
write_remote_eir(local, peer, data);
- adapter_update_found_devices(adapter, peer, class, rssi,
+ adapter_update_found_devices(adapter, peer, type, class, rssi,
confirm_name, data, data_len);
}
diff --git a/src/event.h b/src/event.h
index cce292e..f91b42f 100644
--- a/src/event.h
+++ b/src/event.h
*/
int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba, gboolean secure);
-void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
- int8_t rssi, uint8_t confirm_name,
- uint8_t *data, uint8_t data_len);
+void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, addr_type_t type,
+ uint32_t cls, int8_t rssi, uint8_t confirm_name,
+ uint8_t *data, uint8_t data_len);
void btd_event_set_legacy_pairing(bdaddr_t *local, bdaddr_t *peer, gboolean legacy);
void btd_event_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class);
void btd_event_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char *name);