Expands leading tabs and removes trailing whitespace.
Sponsored-by: On-Waves ehf --- openbsc/src/gprs/gb_proxy.c | 1 - openbsc/tests/vty_test_runner.py | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index dea6e3f..d075578 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -204,7 +204,6 @@ static struct gbprox_peer *peer_alloc(uint16_t bvci) return peer; }
-static void peer_free(struct gbprox_peer *peer) __attribute__((__unused__)); static void peer_free(struct gbprox_peer *peer) { llist_del(&peer->list); diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index 0bd7972..09352b8 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -72,7 +72,7 @@ class TestVTYGenericBSC(TestVTYBase): try: self.checkForEndAndExit() except BaseException as e: - sys.stderr.write('Expected and ignored failure: %s\n' % (str(e))) + sys.stderr.write('Expected and ignored failure: %s\n' % (str(e)))
def _testConfigNetworkTree(self): self.vty.enable() @@ -118,7 +118,7 @@ class TestVTYNITB(TestVTYGenericBSC): return (4242, "./src/osmo-nitb/osmo-nitb", "OpenBSC", "nitb")
def testConfigNetworkTree(self): - self._testConfigNetworkTree() + self._testConfigNetworkTree()
def checkForSmpp(self): """SMPP is not always enabled, check if it is""" @@ -137,10 +137,10 @@ class TestVTYNITB(TestVTYGenericBSC):
if self.checkForSmpp(): self.assertEquals(self.vty.node(), 'config') - self.assertTrue(self.vty.verify('smpp', [''])) - self.assertEquals(self.vty.node(), 'config-smpp') - self.ignoredCheckForEndAndExit() - self.assertTrue(self.vty.verify("exit", [''])) + self.assertTrue(self.vty.verify('smpp', [''])) + self.assertEquals(self.vty.node(), 'config-smpp') + self.ignoredCheckForEndAndExit() + self.assertTrue(self.vty.verify("exit", ['']))
self.assertEquals(self.vty.node(), 'config') self.assertTrue(self.vty.verify("exit", [''])) @@ -241,7 +241,7 @@ class TestVTYBSC(TestVTYGenericBSC): return (4242, "./src/osmo-bsc/osmo-bsc", "OsmoBSC", "bsc")
def testConfigNetworkTree(self): - self._testConfigNetworkTree() + self._testConfigNetworkTree()
def testVtyTree(self): self.vty.enable()
This checks for the ns and gbproxy config nodes and show commands.
Sponsored-by: On-Waves ehf --- openbsc/tests/vty_test_runner.py | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index 09352b8..e040cac 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -495,6 +495,38 @@ class TestVTYNAT(TestVTYGenericBSC): res = self.vty.verify("show ussd-connection", ['The USSD side channel provider is not connected and not authorized.']) self.assertTrue(res)
+class TestVTYGbproxy(TestVTYGenericBSC): + + def vty_command(self): + return ["./src/gprs/osmo-gbproxy", "-c", + "doc/examples/osmo-gbproxy/osmo-gbproxy.cfg"] + + def vty_app(self): + return (4246, "./src/gprs/osmo-gbproxy", "OsmoGbProxy", "bsc") + + def testVtyTree(self): + self.vty.enable() + self.assertTrue(self.vty.verify('configure terminal', [''])) + self.assertEquals(self.vty.node(), 'config') + self.ignoredCheckForEndAndExit() + self.assertTrue(self.vty.verify('ns', [''])) + self.assertEquals(self.vty.node(), 'config-ns') + self.checkForEndAndExit() + self.assertTrue(self.vty.verify('exit', [''])) + self.assertEquals(self.vty.node(), 'config') + self.assertTrue(self.vty.verify('gbproxy', [''])) + self.assertEquals(self.vty.node(), 'config-gbproxy') + self.checkForEndAndExit() + self.assertTrue(self.vty.verify('exit', [''])) + self.assertEquals(self.vty.node(), 'config') + + def testVtyShow(self): + res = self.vty.command("show ns") + self.assert_(res.find('Encapsulation NS-UDP-IP') >= 0) + + res = self.vty.command("show gbproxy stats") + self.assert_(res.find('GBProxy Global Statistics') >= 0) + def add_nat_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")): print("Skipping the NAT test") @@ -509,6 +541,13 @@ def add_bsc_test(suite, workdir): test = unittest.TestLoader().loadTestsFromTestCase(TestVTYBSC) suite.addTest(test)
+def add_gbproxy_test(suite, workdir): + if not os.path.isfile(os.path.join(workdir, "src/gprs/osmo-gbproxy")): + print("Skipping the Gb-Proxy test") + return + test = unittest.TestLoader().loadTestsFromTestCase(TestVTYGbproxy) + suite.addTest(test) + if __name__ == '__main__': import argparse import sys @@ -541,5 +580,6 @@ if __name__ == '__main__': suite.addTest(unittest.TestLoader().loadTestsFromTestCase(TestVTYNITB)) add_bsc_test(suite, workdir) add_nat_test(suite, workdir) + add_gbproxy_test(suite, workdir) res = unittest.TextTestRunner(verbosity=verbose_level).run(suite) sys.exit(len(res.errors) + len(res.failures))
This also frees the counter group pointed to by peer->ctrg when the peer gets freed.
Sponsored-by: On-Waves ehf --- openbsc/src/gprs/gb_proxy.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index d075578..d5872a9 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -206,6 +206,7 @@ static struct gbprox_peer *peer_alloc(uint16_t bvci)
static void peer_free(struct gbprox_peer *peer) { + rate_ctr_group_free(peer->ctrg); llist_del(&peer->list); talloc_free(peer); }
From: Holger Hans Peter Freyther holger@moiji-mobile.com
This just deletes the peer entry based on NSEI and BVCI. The NS-VC are not touched. --- openbsc/include/openbsc/gb_proxy.h | 1 + openbsc/src/gprs/gb_proxy.c | 26 +++++++++++++++++++++++++- openbsc/src/gprs/gb_proxy_vty.c | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h index 7b14a09..e51dd47 100644 --- a/openbsc/include/openbsc/gb_proxy.h +++ b/openbsc/include/openbsc/gb_proxy.h @@ -17,6 +17,7 @@ struct gbproxy_config {
extern struct gbproxy_config gbcfg; extern struct cmd_element show_gbproxy_cmd; +extern struct cmd_element delete_gb_cmd;
/* gb_proxy_vty .c */
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index d5872a9..a7640f0 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -1,7 +1,8 @@ /* NS-over-IP proxy */
/* (C) 2010 by Harald Welte laforge@gnumonks.org - * (C) 2010 by On-Waves + * (C) 2010-2013 by On-Waves + * (C) 2013 by Holger Hans Peter Freyther * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -909,3 +910,26 @@ gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", } return CMD_SUCCESS; } + +gDEFUN(delete_gb, delete_gb_cmd, + "delete-gbproxy-peer <0-65534> bvci <0-65534>", + "Delete a GBProxy peer by NSEI and BVCI\n" + "NSEI number\n" + "BVCI\n" + "BVCI number\n") +{ + struct gbprox_peer *peer, *tmp; + const uint16_t nsei = atoi(argv[0]); + const uint16_t bvci = atoi(argv[1]); + + llist_for_each_entry_safe(peer, tmp, &gbprox_bts_peers, list) { + if (peer->bvci != bvci) + continue; + if (peer->nsei != nsei) + continue; + + peer_free(peer); + } + + return CMD_SUCCESS; +} diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index 63546d3..176ea65 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -80,6 +80,8 @@ int gbproxy_vty_init(void) { install_element_ve(&show_gbproxy_cmd);
+ install_element(ENABLE_NODE, &delete_gb_cmd); + install_element(CONFIG_NODE, &cfg_gbproxy_cmd); install_node(&gbproxy_node, config_write_gbproxy); bsc_install_default(GBPROXY_NODE);
This adds the option to delete all BVC peers and/or NS_VC with a given NSEI with a single command. Static (configured) NS-VC are not affected. In addition, all connections for this NSEI that can be deleted by this command can be listed without deleting them.
Sponsored-by: On-Waves ehf --- openbsc/include/openbsc/gb_proxy.h | 3 +- openbsc/src/gprs/gb_proxy.c | 155 +++++++++++++++++++++++++++++++----- openbsc/src/gprs/gb_proxy_vty.c | 3 +- openbsc/tests/vty_test_runner.py | 10 +++ 4 files changed, 147 insertions(+), 24 deletions(-)
diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h index e51dd47..c2c9092 100644 --- a/openbsc/include/openbsc/gb_proxy.h +++ b/openbsc/include/openbsc/gb_proxy.h @@ -17,7 +17,8 @@ struct gbproxy_config {
extern struct gbproxy_config gbcfg; extern struct cmd_element show_gbproxy_cmd; -extern struct cmd_element delete_gb_cmd; +extern struct cmd_element delete_gb_bvci_cmd; +extern struct cmd_element delete_gb_nsei_cmd;
/* gb_proxy_vty .c */
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index a7640f0..7897baf 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -881,8 +881,63 @@ int gbprox_dump_peers(FILE *stream, int indent, int verbose) return 0; }
+static int gbprox_cleanup_peers(uint16_t nsei, uint16_t bvci) +{ + int counter = 0; + struct gbprox_peer *peer, *tmp; + + llist_for_each_entry_safe(peer, tmp, &gbprox_bts_peers, list) { + if (peer->nsei != nsei) + continue; + if (bvci && peer->bvci != bvci) + continue; + + peer_free(peer); + counter += 1; + } + + return counter; +} + +static int gbprox_cleanup_nsvcs_by_nsei(uint16_t nsei) +{ + int counter = 0; + struct gprs_ns_inst *nsi = gbcfg.nsi; + struct gprs_nsvc *nsvc, *nsvc2; + + /* delete all matching NSVCs and clear their timers */ + llist_for_each_entry_safe(nsvc, nsvc2, &nsi->gprs_nsvcs, list) { + if (nsvc->nsei != nsei) + continue; + + /* skip explicitely configured connections */ + if (nsvc->persistent) + continue; + + gprs_nsvc_delete(nsvc); + counter += 1; + } + + return counter; +} + #include <osmocom/vty/command.h>
+static void gbprox_vty_print_peer(struct vty *vty, struct gbprox_peer *peer) +{ + struct gprs_ra_id raid; + gsm48_parse_ra(&raid, peer->ra); + + vty_out(vty, "NSEI %5u, PTP-BVCI %5u, " + "RAC %u-%u-%u-%u", + peer->nsei, peer->bvci, + raid.mcc, raid.mnc, raid.lac, raid.rac); + if (peer->blocked) + vty_out(vty, " [BVC-BLOCKED]"); + + vty_out(vty, "%s", VTY_NEWLINE); +} + gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", SHOW_STR "Display information about the Gb proxy") { @@ -893,17 +948,7 @@ gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", vty_out_rate_ctr_group(vty, "", get_global_ctrg());
llist_for_each_entry(peer, &gbprox_bts_peers, list) { - struct gprs_ra_id raid; - gsm48_parse_ra(&raid, peer->ra); - - vty_out(vty, "NSEI %5u, PTP-BVCI %5u, " - "RAC %u-%u-%u-%u", - peer->nsei, peer->bvci, - raid.mcc, raid.mnc, raid.lac, raid.rac); - if (peer->blocked) - vty_out(vty, " [BVC-BLOCKED]"); - - vty_out(vty, "%s", VTY_NEWLINE); + gbprox_vty_print_peer(vty, peer);
if (show_stats) vty_out_rate_ctr_group(vty, " ", peer->ctrg); @@ -911,24 +956,90 @@ gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", return CMD_SUCCESS; }
-gDEFUN(delete_gb, delete_gb_cmd, - "delete-gbproxy-peer <0-65534> bvci <0-65534>", - "Delete a GBProxy peer by NSEI and BVCI\n" +gDEFUN(delete_gb_bvci, delete_gb_bvci_cmd, + "delete-gbproxy-peer <0-65534> bvci <2-65534>", + "Delete a GBProxy peer by NSEI and optionally BVCI\n" "NSEI number\n" - "BVCI\n" + "Only delete peer with a matching BVCI\n" "BVCI number\n") { - struct gbprox_peer *peer, *tmp; const uint16_t nsei = atoi(argv[0]); const uint16_t bvci = atoi(argv[1]); + int counter;
- llist_for_each_entry_safe(peer, tmp, &gbprox_bts_peers, list) { - if (peer->bvci != bvci) - continue; - if (peer->nsei != nsei) - continue; + counter = gbprox_cleanup_peers(nsei, bvci);
- peer_free(peer); + if (counter == 0) { + vty_out(vty, "BVC not found%s", VTY_NEWLINE); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + +gDEFUN(delete_gb_nsei, delete_gb_nsei_cmd, + "delete-gbproxy-peer <0-65534> (only-bvc|only-nsvc|all|show)", + "Delete a GBProxy peer by NSEI and optionally BVCI\n" + "NSEI number\n" + "Only delete BSSGP connections (BVC)\n" + "Only delete dynamic NS connections (NS-VC)\n" + "Delete BVC and dynamic NS connections\n" + "Show all BVC and dynamic NS connections (don't delete)\n" + ) +{ + const uint16_t nsei = atoi(argv[0]); + const char *mode = argv[1]; + int delete_bvc = 0; + int delete_nsvc = 0; + int counter; + + if (strcmp(mode, "bvc-only") == 0) + delete_bvc = 1; + else if (strcmp(mode, "nsvc-only") == 0) + delete_nsvc = 1; + else if (strcmp(mode, "all") == 0) + delete_bvc = delete_nsvc = 1; + else { + struct gbprox_peer *peer; + struct gprs_ns_inst *nsi = gbcfg.nsi; + struct gprs_nsvc *nsvc; + + counter = 0; + llist_for_each_entry(peer, &gbprox_bts_peers, list) { + if (peer->nsei != nsei) + continue; + + vty_out(vty, "BVC: "); + gbprox_vty_print_peer(vty, peer); + counter += 1; + } + vty_out(vty, "Found %d BVC%s", counter, VTY_NEWLINE); + + counter = 0; + llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) { + if (nsvc->nsei != nsei) + continue; + if (nsvc->persistent) + continue; + + vty_out(vty, "NS-VC: NSEI %5u, NS-VCI %5u, remote %s%s", + nsvc->nsei, nsvc->nsvci, + gprs_ns_ll_str(nsvc), VTY_NEWLINE); + counter += 1; + } + vty_out(vty, "Found %d NS-VC%s", counter, VTY_NEWLINE); + + return CMD_SUCCESS; + } + + if (delete_bvc) { + counter = gbprox_cleanup_peers(nsei, 0); + vty_out(vty, "Deleted %d BVC%s", counter, VTY_NEWLINE); + } + + if (delete_nsvc) { + counter = gbprox_cleanup_nsvcs_by_nsei(nsei); + vty_out(vty, "Deleted %d NS-VC%s", counter, VTY_NEWLINE); }
return CMD_SUCCESS; diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index 176ea65..82d49ca 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -80,7 +80,8 @@ int gbproxy_vty_init(void) { install_element_ve(&show_gbproxy_cmd);
- install_element(ENABLE_NODE, &delete_gb_cmd); + install_element(ENABLE_NODE, &delete_gb_bvci_cmd); + install_element(ENABLE_NODE, &delete_gb_nsei_cmd);
install_element(CONFIG_NODE, &cfg_gbproxy_cmd); install_node(&gbproxy_node, config_write_gbproxy); diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index e040cac..b5f39fe 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -527,6 +527,16 @@ class TestVTYGbproxy(TestVTYGenericBSC): res = self.vty.command("show gbproxy stats") self.assert_(res.find('GBProxy Global Statistics') >= 0)
+ def testVtyDeletePeer(self): + self.vty.enable() + self.assertTrue(self.vty.verify('delete-gbproxy-peer 9999 bvci 7777', ['BVC not found'])) + res = self.vty.command("delete-gbproxy-peer 9999 show") + self.assert_(res.find('Found 0 BVC') >= 0) + self.assert_(res.find('Found 0 NS-VC') >= 0) + res = self.vty.command("delete-gbproxy-peer 9999 all") + self.assert_(res.find('Deleted 0 BVC') >= 0) + self.assert_(res.find('Deleted 0 NS-VC') >= 0) + def add_nat_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")): print("Skipping the NAT test")
On Wed, Oct 23, 2013 at 11:24:18AM +0200, Jacob Erlbeck wrote:
All patches look fine but the semantic is odd here
+gDEFUN(delete_gb_bvci, delete_gb_bvci_cmd,
- "delete-gbproxy-peer <0-65534> bvci <2-65534>",
- "Delete a GBProxy peer by NSEI and optionally BVCI\n" "NSEI number\n"
- "BVCI\n"
- "Only delete peer with a matching BVCI\n" "BVCI number\n")
delete-gbproxy-peer 1 bvci 3 show. Better either improve the existing show command or create a new one. :)
Hi,
On 10/24/2013 08:28 AM, Holger Hans Peter Freyther wrote:
On Wed, Oct 23, 2013 at 11:24:18AM +0200, Jacob Erlbeck wrote:
All patches look fine but the semantic is odd here
+gDEFUN(delete_gb_bvci, delete_gb_bvci_cmd,
- "delete-gbproxy-peer <0-65534> bvci <2-65534>",
- "Delete a GBProxy peer by NSEI and optionally BVCI\n" "NSEI number\n"
- "BVCI\n"
- "Only delete peer with a matching BVCI\n" "BVCI number\n")
delete-gbproxy-peer 1 bvci 3 show. Better either improve the existing show command or create a new one. :)
I expected this remark ;-) I'm not really happy with this either. I had something in mind like a dry-run option. I decided against an additional show command since this 'show' is tightly coupled to the peer selection of the 'delete-gbproxy-peer'. That's less obvious, when a different command is used.
What do you think about an optional final '[dry-run]' instead of the 'show'?
Jacob
This adds the option to delete all BVC peers and/or NS_VC with a given NSEI with a single command. Static (configured) NS-VC are not affected. In addition, all connections for this NSEI that can be deleted by this command can be listed without deleting them by appending 'dry-run' to the command.
Sponsored-by: On-Waves ehf --- openbsc/include/openbsc/gb_proxy.h | 3 +- openbsc/src/gprs/gb_proxy.c | 135 ++++++++++++++++++++++++++++++------ openbsc/src/gprs/gb_proxy_vty.c | 3 +- openbsc/tests/vty_test_runner.py | 16 +++++ 4 files changed, 133 insertions(+), 24 deletions(-)
diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h index e51dd47..c2c9092 100644 --- a/openbsc/include/openbsc/gb_proxy.h +++ b/openbsc/include/openbsc/gb_proxy.h @@ -17,7 +17,8 @@ struct gbproxy_config {
extern struct gbproxy_config gbcfg; extern struct cmd_element show_gbproxy_cmd; -extern struct cmd_element delete_gb_cmd; +extern struct cmd_element delete_gb_bvci_cmd; +extern struct cmd_element delete_gb_nsei_cmd;
/* gb_proxy_vty .c */
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index a7640f0..6f7d1c3 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -881,8 +881,41 @@ int gbprox_dump_peers(FILE *stream, int indent, int verbose) return 0; }
+static int gbprox_cleanup_peers(uint16_t nsei, uint16_t bvci) +{ + int counter = 0; + struct gbprox_peer *peer, *tmp; + + llist_for_each_entry_safe(peer, tmp, &gbprox_bts_peers, list) { + if (peer->nsei != nsei) + continue; + if (bvci && peer->bvci != bvci) + continue; + + peer_free(peer); + counter += 1; + } + + return counter; +} + #include <osmocom/vty/command.h>
+static void gbprox_vty_print_peer(struct vty *vty, struct gbprox_peer *peer) +{ + struct gprs_ra_id raid; + gsm48_parse_ra(&raid, peer->ra); + + vty_out(vty, "NSEI %5u, PTP-BVCI %5u, " + "RAC %u-%u-%u-%u", + peer->nsei, peer->bvci, + raid.mcc, raid.mnc, raid.lac, raid.rac); + if (peer->blocked) + vty_out(vty, " [BVC-BLOCKED]"); + + vty_out(vty, "%s", VTY_NEWLINE); +} + gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", SHOW_STR "Display information about the Gb proxy") { @@ -893,17 +926,7 @@ gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", vty_out_rate_ctr_group(vty, "", get_global_ctrg());
llist_for_each_entry(peer, &gbprox_bts_peers, list) { - struct gprs_ra_id raid; - gsm48_parse_ra(&raid, peer->ra); - - vty_out(vty, "NSEI %5u, PTP-BVCI %5u, " - "RAC %u-%u-%u-%u", - peer->nsei, peer->bvci, - raid.mcc, raid.mnc, raid.lac, raid.rac); - if (peer->blocked) - vty_out(vty, " [BVC-BLOCKED]"); - - vty_out(vty, "%s", VTY_NEWLINE); + gbprox_vty_print_peer(vty, peer);
if (show_stats) vty_out_rate_ctr_group(vty, " ", peer->ctrg); @@ -911,24 +934,92 @@ gDEFUN(show_gbproxy, show_gbproxy_cmd, "show gbproxy [stats]", return CMD_SUCCESS; }
-gDEFUN(delete_gb, delete_gb_cmd, - "delete-gbproxy-peer <0-65534> bvci <0-65534>", - "Delete a GBProxy peer by NSEI and BVCI\n" +gDEFUN(delete_gb_bvci, delete_gb_bvci_cmd, + "delete-gbproxy-peer <0-65534> bvci <2-65534>", + "Delete a GBProxy peer by NSEI and optionally BVCI\n" "NSEI number\n" - "BVCI\n" + "Only delete peer with a matching BVCI\n" "BVCI number\n") { - struct gbprox_peer *peer, *tmp; const uint16_t nsei = atoi(argv[0]); const uint16_t bvci = atoi(argv[1]); + int counter;
- llist_for_each_entry_safe(peer, tmp, &gbprox_bts_peers, list) { - if (peer->bvci != bvci) - continue; - if (peer->nsei != nsei) - continue; + counter = gbprox_cleanup_peers(nsei, bvci);
- peer_free(peer); + if (counter == 0) { + vty_out(vty, "BVC not found%s", VTY_NEWLINE); + return CMD_WARNING; + } + + return CMD_SUCCESS; +} + +gDEFUN(delete_gb_nsei, delete_gb_nsei_cmd, + "delete-gbproxy-peer <0-65534> (only-bvc|only-nsvc|all) [dry-run]", + "Delete a GBProxy peer by NSEI and optionally BVCI\n" + "NSEI number\n" + "Only delete BSSGP connections (BVC)\n" + "Only delete dynamic NS connections (NS-VC)\n" + "Delete BVC and dynamic NS connections\n" + "Show what would be deleted instead of actually deleting\n" + ) +{ + const uint16_t nsei = atoi(argv[0]); + const char *mode = argv[1]; + int dry_run = argc > 2; + int delete_bvc = 0; + int delete_nsvc = 0; + int counter; + + if (strcmp(mode, "only-bvc") == 0) + delete_bvc = 1; + else if (strcmp(mode, "only-nsvc") == 0) + delete_nsvc = 1; + else + delete_bvc = delete_nsvc = 1; + + if (delete_bvc) { + if (!dry_run) + counter = gbprox_cleanup_peers(nsei, 0); + else { + struct gbprox_peer *peer; + counter = 0; + llist_for_each_entry(peer, &gbprox_bts_peers, list) { + if (peer->nsei != nsei) + continue; + + vty_out(vty, "BVC: "); + gbprox_vty_print_peer(vty, peer); + counter += 1; + } + } + vty_out(vty, "%sDeleted %d BVC%s", + dry_run ? "Not " : "", counter, VTY_NEWLINE); + } + + if (delete_nsvc) { + struct gprs_ns_inst *nsi = gbcfg.nsi; + struct gprs_nsvc *nsvc, *nsvc2; + + counter = 0; + llist_for_each_entry_safe(nsvc, nsvc2, &nsi->gprs_nsvcs, list) { + if (nsvc->nsei != nsei) + continue; + if (nsvc->persistent) + continue; + + if (!dry_run) + gprs_nsvc_delete(nsvc); + else + vty_out(vty, "NS-VC: NSEI %5u, NS-VCI %5u, " + "remote %s%s", + nsvc->nsei, nsvc->nsvci, + gprs_ns_ll_str(nsvc), VTY_NEWLINE); + counter += 1; + } + vty_out(vty, "%sDeleted %d NS-VC%s", + dry_run ? "Not " : "", counter, VTY_NEWLINE); }
return CMD_SUCCESS; diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index 176ea65..82d49ca 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -80,7 +80,8 @@ int gbproxy_vty_init(void) { install_element_ve(&show_gbproxy_cmd);
- install_element(ENABLE_NODE, &delete_gb_cmd); + install_element(ENABLE_NODE, &delete_gb_bvci_cmd); + install_element(ENABLE_NODE, &delete_gb_nsei_cmd);
install_element(CONFIG_NODE, &cfg_gbproxy_cmd); install_node(&gbproxy_node, config_write_gbproxy); diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index e040cac..18cf688 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -527,6 +527,22 @@ class TestVTYGbproxy(TestVTYGenericBSC): res = self.vty.command("show gbproxy stats") self.assert_(res.find('GBProxy Global Statistics') >= 0)
+ def testVtyDeletePeer(self): + self.vty.enable() + self.assertTrue(self.vty.verify('delete-gbproxy-peer 9999 bvci 7777', ['BVC not found'])) + res = self.vty.command("delete-gbproxy-peer 9999 all dry-run") + self.assert_(res.find('Not Deleted 0 BVC') >= 0) + self.assert_(res.find('Not Deleted 0 NS-VC') >= 0) + res = self.vty.command("delete-gbproxy-peer 9999 only-bvc dry-run") + self.assert_(res.find('Not Deleted 0 BVC') >= 0) + self.assert_(res.find('Not Deleted 0 NS-VC') < 0) + res = self.vty.command("delete-gbproxy-peer 9999 only-nsvc dry-run") + self.assert_(res.find('Not Deleted 0 BVC') < 0) + self.assert_(res.find('Not Deleted 0 NS-VC') >= 0) + res = self.vty.command("delete-gbproxy-peer 9999 all") + self.assert_(res.find('Deleted 0 BVC') >= 0) + self.assert_(res.find('Deleted 0 NS-VC') >= 0) + def add_nat_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")): print("Skipping the NAT test")
On Thu, Oct 24, 2013 at 12:48:23PM +0200, Jacob Erlbeck wrote:
llist_for_each_entry_safe(nsvc, nsvc2, &nsi->gprs_nsvcs, list) {if (nsvc->nsei != nsei)continue;if (nsvc->persistent)continue;if (!dry_run)gprs_nsvc_delete(nsvc);elsevty_out(vty, "NS-VC: NSEI %5u, NS-VCI %5u, ""remote %s%s",nsvc->nsei, nsvc->nsvci,gprs_ns_ll_str(nsvc), VTY_NEWLINE);counter += 1;}vty_out(vty, "%sDeleted %d NS-VC%s",dry_run ? "Not " : "", counter, VTY_NEWLINE);
ahhh, now I understand! Good solution! Going to review it again.