Traffic Streams

This commit is contained in:
Christian Giese
2021-03-30 22:11:37 +02:00
parent 67f8182ef9
commit 4ea1c75a8a
10 changed files with 79 additions and 28 deletions
+11 -3
View File
@@ -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);
+4
View File
@@ -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;
+8 -1
View File
@@ -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);
+26 -22
View File
@@ -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);
+10
View File
@@ -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 */
+2 -1
View File
@@ -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) {
+11 -1
View File
@@ -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:
+2
View File
@@ -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);
+4
View File
@@ -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;
}
}
}
+1
View File
@@ -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) {