fixeria has submitted this change. ( 
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, 77 insertions(+), 5 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/layer23/src/modem/rlcmac.c 
b/src/host/layer23/src/modem/rlcmac.c
index 7cd1ba4..6e39273 100644
--- a/src/host/layer23/src/modem/rlcmac.c
+++ b/src/host/layer23/src/modem/rlcmac.c
@@ -30,13 +30,19 @@
 #include <osmocom/core/logging.h>

 #include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/gsm0502.h>
+
 #include <osmocom/gprs/rlcmac/rlcmac_prim.h>
 #include <osmocom/gprs/rlcmac/rlcmac.h>
 #include <osmocom/gprs/llc/llc_prim.h>

 #include <osmocom/bb/common/logging.h>
+#include <osmocom/bb/common/l1ctl.h>
 #include <osmocom/bb/common/ms.h>
 #include <osmocom/bb/modem/rlcmac.h>
+#include <osmocom/bb/modem/grr.h>
+
+#include <l1ctl_proto.h>

 static int modem_rlcmac_handle_grr(struct osmo_gprs_rlcmac_prim *rlcmac_prim)
 {
@@ -108,17 +114,70 @@
        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 @@

        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;
 }

--
To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/31572
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I38e9a686f8edc3fe55f961d75e68602c33bbbaaf
Gerrit-Change-Number: 31572
Gerrit-PatchSet: 9
Gerrit-Owner: fixeria <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to