neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-bsc/+/14768


Change subject: add vty 'no neighbors' to remove all HO targets
......................................................................

add vty 'no neighbors' to remove all HO targets

This is required for an upcoming TTCN3 test that plays through various neighbor
configurations.

Change-Id: I8623ab581639e9f8af6a9ff1eca990518d1b1211
---
M src/osmo-bsc/neighbor_ident_vty.c
M tests/neighbor_ident.vty
2 files changed, 93 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/68/14768/1

diff --git a/src/osmo-bsc/neighbor_ident_vty.c 
b/src/osmo-bsc/neighbor_ident_vty.c
index 203b150..715ee8b 100644
--- a/src/osmo-bsc/neighbor_ident_vty.c
+++ b/src/osmo-bsc/neighbor_ident_vty.c
@@ -372,6 +372,85 @@
        return CMD_SUCCESS;
 }

+struct nil_match_bts_data {
+       int bts_nr;
+       const struct neighbor_ident_key *found;
+};
+
+static bool nil_match_bts(const struct neighbor_ident_key *key,
+                         const struct gsm0808_cell_id_list2 *val,
+                         void *cb_data)
+{
+       struct nil_match_bts_data *d = cb_data;
+       if (key->from_bts == d->bts_nr) {
+               d->found = key;
+               return false;
+       }
+       return true;
+}
+
+static int del_all(struct vty *vty)
+{
+       int rc;
+       int removed = 0;
+       struct gsm_bts *bts = vty->index;
+
+       if (vty->node != BTS_NODE) {
+               vty_out(vty, "%% Error: cannot remove BTS neighbor, not on BTS 
node%s",
+                       VTY_NEWLINE);
+               return CMD_WARNING;
+       }
+       if (!bts) {
+               vty_out(vty, "%% Error: cannot remove BTS neighbor, no BTS on 
this node%s",
+                       VTY_NEWLINE);
+               return CMD_WARNING;
+       }
+
+       /* Remove all local neighbors */
+       while (1) {
+               struct gsm_bts_ref *neigh = 
llist_first_entry_or_null(&bts->local_neighbors, struct gsm_bts_ref, entry);
+               struct gsm_bts *neigh_bts = neigh ? neigh->bts : NULL;
+               if (!neigh)
+                       break;
+
+               rc = gsm_bts_local_neighbor_del(bts, neigh_bts);
+               if (rc > 0) {
+                       vty_out(vty, "%% Removed local neighbor bts %u to bts 
%u%s",
+                               bts->nr, neigh_bts->nr, VTY_NEWLINE);
+                       removed += rc;
+               } else {
+                       vty_out(vty, "%% Error while removing local neigbor bts 
%u to bts %u, aborted%s",
+                               bts->nr, neigh_bts->nr, VTY_NEWLINE);
+                       return CMD_WARNING;
+               }
+       }
+
+       /* Remove all remote-BSS neighbors */
+       while (1) {
+               struct neighbor_ident_key k;
+               struct nil_match_bts_data d = {};
+               neighbor_ident_iter(g_neighbor_cells, nil_match_bts, &d);
+               if (!d.found)
+                       break;
+               k = *d.found;
+               if (neighbor_ident_del(g_neighbor_cells, &k)) {
+                       vty_out(vty, "%% Removed remote BSS neighbor %s%s",
+                               neighbor_ident_key_name(&k), VTY_NEWLINE);
+                       removed++;
+               } else {
+                       vty_out(vty, "%% Error while removing remote BSS 
neighbor %s, aborted%s",
+                               neighbor_ident_key_name(&k), VTY_NEWLINE);
+                       return CMD_WARNING;
+               }
+       }
+
+       if (!removed) {
+               vty_out(vty, "%% Cannot remove, no neighbors configured%s", 
VTY_NEWLINE);
+               return CMD_WARNING;
+       }
+       return CMD_SUCCESS;
+}
+
 DEFUN(cfg_neighbor_add_lac_arfcn_bsic, cfg_neighbor_add_lac_arfcn_bsic_cmd,
        NEIGHBOR_ADD_CMD LAC_PARAMS " " NEIGHBOR_IDENT_VTY_KEY_PARAMS,
        NEIGHBOR_ADD_DOC LAC_DOC NEIGHBOR_IDENT_VTY_KEY_DOC)
@@ -430,6 +509,15 @@
        return del_by_key(vty, &key);
 }

+DEFUN(cfg_neighbor_del_all, cfg_neighbor_del_all_cmd,
+       "no neighbors",
+       NO_STR
+       "Remove all local and remote-BSS neighbor config for this cell."
+       " Note that this falls back to the legacy behavior of regarding all 
local cells as neighbors.\n")
+{
+       return del_all(vty);
+}
+
 struct write_neighbor_ident_entry_data {
        struct vty *vty;
        const char *indent;
@@ -576,5 +664,6 @@
        install_element(BTS_NODE, &cfg_neighbor_add_cgi_arfcn_bsic_cmd);
        install_element(BTS_NODE, &cfg_neighbor_del_bts_nr_cmd);
        install_element(BTS_NODE, &cfg_neighbor_del_arfcn_bsic_cmd);
+       install_element(BTS_NODE, &cfg_neighbor_del_all_cmd);
        install_element_ve(&show_bts_neighbor_cmd);
 }
diff --git a/tests/neighbor_ident.vty b/tests/neighbor_ident.vty
index 4aeb6cc..224e8b3 100644
--- a/tests/neighbor_ident.vty
+++ b/tests/neighbor_ident.vty
@@ -89,6 +89,7 @@
   neighbor cgi <0-999> <0-999> <0-65535> <0-65535> arfcn <0-1023> bsic 
(<0-63>|any)
   no neighbor bts <0-255>
   no neighbor arfcn <0-1023> bsic (<0-63>|any)
+  no neighbors
 ...

 OsmoBSC(config-net-bts)# neighbor?
@@ -158,6 +159,9 @@
 OsmoBSC(config-net-bts)# neighbor cgi 0 0 0 0 arfcn 0 bsic 0 ?
   <cr>

+OsmoBSC(config-net-bts)# no neighbors?
+  neighbors  Remove all local and remote-BSS neighbor config for this cell. 
Note that this falls back to the legacy behavior of regarding all local cells 
as neighbors.
+
 OsmoBSC(config-net-bts)# no neighbor?
   neighbor  Remove local or remote-BSS neighbor cell


--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/14768
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I8623ab581639e9f8af6a9ff1eca990518d1b1211
Gerrit-Change-Number: 14768
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofm...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to