<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/22814">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  daniel: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fix neigh resolution service on local neighbours<br><br>Change-Id: I217e3550aa6d7f3c3cab4e545641d790ae12b23f<br>Related: SYS#4909<br>---<br>M src/osmo-bsc/neighbor_ident.c<br>M tests/ctrl/osmo-bsc-neigh-test.cfg<br>M tests/ctrl_test_runner.py<br>3 files changed, 109 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/neighbor_ident.c b/src/osmo-bsc/neighbor_ident.c</span><br><span>index 335091e..3235508 100644</span><br><span>--- a/src/osmo-bsc/neighbor_ident.c</span><br><span>+++ b/src/osmo-bsc/neighbor_ident.c</span><br><span>@@ -276,6 +276,19 @@</span><br><span> </span><br><span> CTRL_CMD_DEFINE_RO(neighbor_resolve_cgi_ps_from_lac_ci, "neighbor_resolve_cgi_ps_from_lac_ci");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int gsm_bts_get_cgi_ps(const struct gsm_bts *bts, struct osmo_cell_global_id_ps *cgi_ps)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bts->gprs.mode == BTS_GPRS_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    cgi_ps->rai.lac.plmn = bts->network->plmn;</span><br><span style="color: hsl(120, 100%, 40%);">+   cgi_ps->rai.lac.lac = bts->location_area_code;</span><br><span style="color: hsl(120, 100%, 40%);">+  cgi_ps->rai.rac = bts->gprs.rac;</span><br><span style="color: hsl(120, 100%, 40%);">+        cgi_ps->cell_identity = bts->cell_identity;</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 get_neighbor_resolve_cgi_ps_from_lac_ci(struct ctrl_cmd *cmd, void *data)</span><br><span> {</span><br><span>  struct gsm_network *net = (struct gsm_network *)data;</span><br><span>@@ -284,7 +297,9 @@</span><br><span>  char *tmp = NULL, *tok, *saveptr;</span><br><span>    struct neighbor_ident_key ni;</span><br><span>        unsigned lac, cell_id;</span><br><span style="color: hsl(0, 100%, 40%);">-  const struct osmo_cell_global_id_ps *cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_cell_global_id_ps local_cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct osmo_cell_global_id_ps *cgi_ps = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_ref *neigh;</span><br><span> </span><br><span>       if (!cmd->variable)</span><br><span>               goto fmt_err;</span><br><span>@@ -335,10 +350,26 @@</span><br><span>        if (!neighbor_ident_key_valid(&ni))</span><br><span>              goto fmt_err;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       tgt_cell_li = neighbor_ident_get(net->neighbor_bss_cells, &ni);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!tgt_cell_li || tgt_cell_li->id_discr != CELL_IDENT_WHOLE_GLOBAL_PS || tgt_cell_li->id_list_len < 1)</span><br><span style="color: hsl(0, 100%, 40%);">-               goto notfound_err;</span><br><span style="color: hsl(0, 100%, 40%);">-      cgi_ps = &tgt_cell_li->id_list[0].global_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Is there a local BTS that matches the key? */</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(neigh, &bts_found->local_neighbors, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_bts *neigh_bts = neigh->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct neighbor_ident_key *neigh_bts_key = bts_ident_key(neigh_bts);</span><br><span style="color: hsl(120, 100%, 40%);">+          neigh_bts_key->from_bts = ni.from_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!neighbor_ident_key_match(neigh_bts_key, &ni, true))</span><br><span style="color: hsl(120, 100%, 40%);">+                  continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (gsm_bts_get_cgi_ps(neigh->bts, &local_cgi_ps) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      continue; /* Not supporting GPRS */</span><br><span style="color: hsl(120, 100%, 40%);">+           cgi_ps = &local_cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</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%);">+   /* No local neighbor found, looking for remote neighbors */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!cgi_ps) {</span><br><span style="color: hsl(120, 100%, 40%);">+                tgt_cell_li = neighbor_ident_get(net->neighbor_bss_cells, &ni);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!tgt_cell_li || tgt_cell_li->id_discr != CELL_IDENT_WHOLE_GLOBAL_PS || tgt_cell_li->id_list_len < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                     goto notfound_err;</span><br><span style="color: hsl(120, 100%, 40%);">+            cgi_ps = &tgt_cell_li->id_list[0].global_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> </span><br><span>        ctrl_cmd_reply_printf(cmd, "%s", osmo_cgi_ps_name(cgi_ps));</span><br><span>        talloc_free(tmp);</span><br><span>diff --git a/tests/ctrl/osmo-bsc-neigh-test.cfg b/tests/ctrl/osmo-bsc-neigh-test.cfg</span><br><span>index f1e71b6..2fbc8f8 100644</span><br><span>--- a/tests/ctrl/osmo-bsc-neigh-test.cfg</span><br><span>+++ b/tests/ctrl/osmo-bsc-neigh-test.cfg</span><br><span>@@ -46,6 +46,8 @@</span><br><span>   oml ipa stream-id 255 line 0</span><br><span>   codec-support fr</span><br><span>   gprs mode gprs</span><br><span style="color: hsl(120, 100%, 40%);">+  gprs routing area 5</span><br><span style="color: hsl(120, 100%, 40%);">+  ! remote neigh:</span><br><span>   neighbor cgi-ps 23 42 423 2 5 arfcn 23 bsic 32</span><br><span>   trx 0</span><br><span>    rf_locked 0</span><br><span>@@ -78,6 +80,63 @@</span><br><span>    timeslot 7</span><br><span>     phys_chan_config TCH/F</span><br><span>     hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  type sysmobts</span><br><span style="color: hsl(120, 100%, 40%);">+  band DCS1800</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_identity 123</span><br><span style="color: hsl(120, 100%, 40%);">+  location_area_code 1</span><br><span style="color: hsl(120, 100%, 40%);">+  base_station_id_code 55</span><br><span style="color: hsl(120, 100%, 40%);">+  ms max power 15</span><br><span style="color: hsl(120, 100%, 40%);">+  cell reselection hysteresis 4</span><br><span style="color: hsl(120, 100%, 40%);">+  rxlev access min 0</span><br><span style="color: hsl(120, 100%, 40%);">+  radio-link-timeout 32</span><br><span style="color: hsl(120, 100%, 40%);">+  channel allocator ascending</span><br><span style="color: hsl(120, 100%, 40%);">+  rach tx integer 9</span><br><span style="color: hsl(120, 100%, 40%);">+  rach max transmission 7</span><br><span style="color: hsl(120, 100%, 40%);">+  channel-description attach 1</span><br><span style="color: hsl(120, 100%, 40%);">+  channel-description bs-pa-mfrms 5</span><br><span style="color: hsl(120, 100%, 40%);">+  channel-description bs-ag-blks-res 1</span><br><span style="color: hsl(120, 100%, 40%);">+  early-classmark-sending forbidden</span><br><span style="color: hsl(120, 100%, 40%);">+  ipa unit-id 55 0</span><br><span style="color: hsl(120, 100%, 40%);">+  oml ipa stream-id 255 line 0</span><br><span style="color: hsl(120, 100%, 40%);">+  codec-support fr</span><br><span style="color: hsl(120, 100%, 40%);">+  gprs mode gprs</span><br><span style="color: hsl(120, 100%, 40%);">+  gprs routing area 6</span><br><span style="color: hsl(120, 100%, 40%);">+  neighbor bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  trx 0</span><br><span style="color: hsl(120, 100%, 40%);">+   rf_locked 0</span><br><span style="color: hsl(120, 100%, 40%);">+   arfcn 880</span><br><span style="color: hsl(120, 100%, 40%);">+   nominal power 23</span><br><span style="color: hsl(120, 100%, 40%);">+   ! to use full TRX power, set max_power_red 0</span><br><span style="color: hsl(120, 100%, 40%);">+   max_power_red 20</span><br><span style="color: hsl(120, 100%, 40%);">+   rsl e1 tei 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 0</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config CCCH+SDCCH4</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 1</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 2</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 3</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 4</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 5</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 6</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 7</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+    hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  ! local neigh, refers to bts 1:</span><br><span style="color: hsl(120, 100%, 40%);">+  neighbor cgi-ps 1 1 1 6 123</span><br><span> msc 0</span><br><span>  type normal</span><br><span>  allow-emergency allow</span><br><span>diff --git a/tests/ctrl_test_runner.py b/tests/ctrl_test_runner.py</span><br><span>index fb983c9..501b917 100755</span><br><span>--- a/tests/ctrl_test_runner.py</span><br><span>+++ b/tests/ctrl_test_runner.py</span><br><span>@@ -501,11 +501,24 @@</span><br><span>     def ctrl_app(self):</span><br><span>         return (4248, "./src/osmo-bsc/osmo-bsc", "OsmoBSC", "bsc")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def testCtrlNeighborResolution(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def testCtrlNeighborResolutionLocalBtsNr(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_get('neighbor_resolve_cgi_ps_from_lac_ci.1.123.871.63')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'GET_REPLY')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['var'], 'neighbor_resolve_cgi_ps_from_lac_ci.1.123.871.63')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['value'], '001-01-1-5-6969')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def testCtrlNeighborResolutionLocalWithoutArfcnBsic(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        r = self.do_get('neighbor_resolve_cgi_ps_from_lac_ci.1.6969.880.55')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['mtype'], 'GET_REPLY')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['var'], 'neighbor_resolve_cgi_ps_from_lac_ci.1.6969.880.55')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(r['value'], '001-01-1-6-123')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def testCtrlNeighborResolutionWrongSyntax(self):</span><br><span>         r = self.do_get('neighbor_resolve_cgi_ps_from_lac_ci')</span><br><span>         self.assertEqual(r['mtype'], 'ERROR')</span><br><span>         self.assertEqual(r['error'], 'The format is <src_lac>,<src_cell_id>,<dst_arfcn>,<dst_bsic>')</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def testCtrlNeighborResolutionRemote(self):</span><br><span>         r = self.do_get('neighbor_resolve_cgi_ps_from_lac_ci.1.6969.23.32')</span><br><span>         self.assertEqual(r['mtype'], 'GET_REPLY')</span><br><span>         self.assertEqual(r['var'], 'neighbor_resolve_cgi_ps_from_lac_ci.1.6969.23.32')</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/22814">change 22814</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-bsc/+/22814"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I217e3550aa6d7f3c3cab4e545641d790ae12b23f </div>
<div style="display:none"> Gerrit-Change-Number: 22814 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>