<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>