Diff between 018c23adcf0c951a44016453a7be96c6f09c79a4 and 41abf5cb4823a46ee4824ff2a11a55f42c83e253

Changed Files

File Additions Deletions Status
src/adapter.c +62 -1 modified
src/mgmt.c +0 -51 modified
src/mgmt.h +0 -2 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index ae864b8..d3e5dd4 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1991,6 +1991,67 @@ static int load_link_keys(struct btd_adapter *adapter, GSList *keys,
 	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];
@@ -2077,7 +2138,7 @@ free:
 
 	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
@@ -1026,54 +1026,3 @@ int mgmt_cancel_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type)
 
 	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
@@ -25,8 +25,6 @@
 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);