<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25408">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Support Neighbor Address Resolution over PCUIF IPA multiplex<br><br>While NACC was initiall developed, it became clear there was need for a<br>way to interact PCU<->BSC in order resolve ARFCN+BSIC into CGI-PS for<br>later RIM usage.<br>Hence, this resolution was first (until today) implemented using an out<br>of bands RPC system using the CTRL interface, which required specific<br>config to be written and matches in osmo-pcu and osmo-bsc VTY (ip+port<br>of the CTRL interface to use).<br>However, this has several shortcomings:<br>* As explained above, specific configuration is required<br>* Since recently, we do support BSC redundancy in osmo-bts. Hence the BTS<br>  may switch to a BSC other than first one. If that happened, that'd mean<br>  the CTRL interface would still point to the initially configured one,<br>  which may not be the same currently serving the PCU.<br><br>During recent development of ANR related features, a similar need for<br>PCU<->BSC was required, but this time it was decided to extend the IPA<br>multiplex of the Abis OML connection to pass PCUIF messages,<br>transparently forwarded to each side by the BTS.<br>This has the advantage that connection PCU<->BTS is handled by BTS and<br>both sides send messages transparently.<br><br>Let's switch by default to using this new interface, while still<br>maintaing the old way for a while (announcing them as deprecated) to<br>avoid rbeaking existing deployments until they are upgraded to new<br>versions of osmo-pcu and osmo-bsc.<br><br>Change-Id: I9073a121564503f483c84263ac72476041e47c03<br>Related: SYS#4971<br>---<br>M include/osmocom/bsc/neighbor_ident.h<br>M include/osmocom/bsc/pcuif_proto.h<br>M src/osmo-bsc/abis_osmo.c<br>M src/osmo-bsc/neighbor_ident.c<br>M src/osmo-bsc/neighbor_ident_vty.c<br>5 files changed, 162 insertions(+), 44 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/08/25408/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/neighbor_ident.h b/include/osmocom/bsc/neighbor_ident.h</span><br><span>index 0565d52..58300ba 100644</span><br><span>--- a/include/osmocom/bsc/neighbor_ident.h</span><br><span>+++ b/include/osmocom/bsc/neighbor_ident.h</span><br><span>@@ -86,6 +86,10 @@</span><br><span>     "for all BSICs / use any BSIC in this ARFCN\n"</span><br><span> void neighbor_ident_vty_parse_arfcn_bsic(struct cell_ab *ab, const char **argv);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int neighbor_address_resolution(const struct gsm_network *net, const struct cell_ab *ab,</span><br><span style="color: hsl(120, 100%, 40%);">+                            uint16_t lac, uint16_t cell_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               struct osmo_cell_global_id_ps *res_cgi_ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct ctrl_handle *neighbor_controlif_setup(struct gsm_network *net);</span><br><span> int neighbor_ctrl_cmds_install(struct gsm_network *net);</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/pcuif_proto.h b/include/osmocom/bsc/pcuif_proto.h</span><br><span>index 3e6f651..4921fc3 100644</span><br><span>--- a/include/osmocom/bsc/pcuif_proto.h</span><br><span>+++ b/include/osmocom/bsc/pcuif_proto.h</span><br><span>@@ -26,6 +26,10 @@</span><br><span> #define PCU_IF_MSG_TXT_IND     0x70    /* Text indication for BTS */</span><br><span> #define PCU_IF_MSG_CONTAINER   0x80    /* Transparent container message */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* msg_type coming from BSC (inside PCU_IF_MSG_CONTAINER) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_MSG_NEIGH_ADDR_REQ        0x81    /* Neighbor Address Resolution Request */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_MSG_NEIGH_ADDR_CNF    0x82    /* Neighbor Address Resolution Confirmation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* sapi */</span><br><span> #define PCU_IF_SAPI_RACH      0x01    /* channel request on CCCH */</span><br><span> #define PCU_IF_SAPI_AGCH       0x02    /* assignment on AGCH */</span><br><span>@@ -226,6 +230,30 @@</span><br><span>      uint8_t         data[0];</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*** Used inside container: NOTE: values must be network byte order here! ***/</span><br><span style="color: hsl(120, 100%, 40%);">+/* Neighbor Address Resolution Request */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_pcu_if_neigh_addr_req {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t        local_lac;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t        local_ci;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t        tgt_arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t         tgt_bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Neighbor Address Resolution Confirmation */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_pcu_if_neigh_addr_cnf {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_pcu_if_neigh_addr_req orig_req;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t         err_code; /* 0 success, !0 failed & below unset */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* RAI + CI (CGI-PS): */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct __attribute__ ((packed)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint16_t        mcc;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t        mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t         mnc_3_digits;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint16_t        lac;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t         rac;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t        cell_identity;</span><br><span style="color: hsl(120, 100%, 40%);">+        } cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_pcu_if {</span><br><span>      /* context based information */</span><br><span>      uint8_t         msg_type;       /* message type */</span><br><span>diff --git a/src/osmo-bsc/abis_osmo.c b/src/osmo-bsc/abis_osmo.c</span><br><span>index 39caac6..4345a6f 100644</span><br><span>--- a/src/osmo-bsc/abis_osmo.c</span><br><span>+++ b/src/osmo-bsc/abis_osmo.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/pcuif_proto.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/neighbor_ident.h></span><br><span> </span><br><span> #define OM_HEADROOM_SIZE  128</span><br><span> </span><br><span>@@ -40,7 +41,6 @@</span><br><span> ///////////////////////////////////////</span><br><span> #define PCUIF_HDR_SIZE ( sizeof(struct gsm_pcu_if) - sizeof(((struct gsm_pcu_if *)0)->u) )</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span> static struct msgb *abis_osmo_pcu_msgb_alloc(uint8_t msg_type, uint8_t bts_nr, size_t extra_size)</span><br><span> {</span><br><span>   struct msgb *msg;</span><br><span>@@ -62,7 +62,65 @@</span><br><span>       ipa_prepend_header_ext(msg, IPAC_PROTO_EXT_PCU);</span><br><span>     return abis_osmo_sendmsg(bts, msg);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int abis_osmo_pcu_tx_neigh_addr_cnf(struct gsm_bts *bts, const struct gsm_pcu_if_neigh_addr_req *naddr_req,</span><br><span style="color: hsl(120, 100%, 40%);">+                              uint8_t err_code, const 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%);">+ struct msgb *msg = abis_osmo_pcu_msgb_alloc(PCU_IF_MSG_CONTAINER, bts->bts_nr, sizeof(struct gsm_pcu_if_neigh_addr_cnf));</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_pcu_if *pcu_prim = (struct gsm_pcu_if *) msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_pcu_if_neigh_addr_cnf *naddr_cnf = (struct gsm_pcu_if_neigh_addr_cnf *)&pcu_prim->u.container.data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_put(msg, sizeof(pcu_prim->u.container) + sizeof(struct gsm_pcu_if_neigh_addr_cnf));</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_prim->u.container.msg_type = PCU_IF_MSG_NEIGH_ADDR_CNF;</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_store16be(sizeof(struct gsm_pcu_if_neigh_addr_cnf), &pcu_prim->u.container.length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     naddr_cnf->orig_req = *naddr_req;</span><br><span style="color: hsl(120, 100%, 40%);">+  naddr_cnf->err_code = err_code;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (err_code == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_store16be(cgi_ps->rai.lac.plmn.mcc, &naddr_cnf->cgi_ps.mcc);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_store16be(cgi_ps->rai.lac.plmn.mnc, &naddr_cnf->cgi_ps.mnc);</span><br><span style="color: hsl(120, 100%, 40%);">+           naddr_cnf->cgi_ps.mnc_3_digits = cgi_ps->rai.lac.plmn.mnc_3_digits;</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_store16be(cgi_ps->rai.lac.lac, &naddr_cnf->cgi_ps.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+                naddr_cnf->cgi_ps.rac = cgi_ps->rai.rac;</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_store16be(cgi_ps->cell_identity, &naddr_cnf->cgi_ps.cell_identity);</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%);">+   return abis_osmo_pcu_sendmsg(bts, msg);</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%);">+static int rcvmsg_pcu_neigh_addr_req(struct gsm_bts *bts, const struct gsm_pcu_if_neigh_addr_req *naddr_req)</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%);">+       struct cell_ab ab;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t local_lac, local_ci;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_cell_global_id_ps cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     local_lac = osmo_load16be(&naddr_req->local_lac);</span><br><span style="color: hsl(120, 100%, 40%);">+      local_ci = osmo_load16be(&naddr_req->local_ci);</span><br><span style="color: hsl(120, 100%, 40%);">+        ab = (struct cell_ab){</span><br><span style="color: hsl(120, 100%, 40%);">+                .arfcn = osmo_load16be(&naddr_req->tgt_arfcn),</span><br><span style="color: hsl(120, 100%, 40%);">+         .bsic = naddr_req->tgt_bsic,</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%);">+  LOGP(DNM, LOGL_INFO, "(bts=%d) Rx Neighbor Address Resolution Req (ARFCN=%u,BSIC=%u) from (LAC=%u,CI=%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             bts->nr, ab.arfcn, ab.bsic, local_lac, local_ci);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!cell_ab_valid(&ab)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               goto do_fail;</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%);">+   if (neighbor_address_resolution(bts->network, &ab, local_lac, local_ci, &cgi_ps) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               goto do_fail;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return abis_osmo_pcu_tx_neigh_addr_cnf(bts, naddr_req, 0, &cgi_ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+do_fail:</span><br><span style="color: hsl(120, 100%, 40%);">+   return abis_osmo_pcu_tx_neigh_addr_cnf(bts, naddr_req, rc, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> static int rcvmsg_pcu_container(struct gsm_bts *bts, struct gsm_pcu_if_container *container, size_t container_len)</span><br><span> {</span><br><span>@@ -79,6 +137,13 @@</span><br><span>       bts->nr, container->msg_type);</span><br><span> </span><br><span>        switch (container->msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case PCU_IF_MSG_NEIGH_ADDR_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+               if (data_length < sizeof(struct gsm_pcu_if_neigh_addr_req)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DNM, LOGL_ERROR, "ABIS_OSMO_PCU CONTAINER ANR_CNF message too short\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = rcvmsg_pcu_neigh_addr_req(bts, (struct gsm_pcu_if_neigh_addr_req*)&container->data);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       default:</span><br><span>             LOGP(DNM, LOGL_NOTICE, "(bts=%d) Rx ABIS_OSMO_PCU unexpected msg type (%u) inside container!\n",</span><br><span>                bts->nr, container->msg_type);</span><br><span>diff --git a/src/osmo-bsc/neighbor_ident.c b/src/osmo-bsc/neighbor_ident.c</span><br><span>index 6e70625..23697bf 100644</span><br><span>--- a/src/osmo-bsc/neighbor_ident.c</span><br><span>+++ b/src/osmo-bsc/neighbor_ident.c</span><br><span>@@ -366,18 +366,70 @@</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int get_neighbor_resolve_cgi_ps_from_lac_ci(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Attempt resolution of cgi_ps from ARFCN+BSIC of neighbor from BTS identified by LAC+CI */</span><br><span style="color: hsl(120, 100%, 40%);">+int neighbor_address_resolution(const struct gsm_network *net, const struct cell_ab *ab,</span><br><span style="color: hsl(120, 100%, 40%);">+                                uint16_t lac, uint16_t cell_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               struct osmo_cell_global_id_ps *res_cgi_ps)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_network *net = (struct gsm_network *)data;</span><br><span>        struct gsm_bts *bts_tmp, *bts_found = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-     char *tmp = NULL, *tok, *saveptr;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct cell_ab ab;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned lac, cell_id;</span><br><span>       struct osmo_cell_global_id_ps local_cgi_ps;</span><br><span>  const struct osmo_cell_global_id_ps *cgi_ps = NULL;</span><br><span>  struct gsm_bts *local_neighbor = NULL;</span><br><span>       struct gsm0808_cell_id_list2 remote_neighbors = { 0 };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts_tmp, &net->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bts_tmp->location_area_code != lac)</span><br><span style="color: hsl(120, 100%, 40%);">+                    continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bts_tmp->cell_identity != cell_id)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             bts_found = bts_tmp;</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%);">+   if (!bts_found)</span><br><span style="color: hsl(120, 100%, 40%);">+               goto notfound_err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  LOG_BTS(bts_found, DLINP, LOGL_DEBUG, "Resolving neighbor BTS %u -> %s\n", bts_found->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+             cell_ab_to_str_c(OTC_SELECT, ab));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (resolve_neighbors(&local_neighbor, &remote_neighbors, bts_found, ab, true))</span><br><span style="color: hsl(120, 100%, 40%);">+               goto notfound_err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* resolve_neighbors() returns either a local_neighbor or remote_neighbors.</span><br><span style="color: hsl(120, 100%, 40%);">+    * Local-BSS neighbor? */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (local_neighbor) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Supporting GPRS? */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (gsm_bts_get_cgi_ps(local_neighbor, &local_cgi_ps) >= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    cgi_ps = &local_cgi_ps;</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%);">+   /* Remote-BSS neighbor?</span><br><span style="color: hsl(120, 100%, 40%);">+        * By spec, there can be multiple remote neighbors for a given ARFCN+BSIC, but so far osmo-bsc enforces only a</span><br><span style="color: hsl(120, 100%, 40%);">+         * single remote neighbor. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (remote_neighbors.id_list_len</span><br><span style="color: hsl(120, 100%, 40%);">+          && remote_neighbors.id_discr == CELL_IDENT_WHOLE_GLOBAL_PS) {</span><br><span style="color: hsl(120, 100%, 40%);">+             cgi_ps = &remote_neighbors.id_list[0].global_ps;</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 neighbor found */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!cgi_ps)</span><br><span style="color: hsl(120, 100%, 40%);">+          goto notfound_err;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  *res_cgi_ps = *cgi_ps;</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%);">+notfound_err:</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_neighbor_resolve_cgi_ps_from_lac_ci(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_network *net = (struct gsm_network *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *tmp = NULL, *tok, *saveptr;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct cell_ab ab;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned lac, cell_id;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_cell_global_id_ps cgi_ps;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (!cmd->variable)</span><br><span>               goto fmt_err;</span><br><span> </span><br><span>@@ -407,48 +459,13 @@</span><br><span>            goto fmt_err;</span><br><span>        ab.bsic = atoi(tok);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(bts_tmp, &net->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (bts_tmp->location_area_code != lac)</span><br><span style="color: hsl(0, 100%, 40%);">-                      continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (bts_tmp->cell_identity != cell_id)</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               bts_found = bts_tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</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%);">-       if (!bts_found)</span><br><span style="color: hsl(0, 100%, 40%);">-         goto notfound_err;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      LOG_BTS(bts_found, DLINP, LOGL_DEBUG, "Resolving neighbor BTS %u -> %s\n", bts_found->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-               cell_ab_to_str_c(OTC_SELECT, &ab));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      if (!cell_ab_valid(&ab))</span><br><span>                 goto fmt_err;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (resolve_neighbors(&local_neighbor, &remote_neighbors, bts_found, &ab, true))</span><br><span style="color: hsl(120, 100%, 40%);">+  if (neighbor_address_resolution(net, &ab, lac, cell_id, &cgi_ps) < 0)</span><br><span>             goto notfound_err;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* resolve_neighbors() returns either a local_neighbor or remote_neighbors.</span><br><span style="color: hsl(0, 100%, 40%);">-      * Local-BSS neighbor? */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (local_neighbor) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Supporting GPRS? */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (gsm_bts_get_cgi_ps(local_neighbor, &local_cgi_ps) >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                      cgi_ps = &local_cgi_ps;</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%);">-       /* Remote-BSS neighbor?</span><br><span style="color: hsl(0, 100%, 40%);">-  * By spec, there can be multiple remote neighbors for a given ARFCN+BSIC, but so far osmo-bsc enforces only a</span><br><span style="color: hsl(0, 100%, 40%);">-   * single remote neighbor. */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (remote_neighbors.id_list_len</span><br><span style="color: hsl(0, 100%, 40%);">-            && remote_neighbors.id_discr == CELL_IDENT_WHOLE_GLOBAL_PS) {</span><br><span style="color: hsl(0, 100%, 40%);">-               cgi_ps = &remote_neighbors.id_list[0].global_ps;</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%);">-       /* No neighbor found */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!cgi_ps)</span><br><span style="color: hsl(0, 100%, 40%);">-            goto notfound_err;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      ctrl_cmd_reply_printf(cmd, "%s", osmo_cgi_ps_name(cgi_ps));</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_cmd_reply_printf(cmd, "%s", osmo_cgi_ps_name(&cgi_ps));</span><br><span>   talloc_free(tmp);</span><br><span>    return CTRL_CMD_REPLY;</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/neighbor_ident_vty.c b/src/osmo-bsc/neighbor_ident_vty.c</span><br><span>index b9160ec..b500b34 100644</span><br><span>--- a/src/osmo-bsc/neighbor_ident_vty.c</span><br><span>+++ b/src/osmo-bsc/neighbor_ident_vty.c</span><br><span>@@ -481,6 +481,10 @@</span><br><span>   NEIGHBOR_DOC "Bind Neighbor Resolution Service (CTRL interface) to given ip and port\n"</span><br><span>    IP_STR IPV6_STR "Port to bind the service to [defaults to 4248 if not provided]\n")</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "%% Warning: The CTRL interface for Neighbor Address Resolution is now deprecated."</span><br><span style="color: hsl(120, 100%, 40%);">+            "Upgrade osmo-pcu and drop the 'neighbor-resolution bind " VTY_IPV46_CMD " [<0-65535>]' VTY "</span><br><span style="color: hsl(120, 100%, 40%);">+               "option in order to let osmo-pcu use the new resoluton method using the PCUIF over IPA "</span><br><span style="color: hsl(120, 100%, 40%);">+            "multiplex, which will work out of the box without required configuration.%s", VTY_NEWLINE);</span><br><span>       osmo_talloc_replace_string(bsc_gsmnet, &bsc_gsmnet->neigh_ctrl.addr, argv[0]);</span><br><span>        if (argc > 1)</span><br><span>             bsc_gsmnet->neigh_ctrl.port = atoi(argv[1]);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25408">change 25408</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/+/25408"/><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: I9073a121564503f483c84263ac72476041e47c03 </div>
<div style="display:none"> Gerrit-Change-Number: 25408 </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>