fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/31572 )
Change subject: modem: route L1CTL prims to/from libosmo-gprs-rlcmac ......................................................................
modem: route L1CTL prims to/from libosmo-gprs-rlcmac
Change-Id: I38e9a686f8edc3fe55f961d75e68602c33bbbaaf Related: OS#5500 --- M src/host/layer23/src/modem/rlcmac.c 1 file changed, 78 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/72/31572/1
diff --git a/src/host/layer23/src/modem/rlcmac.c b/src/host/layer23/src/modem/rlcmac.c index 83dcd6c..3a391ed 100644 --- a/src/host/layer23/src/modem/rlcmac.c +++ b/src/host/layer23/src/modem/rlcmac.c @@ -36,10 +36,13 @@ #include <osmocom/gprs/llc/llc_prim.h>
#include <osmocom/bb/common/logging.h> +#include <osmocom/bb/common/l1ctl.h> #include <osmocom/bb/common/apn.h> #include <osmocom/bb/common/ms.h> #include <osmocom/bb/modem/rlcmac.h>
+#include <l1ctl_proto.h> + static int modem_rlcmac_handle_grr(struct osmo_gprs_rlcmac_prim *rlcmac_prim) { int rc; @@ -110,12 +113,50 @@ return rc; }
+static int modem_rlcmac_handle_l1ctl(struct osmocom_ms *ms, + const struct osmo_gprs_rlcmac_prim *rlcmac_prim) +{ + const struct osmo_gprs_rlcmac_l1ctl_prim *prim = &rlcmac_prim->l1ctl; + + switch (rlcmac_prim->oph.primitive) { + case OSMO_GPRS_RLCMAC_L1CTL_RACH: + if (prim->rach_req.is_11bit) { + LOGP(DRLCMAC, LOGL_NOTICE, + "%s(): 11-bit RACH is not supported\n", __func__); + return -ENOTSUP; + } + return l1ctl_tx_rach_req(ms, 0, 0, prim->rach_req.ra, 0, 0); + case OSMO_GPRS_RLCMAC_L1CTL_PDCH_DATA: + return l1ctl_tx_gprs_ul_block_req(ms, prim->pdch_data_req.fn, + prim->pdch_data_req.ts_nr, + prim->pdch_data_req.data, + prim->pdch_data_req.data_len); + case OSMO_GPRS_RLCMAC_L1CTL_CFG_UL_TBF: + return l1ctl_tx_gprs_ul_tbf_cfg_req(ms, prim->cfg_ul_tbf_req.ul_tbf_nr, + prim->cfg_ul_tbf_req.ul_slotmask); + case OSMO_GPRS_RLCMAC_L1CTL_CFG_DL_TBF: + return l1ctl_tx_gprs_dl_tbf_cfg_req(ms, prim->cfg_dl_tbf_req.dl_tbf_nr, + prim->cfg_dl_tbf_req.dl_slotmask, + prim->cfg_dl_tbf_req.dl_tfi); + default: + LOGP(DRLCMAC, LOGL_DEBUG, + "%s(): Unexpected L1CTL prim 0x%02x\n", + __func__, rlcmac_prim->oph.primitive); + return -ENOTSUP; + } +} + static int modem_rlcmac_prim_down_cb(struct osmo_gprs_rlcmac_prim *rlcmac_prim, void *user_data) { const char *pdu_name = osmo_gprs_rlcmac_prim_name(rlcmac_prim); + struct osmocom_ms *ms = user_data; int rc = 0;
switch (rlcmac_prim->oph.sap) { + case OSMO_GPRS_RLCMAC_SAP_L1CTL: + LOGP(DRLCMAC, LOGL_DEBUG, "%s(): Rx %s\n", __func__, pdu_name); + rc = modem_rlcmac_handle_l1ctl(ms, rlcmac_prim); + break; default: LOGP(DRLCMAC, LOGL_DEBUG, "%s(): Unexpected Rx %s\n", __func__, pdu_name); OSMO_ASSERT(0); @@ -123,6 +164,30 @@ 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; + struct osmo_gprs_rlcmac_prim *prim; + + /* FIXME: rlcmac_prim_l1ctl_alloc() is not exposed */ + prim = rlcmac_prim_l1ctl_alloc(OSMO_GPRS_RLCMAC_L1CTL_PDCH_DATA, + PRIM_OP_INDICATION, msgb_l2len(msg)); + prim->l1ctl = (struct osmo_gprs_rlcmac_l1ctl_prim) { + .pdch_data_ind = { + /* TODO: ind->usf */ + .fn = osmo_load32be(&ind->hdr.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), + } + }; + + return osmo_gprs_rlcmac_prim_lower_up(prim); +} + int modem_rlcmac_init(struct osmocom_ms *ms) { int rc; @@ -134,5 +199,8 @@
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; }