summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2006-10-12 07:50:13 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2006-10-12 07:50:13 +0000
commit3ec96c0b0cd8d78ebede255583a918145a0eeaa0 (patch)
tree255d2642b27cae59ad7a1819fded54311a5ed3ed /hcid
parent48d9984c99f55dc249050f56aa1c01ad56dac82d (diff)
Sort discovered devices list based on their RSSI
Diffstat (limited to 'hcid')
-rw-r--r--hcid/dbus-adapter.c2
-rw-r--r--hcid/dbus.c26
-rw-r--r--hcid/dbus.h3
3 files changed, 24 insertions, 7 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index c19d5607..baf5edf4 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -1417,7 +1417,7 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB
/* put the request name in the queue to resolve name */
str2ba(peer_addr, &peer_bdaddr);
- disc_device_append(&adapter->disc_devices, &peer_bdaddr, NAME_REQUIRED);
+ disc_device_add(&adapter->disc_devices, &peer_bdaddr, 0, NAME_REQUIRED);
/*
* if there is a discover process running, just queue the request.
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 89de4054..ba47af48 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -104,8 +104,7 @@ int disc_device_find(const struct discovered_dev_info *d1, const struct discover
return ret;
}
- /* if not any */
- if (d2->name_status) {
+ if (d2->name_status != NAME_ANY) {
ret = (d1->name_status - d2->name_status);
if (ret)
return ret;
@@ -114,7 +113,18 @@ int disc_device_find(const struct discovered_dev_info *d1, const struct discover
return 0;
}
-int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status)
+int dev_rssi_cmp(struct discovered_dev_info *d1, struct discovered_dev_info *d2)
+{
+ int rssi1, rssi2;
+
+ rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
+ rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
+
+ return rssi1 - rssi2;
+}
+
+int disc_device_add(struct slist **list, bdaddr_t *bdaddr, int8_t rssi,
+ name_status_t name_status)
{
struct discovered_dev_info *dev, match;
struct slist *l;
@@ -129,12 +139,17 @@ int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name
/* device found, update the attributes */
dev = l->data;
+ dev->rssi = rssi;
+
/* Get remote name can be received while inquiring.
* Keep in mind that multiple inquiry result events can
* be received from the same remote device.
*/
if (name_status != NAME_NOT_REQUIRED)
dev->name_status = name_status;
+
+ *list = slist_sort(*list, (cmp_func_t) dev_rssi_cmp);
+
return -EALREADY;
}
@@ -144,9 +159,10 @@ int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name
memset(dev, 0, sizeof(*dev));
bacpy(&dev->bdaddr, bdaddr);
+ dev->rssi = rssi;
dev->name_status = name_status;
- *list = slist_append(*list, dev);
+ *list = slist_insert_sorted(*list, dev, (cmp_func_t) dev_rssi_cmp);
return 0;
}
@@ -1381,7 +1397,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
}
/* add in the list to track name sent/pending */
- disc_device_append(&adapter->disc_devices, peer, name_status);
+ disc_device_add(&adapter->disc_devices, peer, rssi, name_status);
done:
bt_free(local_addr);
diff --git a/hcid/dbus.h b/hcid/dbus.h
index 2d6dda62..954e7ab5 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -81,6 +81,7 @@ typedef enum {
struct discovered_dev_info {
bdaddr_t bdaddr;
+ int8_t rssi;
name_status_t name_status;
};
@@ -253,7 +254,7 @@ int active_conn_find_by_bdaddr(const void *data, const void *user_data);
void bonding_request_free(struct bonding_request_info *dev);
int pin_req_cmp(const void *p1, const void *p2);
int disc_device_find(const struct discovered_dev_info *d1, const struct discovered_dev_info *d2);
-int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status);
+int disc_device_add(struct slist **list, bdaddr_t *bdaddr, int8_t rssi, name_status_t name_status);
int disc_device_req_name(struct adapter *dbus_data);
int discoverable_timeout_handler(void *data);