diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2015-12-07 01:13:47 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2015-12-07 13:37:28 +0100 |
commit | 4d2b3ff6a235ff42ba839ca782f187a321c3e6a4 (patch) | |
tree | af5734d1ca3c1ab5ede475f04b09c7d9b33d438d | |
parent | d010c49407220f7efe55d50d1dbf261a70f756d2 (diff) |
gtphub: add VTY show for peers and peer stats.
Sponsored-by: On-Waves ehi
-rw-r--r-- | openbsc/src/gprs/gtphub_vty.c | 123 |
1 files changed, 119 insertions, 4 deletions
diff --git a/openbsc/src/gprs/gtphub_vty.c b/openbsc/src/gprs/gtphub_vty.c index 9e3c5e012..85c737d3c 100644 --- a/openbsc/src/gprs/gtphub_vty.c +++ b/openbsc/src/gprs/gtphub_vty.c @@ -19,6 +19,7 @@ */ #include <string.h> +#include <inttypes.h> #include <ares.h> #include <sys/socket.h> @@ -288,7 +289,7 @@ static void show_bind_stats_all(struct vty *vty) int side_idx; for_each_side(side_idx) { struct gtphub_bind *b = &g_hub->to_gsns[side_idx][plane_idx]; - vty_out(vty, " - to/from %ss: %s port %d%s", + vty_out(vty, " - local addr to/from %ss: %s port %d%s", gtphub_side_idx_names[side_idx], gsn_addr_to_str(&b->local_addr), (int)b->local_port, VTY_NEWLINE); @@ -315,13 +316,101 @@ static void show_tunnel_stats(struct vty *vty, struct gtphub_tunnel *tun) } } -/* +static void show_peer_summary(struct vty *vty, const char *prefix, + int side_idx, int plane_idx, + struct gtphub_peer *p, int with_io_stats) +{ + struct gtphub_peer_addr *pa; + int p2l = strlen(prefix) + 4 + 1; + char prefix2[p2l]; + memset(prefix2, ' ', p2l - 1); + prefix2[p2l - 1] = '\0'; + + if (with_io_stats) { + llist_for_each_entry(pa, &p->addresses, entry) { + vty_out(vty, "%s- %s %s %s%s", prefix, + gtphub_side_idx_names[side_idx], + gtphub_plane_idx_names[plane_idx], + gsn_addr_to_str(&pa->addr), + VTY_NEWLINE); + + + struct gtphub_peer_port *pp; + llist_for_each_entry(pp, &pa->ports, entry) { + vty_out(vty, "%s Port %" PRIu16 "%s", prefix, pp->port, VTY_NEWLINE); + vty_out_rate_ctr_group(vty, prefix2, pp->counters_io); + } + } + } else { + llist_for_each_entry(pa, &p->addresses, entry) { + vty_out(vty, "%s- %s %s %s", prefix, + gtphub_side_idx_names[side_idx], + gtphub_plane_idx_names[plane_idx], + gsn_addr_to_str(&pa->addr)); + struct gtphub_peer_port *pp; + llist_for_each_entry(pp, &pa->ports, entry) { + vty_out(vty, ":%" PRIu16, pp->port); + } + vty_out(vty, VTY_NEWLINE); + } + } +} + static void show_peers_summary(struct vty *vty) { - int c + int side_idx; int plane_idx; + + int count[GTPH_SIDE_N][GTPH_PLANE_N] = {{0}}; + + for_each_side(side_idx) { + for_each_plane(plane_idx) { + struct gtphub_peer *p; + llist_for_each_entry(p, &g_hub->to_gsns[side_idx][plane_idx].peers, entry) { + count[side_idx][plane_idx] ++; + } + } + } + + vty_out(vty, "Peers Count:%s", VTY_NEWLINE); + for_each_side_and_plane(side_idx, plane_idx) { + vty_out(vty, " %s %s peers: %d%s", + gtphub_side_idx_names[side_idx], + gtphub_plane_idx_names[plane_idx], + count[side_idx][plane_idx], + VTY_NEWLINE); + } } -*/ + +static void show_peers_all(struct vty *vty, int with_io_stats) +{ + int side_idx; + int plane_idx; + + int count[GTPH_SIDE_N][GTPH_PLANE_N] = {{0}}; + + vty_out(vty, "All Peers%s%s", + with_io_stats? " with I/O stats" : "", + VTY_NEWLINE); + for_each_side(side_idx) { + vty_out(vty, "- %s%s", gtphub_side_idx_names[side_idx], VTY_NEWLINE); + for_each_plane(plane_idx) { + struct gtphub_peer *p; + llist_for_each_entry(p, &g_hub->to_gsns[side_idx][plane_idx].peers, entry) { + count[side_idx][plane_idx] ++; + show_peer_summary(vty, " ", side_idx, plane_idx, p, with_io_stats); + } + } + } + for_each_side_and_plane(side_idx, plane_idx) { + vty_out(vty, "%s %s peers: %d%s", + gtphub_side_idx_names[side_idx], + gtphub_plane_idx_names[plane_idx], + count[side_idx][plane_idx], + VTY_NEWLINE); + } +} + static void show_tunnels_summary(struct vty *vty) { @@ -422,6 +511,28 @@ static void show_tunnels_all(struct vty *vty, int with_io_stats) count, incomplete, VTY_NEWLINE); } + +DEFUN(show_gtphub_peers_summary, show_gtphub_peers_summary_cmd, "show gtphub peers summary", + SHOW_STR "Summary of all peers") +{ + show_peers_summary(vty); + return CMD_SUCCESS; +} + +DEFUN(show_gtphub_peers_list, show_gtphub_peers_list_cmd, "show gtphub peers list", + SHOW_STR "List all peers") +{ + show_peers_all(vty, 0); + return CMD_SUCCESS; +} + +DEFUN(show_gtphub_peers_stats, show_gtphub_peers_stats_cmd, "show gtphub peers stats", + SHOW_STR "List all peers with I/O stats") +{ + show_peers_all(vty, 1); + return CMD_SUCCESS; +} + DEFUN(show_gtphub_tunnels_summary, show_gtphub_tunnels_summary_cmd, "show gtphub tunnels summary", SHOW_STR "Summary of all tunnels") { @@ -447,6 +558,7 @@ DEFUN(show_gtphub, show_gtphub_cmd, "show gtphub all", SHOW_STR "Display information about the GTP hub") { show_bind_stats_all(vty); + show_peers_summary(vty); show_tunnels_summary(vty); return CMD_SUCCESS; } @@ -458,6 +570,9 @@ int gtphub_vty_init(struct gtphub *global_hub, struct gtphub_cfg *global_cfg) g_cfg = global_cfg; install_element_ve(&show_gtphub_cmd); + install_element_ve(&show_gtphub_peers_summary_cmd); + install_element_ve(&show_gtphub_peers_list_cmd); + install_element_ve(&show_gtphub_peers_stats_cmd); install_element_ve(&show_gtphub_tunnels_summary_cmd); install_element_ve(&show_gtphub_tunnels_list_cmd); install_element_ve(&show_gtphub_tunnels_stats_cmd); |