pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/35782?usp=email )
Change subject: rlcmac: Add new structure to allow passing FN+TN to TBF handling functions ......................................................................
rlcmac: Add new structure to allow passing FN+TN to TBF handling functions
The different paths will be updated as required as needed in the future. Until now it was difficult while still valuable to have access to current FN+TS, even if only for logging.
Follow up patch will use this info to be able to calculate poll FN from RRBP more deep in the stack (ul_tbf_fsm).
Change-Id: Ifa09cd70c915aa3a2b799412cb02315aaebc0503 --- M include/osmocom/gprs/rlcmac/rlcmac_private.h M include/osmocom/gprs/rlcmac/tbf_ul.h M src/rlcmac/rlcmac.c M src/rlcmac/tbf_ul.c 4 files changed, 64 insertions(+), 49 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/82/35782/1
diff --git a/include/osmocom/gprs/rlcmac/rlcmac_private.h b/include/osmocom/gprs/rlcmac/rlcmac_private.h index 0fefd11..75f7028 100644 --- a/include/osmocom/gprs/rlcmac/rlcmac_private.h +++ b/include/osmocom/gprs/rlcmac/rlcmac_private.h @@ -42,6 +42,13 @@ struct gprs_rlcmac_dl_tbf_allocation_ts ts[8]; };
+/* PDCH_DATA.ind coming from lower layers, but with data already decoded as RlcMacDownlink_t */ +struct gprs_rlcmac_dl_block_ind { + RlcMacDownlink_t dl_block; + uint32_t fn; + uint8_t ts_nr; +}; + extern int g_rlcmac_log_cat[_OSMO_GPRS_RLCMAC_LOGC_MAX];
#define LOGRLCMAC(lvl, fmt, args...) LOGP(g_rlcmac_log_cat[OSMO_GPRS_RLCMAC_LOGC_RLCMAC], lvl, fmt, ## args) diff --git a/include/osmocom/gprs/rlcmac/tbf_ul.h b/include/osmocom/gprs/rlcmac/tbf_ul.h index bb0231e..c30a566 100644 --- a/include/osmocom/gprs/rlcmac/tbf_ul.h +++ b/include/osmocom/gprs/rlcmac/tbf_ul.h @@ -73,8 +73,7 @@ int gprs_rlcmac_ul_tbf_handle_pkt_ul_ack_nack(struct gprs_rlcmac_ul_tbf *ul_tbf, const RlcMacDownlink_t *dl_block); int gprs_rlcmac_ul_tbf_handle_pkt_ul_ass(struct gprs_rlcmac_ul_tbf *ul_tbf, - const struct osmo_gprs_rlcmac_prim *rlcmac_prim, - const RlcMacDownlink_t *dl_block); + const struct gprs_rlcmac_dl_block_ind *dlbi);
static inline struct gprs_rlcmac_tbf *ul_tbf_as_tbf(struct gprs_rlcmac_ul_tbf *ul_tbf) { diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c index ac168c2..590bb49 100644 --- a/src/rlcmac/rlcmac.c +++ b/src/rlcmac/rlcmac.c @@ -642,10 +642,11 @@ }
-static int gprs_rlcmac_handle_pkt_dl_ass(const struct osmo_gprs_rlcmac_prim *rlcmac_prim, const RlcMacDownlink_t *dl_block) +static int gprs_rlcmac_handle_pkt_dl_ass(const struct gprs_rlcmac_dl_block_ind *dlbi) { struct gprs_rlcmac_tbf *tbf = NULL; struct gprs_rlcmac_entity *gre = NULL; + const RlcMacDownlink_t *dl_block = &dlbi->dl_block; const Packet_Downlink_Assignment_t *dlass = &dl_block->u.Packet_Downlink_Assignment; struct tbf_start_ev_rx_pacch_pkt_ass_ctx ev_data; int rc; @@ -666,21 +667,20 @@
if (!gre) { LOGRLCMAC(LOGL_INFO, "TS=%u FN=%u Rx Pkt DL ASS: MS not found\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn); + dlbi->ts_nr, dlbi->fn); return -ENOENT; }
ev_data = (struct tbf_start_ev_rx_pacch_pkt_ass_ctx) { - .ts_nr = rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - .fn = rlcmac_prim->l1ctl.pdch_data_ind.fn, + .ts_nr = dlbi->ts_nr, + .fn = dlbi->fn, .dl_block = dl_block, }; rc = gprs_rlcmac_tbf_start_from_pacch(&gre->dl_tbf_dl_ass_fsm, &ev_data);
if (dl_block->SP) { - uint32_t poll_fn = rrbp2fn(rlcmac_prim->l1ctl.pdch_data_ind.fn, dl_block->RRBP); - gprs_rlcmac_pdch_ulc_reserve(g_rlcmac_ctx->sched.ulc[rlcmac_prim->l1ctl.pdch_data_ind.ts_nr], + uint32_t poll_fn = rrbp2fn(dlbi->fn, dl_block->RRBP); + gprs_rlcmac_pdch_ulc_reserve(g_rlcmac_ctx->sched.ulc[dlbi->ts_nr], poll_fn, GPRS_RLCMAC_PDCH_ULC_POLL_DL_ASS, gre); @@ -698,37 +698,35 @@ return rc; }
-static int gprs_rlcmac_handle_pkt_ul_ack_nack(const struct osmo_gprs_rlcmac_prim *rlcmac_prim, const RlcMacDownlink_t *dl_block) +static int gprs_rlcmac_handle_pkt_ul_ack_nack(const struct gprs_rlcmac_dl_block_ind *dlbi) { struct gprs_rlcmac_ul_tbf *ul_tbf; int rc; - const Packet_Uplink_Ack_Nack_t *pkt_ul_ack = &dl_block->u.Packet_Uplink_Ack_Nack; + const Packet_Uplink_Ack_Nack_t *pkt_ul_ack = &dlbi->dl_block.u.Packet_Uplink_Ack_Nack;
ul_tbf = gprs_rlcmac_find_ul_tbf_by_tfi(pkt_ul_ack->UPLINK_TFI); if (!ul_tbf) { LOGRLCMAC(LOGL_INFO, "TS=%u FN=%u Rx Pkt UL ACK/NACK: UL_TBF TFI=%u not found\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn, - pkt_ul_ack->UPLINK_TFI); + dlbi->ts_nr, dlbi->fn, pkt_ul_ack->UPLINK_TFI); return -ENOENT; }
- rc = gprs_rlcmac_ul_tbf_handle_pkt_ul_ack_nack(ul_tbf, dl_block); + rc = gprs_rlcmac_ul_tbf_handle_pkt_ul_ack_nack(ul_tbf, &dlbi->dl_block);
/* If RRBP contains valid data, schedule a response (PKT CONTROL ACK or PKT RESOURCE REQ). */ - if (dl_block->SP) { - uint32_t poll_fn = rrbp2fn(rlcmac_prim->l1ctl.pdch_data_ind.fn, dl_block->RRBP); - gprs_rlcmac_pdch_ulc_reserve(g_rlcmac_ctx->sched.ulc[rlcmac_prim->l1ctl.pdch_data_ind.ts_nr], poll_fn, + if (dlbi->dl_block.SP) { + uint32_t poll_fn = rrbp2fn(dlbi->fn, dlbi->dl_block.RRBP); + gprs_rlcmac_pdch_ulc_reserve(g_rlcmac_ctx->sched.ulc[dlbi->ts_nr], poll_fn, GPRS_RLCMAC_PDCH_ULC_POLL_UL_ACK, ul_tbf_as_tbf(ul_tbf)); } return rc; }
-static int gprs_rlcmac_handle_pkt_ul_ass(const struct osmo_gprs_rlcmac_prim *rlcmac_prim, const RlcMacDownlink_t *dl_block) +static int gprs_rlcmac_handle_pkt_ul_ass(const struct gprs_rlcmac_dl_block_ind *dlbi) { struct gprs_rlcmac_entity *gre = NULL; - const Packet_Uplink_Assignment_t *ulass = &dl_block->u.Packet_Uplink_Assignment; + const Packet_Uplink_Assignment_t *ulass = &dlbi->dl_block.u.Packet_Uplink_Assignment; int rc;
/* Attempt to find relevant MS owning UL TBF in assignment state from ID (set "gre" ptr): */ @@ -742,27 +740,23 @@ case 2: /* TQI */ case 3: /* Packet_Request_Reference */ LOGRLCMAC(LOGL_NOTICE, "TS=%u FN=%u Rx Pkt UL ASS: HANDLING OF ID=%u NOT IMPLEMENTED!\n", - ulass->ID.UnionType, - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn); + ulass->ID.UnionType, dlbi->ts_nr, dlbi->fn); break; }
if (!gre) { LOGRLCMAC(LOGL_INFO, "TS=%u FN=%u Rx Pkt UL ASS: MS not found\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn); + dlbi->ts_nr, dlbi->fn); return -ENOENT; }
if (!gre->ul_tbf) { LOGGRE(gre, LOGL_INFO, "TS=%u FN=%u Rx Pkt UL ASS: MS has no UL TBF\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn); + dlbi->ts_nr, dlbi->fn); return -ENOENT; }
- rc = gprs_rlcmac_ul_tbf_handle_pkt_ul_ass(gre->ul_tbf, rlcmac_prim, dl_block); + rc = gprs_rlcmac_ul_tbf_handle_pkt_ul_ass(gre->ul_tbf, dlbi);
return rc; } @@ -770,7 +764,7 @@ static int gprs_rlcmac_handle_gprs_dl_ctrl_block(const struct osmo_gprs_rlcmac_prim *rlcmac_prim) { struct bitvec *bv; - RlcMacDownlink_t *dl_ctrl_block; + struct gprs_rlcmac_dl_block_ind *dlbi; size_t max_len = gprs_rlcmac_mcs_max_bytes_dl(GPRS_RLCMAC_CS_1); int rc;
@@ -778,9 +772,11 @@ OSMO_ASSERT(bv); bitvec_unpack(bv, rlcmac_prim->l1ctl.pdch_data_ind.data);
- dl_ctrl_block = (RlcMacDownlink_t *)talloc_zero(g_rlcmac_ctx, RlcMacDownlink_t); - OSMO_ASSERT(dl_ctrl_block); - rc = osmo_gprs_rlcmac_decode_downlink(bv, dl_ctrl_block); + dlbi = (struct gprs_rlcmac_dl_block_ind *)talloc_zero(g_rlcmac_ctx, struct gprs_rlcmac_dl_block_ind); + dlbi->fn = rlcmac_prim->l1ctl.pdch_data_ind.fn; + dlbi->ts_nr = rlcmac_prim->l1ctl.pdch_data_ind.ts_nr; + OSMO_ASSERT(dlbi); + rc = osmo_gprs_rlcmac_decode_downlink(bv, &dlbi->dl_block); if (rc < 0) { LOGRLCMAC(LOGL_NOTICE, "Failed decoding dl ctrl block: %s\n", osmo_hexdump(rlcmac_prim->l1ctl.pdch_data_ind.data, @@ -788,32 +784,30 @@ goto free_ret; }
- LOGRLCMAC(LOGL_INFO, "TS=%u FN=%u Rx %s\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn, - get_value_string(osmo_gprs_rlcmac_dl_msg_type_names, dl_ctrl_block->u.MESSAGE_TYPE)); + LOGRLCMAC(LOGL_INFO, "TS=%u FN=%u Rx %s\n", dlbi->ts_nr, dlbi->fn, + get_value_string(osmo_gprs_rlcmac_dl_msg_type_names, dlbi->dl_block.u.MESSAGE_TYPE));
- switch (dl_ctrl_block->u.MESSAGE_TYPE) { + switch (dlbi->dl_block.u.MESSAGE_TYPE) { case OSMO_GPRS_RLCMAC_DL_MSGT_PACKET_DOWNLINK_ASSIGNMENT: - rc = gprs_rlcmac_handle_pkt_dl_ass(rlcmac_prim, dl_ctrl_block); + rc = gprs_rlcmac_handle_pkt_dl_ass(dlbi); break; case OSMO_GPRS_RLCMAC_DL_MSGT_PACKET_UPLINK_ACK_NACK: - rc = gprs_rlcmac_handle_pkt_ul_ack_nack(rlcmac_prim, dl_ctrl_block); + rc = gprs_rlcmac_handle_pkt_ul_ack_nack(dlbi); break; case OSMO_GPRS_RLCMAC_DL_MSGT_PACKET_UPLINK_ASSIGNMENT: - rc = gprs_rlcmac_handle_pkt_ul_ass(rlcmac_prim, dl_ctrl_block); + rc = gprs_rlcmac_handle_pkt_ul_ass(dlbi); break; case OSMO_GPRS_RLCMAC_DL_MSGT_PACKET_DOWNLINK_DUMMY_CONTROL_BLOCK: break; /* Ignore dummy blocks */ default: LOGRLCMAC(LOGL_ERROR, "TS=%u FN=%u Rx %s NOT SUPPORTED! ignoring\n", - rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - rlcmac_prim->l1ctl.pdch_data_ind.fn, - get_value_string(osmo_gprs_rlcmac_dl_msg_type_names, dl_ctrl_block->u.MESSAGE_TYPE)); + dlbi->ts_nr, + dlbi->fn, + get_value_string(osmo_gprs_rlcmac_dl_msg_type_names, dlbi->dl_block.u.MESSAGE_TYPE)); }
free_ret: - talloc_free(dl_ctrl_block); + talloc_free(dlbi); bitvec_free(bv); return rc; } diff --git a/src/rlcmac/tbf_ul.c b/src/rlcmac/tbf_ul.c index 34268ee..c6d81d4 100644 --- a/src/rlcmac/tbf_ul.c +++ b/src/rlcmac/tbf_ul.c @@ -352,14 +352,13 @@ }
int gprs_rlcmac_ul_tbf_handle_pkt_ul_ass(struct gprs_rlcmac_ul_tbf *ul_tbf, - const struct osmo_gprs_rlcmac_prim *rlcmac_prim, - const RlcMacDownlink_t *dl_block) + const struct gprs_rlcmac_dl_block_ind *dlbi) { int rc; struct tbf_ul_ass_ev_rx_pkt_ul_ass_ctx d = { - .ts_nr = rlcmac_prim->l1ctl.pdch_data_ind.ts_nr, - .fn = rlcmac_prim->l1ctl.pdch_data_ind.fn, - .dl_block = dl_block, + .ts_nr = dlbi->ts_nr, + .fn = dlbi->fn, + .dl_block = &dlbi->dl_block, };
rc = osmo_fsm_inst_dispatch(ul_tbf->ul_ass_fsm.fi, GPRS_RLCMAC_TBF_UL_ASS_EV_RX_PKT_UL_ASS, &d);