pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmocom-bb/+/33902 )


Change subject: modem: handle OSMO_GPRS_RLCMAC_L1CTL_PDCH_{ESTABLISH,RELEASE}
......................................................................

modem: handle OSMO_GPRS_RLCMAC_L1CTL_PDCH_{ESTABLISH,RELEASE}

Change-Id: Ic39ce696834943dc661c85cbf3d54ccd598b60ce
Depends: libosmo-gprs.git I2568c58646ce7511367275ac96cd55e7fdd7ec18
---
M src/host/layer23/src/modem/grr.c
M src/host/layer23/src/modem/rlcmac.c
2 files changed, 57 insertions(+), 65 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/02/33902/1

diff --git a/src/host/layer23/src/modem/grr.c b/src/host/layer23/src/modem/grr.c
index a7185fe..cf94695 100644
--- a/src/host/layer23/src/modem/grr.c
+++ b/src/host/layer23/src/modem/grr.c
@@ -226,8 +226,6 @@
 {
        const struct gsm48_imm_ass *ia = msgb_l3(msg);
        struct gsm48_rrlayer *rr = &ms->rrlayer;
-       uint8_t ch_type, ch_subch, ch_ts;
-       int rc;

        /* 3GPP TS 44.018, section 10.5.2.25b "Dedicated mode or TBF".
         * As per table 9.1.18.1, only the value part (4 bits) is present in the
@@ -269,68 +267,7 @@
                }
        }

-       if (rsl_dec_chan_nr(ia->chan_desc.chan_nr, &ch_type, &ch_subch, &ch_ts) 
!= 0) {
-               LOGP(DRR, LOGL_ERROR, "%s(): rsl_dec_chan_nr(chan_nr=0x%02x) 
failed\n",
-                    __func__, ia->chan_desc.chan_nr);
-               return -EINVAL;
-       }
-
-       /* FIXME: this event should be triggered by the RLC/MAC layers itself */
-       rc = osmo_fsm_inst_dispatch(ms->grr_fi, GRR_EV_PDCH_ESTABLISH_REQ, 
NULL);
-       if (rc != 0)
-               return rc;
-
-       if (!ia->chan_desc.h0.h) {
-               /* Non-hopping */
-               uint16_t arfcn;
-
-               arfcn = ia->chan_desc.h0.arfcn_low | 
(ia->chan_desc.h0.arfcn_high << 8);
-
-               LOGP(DRR, LOGL_INFO, "GSM48 IMM ASS (ra=0x%02x, chan_nr=0x%02x, 
"
-                    "ARFCN=%u, TS=%u, SS=%u, TSC=%u)\n", ia->req_ref.ra,
-                    ia->chan_desc.chan_nr, arfcn, ch_ts, ch_subch,
-                    ia->chan_desc.h0.tsc);
-
-               l1ctl_tx_dm_est_req_h0(ms, arfcn,
-                                      RSL_CHAN_OSMO_PDCH | ch_ts,
-                                      ia->chan_desc.h0.tsc, GSM48_CMODE_SIGN, 
0);
-       } else {
-               /* Hopping */
-               uint8_t ma_len = 0;
-               uint8_t maio, hsn;
-               uint16_t ma[64];
-
-               hsn = ia->chan_desc.h1.hsn;
-               maio = ia->chan_desc.h1.maio_low | (ia->chan_desc.h1.maio_high 
<< 2);
-
-               LOGP(DRR, LOGL_INFO, "GSM48 IMM ASS (ra=0x%02x, chan_nr=0x%02x, 
"
-                    "HSN=%u, MAIO=%u, TS=%u, SS=%u, TSC=%u)\n", ia->req_ref.ra,
-                    ia->chan_desc.chan_nr, hsn, maio, ch_ts, ch_subch,
-                    ia->chan_desc.h1.tsc);
-
-               for (unsigned int i = 1, j = 0; i <= 1024; i++) {
-                       unsigned int arfcn = i & 1023;
-                       unsigned int k;
-
-                       if (~ms->cellsel.sel_si.freq[arfcn].mask & 0x01)
-                               continue;
-
-                       k = ia->mob_alloc_len - (j >> 3) - 1;
-                       if (ia->mob_alloc[k] & (1 << (j & 7)))
-                               ma[ma_len++] = arfcn;
-                       j++;
-               }
-
-               l1ctl_tx_dm_est_req_h1(ms, maio, hsn, &ma[0], ma_len,
-                                      RSL_CHAN_OSMO_PDCH | ch_ts,
-                                      ia->chan_desc.h1.tsc, GSM48_CMODE_SIGN, 
0);
-       }
-
-       rc = forward_to_rlcmac(ms, msg);
-       if (rc < 0)
-               return rc;
-
-       return 0;
+       return forward_to_rlcmac(ms, msg);
 }

 /* TS 44.018 9.1.22 "Paging request type 1" */
