Bluetooth: Controller: Kconfig Data Length Update feature

Add Kconfig configuration to conditionally enable Data
Length Update procedure support in the Controller.
This will save CPU time, flash and RAM, if this feature is
not desired.

Change-id: I4515c0c7cf9aeb333a289397ae3c9bac04a08e4e
Signed-off-by: Vinayak Chettimada <vinayak.kariappa.chettimada@nordicsemi.no>
This commit is contained in:
Vinayak Chettimada 2016-12-28 06:35:05 +01:00 committed by Johan Hedberg
commit 08fcc44b8a
6 changed files with 126 additions and 27 deletions

View file

@ -2,14 +2,6 @@ if BLUETOOTH_CONTROLLER
comment "BLE Controller configuration"
config BLUETOOTH_CONTROLLER_DATA_LENGTH
prompt "Maximum data length supported"
int
default 27
range 27 251
help
Set the maximum data length of PDU supported in the stack.
config BLUETOOTH_CONTROLLER_RX_BUFFERS
prompt "Number of Rx buffers"
int
@ -46,6 +38,22 @@ config BLUETOOTH_CONTROLLER_LE_PING
help
Enable support for Bluetooth v4.1 LE Ping feature in the Controller.
config BLUETOOTH_CONTROLLER_DATA_LENGTH
bool "Data Length Update"
default y
help
Enable support for Bluetooth v4.2 LE Data Length Update procedure in
the Controller.
config BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX
prompt "Maximum data length supported"
depends on BLUETOOTH_CONTROLLER_DATA_LENGTH
int
default 27
range 27 251
help
Set the maximum data length of PDU supported in the Controller.
comment "BLE Controller debug configuration"
config BLUETOOTH_CONTROLLER_ASSERT_HANDLER

View file

