Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4df378a1 authored by Johan Hedberg's avatar Johan Hedberg Committed by Gustavo Padovan
Browse files

Bluetooth: Add store_hint parameter to mgmt_new_key



Even for keys that shouldn't be stored some use cases require the
knowledge of a new key having been created so that the conclusion of a
successful pairing can be made. Therefore, always send the mgmt_new_key
event but add a store_hint parameter to it to indicate to user space
whether the key should be stored or not.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@nokia.com>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 4748fed2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -775,7 +775,7 @@ int mgmt_index_removed(u16 index);
int mgmt_powered(u16 index, u8 powered);
int mgmt_discoverable(u16 index, u8 discoverable);
int mgmt_connectable(u16 index, u8 connectable);
int mgmt_new_key(u16 index, struct link_key *key);
int mgmt_new_key(u16 index, struct link_key *key, u8 persistent);
int mgmt_connected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnect_failed(u16 index);
+1 −0
Original line number Diff line number Diff line
@@ -230,6 +230,7 @@ struct mgmt_ev_controller_error {

#define MGMT_EV_NEW_KEY			0x000A
struct mgmt_ev_new_key {
	__u8 store_hint;
	struct mgmt_key_info key;
} __packed;

+12 −9
Original line number Diff line number Diff line
@@ -1062,7 +1062,7 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
				bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len)
{
	struct link_key *key, *old_key;
	u8 old_key_type;
	u8 old_key_type, persistent;

	old_key = hci_find_link_key(hdev, bdaddr);
	if (old_key) {
@@ -1089,12 +1089,6 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
			conn->key_type = type;
	}

	if (new_key && !hci_persistent_key(hdev, conn, type, old_key_type)) {
		list_del(&key->list);
		kfree(key);
		return 0;
	}

	bacpy(&key->bdaddr, bdaddr);
	memcpy(key->val, val, 16);
	key->pin_len = pin_len;
@@ -1104,8 +1098,17 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
	else
		key->type = type;

	if (new_key)
		mgmt_new_key(hdev->id, key);
	if (!new_key)
		return 0;

	persistent = hci_persistent_key(hdev, conn, type, old_key_type);

	mgmt_new_key(hdev->id, key, persistent);

	if (!persistent) {
		list_del(&key->list);
		kfree(key);
	}

	return 0;
}
+2 −1
Original line number Diff line number Diff line
@@ -1858,12 +1858,13 @@ int mgmt_connectable(u16 index, u8 connectable)
	return ret;
}

int mgmt_new_key(u16 index, struct link_key *key)
int mgmt_new_key(u16 index, struct link_key *key, u8 persistent)
{
	struct mgmt_ev_new_key ev;

	memset(&ev, 0, sizeof(ev));

	ev.store_hint = persistent;
	bacpy(&ev.key.bdaddr, &key->bdaddr);
	ev.key.type = key->type;
	memcpy(ev.key.val, key->val, 16);