From 769b62e8354bc0fff6fd0fe754c94f8655d51b22 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sun, 14 Dec 2014 19:06:37 +0100 Subject: [PATCH] shared: Add function for adding peer IRK entries to GAP stack --- src/shared/gap.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/shared/gap.h | 7 +++++++ 2 files changed, 49 insertions(+) diff --git a/src/shared/gap.c b/src/shared/gap.c index 4a19981ac..55259afa1 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 9a6700b30..2bddf2a6a 100644 --- a/src/shared/gap.h +++ b/src/shared/gap.h @@ -24,6 +24,10 @@ #include #include +#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]); -- 2.47.3