diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-19 01:24:47 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-19 01:24:47 +0000 |
commit | f841e8de8c71a0f726f77a65b4145b76e924df14 (patch) | |
tree | 1c01979716966d1e0cf0066df8fa4caae7086bd0 /hcid/security.c | |
parent | 9f1c935d4e9a36ad0af6afb0b0e9893397698efa (diff) |
Improve situation where bonding requestor exits
Diffstat (limited to 'hcid/security.c')
-rw-r--r-- | hcid/security.c | 82 |
1 files changed, 49 insertions, 33 deletions
diff --git a/hcid/security.c b/hcid/security.c index 32172e63..9b02f213 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -94,9 +94,57 @@ struct hci_req_data *hci_req_data_new(int dev_id, const bdaddr_t *dba, uint16_t return data; } +static int hci_req_find_by_devid(const void *data, const void *user_data) +{ + const struct hci_req_data *req = data; + const int *dev_id = user_data; + + return (*dev_id - req->dev_id); +} + +static void hci_req_queue_process(int dev_id) +{ + int dd, ret_val; + + /* send the next pending cmd */ + dd = hci_open_dev(dev_id); + do { + struct hci_req_data *data; + struct slist *l = slist_find(hci_req_queue, &dev_id, hci_req_find_by_devid); + + if (!l) + break; + + data = l->data; + data->status = REQ_SENT; + + ret_val = hci_send_cmd(dd, data->ogf, data->ocf, data->clen, data->cparam); + if (ret_val < 0) { + hci_req_queue = slist_remove(hci_req_queue, data); + free(data->cparam); + free(data); + } + + } while(ret_val < 0); + + hci_close_dev(dd); +} + void hci_req_queue_append(struct hci_req_data *data) { + struct slist *l; + struct hci_req_data *match; + + hci_req_queue = slist_append(hci_req_queue, data); + + l = slist_find(hci_req_queue, &data->dev_id, hci_req_find_by_devid); + match = l->data; + + if (match->status == REQ_SENT) + return; + + hci_req_queue_process(data->dev_id); } void hci_req_queue_remove(int dev_id, bdaddr_t *dba) @@ -116,19 +164,10 @@ void hci_req_queue_remove(int dev_id, bdaddr_t *dba) } } -static int hci_req_find_by_devid(const void *data, const void *user_data) -{ - const struct hci_req_data *req = data; - const int *dev_id = user_data; - - return (*dev_id - req->dev_id); -} - static void check_pending_hci_req(int dev_id, int event) { struct hci_req_data *data; struct slist *l; - int dd, ret_val; if (!hci_req_queue) return; @@ -152,30 +191,7 @@ static void check_pending_hci_req(int dev_id, int event) free(data); } - /* send the next pending cmd */ - dd = hci_open_dev(dev_id); - do { - l = slist_find(hci_req_queue, &dev_id, hci_req_find_by_devid); - - if (!l) - goto failed; - - data = l->data; - data->status = REQ_SENT; - - ret_val = hci_send_cmd(dd, data->ogf, data->ocf, data->clen, data->cparam); - if (ret_val < 0) { - hci_req_queue = slist_remove(hci_req_queue, data); - free(data->cparam); - free(data); - } - - } while(ret_val < 0); - -failed: - hci_close_dev(dd); - - return; + hci_req_queue_process(dev_id); } static inline int get_bdaddr(int dev, bdaddr_t *sba, uint16_t handle, bdaddr_t *dba) |