Diff between 4e7069094f65679188a3b490e68949102ac00b31 and 769b62e8354bc0fff6fd0fe754c94f8655d51b22

Changed Files

File Additions Deletions Status
src/shared/gap.c +42 -0 modified
src/shared/gap.h +7 -0 modified

Full Patch

diff --git a/src/shared/gap.c b/src/shared/gap.c
index 4a19981..55259af 100644
--- a/src/shared/gap.c
+++ b/src/shared/gap.c
@@ -32,6 +32,7 @@
 #include "lib/mgmt.h"
 
 #include "src/shared/util.h"
+#include "src/shared/queue.h"
 #include "src/shared/mgmt.h"
 #include "src/shared/gap.h"
 
@@ -51,8 +52,23 @@ struct bt_gap {
 	bt_gap_ready_func_t ready_handler;
 	bt_gap_destroy_func_t ready_destroy;
 	void *ready_data;
+
+	struct queue *irk_list;
+};
+
+struct irk_entry {
+	uint8_t addr_type;
+	uint8_t addr[6];
+	uint8_t key[16];
 };
 
+static void irk_entry_free(void *data)
+{
+	struct irk_entry *irk = data;
+
+	free(irk);
+}
+
 static void ready_status(struct bt_gap *gap, bool status)
 {
 	gap->mgmt_ready = status;
@@ -155,6 +171,8 @@ struct bt_gap *bt_gap_new_index(uint16_t index)
 		return NULL;
 	}
 
+	gap->irk_list = queue_new();
+
 	gap->mgmt_ready = false;
 
 	if (!mgmt_send(gap->mgmt, MGMT_OP_READ_VERSION,
@@ -193,6 +211,8 @@ void bt_gap_unref(struct bt_gap *gap)
 	if (gap->ready_destroy)
 		gap->ready_destroy(gap->ready_data);
 
+	queue_destroy(gap->irk_list, irk_entry_free);
+
 	mgmt_unref(gap->mgmt);
 
 	free(gap);
@@ -214,3 +234,25 @@ bool bt_gap_set_ready_handler(struct bt_gap *gap,
 
 	return true;
 }
+
+bool bt_gap_add_peer_irk(struct bt_gap *gap, uint8_t addr_type,
+					uint8_t addr[6], uint8_t key[16])
+{
+	struct irk_entry *irk;
+
+	if (!gap)
+		return false;
+
+	if (addr_type > BT_GAP_ADDR_TYPE_LE_RANDOM)
+		return false;
+
+	irk = new0(struct irk_entry, 1);
+	if (!irk)
+		return false;
+
+	irk->addr_type = addr_type;
+	memcpy(irk->addr, addr, 6);
+	memcpy(irk->key, key, 16);
+
+	return true;
+}
diff --git a/src/shared/gap.h b/src/shared/gap.h
index 9a6700b..2bddf2a 100644
--- a/src/shared/gap.h
+++ b/src/shared/gap.h
@@ -24,6 +24,10 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#define BT_GAP_ADDR_TYPE_BREDR		0x00
+#define BT_GAP_ADDR_TYPE_LE_PUBLIC	0x01
+#define BT_GAP_ADDR_TYPE_LE_RANDOM	0x02
+
 struct bt_gap;
 
 struct bt_gap *bt_gap_new_default(void);
@@ -38,3 +42,6 @@ typedef void (*bt_gap_ready_func_t)(bool success, void *user_data);
 bool bt_gap_set_ready_handler(struct bt_gap *gap,
 				bt_gap_ready_func_t handler, void *user_data,
 				bt_gap_destroy_func_t destroy);
+
+bool bt_gap_add_peer_irk(struct bt_gap *gap, uint8_t addr_type,
+					uint8_t addr[6], uint8_t key[16]);