1634
1594
return dbus_message_new_method_return(msg);
1637
static device_type_t flags2type(uint8_t flags)
1639
/* Inferring the remote type based on the EIR Flags field */
1641
/* For LE only and dual mode the following flags must be zero */
1642
if (flags & (EIR_SIM_CONTROLLER | EIR_SIM_HOST))
1643
return DEVICE_TYPE_UNKNOWN;
1645
/* Limited or General discoverable mode bit must be enabled */
1646
if (!(flags & (EIR_LIM_DISC | EIR_GEN_DISC)))
1647
return DEVICE_TYPE_UNKNOWN;
1649
if (flags & EIR_BREDR_UNSUP)
1650
return DEVICE_TYPE_LE;
1652
return DEVICE_TYPE_DUALMODE;
1655
static gboolean event_is_connectable(uint8_t type)
1659
case ADV_TYPE_DIRECT_IND:
1666
1597
static struct btd_device *create_device_internal(DBusConnection *conn,
1667
1598
struct btd_adapter *adapter,
1668
const gchar *address,
1669
gboolean force, int *err)
1599
const gchar *address, int *err)
1671
1601
struct remote_dev_info *dev, match;
1672
1602
struct btd_device *device;
2780
2670
bacpy(bdaddr, &adapter->bdaddr);
2673
static inline void suspend_discovery(struct btd_adapter *adapter)
2675
if (adapter->state != STATE_SUSPENDED)
2678
if (adapter->oor_devices) {
2679
g_slist_free(adapter->oor_devices);
2680
adapter->oor_devices = NULL;
2683
if (adapter->scheduler_id) {
2684
g_source_remove(adapter->scheduler_id);
2685
adapter->scheduler_id = 0;
2688
adapter_ops->stop_discovery(adapter->dev_id);
2691
static inline void resolve_names(struct btd_adapter *adapter)
2695
if (adapter->state != STATE_RESOLVNAME)
2698
err = adapter_resolve_names(adapter);
2700
adapter_set_state(adapter, STATE_IDLE);
2783
2703
void adapter_set_state(struct btd_adapter *adapter, int state)
2785
2705
const char *path = adapter->path;
2786
2706
gboolean discov_active;
2789
2708
if (adapter->state == state)
2792
previous = adapter->state;
2793
2711
adapter->state = state;
2795
type = adapter_get_discover_type(adapter);
2800
discov_active = TRUE;
2802
/* Started a new session while resolving names ? */
2803
if (previous & STATE_RESOLVNAME)
2807
discov_active = TRUE;
2809
if (!adapter->disc_sessions)
2812
/* Stop scanning after TGAP(100)/2 */
2813
adapter->stop_discov_id = g_timeout_add(GAP_INTER_DISCOV_WIN,
2817
/* For dual mode: don't send "Discovering = TRUE" (twice) */
2818
if (bredr_capable(adapter) == TRUE)
2713
DBG("hci%d: new state %d", adapter->dev_id, adapter->state);
2715
switch (adapter->state) {
2822
2716
case STATE_IDLE:
2824
* Interleave: from inquiry to scanning. Interleave is not
2825
* applicable to requests triggered by external applications.
2827
if (adapter->disc_sessions && (type & DISC_INTERLEAVE) &&
2828
(previous & STATE_STDINQ)) {
2829
adapter_ops->start_scanning(adapter->dev_id);
2832
/* BR/EDR only: inquiry finished */
2833
discov_active = FALSE;
2836
discov_active = FALSE;
2840
if (discov_active == FALSE) {
2841
if (type & DISC_RESOLVNAME) {
2842
if (adapter_resolve_names(adapter) == 0) {
2843
adapter->state |= STATE_RESOLVNAME;
2848
2717
update_oor_devices(adapter);
2849
} else if (adapter->disc_sessions && main_opts.discov_interval)
2719
discov_active = FALSE;
2720
emit_property_changed(connection, path,
2721
ADAPTER_INTERFACE, "Discovering",
2722
DBUS_TYPE_BOOLEAN, &discov_active);
2724
if (adapter_has_discov_sessions(adapter)) {
2850
2725
adapter->scheduler_id = g_timeout_add_seconds(
2851
2726
main_opts.discov_interval,
2852
2727
discovery_cb, adapter);
2854
emit_property_changed(connection, path,
2855
ADAPTER_INTERFACE, "Discovering",
2856
DBUS_TYPE_BOOLEAN, &discov_active);
2731
discov_active = TRUE;
2732
emit_property_changed(connection, path,
2733
ADAPTER_INTERFACE, "Discovering",
2734
DBUS_TYPE_BOOLEAN, &discov_active);
2736
case STATE_RESOLVNAME:
2737
resolve_names(adapter);
2739
case STATE_SUSPENDED:
2740
suspend_discovery(adapter);
2859
2745
int adapter_get_state(struct btd_adapter *adapter)
3032
static struct remote_dev_info *get_found_dev(struct btd_adapter *adapter,
3033
const bdaddr_t *bdaddr,
2917
static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
2918
gboolean le, const char *name,
2919
const char *alias, uint32_t class,
2920
gboolean legacy, name_status_t status,
3036
struct remote_dev_info *dev, match;
3038
memset(&match, 0, sizeof(struct remote_dev_info));
3039
bacpy(&match.bdaddr, bdaddr);
3040
match.name_status = NAME_ANY;
3042
dev = adapter_search_found_devices(adapter, &match);
3045
/* Out of range list update */
3046
adapter->oor_devices = g_slist_remove(adapter->oor_devices,
3050
dev = g_new0(struct remote_dev_info, 1);
3051
bacpy(&dev->bdaddr, bdaddr);
3052
adapter->found_devices = g_slist_prepend(adapter->found_devices,
2923
struct remote_dev_info *dev;
2925
dev = g_new0(struct remote_dev_info, 1);
2926
bacpy(&dev->bdaddr, bdaddr);
2928
dev->name = g_strdup(name);
2929
dev->alias = g_strdup(alias);
2931
dev->legacy = legacy;
2932
dev->name_status = status;
3081
2961
dev->services = g_slist_prepend(dev->services, g_strdup(new_uuid));
3084
void adapter_update_device_from_info(struct btd_adapter *adapter,
3085
bdaddr_t bdaddr, int8_t rssi,
3086
uint8_t evt_type, const char *name,
3087
GSList *services, int flags)
3089
struct remote_dev_info *dev;
3092
dev = get_found_dev(adapter, &bdaddr, &new_dev);
3096
dev->evt_type = evt_type;
3097
} else if (dev->rssi == rssi)
3102
adapter->found_devices = g_slist_sort(adapter->found_devices,
3103
(GCompareFunc) dev_rssi_cmp);
3105
g_slist_foreach(services, remove_same_uuid, dev);
3106
g_slist_foreach(services, dev_prepend_uuid, dev);
3113
dev->name = g_strdup(name);
3116
/* FIXME: check if other information was changed before emitting the
3118
adapter_emit_device_found(adapter, dev);
2964
static gboolean pairing_is_legacy(bdaddr_t *local, bdaddr_t *peer,
2965
const uint8_t *eir, const char *name)
2967
unsigned char features[8];
2975
if (read_remote_features(local, peer, NULL, features) < 0)
2978
if (features[0] & 0x01)
2984
static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer, const char *file)
2986
char local_addr[18], peer_addr[18], filename[PATH_MAX + 1];
2988
ba2str(local, local_addr);
2989
ba2str(peer, peer_addr);
2991
create_name(filename, PATH_MAX, STORAGEDIR, local_addr, file);
2993
return textfile_get(filename, peer_addr);
3121
2996
void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3122
int8_t rssi, uint32_t class, const char *name,
3123
const char *alias, gboolean legacy,
3124
GSList *services, name_status_t name_status)
2997
uint32_t class, int8_t rssi,
3126
struct remote_dev_info *dev;
3129
dev = get_found_dev(adapter, bdaddr, &new_dev);
3133
dev->name = g_strdup(name);
3136
dev->alias = g_strdup(alias);
3140
dev->legacy = legacy;
3141
dev->name_status = name_status;
3142
} else if (dev->rssi == rssi)
3000
struct remote_dev_info *dev, match;
3001
struct eir_data eir_data;
3003
gboolean legacy, le;
3004
name_status_t name_status;
3007
memset(&eir_data, 0, sizeof(eir_data));
3008
err = eir_parse(&eir_data, data);
3010
error("Error parsing EIR data: %s (%d)", strerror(-err), -err);
3014
if (eir_data.name != NULL && eir_data.name_complete)
3015
write_device_name(&adapter->bdaddr, bdaddr, eir_data.name);
3017
/* Device already seen in the discovery session ? */
3018
memset(&match, 0, sizeof(struct remote_dev_info));
3019
bacpy(&match.bdaddr, bdaddr);
3020
match.name_status = NAME_ANY;
3022
dev = adapter_search_found_devices(adapter, &match);
3024
adapter->oor_devices = g_slist_remove(adapter->oor_devices,
3026
if (dev->rssi != rssi)
3029
eir_data_free(&eir_data);
3034
/* New device in the discovery session */
3036
name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
3038
if (eir_data.flags < 0) {
3041
legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
3044
if (!name && main_opts.name_resolv &&
3045
adapter_has_discov_sessions(adapter))
3046
name_status = NAME_REQUIRED;
3048
name_status = NAME_NOT_REQUIRED;
3052
name_status = NAME_NOT_REQUIRED;
3055
alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
3057
dev = found_device_new(bdaddr, le, name, alias, class, legacy,
3058
name_status, eir_data.flags);
3062
adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
3145
3065
dev->rssi = rssi;
3147
3067
adapter->found_devices = g_slist_sort(adapter->found_devices,
3148
3068
(GCompareFunc) dev_rssi_cmp);
3150
g_slist_foreach(services, remove_same_uuid, dev);
3151
g_slist_foreach(services, dev_prepend_uuid, dev);
3070
g_slist_foreach(eir_data.services, remove_same_uuid, dev);
3071
g_slist_foreach(eir_data.services, dev_prepend_uuid, dev);
3153
3073
adapter_emit_device_found(adapter, dev);
3075
eir_data_free(&eir_data);
3156
3078
int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)