Skip to content

Commit

Permalink
Bluetooth: Convert inquiry cache to use standard list types
Browse files Browse the repository at this point in the history
This makes it possible to use the convenience functions provided for
standard kernel list types and it also makes it easier to extend the use
of the cache for the management interface where e.g. name resolving
control will be needed.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Johan Hedberg committed Feb 13, 2012
1 parent 1232528 commit b57c1a5
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 21 deletions.
10 changes: 4 additions & 6 deletions include/net/bluetooth/hci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ struct inquiry_data {
};

struct inquiry_entry {
struct inquiry_entry *next;
struct list_head list;
__u32 timestamp;
struct inquiry_data data;
};

struct inquiry_cache {
struct list_head list;
__u32 timestamp;
struct inquiry_entry *list;
};

struct hci_conn_hash {
Expand Down Expand Up @@ -350,14 +350,12 @@ extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);

static inline void inquiry_cache_init(struct hci_dev *hdev)
{
struct inquiry_cache *c = &hdev->inq_cache;
c->list = NULL;
INIT_LIST_HEAD(&hdev->inq_cache.list);
}

static inline int inquiry_cache_empty(struct hci_dev *hdev)
{
struct inquiry_cache *c = &hdev->inq_cache;
return c->list == NULL;
return list_empty(&hdev->inq_cache.list);
}

static inline long inquiry_cache_age(struct hci_dev *hdev)
Expand Down
31 changes: 17 additions & 14 deletions net/bluetooth/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,15 +357,11 @@ struct hci_dev *hci_dev_get(int index)
/* ---- Inquiry support ---- */
static void inquiry_cache_flush(struct hci_dev *hdev)
{
struct inquiry_cache *cache = &hdev->inq_cache;
struct inquiry_entry *next = cache->list, *e;

BT_DBG("cache %p", cache);
struct inquiry_entry *p, *n;

cache->list = NULL;
while ((e = next)) {
next = e->next;
kfree(e);
list_for_each_entry_safe(p, n, &hdev->inq_cache.list, list) {
list_del(&p->list);
kfree(p);
}
}

Expand All @@ -376,10 +372,12 @@ struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *b

BT_DBG("cache %p, %s", cache, batostr(bdaddr));

for (e = cache->list; e; e = e->next)
list_for_each_entry(e, &cache->list, list) {
if (!bacmp(&e->data.bdaddr, bdaddr))
break;
return e;
return e;
}

return NULL;
}

void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data)
Expand All @@ -396,8 +394,7 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data)
if (!ie)
return;

ie->next = cache->list;
cache->list = ie;
list_add(&ie->list, &cache->list);
}

memcpy(&ie->data, data, sizeof(*data));
Expand All @@ -412,15 +409,21 @@ static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
struct inquiry_entry *e;
int copied = 0;

for (e = cache->list; e && copied < num; e = e->next, copied++) {
list_for_each_entry(e, &cache->list, list) {
struct inquiry_data *data = &e->data;

if (copied >= num)
break;

bacpy(&info->bdaddr, &data->bdaddr);
info->pscan_rep_mode = data->pscan_rep_mode;
info->pscan_period_mode = data->pscan_period_mode;
info->pscan_mode = data->pscan_mode;
memcpy(info->dev_class, data->dev_class, 3);
info->clock_offset = data->clock_offset;

info++;
copied++;
}

BT_DBG("cache %p, copied %d", cache, copied);
Expand Down
2 changes: 1 addition & 1 deletion net/bluetooth/hci_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ static int inquiry_cache_show(struct seq_file *f, void *p)

hci_dev_lock(hdev);

for (e = cache->list; e; e = e->next) {
list_for_each_entry(e, &cache->list, list) {
struct inquiry_data *data = &e->data;
seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
batostr(&data->bdaddr),
Expand Down

0 comments on commit b57c1a5

Please sign in to comment.