@@ -643,9 +580,50 @@
                break;
        }
        case GRR_EV_PDCH_ESTABLISH_REQ:
-               /* TODO: send L1CTL_DM_EST_REQ here */
+       {
+               const struct osmo_gprs_rlcmac_l1ctl_prim *lp = data;
+
+               if (!lp->pdch_est_req.fh) {
+                       LOGPFSML(fi, LOGL_INFO,
+                                "PDCH Establish.Req: TSC=%u, H0, ARFCN=%u\n",
+                                lp->pdch_est_req.tsc, lp->pdch_est_req.arfcn);
+                       l1ctl_tx_dm_est_req_h0(ms, lp->pdch_est_req.arfcn,
+                                              RSL_CHAN_OSMO_PDCH | 
lp->pdch_est_req.ts_nr,
+                                              lp->pdch_est_req.tsc, 
GSM48_CMODE_SIGN, 0);
+               } else {
+                       /* Hopping */
+                       uint8_t ma_len = 0;
+                       uint16_t ma[64];
+
+                       LOGPFSML(fi, LOGL_INFO,
+                                "PDCH Establish.Req: TSC=%u, H1, HSN=%u, 
MAIO=%u\n",
+                                lp->pdch_est_req.tsc,
+                                lp->pdch_est_req.fhp.hsn,
+                                lp->pdch_est_req.fhp.maio);
+
+                       for (unsigned int i = 1, j = 0; i <= 1024; i++) {
+                               unsigned int arfcn = i & 1023;
+                               unsigned int k;
+
+                               if (~ms->cellsel.sel_si.freq[arfcn].mask & 0x01)
+                                       continue;
+
+                               k = lp->pdch_est_req.fhp.ma_len - (j >> 3) - 1;
+                               if (lp->pdch_est_req.fhp.ma[k] & (1 << (j & 7)))
+                                       ma[ma_len++] = arfcn;
+                               j++;
+                       }
+
+                       l1ctl_tx_dm_est_req_h1(ms,
+                                              lp->pdch_est_req.fhp.maio,
+                                              lp->pdch_est_req.fhp.hsn,
+                                              &ma[0], ma_len,
+                                              RSL_CHAN_OSMO_PDCH | 
lp->pdch_est_req.ts_nr,
+                                              lp->pdch_est_req.tsc, 
GSM48_CMODE_SIGN, 0);
+               }
                osmo_fsm_inst_state_chg(fi, GRR_ST_PACKET_TRANSFER, 0, 0);
                break;
+       }
        default:
                OSMO_ASSERT(0);
        }
diff --git a/src/host/layer23/src/modem/rlcmac.c 
b/src/host/layer23/src/modem/rlcmac.c
index d209ec4..0f98e79 100644
--- a/src/host/layer23/src/modem/rlcmac.c
+++ b/src/host/layer23/src/modem/rlcmac.c
@@ -152,6 +152,10 @@
                return osmo_fsm_inst_dispatch(ms->grr_fi, 
GRR_EV_PDCH_UL_TBF_CFG_REQ, lp);
        case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_CFG_DL_TBF, PRIM_OP_REQUEST):
                return osmo_fsm_inst_dispatch(ms->grr_fi, 
GRR_EV_PDCH_DL_TBF_CFG_REQ, lp);
+       case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_PDCH_ESTABLISH, PRIM_OP_REQUEST):
+               return osmo_fsm_inst_dispatch(ms->grr_fi, 
GRR_EV_PDCH_ESTABLISH_REQ, lp);
+       case OSMO_PRIM(OSMO_GPRS_RLCMAC_L1CTL_PDCH_RELEASE, PRIM_OP_REQUEST):
+               return osmo_fsm_inst_dispatch(ms->grr_fi, 
GRR_EV_PDCH_RELEASE_REQ, lp);
        default:
                LOGP(DRLCMAC, LOGL_DEBUG, "%s(): Unexpected Rx %s\n", __func__, 
pdu_name);
                OSMO_ASSERT(0);

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

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: Ic39ce696834943dc661c85cbf3d54ccd598b60ce
Gerrit-Change-Number: 33902
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-CC: fixeria <[email protected]>
Gerrit-MessageType: newchange

Reply via email to