Skip to content

Commit 33cb9e3

Browse files
thoh-otcarlescufi
authored andcommitted
Bluetooth: controller: Add remote proc ctx pool
Add a separate procedure context pool for remote initiated procedures. Make it configurable in size by BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM. Fix all unit tests referring to the amount of free context buffers. Fixes #41823 Signed-off-by: Thomas Ebert Hansen <[email protected]>
1 parent cecb12e commit 33cb9e3

File tree

20 files changed

+165
-121
lines changed

20 files changed

+165
-121
lines changed

subsys/bluetooth/controller/Kconfig.ll_sw_split

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -533,15 +533,25 @@ config BT_CTLR_LLCP_COMMON_TX_CTRL_BUF_NUM
533533
Configure between 0 and (4 - BT_CTLR_LLCP_PER_CONN_TX_CTRL_BUF_NUM) * BT_CTLR_LLCP_CONN
534534

535535
config BT_CTLR_LLCP_PROC_CTX_BUF_NUM
536-
int "Number of control procedure contexts to be available across all connections"
536+
int "Number of local control procedure contexts to be available across all connections"
537537
default 2 if BT_CTLR_LLCP_CONN = 1
538538
default BT_CTLR_LLCP_CONN if BT_CTLR_LLCP_CONN > 1
539539
range 2 255
540540
help
541541
Set the number control procedure contexts that is to be available.
542542
This defines the size of the pool of control procedure contexts available
543-
for handlign control procedures. This pool is shared across all
544-
connections (local vs remote initiate), with allocation through a queue
543+
for handling local initiated control procedures.
544+
This pool is shared across all connections, with allocation through a queue.
545+
546+
config BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM
547+
int "Number of remote control procedure contexts to be available across all connections"
548+
default BT_CTLR_LLCP_CONN
549+
range 1 255
550+
help
551+
Set the number control procedure contexts that is to be available.
552+
This defines the size of the pool of control procedure contexts available
553+
for handling remote initiated control procedures.
554+
This pool is shared across all connections, with allocation through a queue.
545555

546556
endif #!BT_LL_SW_LLCP_LEGACY
547557

subsys/bluetooth/controller/ll_sw/ull_llcp.c

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,13 @@ static uint8_t buffer_mem_tx[TX_CTRL_BUF_SIZE * LLCP_TX_CTRL_BUF_COUNT];
5959
static struct llcp_mem_pool mem_tx = { .pool = buffer_mem_tx };
6060

6161
/* TODO: Determine 'correct' number of ctx */
62-
static uint8_t buffer_mem_ctx[PROC_CTX_BUF_SIZE * CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM];
63-
static struct llcp_mem_pool mem_ctx = { .pool = buffer_mem_ctx };
62+
static uint8_t buffer_mem_local_ctx[PROC_CTX_BUF_SIZE * CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM];
63+
static struct llcp_mem_pool mem_local_ctx = { .pool = buffer_mem_local_ctx };
64+
65+
/* TODO(thoh-ot): Determine 'correct' number of ctx */
66+
static uint8_t buffer_mem_remote_ctx[PROC_CTX_BUF_SIZE *
67+
CONFIG_BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM];
68+
static struct llcp_mem_pool mem_remote_ctx = { .pool = buffer_mem_remote_ctx };
6469

