diff --git a/android/bluetooth.c b/android/bluetooth.c
index 2bc79e2..4eb5e2f 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
HAL_EV_BOND_STATE_CHANGED, sizeof(ev), &ev);
}
-static void set_device_bond_state(const bdaddr_t *addr, uint8_t status,
+static void set_device_bond_state(struct device *dev, uint8_t status,
int state)
{
- struct device *dev;
-
- dev = find_device(addr);
- if (!dev)
- return;
-
if (dev->bond_state == state)
return;
{
const struct mgmt_ev_new_link_key *ev = param;
const struct mgmt_addr_info *addr = &ev->key.addr;
+ struct device *dev;
char dst[18];
if (length < sizeof(*ev)) {
return;
}
- set_device_bond_state(&addr->bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDED);
+ dev = find_device(&ev->key.addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDED);
if (ev->store_hint) {
const struct mgmt_link_key_info *key = &ev->key;
*/
get_device_name(dev);
- set_device_bond_state(&ev->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDING);
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDING);
DBG("%s type %u secure %u", dst, ev->addr.type, ev->secure);
const void *param, void *user_data)
{
const struct mgmt_ev_user_confirm_request *ev = param;
+ struct device *dev;
char dst[18];
if (length < sizeof(*ev)) {
ba2str(&ev->addr.bdaddr, dst);
DBG("%s confirm_hint %u", dst, ev->confirm_hint);
- set_device_bond_state(&ev->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDING);
+ dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDING);
if (ev->confirm_hint)
send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_CONSENT, 0);
const void *param, void *user_data)
{
const struct mgmt_ev_user_passkey_request *ev = param;
+ struct device *dev;
char dst[18];
if (length < sizeof(*ev)) {
ba2str(&ev->addr.bdaddr, dst);
DBG("%s", dst);
- set_device_bond_state(&ev->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDING);
+ dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDING);
send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_ENTRY, 0);
}
void *user_data)
{
const struct mgmt_ev_passkey_notify *ev = param;
+ struct device *dev;
char dst[18];
if (length < sizeof(*ev)) {
if (ev->entered)
return;
- set_device_bond_state(&ev->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDING);
+ dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDING);
send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_NOTIF, ev->passkey);
}
DBG("");
dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
/*
* In case security mode 3 pairing we will get connect failed event
* bonding, if so update bond state
*/
- if (dev && dev->bond_state == HAL_BOND_STATE_BONDING)
- set_device_bond_state(&ev->addr.bdaddr,
- status_mgmt2hal(ev->status),
- HAL_BOND_STATE_NONE);
+ if (dev->bond_state != HAL_BOND_STATE_BONDING)
+ return;
+
+ set_device_bond_state(dev, status_mgmt2hal(ev->status),
+ HAL_BOND_STATE_NONE);
}
static void mgmt_auth_failed_event(uint16_t index, uint16_t length,
DBG("");
dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
+
+ if (dev->bond_state != HAL_BOND_STATE_BONDING)
+ return;
- if (dev && dev->bond_state == HAL_BOND_STATE_BONDING)
- set_device_bond_state(&ev->addr.bdaddr,
- status_mgmt2hal(ev->status),
- HAL_BOND_STATE_NONE);
+ set_device_bond_state(dev, status_mgmt2hal(ev->status),
+ HAL_BOND_STATE_NONE);
}
static void mgmt_device_unpaired_event(uint16_t index, uint16_t length,
const void *param, void *user_data)
{
const struct mgmt_ev_device_unpaired *ev = param;
+ struct device *dev;
if (length < sizeof(*ev)) {
error("Too small device unpaired event (%u bytes)", length);
/* TODO should device be disconnected ? */
- set_device_bond_state(&ev->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_NONE);
+ dev = find_device(&ev->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_NONE);
}
static void store_ltk(const bdaddr_t *dst, uint8_t bdaddr_type, bool master,
const void *param, void *user_data)
{
const struct mgmt_ev_new_long_term_key *ev = param;
- const struct mgmt_addr_info *addr = &ev->key.addr;
+ struct device *dev;
char dst[18];
if (length < sizeof(*ev)) {
return;
}
- ba2str(&addr->bdaddr, dst);
+ ba2str(&ev->key.addr.bdaddr, dst);
DBG("new LTK for %s type %u enc_size %u store_hint %u",
dst, ev->key.type, ev->key.enc_size, ev->store_hint);
- set_device_bond_state(&addr->bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDED);
+ dev = find_device(&ev->key.addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_BONDED);
if (ev->store_hint) {
const struct mgmt_ltk_info *key = &ev->key;
const void *param, void *user_data)
{
const struct mgmt_rp_pair_device *rp = param;
+ struct device *dev;
DBG("status %u", status);
if (status == MGMT_STATUS_SUCCESS)
return;
- set_device_bond_state(&rp->addr.bdaddr, status_mgmt2hal(status),
+ dev = find_device(&rp->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, status_mgmt2hal(status),
HAL_BOND_STATE_NONE);
}
status = HAL_STATUS_SUCCESS;
- set_device_bond_state(&cp.addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_BONDING);
+ if (dev)
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS,
+ HAL_BOND_STATE_BONDING);
fail:
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_BLUETOOTH, HAL_OP_CREATE_BOND,
const void *param, void *user_data)
{
const struct mgmt_rp_unpair_device *rp = param;
+ struct device *dev;
DBG("status %u", status);
if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_NOT_PAIRED)
return;
- set_device_bond_state(&rp->addr.bdaddr, HAL_STATUS_SUCCESS,
- HAL_BOND_STATE_NONE);
+ dev = find_device(&rp->addr.bdaddr);
+ if (!dev)
+ return;
+
+ set_device_bond_state(dev, HAL_STATUS_SUCCESS, HAL_BOND_STATE_NONE);
}
static void handle_remove_bond_cmd(const void *buf, uint16_t len)