mirror of
https://github.com/rtbrick/bngblaster.git
synced 2024-05-06 15:54:57 +00:00
Traffic Streams
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user