@ -212,18 +212,25 @@ static void read_supported_commands(struct net_buf *buf, struct net_buf *evt)
* LE Read Supported States.
*/
rp->commands[28] = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
/* LE Remote Conn Param Req and Neg Reply, LE Set Data Length,
* and LE Read Suggested Data Length.
*/
rp->commands[33] = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);
/* LE Remote Conn Param Req and Neg Reply */
rp->commands[33] = (1 << 4) | (1 << 5);
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
/* LE Set Data Length, and LE Read Suggested Data Length. */
rp->commands[33] |= (1 << 6) | (1 << 7);
/* LE Write Suggested Data Length. */
rp->commands[34] = (1 << 0);
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
#if defined(CONFIG_BLUETOOTH_HCI_RAW) && defined(CONFIG_BLUETOOTH_TINYCRYPT_ECC)
/* LE Read Local P256 Public Key and LE Generate DH Key*/
rp->commands[34] |= (1 << 1) | (1 << 2);
#endif
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
/* LE Read Maximum Data Length. */
rp->commands[35] = (1 << 3);
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
}
static void read_local_features(struct net_buf *buf, struct net_buf *evt)
@ -660,6 +667,7 @@ static void le_conn_param_req_neg_reply(struct net_buf *buf,
rp->handle = cmd->handle;
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static void le_set_data_len(struct net_buf *buf, struct net_buf *evt)
{
struct bt_hci_cp_le_set_data_len *cmd = (void *)buf->data;
@ -710,6 +718,7 @@ static void le_read_max_data_len(struct net_buf *buf, struct net_buf *evt)
&rp->max_rx_octets, &rp->max_rx_time);
rp->status = 0x00;
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static int controller_cmd_handle(uint8_t ocf, struct net_buf *cmd,
struct net_buf *evt)
@ -827,6 +836,7 @@ static int controller_cmd_handle(uint8_t ocf, struct net_buf *cmd,
le_conn_param_req_neg_reply(cmd, evt);
break;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
case BT_OCF(BT_HCI_OP_LE_SET_DATA_LEN):
le_set_data_len(cmd, evt);
break;
@ -842,6 +852,7 @@ static int controller_cmd_handle(uint8_t ocf, struct net_buf *cmd,
case BT_OCF(BT_HCI_OP_LE_READ_MAX_DATA_LEN):
le_read_max_data_len(cmd, evt);
break;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
default:
return -EINVAL;

View file

@ -243,7 +243,11 @@ static void tx_packet_set(struct connection *conn,
static void prepare_pdu_data_tx(struct connection *conn,
struct pdu_data **pdu_data_tx);
static void packet_rx_allocate(uint8_t max);
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static uint8_t packet_rx_acquired_count_get(void);
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static struct radio_pdu_node_rx *packet_rx_reserve_get(uint8_t count);
static void packet_rx_enqueue(void);
static void packet_tx_enqueue(uint8_t max);
@ -277,9 +281,13 @@ static void ping_resp_send(struct connection *conn);
static void reject_ind_ext_send(struct connection *conn,
uint8_t reject_opcode,
uint8_t error_code);
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static void length_resp_send(struct connection *conn,
uint16_t eff_rx_octets,
uint16_t eff_tx_octets);
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static uint32_t role_disable(uint8_t ticker_id_primary,
uint8_t ticker_id_stop);
static void rx_fc_lock(uint16_t handle);
@ -484,9 +492,11 @@ static void common_init(void)
_radio.data_channel_map[4] = 0x1F;
_radio.data_channel_count = 37;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
/* Initialize the DLE defaults */
_radio.default_tx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
_radio.default_tx_time = RADIO_LL_LENGTH_TIME_RX_MIN;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
/* allocate the rx queue */
packet_rx_allocate(0xFF);
@ -1134,6 +1144,7 @@ static inline uint8_t isr_rx_conn_pkt_ack(struct pdu_data *pdu_data_tx,
_radio.conn_curr->procedure_expire = 0;
break;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
case PDU_DATA_LLCTRL_TYPE_LENGTH_REQ:
if ((_radio.conn_curr->llcp_length.req !=
_radio.conn_curr->llcp_length.ack) &&
@ -1147,6 +1158,7 @@ static inline uint8_t isr_rx_conn_pkt_ack(struct pdu_data *pdu_data_tx,
LLCP_LENGTH_STATE_RSP_WAIT;
}
break;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
default:
/* Do nothing for other ctrl packet ack */
@ -1249,6 +1261,7 @@ isr_rx_conn_pkt_ctrl_rej(struct radio_pdu_node_rx *radio_pdu_node_rx,
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static inline uint8_t isr_rx_conn_pkt_ctrl_dle(struct pdu_data *pdu_data_rx,
uint8_t *rx_enqueue)
{
@ -1367,6 +1380,7 @@ static inline uint8_t isr_rx_conn_pkt_ctrl_dle(struct pdu_data *pdu_data_rx,
return nack;
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static inline uint8_t
isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *radio_pdu_node_rx,
@ -1743,6 +1757,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *radio_pdu_node_rx,
LL_ASSERT(0);
break;
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
} else if (_radio.conn_curr->llcp_length.req !=
_radio.conn_curr->llcp_length.ack) {
/* Procedure complete */
@ -1757,6 +1773,8 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *radio_pdu_node_rx,
* host
*/
*rx_enqueue = 1;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
} else {
struct pdu_data_llctrl *llctrl;
@ -1783,10 +1801,12 @@ isr_rx_conn_pkt_ctrl(struct radio_pdu_node_rx *radio_pdu_node_rx,
}
break;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
case PDU_DATA_LLCTRL_TYPE_LENGTH_RSP:
case PDU_DATA_LLCTRL_TYPE_LENGTH_REQ:
nack = isr_rx_conn_pkt_ctrl_dle(pdu_data_rx, rx_enqueue);
break;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
default:
unknown_rsp_send(_radio.conn_curr,
@ -5069,6 +5089,7 @@ static inline void event_ping_prep(struct connection *conn)
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static inline void event_len_prep(struct connection *conn)
{
switch (conn->llcp_length.state) {
@ -5275,7 +5296,7 @@ static inline void event_len_prep(struct connection *conn)
break;
}
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static void event_connection_prepare(uint32_t ticks_at_expire,
uint32_t remainder, uint16_t lazy,
@ -5381,6 +5402,7 @@ static void event_connection_prepare(uint32_t ticks_at_expire,
}
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
/* check if procedure is requested */
if (conn->llcp_length.ack != conn->llcp_length.req) {
/* Stop previous event, to avoid Radio DMA corrupting the
@ -5391,6 +5413,7 @@ static void event_connection_prepare(uint32_t ticks_at_expire,
/* handle DLU state machine */
event_len_prep(conn);
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
/* Setup XTAL startup and radio active events */
event_common_prepare(ticks_at_expire, remainder,
@ -5671,15 +5694,22 @@ static void event_master(uint32_t ticks_at_expire, uint32_t remainder,
static void rx_packet_set(struct connection *conn, struct pdu_data *pdu_data_rx)
{
uint8_t phy;
uint16_t max_rx_octets;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
max_rx_octets = conn->max_rx_octets;
#else /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
max_rx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
phy = RADIO_PHY_CONN;
if (conn->enc_rx) {
radio_pkt_configure(phy, 8, (conn->max_rx_octets + 4));
radio_pkt_configure(phy, 8, (max_rx_octets + 4));
radio_pkt_rx_set(radio_ccm_rx_pkt_set(&conn->ccm_rx,
pdu_data_rx));
} else {
radio_pkt_configure(phy, 8, conn->max_rx_octets);
radio_pkt_configure(phy, 8, max_rx_octets);
radio_pkt_rx_set(pdu_data_rx);
}
@ -5689,15 +5719,22 @@ static void tx_packet_set(struct connection *conn,
struct pdu_data *pdu_data_tx)
{
uint8_t phy;
uint16_t max_tx_octets;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
max_tx_octets = conn->max_tx_octets;
#else /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
max_tx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
phy = RADIO_PHY_CONN;
if (conn->enc_tx) {
radio_pkt_configure(phy, 8, (conn->max_tx_octets + 4));
radio_pkt_configure(phy, 8, (max_tx_octets + 4));
radio_pkt_tx_set(radio_ccm_tx_pkt_set(&conn->ccm_tx,
pdu_data_tx));
} else {
radio_pkt_configure(phy, 8, conn->max_tx_octets);
radio_pkt_configure(phy, 8, max_tx_octets);
radio_pkt_tx_set(pdu_data_tx);
}
@ -5748,6 +5785,8 @@ static void prepare_pdu_data_tx(struct connection *conn,
(_pdu_data_tx->payload.llctrl.opcode != PDU_DATA_LLCTRL_TYPE_REJECT_IND_EXT))))))) {
_pdu_data_tx = empty_tx_enqueue(conn);
} else {
uint16_t max_tx_octets;
_pdu_data_tx =
(struct pdu_data *)(conn->pkt_tx_head->pdu_data +
conn->packet_tx_head_offset);
@ -5764,8 +5803,14 @@ static void prepare_pdu_data_tx(struct connection *conn,
conn->packet_tx_head_offset;
_pdu_data_tx->md = 0;
if (_pdu_data_tx->len > conn->max_tx_octets) {
_pdu_data_tx->len = conn->max_tx_octets;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
max_tx_octets = conn->max_tx_octets;
#else /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
max_tx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
if (_pdu_data_tx->len > max_tx_octets) {
_pdu_data_tx->len = max_tx_octets;
_pdu_data_tx->md = 1;
}
@ -5822,6 +5867,7 @@ static void packet_rx_allocate(uint8_t max)
}
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static uint8_t packet_rx_acquired_count_get(void)
{
if (_radio.packet_rx_acquire >=
@ -5834,6 +5880,7 @@ static uint8_t packet_rx_acquired_count_get(void)
_radio.packet_rx_acquire);
}
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static struct radio_pdu_node_rx *packet_rx_reserve_get(uint8_t count)
{
@ -6496,6 +6543,7 @@ static void reject_ind_ext_send(struct connection *conn,
ctrl_tx_enqueue(conn, node_tx);
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
static void length_resp_send(struct connection *conn, uint16_t eff_rx_octets,
uint16_t eff_tx_octets)
{
@ -6522,6 +6570,7 @@ static void length_resp_send(struct connection *conn, uint16_t eff_rx_octets,
ctrl_tx_enqueue(conn, node_tx);
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
void radio_ticks_active_to_start_set(uint32_t ticks_active_to_start)
{
@ -6857,9 +6906,13 @@ uint32_t radio_adv_enable(uint16_t interval, uint8_t chl_map,
conn->event_counter = 0;
conn->latency_prepare = 0;
conn->latency_event = 0;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
conn->default_tx_octets = _radio.default_tx_octets;
conn->max_tx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
conn->max_rx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
conn->role.slave.role = 1;
conn->role.slave.latency_cancel = 0;
conn->role.slave.window_widening_prepare_us = 0;
@ -6881,8 +6934,12 @@ uint32_t radio_adv_enable(uint16_t interval, uint8_t chl_map,
conn->llcp_terminate.ack = 0;
conn->llcp_terminate.reason_peer = 0;
conn->llcp_terminate.radio_pdu_node_rx.hdr.onion.link = link;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
conn->llcp_length.req = 0;
conn->llcp_length.ack = 0;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
conn->sn = 0;
conn->nesn = 0;
conn->pause_rx = 0;
@ -7182,9 +7239,13 @@ uint32_t radio_connect_enable(uint8_t adv_addr_type, uint8_t *adv_addr,
conn->latency_prepare = 0;
conn->latency_event = 0;
conn->latency = _radio.observer.conn_latency;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
conn->default_tx_octets = _radio.default_tx_octets;
conn->max_tx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
conn->max_rx_octets = RADIO_LL_LENGTH_OCTETS_RX_MIN;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
conn->role.master.role = 0;
conn->role.master.connect_expire = 6;
conn_interval_us =
@ -7214,8 +7275,12 @@ uint32_t radio_connect_enable(uint8_t adv_addr_type, uint8_t *adv_addr,
conn->llcp_terminate.ack = 0;
conn->llcp_terminate.reason_peer = 0;
conn->llcp_terminate.radio_pdu_node_rx.hdr.onion.link = link;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
conn->llcp_length.req = 0;
conn->llcp_length.ack = 0;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
conn->sn = 0;
conn->nesn = 0;
conn->pause_rx = 0;
@ -7507,6 +7572,7 @@ uint32_t radio_terminate_ind_send(uint16_t handle, uint8_t reason)
return 0;
}
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
uint32_t radio_length_req_send(uint16_t handle, uint16_t tx_octets)
{
struct connection *conn;
@ -7552,6 +7618,7 @@ void radio_length_max_get(uint16_t *max_tx_octets, uint16_t *max_tx_time,
*max_rx_octets = RADIO_LL_LENGTH_OCTETS_RX_MAX;
*max_rx_time = RADIO_LL_LENGTH_TIME_RX_MAX;
}
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
static uint8_t tx_cmplt_get(uint16_t *handle, uint8_t *first, uint8_t last)
{

View file

@ -29,11 +29,6 @@
#define RADIO_CONNECTION_CONTEXT_MAX 0
#endif
#ifdef CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH
#define RADIO_LL_LENGTH_OCTETS_RX_MAX \
CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH
#endif
#ifdef CONFIG_BLUETOOTH_CONTROLLER_RX_BUFFERS
#define RADIO_PACKET_COUNT_RX_MAX \
CONFIG_BLUETOOTH_CONTROLLER_RX_BUFFERS
@ -50,6 +45,15 @@
#define RADIO_BLE_FEATURES_BIT_PING 0
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX)
#define RADIO_BLE_FEATURES_BIT_DLE BIT(BT_LE_FEAT_BIT_DLE)
#define RADIO_LL_LENGTH_OCTETS_RX_MAX \
CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX
#else
#define RADIO_BLE_FEATURES_BIT_DLE 0
#define RADIO_LL_LENGTH_OCTETS_RX_MAX 27
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH_MAX */
/*****************************************************************************
* Timer Resources (Controller defined)
****************************************************************************/
@ -95,7 +99,7 @@
BIT(BT_LE_FEAT_BIT_EXT_REJ_IND) | \
BIT(BT_LE_FEAT_BIT_SLAVE_FEAT_REQ) | \
RADIO_BLE_FEATURES_BIT_PING | \
BIT(BT_LE_FEAT_BIT_DLE))
RADIO_BLE_FEATURES_BIT_DLE)
/*****************************************************************************
* Controller Reference Defines (compile time override-able)
@ -257,11 +261,15 @@ uint32_t radio_start_enc_req_send(uint16_t handle, uint8_t err_code,
uint32_t radio_feature_req_send(uint16_t handle);
uint32_t radio_version_ind_send(uint16_t handle);
uint32_t radio_terminate_ind_send(uint16_t handle, uint8_t reason);
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
uint32_t radio_length_req_send(uint16_t handle, uint16_t tx_octets);
void radio_length_default_get(uint16_t *max_tx_octets, uint16_t *max_tx_time);
uint32_t radio_length_default_set(uint16_t max_tx_octets, uint16_t max_tx_time);
void radio_length_max_get(uint16_t *max_tx_octets, uint16_t *max_tx_time,
uint16_t *max_rx_octets, uint16_t *max_rx_time);
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
uint8_t radio_rx_get(struct radio_pdu_node_rx **radio_pdu_node_rx,
uint16_t *handle);
void radio_rx_dequeue(void);

View file

@ -32,8 +32,6 @@ enum llcp {
#if defined(CONFIG_BLUETOOTH_CONTROLLER_LE_PING)
LLCP_PING,
#endif /* CONFIG_BLUETOOTH_CONTROLLER_LE_PING */
/* LLCP_LENGTH, */
};
@ -59,9 +57,13 @@ struct connection {
uint16_t latency;
uint16_t latency_prepare;
uint16_t latency_event;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
uint16_t default_tx_octets;
uint16_t max_tx_octets;
uint16_t max_rx_octets;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
uint16_t supervision_reload;
uint16_t supervision_expire;
uint16_t procedure_reload;
@ -163,6 +165,7 @@ struct connection {
} radio_pdu_node_rx;
} llcp_terminate;
#if defined(CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH)
struct {
uint8_t req;
uint8_t ack;
@ -174,6 +177,7 @@ struct connection {
uint16_t rx_octets;
uint16_t tx_octets;
} llcp_length;
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
uint8_t sn:1;
uint8_t nesn:1;

View file

@ -1,6 +1,7 @@
CONFIG_BLUETOOTH=y
CONFIG_BLUETOOTH_CONTROLLER=y
CONFIG_BLUETOOTH_CONTROLLER_LE_PING=n
CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH=n
CONFIG_BLUETOOTH_PERIPHERAL=y
CONFIG_BLUETOOTH_CENTRAL=y
CONFIG_BLUETOOTH_SMP=y