From 3b582af2eb05071961ef1c8b77b4210c2335f4d1 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Sun, 19 Feb 2023 16:15:53 +0700 Subject: [PATCH] modem: route L1CTL prims to/from libosmo-gprs-rlcmac Change-Id: I38e9a686f8edc3fe55f961d75e68602c33bbbaaf Related: OS#5500 --- src/host/layer23/src/modem/rlcmac.c | 72 +++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/src/host/layer23/src/modem/rlcmac.c b/src/host/layer23/src/modem/rlcmac.c index 7cd1ba4c2..6e39273ed 100644 --- a/src/host/layer23/src/modem/rlcmac.c +++ b/src/host/layer23/src/modem/rlcmac.c @@ -30,13 +30,19 @@ #include #include +#include + #include #include #include #include +#include #include #include +#include + +#include static int modem_rlcmac_handle_grr(struct osmo_gprs_rlcmac_prim *rlcmac_prim) { @@ -108,17 +114,70 @@ static int modem_rlcmac_prim_up_cb(struct osmo_gprs_rlcmac_prim *rlcmac_prim, vo return rc; } -static int modem_rlcmac_prim_down_cb(struct osmo_gprs_rlcmac_prim *rlcmac_prim, void *user_data) +static int modem_rlcmac_prim_down_cb(struct osmo_gprs_rlcmac_prim *prim, void *user_data) { - const char *pdu_name = osmo_gprs_rlcmac_prim_name(rlcmac_prim); - int rc = 0; + const struct osmo_gprs_rlcmac_l1ctl_prim *lp = &prim->l1ctl; + const char *pdu_name = osmo_gprs_rlcmac_prim_name(prim); + struct osmocom_ms *ms = user_data; - switch (rlcmac_prim->oph.sap) { + switch (OSMO_PRIM_HDR(&prim->oph)) { + case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_RACH, PRIM_OP_REQUEST): + if (lp->rach_req.is_11bit) { + LOGP(DRLCMAC, LOGL_NOTICE, + "%s(): 11-bit RACH is not supported\n", __func__); + return -ENOTSUP; + } + return modem_grr_tx_chan_req(ms, lp->rach_req.ra); + case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_PDCH_DATA, PRIM_OP_REQUEST): + return l1ctl_tx_gprs_ul_block_req(ms, + lp->pdch_data_req.fn, + lp->pdch_data_req.ts_nr, + lp->pdch_data_req.data, + lp->pdch_data_req.data_len); + case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_CFG_UL_TBF, PRIM_OP_REQUEST): + return l1ctl_tx_gprs_ul_tbf_cfg_req(ms, + lp->cfg_ul_tbf_req.ul_tbf_nr, + lp->cfg_ul_tbf_req.ul_slotmask); + case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_CFG_DL_TBF, PRIM_OP_REQUEST): + return l1ctl_tx_gprs_dl_tbf_cfg_req(ms, + lp->cfg_dl_tbf_req.dl_tbf_nr, + lp->cfg_dl_tbf_req.dl_slotmask, + lp->cfg_dl_tbf_req.dl_tfi); default: LOGP(DRLCMAC, LOGL_DEBUG, "%s(): Unexpected Rx %s\n", __func__, pdu_name); OSMO_ASSERT(0); } - return rc; +} + +static int l1ctl_dl_block_cb(struct osmocom_ms *ms, struct msgb *msg) +{ + const struct l1ctl_gprs_dl_block_ind *ind = (void *)msg->l1h; + const uint32_t fn = osmo_load32be(&ind->hdr.fn); + struct osmo_gprs_rlcmac_prim *prim; + + /* FIXME: sadly, rlcmac_prim_l1ctl_alloc() is not exposed */ + prim = osmo_gprs_rlcmac_prim_alloc_l1ctl_pdch_data_ind(0, 0, 0, 0, 0, NULL, 0); + prim->l1ctl = (struct osmo_gprs_rlcmac_l1ctl_prim) { + .pdch_data_ind = { + .fn = fn, + .ts_nr = ind->hdr.tn, + .rx_lev = ind->meas.rx_lev, + .ber10k = osmo_load16be(&ind->meas.ber10k), + .ci_cb = osmo_load16be(&ind->meas.ci_cb), + .data_len = msgb_l2len(msg), + .data = msgb_l2(msg), + } + }; + osmo_gprs_rlcmac_prim_lower_up(prim); + + /* Every fn % 13 == 12 we have either a PTCCH or an IDLE slot, thus + * every fn % 13 == 8 we add 5 frames, or 4 frames othrwise. The + * resulting value is first fn of the next block. */ + const uint32_t rts_fn = GSM_TDMA_FN_SUM(fn, (fn % 13 == 8) ? 5 : 4); + prim = osmo_gprs_rlcmac_prim_alloc_l1ctl_pdch_rts_ind(ind->hdr.tn, rts_fn, ind->usf); + osmo_gprs_rlcmac_prim_lower_up(prim); + + return 0; } int modem_rlcmac_init(struct osmocom_ms *ms) @@ -132,5 +191,8 @@ int modem_rlcmac_init(struct osmocom_ms *ms) osmo_gprs_rlcmac_prim_set_up_cb(modem_rlcmac_prim_up_cb, ms); osmo_gprs_rlcmac_prim_set_down_cb(modem_rlcmac_prim_down_cb, ms); + + ms->l1_entity.l1_gprs_dl_block_ind = &l1ctl_dl_block_cb; + return rc; }