Add UI View for Stream Stats

This commit is contained in:
Christian Giese
2021-03-31 15:37:59 +02:00
parent 6e7c44e286
commit 1f2cd179f5
2 changed files with 264 additions and 190 deletions
-5
View File
@@ -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"
+264 -185
View File
@@ -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",