From 1f2cd179f557fac7ec22a4b0e078b0d97fface78 Mon Sep 17 00:00:00 2001 From: Christian Giese Date: Wed, 31 Mar 2021 15:37:59 +0200 Subject: [PATCH] Add UI View for Stream Stats --- src/bbl.c | 5 - src/bbl_interactive.c | 449 +++++++++++++++++++++++++----------------- 2 files changed, 264 insertions(+), 190 deletions(-) diff --git a/src/bbl.c b/src/bbl.c index 73240907..7ecdadf8 100644 --- a/src/bbl.c +++ b/src/bbl.c @@ -35,12 +35,7 @@ volatile bool g_teardown = false; volatile bool g_teardown_request = false; volatile uint8_t g_teardown_request_count = 0; -/* This global variable is used to switch between access - * interfaces in interactive mode (ncurses). */ -uint8_t g_access_if_selected = 0; -uint8_t g_display_streams = 0; -uint8_t g_stream_start_index = 0; const char banner[] = "\n" " ____ __ ____ _ __ ,/\n" diff --git a/src/bbl_interactive.c b/src/bbl_interactive.c index a15438af..63825103 100644 --- a/src/bbl_interactive.c +++ b/src/bbl_interactive.c @@ -10,20 +10,46 @@ #include "bbl.h" #include "bbl_stats.h" #include "bbl_logging.h" +#include "bbl_session.h" +#include "bbl_stream.h" #define PROGRESS_BAR_SIZE 60 #define STATS_WIN_SIZE 90 +typedef enum { + UI_VIEW_DEFAULT = 0, + UI_VIEW_STREAMS, + UI_VIEW_MAX, +} __attribute__ ((__packed__)) bbl_ui_view; + + /* ncurses */ WINDOW *stats_win = NULL; WINDOW *log_win = NULL; extern volatile bool g_teardown; extern volatile bool g_teardown_request; -extern uint8_t g_access_if_selected; + +/* This global variable is used to switch between access interfaces. */ +uint8_t g_access_if_selected = 0; +/* This global variable is used to switch between views. */ +bbl_ui_view g_view_selected = 0; +/* This global variable is used to switch vetween sessions in some views. */ +uint32_t g_session_selected = 1; extern const char banner[]; +void +bbl_init_stats_win() +{ + wclear(stats_win); + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, "F1: Select View F2: Select Session F3: Select Interface\n"); + wprintw(stats_win, "F7: Start Traffic F8: Stop Traffic F9: Terminate Sessions\n"); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, "%s", banner); +} + static void enable_disable_traffic(bbl_ctx_s *ctx, bool status) { @@ -51,6 +77,19 @@ bbl_read_key_job (timer_s *timer) ch = getch(); switch (ch) { + case KEY_F(1): + g_view_selected++; + if(g_view_selected >= UI_VIEW_MAX) { + g_view_selected = UI_VIEW_DEFAULT; + } + bbl_init_stats_win(); + break; + case KEY_F(2): + g_session_selected++; + if(g_session_selected > ctx->sessions) { + g_session_selected = 1; + } + break; case KEY_F(6): g_access_if_selected++; if(g_access_if_selected >= ctx->op.access_if_count) { @@ -111,211 +150,254 @@ void bbl_stats_job (timer_s *timer) { bbl_ctx_s *ctx = timer->data; - struct bbl_interface_ *access_if; + struct bbl_interface_ *access_if; + + bbl_session_s *session; + bbl_stream *stream; + int max_x, max_y; int i; access_if = ctx->op.access_if[g_access_if_selected]; - wmove(stats_win, 12, 0); + wmove(stats_win, 14, 0); getmaxyx(stats_win, max_y, max_x); (void)max_x; - if(ctx->sessions) { - wprintw(stats_win, "\nSessions %10lu (%lu PPPoE / %lu IPoE)\n", ctx->sessions, ctx->sessions_pppoe, ctx->sessions_ipoe); + if(g_view_selected == UI_VIEW_DEFAULT) { - /* Progress bar established sessions */ - wprintw(stats_win, " Established %10lu [", ctx->sessions_established); - if(ctx->sessions == ctx->sessions_established) { - wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_established)); - wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - } else { + if(ctx->sessions) { + wprintw(stats_win, "\nSessions %10lu (%lu PPPoE / %lu IPoE)\n", ctx->sessions, ctx->sessions_pppoe, ctx->sessions_ipoe); + + /* Progress bar established sessions */ + wprintw(stats_win, " Established %10lu [", ctx->sessions_established); + if(ctx->sessions == ctx->sessions_established) { + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_established)); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + } else { + wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_established)); + wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); + } + wprintw(stats_win, "]\n"); + + /* Progress bar outstanding sessions */ + wprintw(stats_win, " Outstanding %10lu [", ctx->sessions_outstanding); wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_established)); - wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); - } - wprintw(stats_win, "]\n"); - - /* Progress bar outstanding sessions */ - wprintw(stats_win, " Outstanding %10lu [", ctx->sessions_outstanding); - wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->config.sessions_max_outstanding, ctx->sessions_outstanding)); - wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); - wprintw(stats_win, "]\n"); - - /* Progress bar terminated sessions */ - wprintw(stats_win, " Terminated %10lu [", ctx->sessions_terminated); - wattron(stats_win, COLOR_PAIR(COLOR_RED)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_terminated)); - wattroff(stats_win, COLOR_PAIR(COLOR_RED)); - wprintw(stats_win, "]\n"); - - /* Session stats */ - wprintw(stats_win, " Setup Time %10lu ms\n", ctx->stats.setup_time); - wprintw(stats_win, " Setup Rate %10.02lf CPS (MIN: %0.02lf AVG: %0.02lf MAX: %0.02lf)\n", - ctx->stats.cps, ctx->stats.cps_min, ctx->stats.cps_avg, ctx->stats.cps_max); - wprintw(stats_win, " Flapped %10lu\n", ctx->sessions_flapped); - - /* DHCPv6 */ - if(ctx->config.dhcpv6_enable) { - wprintw(stats_win, "\nDHCPv6\n"); - wprintw(stats_win, " Sessions %10lu\n", ctx->dhcpv6_requested); - wprintw(stats_win, " Established %10lu [", ctx->dhcpv6_established); - if(ctx->dhcpv6_requested == ctx->dhcpv6_established) { - wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->dhcpv6_requested, ctx->dhcpv6_established)); - wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - } else { - wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->dhcpv6_requested, ctx->dhcpv6_established)); - wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); - } + wprintw(stats_win, "%s", bbl_format_progress(ctx->config.sessions_max_outstanding, ctx->sessions_outstanding)); + wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); wprintw(stats_win, "]\n"); - } - } - - if (ctx->op.network_if) { - if(dict_count(ctx->li_flow_dict)) { - wprintw(stats_win, "\nLI Statistics\n"); - wprintw(stats_win, " Flows %10lu\n", dict_count(ctx->li_flow_dict)); - wprintw(stats_win, " Rx Packets %10lu (%7lu PPS)\n", - ctx->op.network_if->stats.li_rx, ctx->op.network_if->stats.rate_li_rx.avg); - } - if(ctx->config.l2tp_server) { - wprintw(stats_win, "\nL2TP LNS Statistics\n"); - wprintw(stats_win, " Tunnels %10lu\n", ctx->l2tp_tunnels); - wprintw(stats_win, " Established %10lu\n", ctx->l2tp_tunnels_established); - wprintw(stats_win, " Sessions %10lu\n", ctx->l2tp_sessions); - wprintw(stats_win, " Packets:\n"); - wprintw(stats_win, " Tx Control %10lu Retries: %lu\n", - ctx->op.network_if->stats.l2tp_control_tx, ctx->op.network_if->stats.l2tp_control_retry); - wprintw(stats_win, " Rx Control %10lu Duplicate: %lu Out-of-Order: %lu\n", - ctx->op.network_if->stats.l2tp_control_rx, - ctx->op.network_if->stats.l2tp_control_rx_dup, - ctx->op.network_if->stats.l2tp_control_rx_ooo); - wprintw(stats_win, " Tx Data %10lu (%7lu PPS)\n", - ctx->op.network_if->stats.l2tp_data_tx, ctx->op.network_if->stats.rate_l2tp_data_tx.avg); - wprintw(stats_win, " Rx Data %10lu (%7lu PPS)\n", - ctx->op.network_if->stats.l2tp_data_rx, ctx->op.network_if->stats.rate_l2tp_data_tx.avg); + + /* Progress bar terminated sessions */ + wprintw(stats_win, " Terminated %10lu [", ctx->sessions_terminated); + wattron(stats_win, COLOR_PAIR(COLOR_RED)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->sessions, ctx->sessions_terminated)); + wattroff(stats_win, COLOR_PAIR(COLOR_RED)); + wprintw(stats_win, "]\n"); + + /* Session stats */ + wprintw(stats_win, " Setup Time %10lu ms\n", ctx->stats.setup_time); + wprintw(stats_win, " Setup Rate %10.02lf CPS (MIN: %0.02lf AVG: %0.02lf MAX: %0.02lf)\n", + ctx->stats.cps, ctx->stats.cps_min, ctx->stats.cps_avg, ctx->stats.cps_max); + wprintw(stats_win, " Flapped %10lu\n", ctx->sessions_flapped); + + /* DHCPv6 */ + if(ctx->config.dhcpv6_enable) { + wprintw(stats_win, "\nDHCPv6\n"); + wprintw(stats_win, " Sessions %10lu\n", ctx->dhcpv6_requested); + wprintw(stats_win, " Established %10lu [", ctx->dhcpv6_established); + if(ctx->dhcpv6_requested == ctx->dhcpv6_established) { + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->dhcpv6_requested, ctx->dhcpv6_established)); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + } else { + wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->dhcpv6_requested, ctx->dhcpv6_established)); + wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); + } + wprintw(stats_win, "]\n"); + } } - if(access_if && ctx->stats.session_traffic_flows) { - wprintw(stats_win, "\nSession Traffic\n"); - wprintw(stats_win, " Flows %10lu\n", ctx->stats.session_traffic_flows); - /* Progress bar session traffic flows */ - wprintw(stats_win, " Verified %10lu [", ctx->stats.session_traffic_flows_verified); - if(ctx->stats.session_traffic_flows == ctx->stats.session_traffic_flows_verified) { - wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->stats.session_traffic_flows, ctx->stats.session_traffic_flows_verified)); - wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - } else { - wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); - wprintw(stats_win, "%s", bbl_format_progress(ctx->stats.session_traffic_flows, ctx->stats.session_traffic_flows_verified)); - wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); + if (ctx->op.network_if) { + if(dict_count(ctx->li_flow_dict)) { + wprintw(stats_win, "\nLI Statistics\n"); + wprintw(stats_win, " Flows %10lu\n", dict_count(ctx->li_flow_dict)); + wprintw(stats_win, " Rx Packets %10lu (%7lu PPS)\n", + ctx->op.network_if->stats.li_rx, ctx->op.network_if->stats.rate_li_rx.avg); } - wprintw(stats_win, "]\n"); + if(ctx->config.l2tp_server) { + wprintw(stats_win, "\nL2TP LNS Statistics\n"); + wprintw(stats_win, " Tunnels %10lu\n", ctx->l2tp_tunnels); + wprintw(stats_win, " Established %10lu\n", ctx->l2tp_tunnels_established); + wprintw(stats_win, " Sessions %10lu\n", ctx->l2tp_sessions); + wprintw(stats_win, " Packets:\n"); + wprintw(stats_win, " Tx Control %10lu Retries: %lu\n", + ctx->op.network_if->stats.l2tp_control_tx, ctx->op.network_if->stats.l2tp_control_retry); + wprintw(stats_win, " Rx Control %10lu Duplicate: %lu Out-of-Order: %lu\n", + ctx->op.network_if->stats.l2tp_control_rx, + ctx->op.network_if->stats.l2tp_control_rx_dup, + ctx->op.network_if->stats.l2tp_control_rx_ooo); + wprintw(stats_win, " Tx Data %10lu (%7lu PPS)\n", + ctx->op.network_if->stats.l2tp_data_tx, ctx->op.network_if->stats.rate_l2tp_data_tx.avg); + wprintw(stats_win, " Rx Data %10lu (%7lu PPS)\n", + ctx->op.network_if->stats.l2tp_data_rx, ctx->op.network_if->stats.rate_l2tp_data_tx.avg); + } + + if(access_if && ctx->stats.session_traffic_flows) { + wprintw(stats_win, "\nSession Traffic\n"); + wprintw(stats_win, " Flows %10lu\n", ctx->stats.session_traffic_flows); + /* Progress bar session traffic flows */ + wprintw(stats_win, " Verified %10lu [", ctx->stats.session_traffic_flows_verified); + if(ctx->stats.session_traffic_flows == ctx->stats.session_traffic_flows_verified) { + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->stats.session_traffic_flows, ctx->stats.session_traffic_flows_verified)); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + } else { + wattron(stats_win, COLOR_PAIR(COLOR_BLACK)); + wprintw(stats_win, "%s", bbl_format_progress(ctx->stats.session_traffic_flows, ctx->stats.session_traffic_flows_verified)); + wattroff(stats_win, COLOR_PAIR(COLOR_BLACK)); + } + wprintw(stats_win, "]\n"); + } + wprintw(stats_win, "\nNetwork Interface ("); + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, " %s", ctx->op.network_if->name); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, " )\n Tx Packets %10lu |%7lu PPS %10lu Kbps\n", + ctx->op.network_if->stats.packets_tx, ctx->op.network_if->stats.rate_packets_tx.avg, + ctx->op.network_if->stats.rate_bytes_tx.avg * 8 / 1000); + wprintw(stats_win, " Rx Packets %10lu |%7lu PPS %10lu Kbps\n", + ctx->op.network_if->stats.packets_rx, ctx->op.network_if->stats.rate_packets_rx.avg, + ctx->op.network_if->stats.rate_bytes_rx.avg * 8 / 1000); + wprintw(stats_win, " Tx Session Packets %10lu |%7lu PPS\n", + ctx->op.network_if->stats.session_ipv4_tx, ctx->op.network_if->stats.rate_session_ipv4_tx.avg); + wprintw(stats_win, " Rx Session Packets %10lu |%7lu PPS %10lu Loss\n", + ctx->op.network_if->stats.session_ipv4_rx, ctx->op.network_if->stats.rate_session_ipv4_rx.avg, + ctx->op.network_if->stats.session_ipv4_loss); + wprintw(stats_win, " Tx Session Packets IPv6 %10lu |%7lu PPS\n", + ctx->op.network_if->stats.session_ipv6_tx, ctx->op.network_if->stats.rate_session_ipv6_tx.avg); + wprintw(stats_win, " Rx Session Packets IPv6 %10lu |%7lu PPS %10lu Loss\n", + ctx->op.network_if->stats.session_ipv6_rx, ctx->op.network_if->stats.rate_session_ipv6_rx.avg, + ctx->op.network_if->stats.session_ipv6_loss); + wprintw(stats_win, " Tx Session Packets IPv6PD %10lu |%7lu PPS\n", + ctx->op.network_if->stats.session_ipv6pd_tx, ctx->op.network_if->stats.rate_session_ipv6pd_tx.avg); + wprintw(stats_win, " Rx Session Packets IPv6PD %10lu |%7lu PPS %10lu Loss\n", + ctx->op.network_if->stats.session_ipv6pd_rx, ctx->op.network_if->stats.rate_session_ipv6pd_rx.avg, + ctx->op.network_if->stats.session_ipv6pd_loss); + wprintw(stats_win, " Tx Multicast Packets %10lu |%7lu PPS\n", + ctx->op.network_if->stats.mc_tx, ctx->op.network_if->stats.rate_mc_tx.avg); } - wprintw(stats_win, "\nNetwork Interface ("); + + if(access_if) { + wprintw(stats_win, "\nAccess Interface ("); + for(i = 0; i < ctx->op.access_if_count; i++) { + if(i == g_access_if_selected) { + wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); + wprintw(stats_win, " %s", ctx->op.access_if[i]->name); + wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); + } else { + wprintw(stats_win, " %s", ctx->op.access_if[i]->name); + } + } + wprintw(stats_win, " )\n Tx Packets %10lu |%7lu PPS %10lu Kbps\n", + access_if->stats.packets_tx, access_if->stats.rate_packets_tx.avg, + access_if->stats.rate_bytes_tx.avg * 8 / 1000); + wprintw(stats_win, " Rx Packets %10lu |%7lu PPS %10lu Kbps\n", + access_if->stats.packets_rx, access_if->stats.rate_packets_rx.avg, + access_if->stats.rate_bytes_rx.avg * 8 / 1000); + wprintw(stats_win, " Tx Session Packets %10lu |%7lu PPS\n", + access_if->stats.session_ipv4_tx, access_if->stats.rate_session_ipv4_tx.avg); + wprintw(stats_win, " Rx Session Packets %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", + access_if->stats.session_ipv4_rx, access_if->stats.rate_session_ipv4_rx.avg, + access_if->stats.session_ipv4_loss, access_if->stats.session_ipv4_wrong_session); + wprintw(stats_win, " Tx Session Packets IPv6 %10lu |%7lu PPS\n", + access_if->stats.session_ipv6_tx, access_if->stats.rate_session_ipv6_tx.avg); + wprintw(stats_win, " Rx Session Packets IPv6 %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", + access_if->stats.session_ipv6_rx, access_if->stats.rate_session_ipv6_rx.avg, + access_if->stats.session_ipv6_loss, access_if->stats.session_ipv6_wrong_session); + wprintw(stats_win, " Tx Session Packets IPv6PD %10lu |%7lu PPS\n", + access_if->stats.session_ipv6pd_tx, access_if->stats.rate_session_ipv6pd_tx.avg); + wprintw(stats_win, " Rx Session Packets IPv6PD %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", + access_if->stats.session_ipv6pd_rx, access_if->stats.rate_session_ipv6pd_rx.avg, + access_if->stats.session_ipv6pd_loss, access_if->stats.session_ipv6pd_wrong_session); + wprintw(stats_win, " Rx Multicast Packets %10lu |%7lu PPS %10lu Loss\n", + access_if->stats.mc_rx, access_if->stats.rate_mc_rx.avg, + access_if->stats.mc_loss); + + /* Protocol stats */ + if(max_y > 70) { + wprintw(stats_win, "\nAccess Interface Protocol Packet Stats\n"); + wprintw(stats_win, " ARP TX: %10u RX: %10u\n", access_if->stats.arp_tx, access_if->stats.arp_rx); + wprintw(stats_win, " PADI TX: %10u RX: %10u\n", access_if->stats.padi_tx, 0); + wprintw(stats_win, " PADO TX: %10u RX: %10u\n", 0, access_if->stats.pado_rx); + wprintw(stats_win, " PADR TX: %10u RX: %10u\n", access_if->stats.padr_tx, 0); + wprintw(stats_win, " PADS TX: %10u RX: %10u\n", 0, access_if->stats.pads_rx); + wprintw(stats_win, " PADT TX: %10u RX: %10u\n", access_if->stats.padt_tx, access_if->stats.padt_rx); + wprintw(stats_win, " LCP TX: %10u RX: %10u\n", access_if->stats.lcp_tx, access_if->stats.lcp_rx); + wprintw(stats_win, " PAP TX: %10u RX: %10u\n", access_if->stats.pap_tx, access_if->stats.pap_rx); + wprintw(stats_win, " CHAP TX: %10u RX: %10u\n", access_if->stats.chap_tx, access_if->stats.chap_rx); + wprintw(stats_win, " IPCP TX: %10u RX: %10u\n", access_if->stats.ipcp_tx, access_if->stats.ipcp_rx); + wprintw(stats_win, " IP6CP TX: %10u RX: %10u\n", access_if->stats.ip6cp_tx, access_if->stats.ip6cp_rx); + wprintw(stats_win, " IGMP TX: %10u RX: %10u\n", access_if->stats.igmp_tx, access_if->stats.igmp_rx); + wprintw(stats_win, " ICMP TX: %10u RX: %10u\n", access_if->stats.icmp_tx, access_if->stats.icmp_rx); + wprintw(stats_win, " ICMPv6 TX: %10u RX: %10u\n", access_if->stats.icmpv6_tx, access_if->stats.icmpv6_rx); + wprintw(stats_win, " DHCPv6 TX: %10u RX: %10u\n", access_if->stats.dhcpv6_tx, access_if->stats.dhcpv6_rx); + } + if(max_y > 80) { + wprintw(stats_win, "\nAccess Interface Protocol Timeout Stats\n"); + wprintw(stats_win, " LCP Echo Request: %10u\n", access_if->stats.lcp_echo_timeout); + wprintw(stats_win, " LCP Request: %10u\n", access_if->stats.lcp_timeout); + wprintw(stats_win, " IPCP Request: %10u\n", access_if->stats.ipcp_timeout); + wprintw(stats_win, " IP6CP Request: %10u\n", access_if->stats.ip6cp_timeout); + wprintw(stats_win, " PAP: %10u\n", access_if->stats.pap_timeout); + wprintw(stats_win, " CHAP: %10u\n", access_if->stats.chap_timeout); + wprintw(stats_win, " ICMPv6 RS: %10u\n", access_if->stats.dhcpv6_timeout); + wprintw(stats_win, " DHCPv6 Request: %10u\n", access_if->stats.dhcpv6_timeout); + } + } + } else if(g_view_selected == UI_VIEW_STREAMS) { + wprintw(stats_win, "\nSession Stream Stats ( Session-Id: ", g_session_selected); wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, " %s", ctx->op.network_if->name); + wprintw(stats_win, "%u", g_session_selected); wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, " )\n Tx Packets %10lu |%7lu PPS %10lu Kbps\n", - ctx->op.network_if->stats.packets_tx, ctx->op.network_if->stats.rate_packets_tx.avg, - ctx->op.network_if->stats.rate_bytes_tx.avg * 8 / 1000); - wprintw(stats_win, " Rx Packets %10lu |%7lu PPS %10lu Kbps\n", - ctx->op.network_if->stats.packets_rx, ctx->op.network_if->stats.rate_packets_rx.avg, - ctx->op.network_if->stats.rate_bytes_rx.avg * 8 / 1000); - wprintw(stats_win, " Tx Session Packets %10lu |%7lu PPS\n", - ctx->op.network_if->stats.session_ipv4_tx, ctx->op.network_if->stats.rate_session_ipv4_tx.avg); - wprintw(stats_win, " Rx Session Packets %10lu |%7lu PPS %10lu Loss\n", - ctx->op.network_if->stats.session_ipv4_rx, ctx->op.network_if->stats.rate_session_ipv4_rx.avg, - ctx->op.network_if->stats.session_ipv4_loss); - wprintw(stats_win, " Tx Session Packets IPv6 %10lu |%7lu PPS\n", - ctx->op.network_if->stats.session_ipv6_tx, ctx->op.network_if->stats.rate_session_ipv6_tx.avg); - wprintw(stats_win, " Rx Session Packets IPv6 %10lu |%7lu PPS %10lu Loss\n", - ctx->op.network_if->stats.session_ipv6_rx, ctx->op.network_if->stats.rate_session_ipv6_rx.avg, - ctx->op.network_if->stats.session_ipv6_loss); - wprintw(stats_win, " Tx Session Packets IPv6PD %10lu |%7lu PPS\n", - ctx->op.network_if->stats.session_ipv6pd_tx, ctx->op.network_if->stats.rate_session_ipv6pd_tx.avg); - wprintw(stats_win, " Rx Session Packets IPv6PD %10lu |%7lu PPS %10lu Loss\n", - ctx->op.network_if->stats.session_ipv6pd_rx, ctx->op.network_if->stats.rate_session_ipv6pd_rx.avg, - ctx->op.network_if->stats.session_ipv6pd_loss); - wprintw(stats_win, " Tx Multicast Packets %10lu |%7lu PPS\n", - ctx->op.network_if->stats.mc_tx, ctx->op.network_if->stats.rate_mc_tx.avg); - } + wprintw(stats_win, " )\n", g_session_selected); + session = bbl_session_get(ctx, g_session_selected); + if(session) { + if(session->username) { + wprintw(stats_win, "\n Username: %s \n", session->username); + } + wprintw(stats_win, "\n Session\n"); + wprintw(stats_win, " Tx Packets %10lu | %7lu PPS | %10lu Kbps\n", + session->stats.packets_tx, session->stats.rate_packets_tx.avg, + session->stats.rate_bytes_tx.avg * 8 / 1000); + wprintw(stats_win, " Rx Packets %10lu | %7lu PPS | %10lu Kbps\n", + session->stats.packets_rx, session->stats.rate_packets_rx.avg, + session->stats.rate_bytes_rx.avg * 8 / 1000); - if(access_if) { - wprintw(stats_win, "\nAccess Interface ("); - for(i = 0; i < ctx->op.access_if_count; i++) { - if(i == g_access_if_selected) { - wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, " %s", ctx->op.access_if[i]->name); - wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - } else { - wprintw(stats_win, " %s", ctx->op.access_if[i]->name); + if(session->stream) { + wprintw(stats_win, "\n Streams\n"); + wprintw(stats_win, "\n Name | Direction | Tx PPS | Tx Kbps | Rx PPS | Rx Kbps | Loss\n"); + stream = session->stream; + while(stream) { + wprintw(stats_win, " %-16.16s | %-9.9s | %7lu | %10lu | %7lu | %10lu | %8lu\n", stream->config->name, + stream->direction == STREAM_DIRECTION_UP ? "up" : "down", + stream->rate_packets_tx.avg, stream->rate_packets_tx.avg * stream->tx_len * 8 / 1000, + stream->rate_packets_rx.avg, stream->rate_packets_rx.avg * stream->rx_len * 8 / 1000, + stream->loss); + stream = stream->next; + } } } - wprintw(stats_win, " )\n Tx Packets %10lu |%7lu PPS %10lu Kbps\n", - access_if->stats.packets_tx, access_if->stats.rate_packets_tx.avg, - access_if->stats.rate_bytes_tx.avg * 8 / 1000); - wprintw(stats_win, " Rx Packets %10lu |%7lu PPS %10lu Kbps\n", - access_if->stats.packets_rx, access_if->stats.rate_packets_rx.avg, - access_if->stats.rate_bytes_rx.avg * 8 / 1000); - wprintw(stats_win, " Tx Session Packets %10lu |%7lu PPS\n", - access_if->stats.session_ipv4_tx, access_if->stats.rate_session_ipv4_tx.avg); - wprintw(stats_win, " Rx Session Packets %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", - access_if->stats.session_ipv4_rx, access_if->stats.rate_session_ipv4_rx.avg, - access_if->stats.session_ipv4_loss, access_if->stats.session_ipv4_wrong_session); - wprintw(stats_win, " Tx Session Packets IPv6 %10lu |%7lu PPS\n", - access_if->stats.session_ipv6_tx, access_if->stats.rate_session_ipv6_tx.avg); - wprintw(stats_win, " Rx Session Packets IPv6 %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", - access_if->stats.session_ipv6_rx, access_if->stats.rate_session_ipv6_rx.avg, - access_if->stats.session_ipv6_loss, access_if->stats.session_ipv6_wrong_session); - wprintw(stats_win, " Tx Session Packets IPv6PD %10lu |%7lu PPS\n", - access_if->stats.session_ipv6pd_tx, access_if->stats.rate_session_ipv6pd_tx.avg); - wprintw(stats_win, " Rx Session Packets IPv6PD %10lu |%7lu PPS %10lu Loss %lu Wrong Session\n", - access_if->stats.session_ipv6pd_rx, access_if->stats.rate_session_ipv6pd_rx.avg, - access_if->stats.session_ipv6pd_loss, access_if->stats.session_ipv6pd_wrong_session); - wprintw(stats_win, " Rx Multicast Packets %10lu |%7lu PPS %10lu Loss\n", - access_if->stats.mc_rx, access_if->stats.rate_mc_rx.avg, - access_if->stats.mc_loss); - - /* Protocol stats */ - if(max_y > 68) { - wprintw(stats_win, "\nAccess Interface Protocol Packet Stats\n"); - wprintw(stats_win, " ARP TX: %10u RX: %10u\n", access_if->stats.arp_tx, access_if->stats.arp_rx); - wprintw(stats_win, " PADI TX: %10u RX: %10u\n", access_if->stats.padi_tx, 0); - wprintw(stats_win, " PADO TX: %10u RX: %10u\n", 0, access_if->stats.pado_rx); - wprintw(stats_win, " PADR TX: %10u RX: %10u\n", access_if->stats.padr_tx, 0); - wprintw(stats_win, " PADS TX: %10u RX: %10u\n", 0, access_if->stats.pads_rx); - wprintw(stats_win, " PADT TX: %10u RX: %10u\n", access_if->stats.padt_tx, access_if->stats.padt_rx); - wprintw(stats_win, " LCP TX: %10u RX: %10u\n", access_if->stats.lcp_tx, access_if->stats.lcp_rx); - wprintw(stats_win, " PAP TX: %10u RX: %10u\n", access_if->stats.pap_tx, access_if->stats.pap_rx); - wprintw(stats_win, " CHAP TX: %10u RX: %10u\n", access_if->stats.chap_tx, access_if->stats.chap_rx); - wprintw(stats_win, " IPCP TX: %10u RX: %10u\n", access_if->stats.ipcp_tx, access_if->stats.ipcp_rx); - wprintw(stats_win, " IP6CP TX: %10u RX: %10u\n", access_if->stats.ip6cp_tx, access_if->stats.ip6cp_rx); - wprintw(stats_win, " IGMP TX: %10u RX: %10u\n", access_if->stats.igmp_tx, access_if->stats.igmp_rx); - wprintw(stats_win, " ICMP TX: %10u RX: %10u\n", access_if->stats.icmp_tx, access_if->stats.icmp_rx); - wprintw(stats_win, " ICMPv6 TX: %10u RX: %10u\n", access_if->stats.icmpv6_tx, access_if->stats.icmpv6_rx); - wprintw(stats_win, " DHCPv6 TX: %10u RX: %10u\n", access_if->stats.dhcpv6_tx, access_if->stats.dhcpv6_rx); - } - if(max_y > 78) { - wprintw(stats_win, "\nAccess Interface Protocol Timeout Stats\n"); - wprintw(stats_win, " LCP Echo Request: %10u\n", access_if->stats.lcp_echo_timeout); - wprintw(stats_win, " LCP Request: %10u\n", access_if->stats.lcp_timeout); - wprintw(stats_win, " IPCP Request: %10u\n", access_if->stats.ipcp_timeout); - wprintw(stats_win, " IP6CP Request: %10u\n", access_if->stats.ip6cp_timeout); - wprintw(stats_win, " PAP: %10u\n", access_if->stats.pap_timeout); - wprintw(stats_win, " CHAP: %10u\n", access_if->stats.chap_timeout); - wprintw(stats_win, " ICMPv6 RS: %10u\n", access_if->stats.dhcpv6_timeout); - wprintw(stats_win, " DHCPv6 Request: %10u\n", access_if->stats.dhcpv6_timeout); - } } + wclrtoeol(stats_win); wrefresh(stats_win); } + + /* * Curses init. */ @@ -344,10 +426,7 @@ bbl_init_curses (bbl_ctx_s *ctx) refresh(); timeout(0); - wattron(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, "F6: Select Interface F7/F8: Start/Stop Traffic F9: Terminate Sessions\n"); - wattroff(stats_win, COLOR_PAIR(COLOR_GREEN)); - wprintw(stats_win, "%s", banner); + bbl_init_stats_win(); wrefresh(stats_win); timer_add_periodic(&ctx->timer_root, &ctx->stats_timer, "Statistics Timer",