fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmocom-bb/+/32628 )
Change subject: trxcon/l1sched: allocate primitives of fixed size (64 + 64) ......................................................................
trxcon/l1sched: allocate primitives of fixed size (64 + 64)
When running trxcon with GSMTAP Um logging enabled (-g cmd line arg), in handle_prim_rach_cnf() we msgb_put() one or two bytes to the given msgb. This causes a segfault, because the L1SCHED_PRIM_T_RACH prims have 0 tailroom bytes available.
While we could allocate L1SCHED_PRIM_T_RACH with a few extra bytes, a more fundamental approach is to allocate all l1sched primitives with a fixed tailroom.
Change-Id: Ica87b147e11744a69dcd7c056376dcf6b98f9ca6 Fixes: ff9db9de "trxcon/l1sched: rework the primitive API" Related: OS#5500 --- M src/host/trxcon/include/osmocom/bb/l1sched/prim.h M src/host/trxcon/src/sched_lchan_sch.c M src/host/trxcon/src/sched_prim.c M src/host/trxcon/src/sched_trx.c M src/host/trxcon/src/trxcon_fsm.c 5 files changed, 33 insertions(+), 14 deletions(-)
Approvals: laforge: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified
diff --git a/src/host/trxcon/include/osmocom/bb/l1sched/prim.h b/src/host/trxcon/include/osmocom/bb/l1sched/prim.h index 0981dc9..0575ad8 100644 --- a/src/host/trxcon/include/osmocom/bb/l1sched/prim.h +++ b/src/host/trxcon/include/osmocom/bb/l1sched/prim.h @@ -114,8 +114,7 @@ enum osmo_prim_operation op);
struct msgb *l1sched_prim_alloc(enum l1sched_prim_type type, - enum osmo_prim_operation op, - size_t extra_size); + enum osmo_prim_operation op);
struct msgb *l1sched_lchan_prim_dequeue(struct l1sched_lchan_state *lchan, uint32_t fn); void l1sched_lchan_prim_assign_dummy(struct l1sched_lchan_state *lchan); diff --git a/src/host/trxcon/src/sched_lchan_sch.c b/src/host/trxcon/src/sched_lchan_sch.c index f433de6..e242005 100644 --- a/src/host/trxcon/src/sched_lchan_sch.c +++ b/src/host/trxcon/src/sched_lchan_sch.c @@ -66,7 +66,7 @@ struct l1sched_prim *prim; struct msgb *msg;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_SCH, PRIM_OP_INDICATION, 0); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_SCH, PRIM_OP_INDICATION); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); diff --git a/src/host/trxcon/src/sched_prim.c b/src/host/trxcon/src/sched_prim.c index 5f0ee29..380d5a8 100644 --- a/src/host/trxcon/src/sched_prim.c +++ b/src/host/trxcon/src/sched_prim.c @@ -35,7 +35,8 @@ #include <osmocom/bb/l1sched/l1sched.h> #include <osmocom/bb/l1sched/logging.h>
-#define L1SCHED_PRIM_HEADROOM 128 +#define L1SCHED_PRIM_HEADROOM 64 +#define L1SCHED_PRIM_TAILROOM 64
osmo_static_assert(sizeof(struct l1sched_prim) <= L1SCHED_PRIM_HEADROOM, l1sched_prim_size);
@@ -61,12 +62,11 @@ }
struct msgb *l1sched_prim_alloc(enum l1sched_prim_type type, - enum osmo_prim_operation op, - size_t extra_size) + enum osmo_prim_operation op) { struct msgb *msg;
- msg = msgb_alloc_headroom(L1SCHED_PRIM_HEADROOM + extra_size, + msg = msgb_alloc_headroom(L1SCHED_PRIM_HEADROOM + L1SCHED_PRIM_TAILROOM, L1SCHED_PRIM_HEADROOM, "l1sched_prim"); if (msg == NULL) return NULL; @@ -89,7 +89,7 @@ bool cached;
/* Allocate a new primitive */ - msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST, GSM_MACBLOCK_LEN); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); @@ -469,7 +469,7 @@ if (!prim_len) return;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST, prim_len); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); @@ -498,7 +498,7 @@
lchan_desc = &l1sched_lchan_desc[lchan->type];
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_INDICATION, data_len); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_INDICATION); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); diff --git a/src/host/trxcon/src/sched_trx.c b/src/host/trxcon/src/sched_trx.c index bcd24f0..ccac32c 100644 --- a/src/host/trxcon/src/sched_trx.c +++ b/src/host/trxcon/src/sched_trx.c @@ -74,7 +74,7 @@ struct l1sched_prim *prim; struct msgb *msg;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_PCHAN_COMB, PRIM_OP_INDICATION, 0); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_PCHAN_COMB, PRIM_OP_INDICATION); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); diff --git a/src/host/trxcon/src/trxcon_fsm.c b/src/host/trxcon/src/trxcon_fsm.c index 598f2bd..eabab3d 100644 --- a/src/host/trxcon/src/trxcon_fsm.c +++ b/src/host/trxcon/src/trxcon_fsm.c @@ -286,7 +286,7 @@ struct l1sched_prim *prim; struct msgb *msg;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_RACH, PRIM_OP_REQUEST, 0); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_RACH, PRIM_OP_REQUEST); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); @@ -492,7 +492,7 @@ struct l1sched_prim *prim; struct msgb *msg;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST, req->data_len); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg); @@ -563,7 +563,7 @@ if (l1gprs_handle_ul_block_req(trxcon->gprs, &block_req, msg) != 0) return;
- msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST, block_req.data_len); + msg = l1sched_prim_alloc(L1SCHED_PRIM_T_DATA, PRIM_OP_REQUEST); OSMO_ASSERT(msg != NULL);
prim = l1sched_prim_from_msgb(msg);