6570
/*
6671
* LLCP Resource Management
@@ -282,7 +287,7 @@ struct proc_ctx *llcp_create_local_procedure(enum llcp_proc proc)
282287
{
283288
struct proc_ctx *ctx;
284289

285-
ctx = create_procedure(proc, &mem_ctx);
290+
ctx = create_procedure(proc, &mem_local_ctx);
286291
if (!ctx) {
287292
return NULL;
288293
}
@@ -350,7 +355,7 @@ struct proc_ctx *llcp_create_remote_procedure(enum llcp_proc proc)
350355
{
351356
struct proc_ctx *ctx;
352357

353-
ctx = create_procedure(proc, &mem_ctx);
358+
ctx = create_procedure(proc, &mem_remote_ctx);
354359
if (!ctx) {
355360
return NULL;
356361
}
@@ -423,8 +428,11 @@ struct proc_ctx *llcp_create_remote_procedure(enum llcp_proc proc)
423428

424429
void ull_cp_init(void)
425430
{
426-
mem_init(mem_ctx.pool, PROC_CTX_BUF_SIZE, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM,
427-
&mem_ctx.free);
431+
mem_init(mem_local_ctx.pool, PROC_CTX_BUF_SIZE, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM,
432+
&mem_local_ctx.free);
433+
mem_init(mem_remote_ctx.pool, PROC_CTX_BUF_SIZE,
434+
CONFIG_BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM,
435+
&mem_remote_ctx.free);
428436
mem_init(mem_tx.pool, TX_CTRL_BUF_SIZE, LLCP_TX_CTRL_BUF_COUNT, &mem_tx.free);
429437

430438
#if defined(LLCP_TX_CTRL_BUF_QUEUE_ENABLE)
@@ -1025,13 +1033,19 @@ void ull_cp_rx(struct ll_conn *conn, struct node_rx_pdu *rx)
10251033

10261034
#ifdef ZTEST_UNITTEST
10271035

1028-
int ctx_buffers_free(void)
1036+
static uint16_t local_ctx_buffers_free(void)
10291037
{
1030-
int nr_of_free_ctx;
1038+
return mem_free_count_get(mem_local_ctx.free);
1039+
}
10311040

1032-
nr_of_free_ctx = mem_free_count_get(mem_ctx.free);
1041+
static uint16_t remote_ctx_buffers_free(void)
1042+
{
1043+
return mem_free_count_get(mem_remote_ctx.free);
1044+
}
10331045

1034-
return nr_of_free_ctx;
1046+
uint16_t ctx_buffers_free(void)
1047+
{
1048+
return local_ctx_buffers_free() + remote_ctx_buffers_free();
10351049
}
10361050

10371051
void test_int_mem_proc_ctx(void)
@@ -1043,28 +1057,29 @@ void test_int_mem_proc_ctx(void)
10431057
ull_cp_init();
10441058

10451059
nr_of_free_ctx = ctx_buffers_free();
1046-
zassert_equal(nr_of_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
1060+
zassert_equal(nr_of_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM +
1061+
CONFIG_BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM, NULL);
10471062

10481063
for (int i = 0U; i < CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM; i++) {
1049-
ctx1 = proc_ctx_acquire(&mem_ctx);
1064+
ctx1 = proc_ctx_acquire(&mem_local_ctx);
10501065

10511066
/* The previous acquire should be valid */
10521067
zassert_not_null(ctx1, NULL);
10531068
}
10541069

1055-
nr_of_free_ctx = ctx_buffers_free();
1070+
nr_of_free_ctx = local_ctx_buffers_free();
10561071
zassert_equal(nr_of_free_ctx, 0, NULL);
10571072

1058-
ctx2 = proc_ctx_acquire(&mem_ctx);
1073+
ctx2 = proc_ctx_acquire(&mem_local_ctx);
10591074

10601075
/* The last acquire should fail */
10611076
zassert_is_null(ctx2, NULL);
10621077

10631078
llcp_proc_ctx_release(ctx1);
1064-
nr_of_free_ctx = ctx_buffers_free();
1079+
nr_of_free_ctx = local_ctx_buffers_free();
10651080
zassert_equal(nr_of_free_ctx, 1, NULL);
10661081

1067-
ctx1 = proc_ctx_acquire(&mem_ctx);
1082+
ctx1 = proc_ctx_acquire(&mem_local_ctx);
10681083

10691084
/* Releasing returns the context to the avilable pool */
10701085
zassert_not_null(ctx1, NULL);
@@ -1141,7 +1156,7 @@ void test_int_create_proc(void)
11411156

11421157
ull_cp_init();
11431158

1144-
ctx = create_procedure(PROC_VERSION_EXCHANGE, &mem_ctx);
1159+
ctx = create_procedure(PROC_VERSION_EXCHANGE, &mem_local_ctx);
11451160
zassert_not_null(ctx, NULL);
11461161

11471162
zassert_equal(ctx->proc, PROC_VERSION_EXCHANGE, NULL);
@@ -1150,7 +1165,7 @@ void test_int_create_proc(void)
11501165

11511166
for (int i = 0U; i < CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM; i++) {
11521167
zassert_not_null(ctx, NULL);
1153-
ctx = create_procedure(PROC_VERSION_EXCHANGE, &mem_ctx);
1168+
ctx = create_procedure(PROC_VERSION_EXCHANGE, &mem_local_ctx);
11541169
}
11551170

11561171
zassert_is_null(ctx, NULL);

subsys/bluetooth/controller/ll_sw/ull_llcp_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,5 +626,5 @@ bool lr_is_disconnected(struct ll_conn *conn);
626626
bool lr_is_idle(struct ll_conn *conn);
627627
bool rr_is_disconnected(struct ll_conn *conn);
628628
bool rr_is_idle(struct ll_conn *conn);
629-
int ctx_buffers_free(void);
629+
uint16_t ctx_buffers_free(void);
630630
#endif

tests/bluetooth/controller/common/include/helper_util.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
*/
77

88
void test_print_conn(struct ll_conn *conn);
9-
9+
uint16_t test_ctx_buffers_cnt(void);
1010
void test_set_role(struct ll_conn *conn, uint8_t role);
1111
void test_setup(struct ll_conn *conn);
12+
1213
void event_prepare(struct ll_conn *conn);
1314
void event_tx_ack(struct ll_conn *conn, struct node_tx *tx);
1415
void event_done(struct ll_conn *conn);

tests/bluetooth/controller/common/src/helper_util.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static uint32_t event_active;
4242
static uint16_t lazy;
4343
sys_slist_t ut_rx_q;
4444
static sys_slist_t lt_tx_q;
45+
static uint32_t no_of_ctx_buffers_at_test_setup;
4546

