From 4ea1c75a8af2ab6c471a65ac62e28567c4eaed72 Mon Sep 17 00:00:00 2001 From: Christian Giese Date: Tue, 30 Mar 2021 22:11:37 +0200 Subject: [PATCH] Traffic Streams --- src/bbl.h | 14 +++++++++--- src/bbl_config.c | 4 ++++ src/bbl_ctrl.c | 9 +++++++- src/bbl_interactive.c | 48 ++++++++++++++++++++++------------------ src/bbl_io_packet_mmap.c | 10 +++++++++ src/bbl_rx.c | 3 ++- src/bbl_session.c | 12 +++++++++- src/bbl_stats.c | 2 ++ src/bbl_stream.c | 4 ++++ src/bbl_tx.c | 1 + 10 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/bbl.h b/src/bbl.h index 38bb178f..4f0759bb 100644 --- a/src/bbl.h +++ b/src/bbl.h @@ -184,10 +184,12 @@ typedef struct bbl_interface_ struct { uint64_t packets_tx; uint64_t packets_rx; - uint64_t bytes_tx; - uint64_t bytes_rx; bbl_rate_s rate_packets_tx; bbl_rate_s rate_packets_rx; + uint64_t bytes_tx; + uint64_t bytes_rx; + bbl_rate_s rate_bytes_tx; + bbl_rate_s rate_bytes_rx; uint64_t packets_rx_drop_unknown; uint64_t packets_rx_drop_decode_error; uint64_t sendto_failed; @@ -650,6 +652,7 @@ typedef struct bbl_session_ struct timer_ *timer_session_traffic_ipv4; struct timer_ *timer_session_traffic_ipv6; struct timer_ *timer_session_traffic_ipv6pd; + struct timer_ *timer_rate; bbl_access_type_t access_type; @@ -833,6 +836,12 @@ typedef struct bbl_session_ struct { uint64_t packets_tx; uint64_t packets_rx; + bbl_rate_s rate_packets_tx; + bbl_rate_s rate_packets_rx; + uint64_t bytes_tx; + uint64_t bytes_rx; + bbl_rate_s rate_bytes_tx; + bbl_rate_s rate_bytes_rx; uint32_t igmp_rx; uint32_t igmp_tx; @@ -882,7 +891,6 @@ typedef struct bbl_session_ uint32_t flapped; // flap counter } stats; - } bbl_session_s; void bbl_session_tx_qnode_insert(struct bbl_session_ *session); diff --git a/src/bbl_config.c b/src/bbl_config.c index d5fa7ce3..46d20188 100644 --- a/src/bbl_config.c +++ b/src/bbl_config.c @@ -692,6 +692,10 @@ json_parse_config (json_t *root, bbl_ctx_s *ctx) { if (json_is_boolean(value)) { ctx->config.qdisc_bypass = json_boolean_value(value); } + value = json_object_get(section, "io-slots"); + if (json_is_number(value)) { + ctx->config.io_slots = json_number_value(value); + } if (json_unpack(section, "{s:s}", "io-mode", &s) == 0) { if (strcmp(s, "packet_mmap") == 0) { ctx->config.io_mode = IO_MODE_PACKET_MMAP; diff --git a/src/bbl_ctrl.c b/src/bbl_ctrl.c index 3879d85a..510051a0 100644 --- a/src/bbl_ctrl.c +++ b/src/bbl_ctrl.c @@ -1019,12 +1019,19 @@ bbl_ctrl_session_streams(int fd, bbl_ctx_s *ctx, uint32_t session_id, json_t* ar json_array_append(json_streams, json_stream); stream = stream->next; } - root = json_pack("{ss si s{si so*}}", + root = json_pack("{ss si s{si si si si si si si so*}}", "status", "ok", "code", 200, "session-streams", "session-id", session->session_id, + "rx-packets", session->stats.packets_rx, + "tx-packets", session->stats.packets_tx, + "rx-pps", session->stats.rate_packets_rx.avg, + "tx-pps", session->stats.rate_packets_tx.avg, + "rx-bps-l2", session->stats.rate_bytes_rx.avg * 8, + "tx-bps-l2", session->stats.rate_bytes_tx.avg * 8, "streams", json_streams); + if(root) { result = json_dumpfd(root, fd, 0); json_decref(root); diff --git a/src/bbl_interactive.c b/src/bbl_interactive.c index c9e206cf..38b88584 100644 --- a/src/bbl_interactive.c +++ b/src/bbl_interactive.c @@ -220,26 +220,28 @@ bbl_stats_job (timer_s *timer) 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)\n", - ctx->op.network_if->stats.packets_tx, ctx->op.network_if->stats.rate_packets_tx.avg); - wprintw(stats_win, " Rx Packets %10lu (%7lu PPS)\n", - ctx->op.network_if->stats.packets_rx, ctx->op.network_if->stats.rate_packets_rx.avg); - wprintw(stats_win, " Tx Session Packets %10lu (%7lu PPS)\n", + 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) Loss: %lu\n", + 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", + 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) Loss: %lu\n", + 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", + 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) Loss: %lu\n", + 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", + 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); } @@ -254,26 +256,28 @@ bbl_stats_job (timer_s *timer) wprintw(stats_win, " %s", ctx->op.access_if[i]->name); } } - wprintw(stats_win, " )\n Tx Packets %10lu (%7lu PPS)\n", - access_if->stats.packets_tx, access_if->stats.rate_packets_tx.avg); - wprintw(stats_win, " Rx Packets %10lu (%7lu PPS)\n", - access_if->stats.packets_rx, access_if->stats.rate_packets_rx.avg); - wprintw(stats_win, " Tx Session Packets %10lu (%7lu PPS)\n", + 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) Loss: %lu Wrong Session: %lu\n", + 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", + 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) Loss: %lu Wrong Session: %lu\n", + 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", + 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) Loss: %lu Wrong Session: %lu\n", + 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) Loss: %lu\n", + 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); diff --git a/src/bbl_io_packet_mmap.c b/src/bbl_io_packet_mmap.c index 66e5ff8b..c4ba04d0 100644 --- a/src/bbl_io_packet_mmap.c +++ b/src/bbl_io_packet_mmap.c @@ -336,6 +336,16 @@ bbl_io_packet_mmap_add_interface(bbl_ctx_s *ctx, bbl_interface_s *interface, int /* * Setup TX ringbuffer. + * + * The following are conditions that are checked in packet_set_ring + + * tp_block_size must be a multiple of PAGE_SIZE (1) + * tp_frame_size must be greater than TPACKET_HDRLEN (obvious) + * tp_frame_size must be a multiple of TPACKET_ALIGNMENT + * tp_frame_nr must be exactly frames_per_block*tp_block_nr + * + * Note that tp_block_size should be chosen to be a power of two or there will + * be a waste of memory. */ memset(&io_ctx->req_tx, 0, sizeof(io_ctx->req_tx)); io_ctx->req_tx.tp_block_size = sysconf(_SC_PAGESIZE); /* 4096 */ diff --git a/src/bbl_rx.c b/src/bbl_rx.c index 20b774fe..636b93a1 100644 --- a/src/bbl_rx.c +++ b/src/bbl_rx.c @@ -661,7 +661,7 @@ bbl_rx_stream(bbl_interface_s *interface, bbl_ethernet_header_t *eth, bbl_bbl_t stream->max_delay_ns = delay_nsec; } if(stream->min_delay_ns) { - if(delay_nsec > stream->min_delay_ns) { + if(delay_nsec < stream->min_delay_ns) { stream->min_delay_ns = delay_nsec; } } else { @@ -1769,6 +1769,7 @@ bbl_rx_handler_access(bbl_ethernet_header_t *eth, bbl_interface_s *interface) { if(session->session_state != BBL_TERMINATED && session->session_state != BBL_IDLE) { session->stats.packets_rx++; + session->stats.bytes_rx += eth->length; switch (session->access_type) { case ACCESS_TYPE_PPPOE: switch(eth->type) { diff --git a/src/bbl_session.c b/src/bbl_session.c index 56542c1d..2896b70d 100644 --- a/src/bbl_session.c +++ b/src/bbl_session.c @@ -11,9 +11,19 @@ #include "bbl.h" #include "bbl_session.h" #include "bbl_stream.h" +#include "bbl_stats.h" extern volatile bool g_teardown; +void +bbl_session_rate_job (timer_s *timer) { + bbl_session_s *session = timer->data; + bbl_compute_avg_rate(&session->stats.rate_packets_tx, session->stats.packets_tx); + bbl_compute_avg_rate(&session->stats.rate_packets_rx, session->stats.packets_rx); + bbl_compute_avg_rate(&session->stats.rate_bytes_tx, session->stats.bytes_tx); + bbl_compute_avg_rate(&session->stats.rate_bytes_rx, session->stats.bytes_rx); +} + /** * bbl_session_update_state * @@ -452,8 +462,8 @@ bbl_sessions_init(bbl_ctx_s *ctx) LOG(ERROR, "Failed to create session traffic stream!\n"); return false; } + timer_add_periodic(&ctx->timer_root, &session->timer_rate, "Rate Computation", 1, 0, session, bbl_session_rate_job); } - LOG(DEBUG, "Session %u created (%s.%u:%u)\n", i, access_config->interface, access_config->access_outer_vlan, access_config->access_inner_vlan); i++; Next: diff --git a/src/bbl_stats.c b/src/bbl_stats.c index b1e196e9..305c8bda 100644 --- a/src/bbl_stats.c +++ b/src/bbl_stats.c @@ -552,6 +552,8 @@ bbl_compute_interface_rate_job (timer_s *timer) bbl_compute_avg_rate(&interface->stats.rate_packets_tx, interface->stats.packets_tx); bbl_compute_avg_rate(&interface->stats.rate_packets_rx, interface->stats.packets_rx); + bbl_compute_avg_rate(&interface->stats.rate_bytes_tx, interface->stats.bytes_tx); + bbl_compute_avg_rate(&interface->stats.rate_bytes_rx, interface->stats.bytes_rx); bbl_compute_avg_rate(&interface->stats.rate_session_ipv4_tx, interface->stats.session_ipv4_tx); bbl_compute_avg_rate(&interface->stats.rate_session_ipv4_rx, interface->stats.session_ipv4_rx); bbl_compute_avg_rate(&interface->stats.rate_session_ipv6_tx, interface->stats.session_ipv6_tx); diff --git a/src/bbl_stream.c b/src/bbl_stream.c index 10181e25..a4726833 100644 --- a/src/bbl_stream.c +++ b/src/bbl_stream.c @@ -525,6 +525,10 @@ bbl_stream_tx_job (timer_s *timer) { stream->packets_tx++; stream->flow_seq++; packets--; + if(stream->session && stream->direction == STREAM_DIRECTION_UP) { + stream->session->stats.packets_tx++; + stream->session->stats.bytes_tx += stream->tx_len; + } } } diff --git a/src/bbl_tx.c b/src/bbl_tx.c index 0c3b538a..b4e16af8 100644 --- a/src/bbl_tx.c +++ b/src/bbl_tx.c @@ -1491,6 +1491,7 @@ bbl_tx (bbl_ctx_s *ctx, bbl_interface_s *interface, uint8_t *buf, uint16_t *len) result = bbl_encode_packet(session, buf, len); if(result == PROTOCOL_SUCCESS) { session->stats.packets_tx++; + session->stats.bytes_tx += *len; } /* Remove only from TX queue if all requests are processed! */ if(session->send_requests == 0) {