<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25781">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move lchan related code to lchan.{c,h}<br><br>Change-Id: I17ebe6af69e31d1b4dbad7656bbf043f4c9243c1<br>---<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/lchan.h<br>M src/common/bts.c<br>M src/common/lchan.c<br>M src/common/sysinfo.c<br>5 files changed, 79 insertions(+), 78 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/81/25781/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index 4683758..8832588 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -407,8 +407,6 @@</span><br><span> void regenerate_si3_restoctets(struct gsm_bts *bts);</span><br><span> void regenerate_si4_restoctets(struct gsm_bts *bts);</span><br><span> int get_si4_ro_offset(const uint8_t *si4_buf);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t *lchan_sacch_get(struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-int lchan_init_lapdm(struct gsm_lchan *lchan);</span><br><span> </span><br><span> void load_timer_start(struct gsm_bts *bts);</span><br><span> void load_timer_stop(struct gsm_bts *bts);</span><br><span>diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h</span><br><span>index 8fcf36a..665bb44 100644</span><br><span>--- a/include/osmo-bts/lchan.h</span><br><span>+++ b/include/osmo-bts/lchan.h</span><br><span>@@ -329,6 +329,7 @@</span><br><span> </span><br><span> void gsm_lchan_init(struct gsm_lchan *lchan, struct gsm_bts_trx_ts *ts, unsigned int lchan_nr);</span><br><span> void gsm_lchan_name_update(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_init_lapdm(struct gsm_lchan *lchan);</span><br><span> void gsm_lchan_release(struct gsm_lchan *lchan, enum lchan_rel_act_kind rel_kind);</span><br><span> const char *gsm_lchans_name(enum gsm_lchan_state s);</span><br><span> </span><br><span>@@ -337,6 +338,8 @@</span><br><span>    return lchan->name;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t *lchan_sacch_get(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span> uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan);</span><br><span> uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index b226df2..86140ba 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -454,66 +454,6 @@</span><br><span>         return bts_model_oml_estab(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* prepare the per-SAPI T200 arrays for a given lchan */</span><br><span style="color: hsl(0, 100%, 40%);">-static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* we have to compensate for the "RTS advance" due to the asynchronous interface between</span><br><span style="color: hsl(0, 100%, 40%);">-       * the BTS (LAPDm) and the PHY/L1 (OsmoTRX or DSP in case of osmo-bts-{sysmo,lc15,oc2g,octphy} */</span><br><span style="color: hsl(0, 100%, 40%);">-       int32_t fn_advance = bts_get_avg_fn_advance(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-       int32_t fn_advance_us = fn_advance * 4615;</span><br><span style="color: hsl(0, 100%, 40%);">-      int fn_advance_ms = fn_advance_us / 1000;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       t200_ms_acch[DL_SAPI0] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-     t200_ms_acch[DL_SAPI3] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (lchan->repeated_acch_capability.dl_facch_all && (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              t200_ms_acch[DL_SAPI0] *= 2;</span><br><span style="color: hsl(0, 100%, 40%);">-            t200_ms_acch[DL_SAPI3] *= 2;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (lchan->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-           t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-           t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_SDCCH_SAPI3] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-         t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-         t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                /* Channels such as CCCH don't use lapdm DL, and hence no T200 is needed */</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int lchan_init_lapdm(struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct lapdm_channel *lc = &lchan->lapdm_ch;</span><br><span style="color: hsl(0, 100%, 40%);">-     int t200_ms_dcch[_NR_DL_SAPI], t200_ms_acch[_NR_DL_SAPI];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (t200_by_lchan(t200_ms_dcch, t200_ms_acch, lchan) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPLCHAN(lchan, DLLAPD, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Setting T200 D0=%u, D3=%u, S0=%u, S3=%u (all in ms)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      t200_ms_dcch[DL_SAPI0], t200_ms_dcch[DL_SAPI3],</span><br><span style="color: hsl(0, 100%, 40%);">-                         t200_ms_acch[DL_SAPI0], t200_ms_acch[DL_SAPI3]);</span><br><span style="color: hsl(0, 100%, 40%);">-              lapdm_channel_init3(lc, LAPDM_MODE_BTS, t200_ms_dcch, t200_ms_acch, lchan->type,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 gsm_lchan_name(lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-             lapdm_channel_set_flags(lc, LAPDM_ENT_F_POLLING_ONLY);</span><br><span style="color: hsl(0, 100%, 40%);">-          lapdm_channel_set_l1(lc, NULL, lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* We still need to set Rx callback to receive RACH requests: */</span><br><span style="color: hsl(0, 100%, 40%);">-        lapdm_channel_set_l3(lc, lapdm_rll_tx_cb, lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define CCCH_RACH_RATIO_COMBINED256      (256*1/9)</span><br><span> #define CCCH_RACH_RATIO_SEPARATE256      (256*10/55)</span><br><span> </span><br><span>diff --git a/src/common/lchan.c b/src/common/lchan.c</span><br><span>index 747e8b0..14fa625 100644</span><br><span>--- a/src/common/lchan.c</span><br><span>+++ b/src/common/lchan.c</span><br><span>@@ -52,6 +52,45 @@</span><br><span>       { 0, NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* prepare the per-SAPI T200 arrays for a given lchan */</span><br><span style="color: hsl(120, 100%, 40%);">+static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we have to compensate for the "RTS advance" due to the asynchronous interface between</span><br><span style="color: hsl(120, 100%, 40%);">+     * the BTS (LAPDm) and the PHY/L1 (OsmoTRX or DSP in case of osmo-bts-{sysmo,lc15,oc2g,octphy} */</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t fn_advance = bts_get_avg_fn_advance(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t fn_advance_us = fn_advance * 4615;</span><br><span style="color: hsl(120, 100%, 40%);">+    int fn_advance_ms = fn_advance_us / 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   t200_ms_acch[DL_SAPI0] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+   t200_ms_acch[DL_SAPI3] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan->repeated_acch_capability.dl_facch_all && (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            t200_ms_acch[DL_SAPI0] *= 2;</span><br><span style="color: hsl(120, 100%, 40%);">+          t200_ms_acch[DL_SAPI3] *= 2;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(120, 100%, 40%);">+         t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_SDCCH] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+         t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_SDCCH_SAPI3] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+         t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+               t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+         t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+               t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Channels such as CCCH don't use lapdm DL, and hence no T200 is needed */</span><br><span style="color: hsl(120, 100%, 40%);">+               return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void early_rr_ia_delay_cb(void *data)</span><br><span> {</span><br><span>  struct gsm_lchan *lchan = data;</span><br><span>@@ -105,6 +144,27 @@</span><br><span>       lchan->name = name;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_init_lapdm(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct lapdm_channel *lc = &lchan->lapdm_ch;</span><br><span style="color: hsl(120, 100%, 40%);">+   int t200_ms_dcch[_NR_DL_SAPI], t200_ms_acch[_NR_DL_SAPI];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (t200_by_lchan(t200_ms_dcch, t200_ms_acch, lchan) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPLCHAN(lchan, DLLAPD, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Setting T200 D0=%u, D3=%u, S0=%u, S3=%u (all in ms)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    t200_ms_dcch[DL_SAPI0], t200_ms_dcch[DL_SAPI3],</span><br><span style="color: hsl(120, 100%, 40%);">+                       t200_ms_acch[DL_SAPI0], t200_ms_acch[DL_SAPI3]);</span><br><span style="color: hsl(120, 100%, 40%);">+            lapdm_channel_init3(lc, LAPDM_MODE_BTS, t200_ms_dcch, t200_ms_acch, lchan->type,</span><br><span style="color: hsl(120, 100%, 40%);">+                               gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+           lapdm_channel_set_flags(lc, LAPDM_ENT_F_POLLING_ONLY);</span><br><span style="color: hsl(120, 100%, 40%);">+                lapdm_channel_set_l1(lc, NULL, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* We still need to set Rx callback to receive RACH requests: */</span><br><span style="color: hsl(120, 100%, 40%);">+      lapdm_channel_set_l3(lc, lapdm_rll_tx_cb, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int dyn_ts_pdch_release(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>       struct gsm_bts_trx_ts *ts = lchan->ts;</span><br><span>@@ -179,6 +239,22 @@</span><br><span>     return get_value_string(lchan_s_names, s);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* obtain the next to-be transmitted dowlink SACCH frame (L2 hdr + L3); returns pointer to lchan->si buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t *lchan_sacch_get(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t tmp, i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < _MAX_SYSINFO_TYPE; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          tmp = (lchan->si.last + 1 + i) % _MAX_SYSINFO_TYPE;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!(lchan->si.valid & (1 << tmp)))</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->si.last = tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+              return GSM_LCHAN_SI(lchan, tmp);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPLCHAN(lchan, DL1P, LOGL_NOTICE, "SACCH no SI available\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state)</span><br><span> {</span><br><span>  DEBUGP(DL1C, "%s state %s -> %s\n",</span><br><span>diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c</span><br><span>index 5c5af25..b0f1ebf 100644</span><br><span>--- a/src/common/sysinfo.c</span><br><span>+++ b/src/common/sysinfo.c</span><br><span>@@ -164,22 +164,6 @@</span><br><span>         return 1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* obtain the next to-be transmitted dowlink SACCH frame (L2 hdr + L3); returns pointer to lchan->si buffer */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t *lchan_sacch_get(struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t tmp, i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        for (i = 0; i < _MAX_SYSINFO_TYPE; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            tmp = (lchan->si.last + 1 + i) % _MAX_SYSINFO_TYPE;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!(lchan->si.valid & (1 << tmp)))</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->si.last = tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-                return GSM_LCHAN_SI(lchan, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGPLCHAN(lchan, DL1P, LOGL_NOTICE, "SACCH no SI available\n");</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* re-generate SI3 restoctets with GPRS indicator depending on the PCU socket connection state */</span><br><span> void regenerate_si3_restoctets(struct gsm_bts *bts)</span><br><span> {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25781">change 25781</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/25781"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I17ebe6af69e31d1b4dbad7656bbf043f4c9243c1 </div>
<div style="display:none"> Gerrit-Change-Number: 25781 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>