4647
#define PDU_DC_LL_HEADER_SIZE (offsetof(struct pdu_data, lldata))
4748
#define NODE_RX_HEADER_SIZE (offsetof(struct node_rx_pdu, pdu))
@@ -192,6 +193,11 @@ void test_print_conn(struct ll_conn *conn)
192193
printf("--------------------->\n");
193194
}
194195

196+
uint16_t test_ctx_buffers_cnt(void)
197+
{
198+
return no_of_ctx_buffers_at_test_setup;
199+
}
200+
195201
void test_setup(struct ll_conn *conn)
196202
{
197203
ull_conn_init();
@@ -218,6 +224,8 @@ void test_setup(struct ll_conn *conn)
218224
conn->lll.event_counter = 0;
219225
event_active = 0;
220226
lazy = 0;
227+
228+
no_of_ctx_buffers_at_test_setup = ctx_buffers_free();
221229
}
222230

223231

tests/bluetooth/controller/ctrl_api/src/main.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ void test_int_disconnect_loc(void)
107107
ull_cp_state_set(&conn, ULL_CP_CONNECTED);
108108

109109
nr_free_ctx = ctx_buffers_free();
110-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
110+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
111111

112112
err = ull_cp_version_exchange(&conn);
113113
zassert_equal(err, BT_HCI_ERR_SUCCESS, NULL);
114114

115115
nr_free_ctx = ctx_buffers_free();
116-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM - 1, NULL);
116+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt() - 1, NULL);
117117

118118
event_prepare(&conn);
119119
lt_rx(LL_VERSION_IND, &conn, &tx, &local_version_ind);
@@ -126,7 +126,7 @@ void test_int_disconnect_loc(void)
126126
ull_cp_state_set(&conn, ULL_CP_DISCONNECTED);
127127

128128
nr_free_ctx = ctx_buffers_free();
129-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
129+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
130130

131131
ut_rx_q_is_empty();
132132

@@ -137,7 +137,7 @@ void test_int_disconnect_loc(void)
137137
event_done(&conn);
138138

139139
nr_free_ctx = ctx_buffers_free();
140-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
140+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
141141

142142
/*
143143
* all buffers should still be empty
@@ -165,15 +165,15 @@ void test_int_disconnect_rem(void)
165165
ull_cp_state_set(&conn, ULL_CP_CONNECTED);
166166

167167
nr_free_ctx = ctx_buffers_free();
168-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
168+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
169169
/* Prepare */
170170
event_prepare(&conn);
171171

172172
/* Rx */
173173
lt_tx(LL_VERSION_IND, &conn, &remote_version_ind);
174174

175175
nr_free_ctx = ctx_buffers_free();
176-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
176+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
177177

178178
/* Disconnect before we reply */
179179

@@ -189,7 +189,7 @@ void test_int_disconnect_rem(void)
189189
event_done(&conn);
190190

191191
nr_free_ctx = ctx_buffers_free();
192-
zassert_equal(nr_free_ctx, CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM, NULL);
192+
zassert_equal(nr_free_ctx, test_ctx_buffers_cnt(), NULL);
193193

194194
/* There should not be a host notifications */
195195
ut_rx_q_is_empty();

tests/bluetooth/controller/ctrl_chmu/src/main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void test_channel_map_update_central_loc(void)
125125
zassert_mem_equal(conn.lll.data_chan_map, chm, sizeof(conn.lll.data_chan_map),
126126
"Channel map invalid");
127127

128-
zassert_equal(ctx_buffers_free(), CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM,
128+
zassert_equal(ctx_buffers_free(), test_ctx_buffers_cnt(),
129129
"Free CTX buffers %d", ctx_buffers_free());
130130
}
131131

@@ -193,7 +193,7 @@ void test_channel_map_update_periph_rem(void)
193193
zassert_mem_equal(conn.lll.data_chan_map, chm, sizeof(conn.lll.data_chan_map),
194194
"Channel map invalid");
195195

196-
zassert_equal(ctx_buffers_free(), CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM,
196+
zassert_equal(ctx_buffers_free(), test_ctx_buffers_cnt(),
197197
"Free CTX buffers %d", ctx_buffers_free());
198198
}
199199

@@ -211,7 +211,7 @@ void test_channel_map_update_periph_loc(void)
211211
err = ull_cp_chan_map_update(&conn, chm);
212212
zassert_equal(err, BT_HCI_ERR_CMD_DISALLOWED, NULL);
213213

214-
zassert_equal(ctx_buffers_free(), CONFIG_BT_CTLR_LLCP_PROC_CTX_BUF_NUM,
214+
zassert_equal(ctx_buffers_free(), test_ctx_buffers_cnt(),
215215
"Free CTX buffers %d", ctx_buffers_free());
216216
}
217217

0 commit comments

Comments
 (0)