<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/24153">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[VAMOS] Implement the concept of 'shadow' transceiver<br><br>Change-Id: I48b44b4df9ffb1cca105aebbd868c29b21f3b1d6<br>Related: SYS#5315, OS#4940<br>---<br>M include/osmo-bts/bts_trx.h<br>M src/common/bts_trx.c<br>M src/common/oml.c<br>3 files changed, 86 insertions(+), 33 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/53/24153/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts_trx.h b/include/osmo-bts/bts_trx.h</span><br><span>index 8513a12..86d5167 100644</span><br><span>--- a/include/osmo-bts/bts_trx.h</span><br><span>+++ b/include/osmo-bts/bts_trx.h</span><br><span>@@ -41,6 +41,11 @@</span><br><span>    } role_bts;</span><br><span> </span><br><span>      struct gsm_bts_trx_ts ts[TRX_NR_TS];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* If this is a primary TRX that has a shadow TRX, this points at the shadow TRX.</span><br><span style="color: hsl(120, 100%, 40%);">+      * NULL when this TRX is a shadow TRX itself, or when there is no shadow TRX set up. */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx *shadow;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool is_shadow;</span><br><span> };</span><br><span> </span><br><span> static inline struct gsm_bts_trx *gsm_bts_bb_trx_get_trx(struct gsm_bts_bb_trx *bb_transc) {</span><br><span>@@ -48,6 +53,7 @@</span><br><span> }</span><br><span> </span><br><span> struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_bts_trx_alloc_shadow(struct gsm_bts_trx *trx);</span><br><span> int bts_trx_init(struct gsm_bts_trx *trx);</span><br><span> struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);</span><br><span> char *gsm_trx_name(const struct gsm_bts_trx *trx);</span><br><span>diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c</span><br><span>index 9fc18e4..5ee4e7f 100644</span><br><span>--- a/src/common/bts_trx.c</span><br><span>+++ b/src/common/bts_trx.c</span><br><span>@@ -52,10 +52,76 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void gsm_bts_trx_init_ts_lchan(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int tn, ln;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (tn = 0; tn < TRX_NR_TS; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gsm_bts_trx_ts *ts = &trx->ts[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            ts->trx = trx;</span><br><span style="color: hsl(120, 100%, 40%);">+             ts->nr = tn;</span><br><span style="color: hsl(120, 100%, 40%);">+               ts->pchan = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+                ts->dyn.pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+         ts->dyn.pchan_want = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+               ts->tsc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            ts->mo.fi = osmo_fsm_inst_alloc(&nm_chan_fsm, trx, ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         LOGL_INFO, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fsm_inst_update_id_f(ts->mo.fi, "%s-ts%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    trx->bb_transc.mo.fi->id, ts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+         gsm_mo_init(&ts->mo, trx->bts, NM_OC_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+                           trx->bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             for (ln = 0; ln < TS_MAX_LCHAN; ln++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct gsm_lchan *lchan = &ts->lchan[ln];</span><br><span style="color: hsl(120, 100%, 40%);">+                      char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 lchan->ts = ts;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->nr = ln;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->type = GSM_LCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    name = gsm_lchan_name_compute(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                 lchan->name = talloc_strdup(trx, name);</span><br><span style="color: hsl(120, 100%, 40%);">+                    INIT_LLIST_HEAD(&lchan->sapi_cmds);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_bts_trx_alloc_shadow(struct gsm_bts_trx *prim)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx *shadow;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The can be only one shadow TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(prim->shadow == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       shadow = talloc_zero(prim, struct gsm_bts_trx);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(shadow != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  prim->shadow = shadow;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   talloc_set_destructor(shadow, gsm_bts_trx_talloc_destructor);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       shadow->is_shadow = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  shadow->bts = prim->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        shadow->nr = prim->nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The shadow TRX has its own BASEBAND-TRANSCEIVER and CHANNEL MOs,</span><br><span style="color: hsl(120, 100%, 40%);">+    * but due to its virtual nature has no dedicated RADIO-CARRIER MO. */</span><br><span style="color: hsl(120, 100%, 40%);">+        shadow->bb_transc.mo.fi = osmo_fsm_inst_alloc(&nm_bb_transc_fsm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     shadow, &shadow->bb_transc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    LOGL_INFO, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_fsm_inst_update_id_f(shadow->bb_transc.mo.fi,</span><br><span style="color: hsl(120, 100%, 40%);">+                           "bts%d-shadow-trx%d",</span><br><span style="color: hsl(120, 100%, 40%);">+                               prim->bts->nr, shadow->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        gsm_mo_init(&shadow->bb_transc.mo, prim->bts, NM_OC_OSMO_SHADOW_TRANSC,</span><br><span style="color: hsl(120, 100%, 40%);">+                 prim->bts->nr, shadow->nr, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      gsm_bts_trx_init_ts_lchan(shadow);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)</span><br><span> {</span><br><span>   struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);</span><br><span style="color: hsl(0, 100%, 40%);">- int k;</span><br><span> </span><br><span>   if (!trx)</span><br><span>            return NULL;</span><br><span>@@ -77,38 +143,7 @@</span><br><span>   gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,</span><br><span>                  bts->nr, trx->nr, 0xff);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  for (k = 0; k < TRX_NR_TS; k++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gsm_bts_trx_ts *ts = &trx->ts[k];</span><br><span style="color: hsl(0, 100%, 40%);">-         int l;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->trx = trx;</span><br><span style="color: hsl(0, 100%, 40%);">-               ts->nr = k;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->pchan = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->dyn.pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-           ts->dyn.pchan_want = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-         ts->tsc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->mo.fi = osmo_fsm_inst_alloc(&nm_chan_fsm, trx, ts,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                LOGL_INFO, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_fsm_inst_update_id_f(ts->mo.fi, "bts%d-trx%d-ts%d",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-           gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         for (l = 0; l < TS_MAX_LCHAN; l++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                        char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan = &ts->lchan[l];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->ts = ts;</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan->nr = l;</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan->type = GSM_LCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        name = gsm_lchan_name_compute(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->name = talloc_strdup(trx, name);</span><br><span style="color: hsl(0, 100%, 40%);">-                      INIT_LLIST_HEAD(&lchan->sapi_cmds);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+     gsm_bts_trx_init_ts_lchan(trx);</span><br><span> </span><br><span>  if (trx->nr != 0)</span><br><span>                 trx->nominal_power = bts->c0->nominal_power;</span><br><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index c32260b..bd9a86e 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -1596,10 +1596,16 @@</span><br><span>                 mo = &trx->mo;</span><br><span>                break;</span><br><span>       case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_OC_OSMO_SHADOW_TRANSC:</span><br><span>               if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span>                     return NULL;</span><br><span>                 }</span><br><span>            trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (obj_class == NM_OC_OSMO_SHADOW_TRANSC) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (trx->shadow == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                  trx = trx->shadow;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            mo = &trx->bb_transc.mo;</span><br><span>              break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>@@ -1663,10 +1669,16 @@</span><br><span>                obj = trx;</span><br><span>           break;</span><br><span>       case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_OC_OSMO_SHADOW_TRANSC:</span><br><span>               if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span>                     return NULL;</span><br><span>                 }</span><br><span>            trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (obj_class == NM_OC_OSMO_SHADOW_TRANSC) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (trx->shadow == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                  trx = trx->shadow;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            obj = &trx->bb_transc;</span><br><span>                break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/24153">change 24153</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/+/24153"/><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: I48b44b4df9ffb1cca105aebbd868c29b21f3b1d6 </div>
<div style="display:none"> Gerrit-Change-Number: 24153 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>