<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/22814">View Change</a></p><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 include/osmocom/bsc/bts.h<br>M src/osmo-bsc/bts.c<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>5 files changed, 110 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/14/22814/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index e1dd403..7d71991 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -660,3 +660,4 @@</span><br><span> const char *btsvariant2str(enum gsm_bts_type_variant v);</span><br><span> </span><br><span> struct neighbor_ident_key *bts_ident_key(const struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_get_cgi_ps(const struct gsm_bts *bts, struct osmo_cell_global_id_ps *cgi_ps);</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 76da136..af22561 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -769,6 +769,19 @@</span><br><span>  return &key;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+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> const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span>       [BTS_CTR_CHREQ_TOTAL] = \</span><br><span>            { "chreq:total",</span><br><span>diff --git a/src/osmo-bsc/neighbor_ident.c b/src/osmo-bsc/neighbor_ident.c</span><br><span>index 185cd0b..6f96033 100644</span><br><span>--- a/src/osmo-bsc/neighbor_ident.c</span><br><span>+++ b/src/osmo-bsc/neighbor_ident.c</span><br><span>@@ -273,7 +273,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>@@ -324,10 +326,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: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>