Bluetooth: Add initial Kconfig split options
This allows to specify which roles are supported. Broadcaster and Observer roles are always supported. Image size reduction for samples apps: beacon 43148 -> 15196 central 46892 -> 46356 peripheral 47532 -> 45940 Change-Id: If260c13d63651b9b54df5bafc2c412b01dcb1eb0 Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
This commit is contained in:
parent
46ad2cf69a
commit
8ff443b1c9
12 changed files with 169 additions and 29 deletions
|
@ -39,10 +39,25 @@ menuconfig BLUETOOTH
|
|||
This option enables Bluetooth Low Energy support.
|
||||
|
||||
if BLUETOOTH
|
||||
config BLUETOOTH_CONN
|
||||
bool
|
||||
default n
|
||||
|
||||
config BLUETOOTH_PERIPHERAL
|
||||
bool "Peripheral Role support"
|
||||
default n
|
||||
select BLUETOOTH_CONN
|
||||
|
||||
config BLUETOOTH_CENTRAL
|
||||
bool "Central Role support"
|
||||
default n
|
||||
select BLUETOOTH_CONN
|
||||
|
||||
if BLUETOOTH_PERIPHERAL || BLUETOOTH_CENTRAL
|
||||
config BLUETOOTH_MAX_CONN
|
||||
int
|
||||
prompt "Maximum number of simultaneous connections"
|
||||
depends on BLUETOOTH
|
||||
depends on BLUETOOTH_CONN
|
||||
default 1
|
||||
range 1 16
|
||||
help
|
||||
|
@ -52,7 +67,7 @@ config BLUETOOTH_MAX_CONN
|
|||
config BLUETOOTH_MAX_PAIRED
|
||||
int
|
||||
prompt "Maximum number of paired devices"
|
||||
depends on BLUETOOTH
|
||||
depends on BLUETOOTH_CONN
|
||||
default 1
|
||||
range 1 32
|
||||
help
|
||||
|
@ -149,3 +164,4 @@ config BLUETOOTH_DEBUG_GATT
|
|||
This option enables debug support for the Bluetooth
|
||||
Generic Attribute Profile (GATT).
|
||||
endif
|
||||
endif
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
obj-y = att.o \
|
||||
buf.o \
|
||||
conn.o \
|
||||
gatt.o \
|
||||
hci_core.o \
|
||||
keys.o \
|
||||
obj-y = buf.o \
|
||||
hci_core.o
|
||||
|
||||
obj-$(CONFIG_BLUETOOTH_CONN) += conn.o \
|
||||
l2cap.o \
|
||||
keys.o \
|
||||
smp.o \
|
||||
att.o \
|
||||
gatt.o \
|
||||
uuid.o
|
||||
|
|
|
@ -568,6 +568,7 @@ int bt_conn_security(struct bt_conn *conn, bt_security_t sec)
|
|||
|
||||
conn->required_sec_level = sec;
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER) {
|
||||
struct bt_keys *keys;
|
||||
|
||||
|
@ -585,8 +586,13 @@ int bt_conn_security(struct bt_conn *conn, bt_security_t sec)
|
|||
|
||||
return bt_smp_send_pairing_req(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
return bt_smp_send_security_req(conn);
|
||||
#else
|
||||
return -EIO;
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
}
|
||||
|
||||
void bt_conn_set_auto_conn(struct bt_conn *conn, bool auto_conn)
|
||||
|
|
|
@ -209,6 +209,7 @@ int bt_hci_cmd_send_sync(uint16_t opcode, struct bt_buf *buf,
|
|||
return err;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static void hci_acl(struct bt_buf *buf)
|
||||
{
|
||||
struct bt_hci_acl_hdr *hdr = (void *)buf->data;
|
||||
|
@ -242,6 +243,7 @@ static void hci_acl(struct bt_buf *buf)
|
|||
bt_conn_recv(conn, buf, flags);
|
||||
bt_conn_put(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
#if defined(CONFIG_INIT_STACKS) && defined(CONFIG_PRINTK)
|
||||
#include <offsets.h>
|
||||
|
@ -318,6 +320,7 @@ static void analyze_stacks(struct bt_conn *conn, struct bt_conn **ref)
|
|||
|
||||
/* HCI event processing */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static void update_sec_level(struct bt_conn *conn)
|
||||
{
|
||||
struct bt_keys *keys;
|
||||
|
@ -367,6 +370,7 @@ static void hci_encrypt_change(struct bt_buf *buf)
|
|||
|
||||
bt_conn_put(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static void hci_reset_complete(struct bt_buf *buf)
|
||||
{
|
||||
|
@ -471,6 +475,7 @@ static void hci_cmd_status(struct bt_buf *buf)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static void hci_num_completed_packets(struct bt_buf *buf)
|
||||
{
|
||||
struct bt_hci_evt_num_completed_packets *evt = (void *)buf->data;
|
||||
|
@ -550,6 +555,7 @@ static void copy_id_addr(struct bt_conn *conn, const bt_addr_le_t *addr)
|
|||
bt_addr_le_copy(&conn->dst, addr);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static int bt_hci_start_scanning(uint8_t scan_type)
|
||||
{
|
||||
|
@ -642,6 +648,7 @@ static int bt_hci_stop_scanning(void)
|
|||
return err;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static int hci_le_create_conn(const bt_addr_le_t *addr)
|
||||
{
|
||||
struct bt_buf *buf;
|
||||
|
@ -663,6 +670,7 @@ static int hci_le_create_conn(const bt_addr_le_t *addr)
|
|||
|
||||
return bt_hci_cmd_send_sync(BT_HCI_OP_LE_CREATE_CONN, buf, NULL);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
/* Used to determine whether to start scan and which scan type should be used */
|
||||
int bt_le_scan_update(void)
|
||||
|
@ -680,6 +688,7 @@ int bt_le_scan_update(void)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
if (!scan_dev_found_cb) {
|
||||
struct bt_conn *conn;
|
||||
|
||||
|
@ -693,10 +702,12 @@ int bt_le_scan_update(void)
|
|||
|
||||
return bt_hci_start_scanning(BT_LE_SCAN_PASSIVE);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
return bt_hci_start_scanning(BT_LE_SCAN_ACTIVE);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static void hci_disconn_complete(struct bt_buf *buf)
|
||||
{
|
||||
struct bt_hci_evt_disconn_complete *evt = (void *)buf->data;
|
||||
|
@ -1019,6 +1030,7 @@ static void check_pending_conn(const bt_addr_le_t *addr, uint8_t evtype)
|
|||
done:
|
||||
bt_conn_put(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static void le_adv_report(struct bt_buf *buf)
|
||||
{
|
||||
|
@ -1031,13 +1043,15 @@ static void le_adv_report(struct bt_buf *buf)
|
|||
|
||||
while (num_reports--) {
|
||||
int8_t rssi = info->data[info->length];
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
const bt_addr_le_t *addr;
|
||||
struct bt_keys *keys;
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
BT_DBG("%s event %u, len %u, rssi %d dBm\n",
|
||||
bt_addr_le_str(&info->addr),
|
||||
info->evt_type, info->length, rssi);
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
keys = bt_keys_find_irk(&info->addr);
|
||||
if (keys) {
|
||||
addr = &keys->addr;
|
||||
|
@ -1054,7 +1068,12 @@ static void le_adv_report(struct bt_buf *buf)
|
|||
}
|
||||
|
||||
check_pending_conn(addr, info->evt_type);
|
||||
|
||||
#else
|
||||
if (scan_dev_found_cb) {
|
||||
scan_dev_found_cb(&info->addr, rssi, info->evt_type,
|
||||
info->data, info->length);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
/* Get next report iteration by moving pointer to right offset
|
||||
* in buf according to spec 4.2, Vol 2, Part E, 7.7.65.2.
|
||||
*/
|
||||
|
@ -1063,6 +1082,7 @@ static void le_adv_report(struct bt_buf *buf)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static void le_ltk_request(struct bt_buf *buf)
|
||||
{
|
||||
struct bt_hci_evt_le_ltk_request *evt = (void *)buf->data;
|
||||
|
@ -1119,6 +1139,7 @@ static void le_ltk_request(struct bt_buf *buf)
|
|||
done:
|
||||
bt_conn_put(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static void hci_le_meta_event(struct bt_buf *buf)
|
||||
{
|
||||
|
@ -1127,15 +1148,13 @@ static void hci_le_meta_event(struct bt_buf *buf)
|
|||
bt_buf_pull(buf, sizeof(*evt));
|
||||
|
||||
switch (evt->subevent) {
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
case BT_HCI_EVT_LE_CONN_COMPLETE:
|
||||
le_conn_complete(buf);
|
||||
break;
|
||||
case BT_HCI_EVT_LE_CONN_UPDATE_COMPLETE:
|
||||
le_conn_update_complete(buf);
|
||||
break;
|
||||
case BT_HCI_EVT_LE_ADVERTISING_REPORT:
|
||||
le_adv_report(buf);
|
||||
break;
|
||||
case BT_HCI_EVT_LE_LTK_REQUEST:
|
||||
le_ltk_request(buf);
|
||||
break;
|
||||
|
@ -1145,6 +1164,10 @@ static void hci_le_meta_event(struct bt_buf *buf)
|
|||
case BT_HCI_EVT_LE_CONN_PARAM_REQ:
|
||||
le_conn_param_req(buf);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
case BT_HCI_EVT_LE_ADVERTISING_REPORT:
|
||||
le_adv_report(buf);
|
||||
break;
|
||||
default:
|
||||
BT_DBG("Unhandled LE event %x\n", evt->subevent);
|
||||
break;
|
||||
|
@ -1160,6 +1183,7 @@ static void hci_event(struct bt_buf *buf)
|
|||
bt_buf_pull(buf, sizeof(*hdr));
|
||||
|
||||
switch (hdr->evt) {
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
case BT_HCI_EVT_DISCONN_COMPLETE:
|
||||
hci_disconn_complete(buf);
|
||||
break;
|
||||
|
@ -1169,6 +1193,7 @@ static void hci_event(struct bt_buf *buf)
|
|||
case BT_HCI_EVT_ENCRYPT_KEY_REFRESH_COMPLETE:
|
||||
hci_encrypt_key_refresh_complete(buf);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
case BT_HCI_EVT_LE_META_EVENT:
|
||||
hci_le_meta_event(buf);
|
||||
break;
|
||||
|
@ -1256,9 +1281,11 @@ static void rx_prio_fiber(void)
|
|||
case BT_HCI_EVT_CMD_STATUS:
|
||||
hci_cmd_status(buf);
|
||||
break;
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
case BT_HCI_EVT_NUM_COMPLETED_PACKETS:
|
||||
hci_num_completed_packets(buf);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
default:
|
||||
BT_ERR("Unknown event 0x%02x\n", hdr->evt);
|
||||
break;
|
||||
|
@ -1331,6 +1358,7 @@ static void le_read_buffer_size_complete(struct bt_buf *buf)
|
|||
bt_dev.le_pkts = rp->le_max_num;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
static int set_flow_control(void)
|
||||
{
|
||||
struct bt_hci_cp_host_buffer_size *hbs;
|
||||
|
@ -1365,6 +1393,7 @@ static int set_flow_control(void)
|
|||
*enable = 0x01;
|
||||
return bt_hci_cmd_send_sync(BT_HCI_OP_SET_CTL_TO_HOST_FLOW, buf, NULL);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
static int hci_init(void)
|
||||
{
|
||||
|
@ -1430,26 +1459,38 @@ static int hci_init(void)
|
|||
|
||||
ev = bt_buf_add(buf, sizeof(*ev));
|
||||
memset(ev, 0, sizeof(*ev));
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
ev->events[0] |= 0x10; /* Disconnection Complete */
|
||||
ev->events[1] |= 0x08; /* Read Remote Version Information Complete */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
ev->events[1] |= 0x20; /* Command Complete */
|
||||
ev->events[1] |= 0x40; /* Command Status */
|
||||
ev->events[1] |= 0x80; /* Hardware Error */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
ev->events[2] |= 0x04; /* Number of Completed Packets */
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
ev->events[3] |= 0x02; /* Data Buffer Overflow */
|
||||
ev->events[7] |= 0x20; /* LE Meta-Event */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
if (bt_dev.le_features[0] & BT_HCI_LE_ENCRYPTION) {
|
||||
ev->events[0] |= 0x80; /* Encryption Change */
|
||||
ev->events[5] |= 0x80; /* Encryption Key Refresh Complete */
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
bt_hci_cmd_send_sync(BT_HCI_OP_SET_EVENT_MASK, buf, NULL);
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
err = set_flow_control();
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
if (lmp_bredr_capable(bt_dev)) {
|
||||
struct bt_hci_cp_write_le_host_supp *cp;
|
||||
|
@ -1560,11 +1601,14 @@ static int bt_init(void)
|
|||
}
|
||||
|
||||
err = hci_init();
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
return bt_l2cap_init();
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
if (!err) {
|
||||
err = bt_l2cap_init();
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void hci_rx_fiber(bt_ready_cb_t ready_cb)
|
||||
|
@ -1584,9 +1628,11 @@ static void hci_rx_fiber(bt_ready_cb_t ready_cb)
|
|||
BT_DBG("buf %p type %u len %u\n", buf, buf->type, buf->len);
|
||||
|
||||
switch (buf->type) {
|
||||
#if defined(CONFIG_BLUETOOTH_CONN)
|
||||
case BT_ACL_IN:
|
||||
hci_acl(buf);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CONN */
|
||||
case BT_EVT:
|
||||
hci_event(buf);
|
||||
break;
|
||||
|
|
|
@ -165,6 +165,7 @@ static void le_conn_param_rsp(struct bt_conn *conn, struct bt_buf *buf)
|
|||
bt_conn_connected(conn);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
static void le_conn_param_update_req(struct bt_conn *conn, uint8_t ident,
|
||||
struct bt_buf *buf)
|
||||
{
|
||||
|
@ -217,6 +218,7 @@ static void le_conn_param_update_req(struct bt_conn *conn, uint8_t ident,
|
|||
bt_conn_le_conn_update(conn, min, max, latency, timeout);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
static void le_sig(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
|
@ -248,9 +250,11 @@ static void le_sig(struct bt_conn *conn, struct bt_buf *buf)
|
|||
case BT_L2CAP_CONN_PARAM_RSP:
|
||||
le_conn_param_rsp(conn, buf);
|
||||
break;
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
case BT_L2CAP_CONN_PARAM_REQ:
|
||||
le_conn_param_update_req(conn, hdr->ident, buf);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
default:
|
||||
BT_WARN("Unknown L2CAP PDU code 0x%02x\n", hdr->code);
|
||||
rej_not_understood(conn, hdr->ident);
|
||||
|
|
|
@ -508,6 +508,7 @@ static uint8_t smp_request_tk(struct bt_conn *conn, uint8_t remote_io)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
static uint8_t smp_pairing_req(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
struct bt_smp_pairing *req = (void *)buf->data;
|
||||
|
@ -557,6 +558,12 @@ static uint8_t smp_pairing_req(struct bt_conn *conn, struct bt_buf *buf)
|
|||
|
||||
return smp_request_tk(conn, req->io_capability);
|
||||
}
|
||||
#else
|
||||
static uint8_t smp_pairing_req(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
return BT_SMP_ERR_CMD_NOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
|
||||
static bool sec_level_reachable(struct bt_conn *conn)
|
||||
{
|
||||
|
@ -572,6 +579,7 @@ static bool sec_level_reachable(struct bt_conn *conn)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
int bt_smp_send_security_req(struct bt_conn *conn)
|
||||
{
|
||||
struct bt_smp *smp = conn->smp;
|
||||
|
@ -605,7 +613,9 @@ int bt_smp_send_security_req(struct bt_conn *conn)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
int bt_smp_send_pairing_req(struct bt_conn *conn)
|
||||
{
|
||||
struct bt_smp *smp = conn->smp;
|
||||
|
@ -650,6 +660,7 @@ int bt_smp_send_pairing_req(struct bt_conn *conn)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
static uint8_t smp_send_pairing_confirm(struct bt_conn *conn)
|
||||
{
|
||||
|
@ -680,6 +691,7 @@ static uint8_t smp_send_pairing_confirm(struct bt_conn *conn)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
static uint8_t smp_pairing_rsp(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
struct bt_smp_pairing *rsp = (void *)buf->data;
|
||||
|
@ -714,6 +726,12 @@ static uint8_t smp_pairing_rsp(struct bt_conn *conn, struct bt_buf *buf)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static uint8_t smp_pairing_rsp(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
return BT_SMP_ERR_CMD_NOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
static uint8_t smp_send_pairing_random(struct bt_conn *conn)
|
||||
{
|
||||
|
@ -744,18 +762,21 @@ static uint8_t smp_pairing_confirm(struct bt_conn *conn, struct bt_buf *buf)
|
|||
|
||||
memcpy(smp->pcnf, req->val, sizeof(smp->pcnf));
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER) {
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
|
||||
return smp_send_pairing_random(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
if (atomic_test_bit(&smp->flags, SMP_FLAG_TK_VALID)) {
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
|
||||
return smp_send_pairing_confirm(conn);
|
||||
}
|
||||
|
||||
atomic_set_bit(&smp->flags, SMP_FLAG_CFM_DELAYED);
|
||||
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -795,6 +816,7 @@ static uint8_t smp_pairing_random(struct bt_conn *conn, struct bt_buf *buf)
|
|||
return BT_SMP_ERR_CONFIRM_FAILED;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER) {
|
||||
uint8_t stk[16];
|
||||
|
||||
|
@ -825,7 +847,9 @@ static uint8_t smp_pairing_random(struct bt_conn *conn, struct bt_buf *buf)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
keys = bt_keys_get_type(BT_KEYS_SLAVE_LTK, &conn->dst);
|
||||
if (!keys) {
|
||||
BT_ERR("Unable to create new keys\n");
|
||||
|
@ -853,6 +877,7 @@ static uint8_t smp_pairing_random(struct bt_conn *conn, struct bt_buf *buf)
|
|||
atomic_set_bit(&smp->flags, SMP_FLAG_ENC_PENDING);
|
||||
|
||||
smp_send_pairing_random(conn);
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -865,12 +890,20 @@ static void smp_reset(struct bt_conn *conn)
|
|||
atomic_set(&smp->allowed_cmds, 0);
|
||||
atomic_set(&smp->flags, 0);
|
||||
|
||||
if (conn->role == BT_HCI_ROLE_MASTER) {
|
||||
atomic_set_bit(&smp->allowed_cmds,
|
||||
BT_SMP_CMD_SECURITY_REQUEST);
|
||||
} else {
|
||||
atomic_set_bit(&smp->allowed_cmds,
|
||||
BT_SMP_CMD_PAIRING_REQ);
|
||||
switch(conn->role) {
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
case BT_HCI_ROLE_MASTER:
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_SECURITY_REQUEST);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
case BT_HCI_ROLE_SLAVE:
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_PAIRING_REQ);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1030,9 +1063,11 @@ static uint8_t smp_master_ident(struct bt_conn *conn, struct bt_buf *buf)
|
|||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER && !smp->remote_dist) {
|
||||
bt_smp_distribute_keys(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1114,9 +1149,11 @@ static uint8_t smp_ident_addr_info(struct bt_conn *conn, struct bt_buf *buf)
|
|||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_SIGNING_INFO);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER && !smp->remote_dist) {
|
||||
bt_smp_distribute_keys(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1140,13 +1177,16 @@ static uint8_t smp_signing_info(struct bt_conn *conn, struct bt_buf *buf)
|
|||
|
||||
smp->remote_dist &= ~BT_SMP_DIST_SIGN;
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
if (conn->role == BT_HCI_ROLE_MASTER && !smp->remote_dist) {
|
||||
bt_smp_distribute_keys(conn);
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
static uint8_t smp_security_request(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
struct bt_smp_security_request *req = (void *)buf->data;
|
||||
|
@ -1189,6 +1229,12 @@ pair:
|
|||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static uint8_t smp_security_request(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
return BT_SMP_ERR_CMD_NOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
static const struct {
|
||||
uint8_t (*func)(struct bt_conn *conn, struct bt_buf *buf);
|
||||
|
@ -1322,10 +1368,12 @@ static void bt_smp_encrypt_change(struct bt_conn *conn)
|
|||
bt_keys_clear(keys, BT_KEYS_ALL);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
/* Slave distributes it's keys first */
|
||||
if (conn->role == BT_HCI_ROLE_MASTER && smp->remote_dist) {
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
bt_smp_distribute_keys(conn);
|
||||
}
|
||||
|
@ -1878,10 +1926,20 @@ void bt_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey)
|
|||
return;
|
||||
}
|
||||
|
||||
if (conn->role == BT_HCI_ROLE_MASTER) {
|
||||
switch(conn->role) {
|
||||
#if defined(CONFIG_BLUETOOTH_CENTRAL)
|
||||
case BT_HCI_ROLE_MASTER:
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_PAIRING_CONFIRM);
|
||||
} else {
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_CENTRAL */
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_PERIPHERAL)
|
||||
case BT_HCI_ROLE_SLAVE:
|
||||
atomic_set_bit(&smp->allowed_cmds, BT_SMP_CMD_PAIRING_RANDOM);
|
||||
break;
|
||||
#endif /* CONFIG_BLUETOOTH_PERIPHERAL */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,3 +2,4 @@ CONFIG_TEST_RANDOM_GENERATOR=y
|
|||
CONFIG_BLUETOOTH=y
|
||||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_BLUETOOTH_DEBUG=y
|
||||
CONFIG_BLUETOOTH_CENTRAL=y
|
||||
|
|
|
@ -2,3 +2,4 @@ CONFIG_BLUETOOTH=y
|
|||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_BLUETOOTH_DEBUG=y
|
||||
CONFIG_TEST_RANDOM_GENERATOR=y
|
||||
CONFIG_BLUETOOTH_PERIPHERAL=y
|
||||
|
|
|
@ -2,3 +2,4 @@ CONFIG_TEST_RANDOM_GENERATOR=y
|
|||
CONFIG_BLUETOOTH=y
|
||||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_BLUETOOTH_DEBUG=y
|
||||
CONFIG_BLUETOOTH_PERIPHERAL=y
|
||||
|
|
|
@ -4,3 +4,5 @@ CONFIG_BLUETOOTH=y
|
|||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_BLUETOOTH_DEBUG=y
|
||||
CONFIG_CONSOLE_HANDLER=y
|
||||
CONFIG_BLUETOOTH_CENTRAL=y
|
||||
CONFIG_BLUETOOTH_PERIPHERAL=y
|
||||
|
|
|
@ -4,5 +4,7 @@ CONFIG_TEST_RANDOM_GENERATOR=y
|
|||
CONFIG_BLUETOOTH=y
|
||||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_CONSOLE_HANDLER=y
|
||||
CONFIG_BLUETOOTH_CENTRAL=y
|
||||
CONFIG_BLUETOOTH_PERIPHERAL=y
|
||||
CONFIG_TINYCRYPT=y
|
||||
CONFIG_TINYCRYPT_AES=y
|
||||
|
|
|
@ -3,6 +3,8 @@ CONFIG_TEST_RANDOM_GENERATOR=y
|
|||
CONFIG_CONSOLE_HANDLER=y
|
||||
CONFIG_BLUETOOTH=y
|
||||
CONFIG_BLUETOOTH_UART=y
|
||||
CONFIG_BLUETOOTH_CENTRAL=y
|
||||
CONFIG_BLUETOOTH_PERIPHERAL=y
|
||||
CONFIG_BLUETOOTH_DEBUG=y
|
||||
CONFIG_BLUETOOTH_DEBUG_HCI_CORE=y
|
||||
CONFIG_BLUETOOTH_DEBUG_BUF=y
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue