diff --git a/src/adapter.c b/src/adapter.c
index ae864b8..d3e5dd4 100644
--- a/src/adapter.c
+++ b/src/adapter.c
return 0;
}
+static void load_ltks_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ struct btd_adapter *adapter = user_data;
+
+ if (status != MGMT_STATUS_SUCCESS) {
+ error("Failed to load LTKs for hci%u: %s (0x%02x)",
+ adapter->dev_id, mgmt_errstr(status), status);
+ return;
+ }
+
+ DBG("LTKs loaded for hci%u", adapter->dev_id);
+}
+
+static int load_ltks(struct btd_adapter *adapter, GSList *keys)
+{
+ struct mgmt_cp_load_long_term_keys *cp;
+ struct mgmt_ltk_info *key;
+ size_t key_count, cp_size;
+ unsigned int id;
+ GSList *l;
+
+ key_count = g_slist_length(keys);
+
+ DBG("hci%u keys %zu", adapter->dev_id, key_count);
+
+ cp_size = sizeof(*cp) + (key_count * sizeof(*key));
+
+ cp = g_try_malloc0(cp_size);
+ if (cp == NULL)
+ return -ENOMEM;
+
+ cp->key_count = htobs(key_count);
+
+ for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
+ struct smp_ltk_info *info = l->data;
+
+ bacpy(&key->addr.bdaddr, &info->bdaddr);
+ key->addr.type = info->bdaddr_type;
+ memcpy(key->val, info->val, sizeof(info->val));
+ memcpy(key->rand, info->rand, sizeof(info->rand));
+ memcpy(&key->ediv, &info->ediv, sizeof(key->ediv));
+ key->authenticated = info->authenticated;
+ key->master = info->master;
+ key->enc_size = info->enc_size;
+ }
+
+ id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LONG_TERM_KEYS,
+ adapter->dev_id, cp_size, cp,
+ load_ltks_complete, adapter, NULL);
+
+ g_free(cp);
+
+ if (id == 0) {
+ error("Failed to load LTKs for hci%u", adapter->dev_id);
+ return -EIO;
+ }
+
+ return 0;
+}
+
static void load_devices(struct btd_adapter *adapter)
{
char filename[PATH_MAX + 1];
g_slist_free_full(keys.keys, g_free);
- err = mgmt_load_ltks(adapter->dev_id, ltks.keys);
+ err = load_ltks(adapter, ltks.keys);
if (err < 0)
error("Unable to load ltks: %s (%d)", strerror(-err), -err);
diff --git a/src/mgmt.c b/src/mgmt.c
index bed2795..b0e0915 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
return 0;
}
-
-int mgmt_load_ltks(int index, GSList *keys)
-{
- char *buf;
- struct mgmt_hdr *hdr;
- struct mgmt_cp_load_long_term_keys *cp;
- struct mgmt_ltk_info *key;
- size_t key_count, cp_size;
- GSList *l;
- int err;
-
- key_count = g_slist_length(keys);
-
- DBG("index %d keys %zu", index, key_count);
-
- cp_size = sizeof(*cp) + (key_count * sizeof(*key));
-
- buf = g_try_malloc0(sizeof(*hdr) + cp_size);
- if (buf == NULL)
- return -ENOMEM;
-
- hdr = (void *) buf;
- hdr->opcode = htobs(MGMT_OP_LOAD_LONG_TERM_KEYS);
- hdr->len = htobs(cp_size);
- hdr->index = htobs(index);
-
- cp = (void *) (buf + sizeof(*hdr));
- cp->key_count = htobs(key_count);
-
- for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
- struct smp_ltk_info *info = l->data;
-
- bacpy(&key->addr.bdaddr, &info->bdaddr);
- key->addr.type = info->bdaddr_type;
- memcpy(key->val, info->val, sizeof(info->val));
- memcpy(key->rand, info->rand, sizeof(info->rand));
- memcpy(&key->ediv, &info->ediv, sizeof(key->ediv));
- key->authenticated = info->authenticated;
- key->master = info->master;
- key->enc_size = info->enc_size;
- }
-
- if (write(mgmt_sock, buf, sizeof(*hdr) + cp_size) < 0)
- err = -errno;
- else
- err = 0;
-
- g_free(buf);
-
- return err;
-}
diff --git a/src/mgmt.h b/src/mgmt.h
index 71c42b1..91ea085 100644
--- a/src/mgmt.h
+++ b/src/mgmt.h
int mgmt_setup(void);
void mgmt_cleanup(void);
-int mgmt_load_ltks(int index, GSList *keys);
-
int mgmt_create_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type,
uint8_t io_cap);
int mgmt_cancel_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type);