/* Try to execute action with the drop action, which should succeed */ static void test_action_execute_drop(int argc, char *argv[]) { struct rte_mbuf buf_free; struct rte_mbuf buf_drop; struct action action_multiple[MAX_ACTIONS] = {0}; struct action action_drop[MAX_ACTIONS] = {0}; stats_init(); stats_vswitch_clear(); /* TODO: Break this into multiple tests? */ /* check that mbuf is freed on drop */ assert(memcmp(&buf_free, &buf_drop, sizeof(buf_drop)) != 0); buf_drop.pkt.next = NULL; /* Required for rte_pktmbuf_free */ memcpy(&buf_free, &buf_drop, sizeof(buf_drop)); assert(memcmp(&buf_free, &buf_drop, sizeof(buf_drop)) == 0); action_drop_build(&action_drop[0]); action_null_build(&action_drop[1]); action_execute(action_drop, &buf_free); assert(memcmp(&buf_free, &buf_drop, sizeof(buf_drop)) != 0); /* check that vswitch rx drop stats are increased */ stats_vswitch_clear(); assert(stats_vswitch_rx_drop_get() == 0); action_drop_build(&action_drop[0]); action_null_build(&action_drop[1]); action_execute(action_drop, &buf_drop); assert(stats_vswitch_rx_drop_get() == 1); }
/* * This function displays the recorded statistics for each port * and for each client. It uses ANSI terminal codes to clear * screen when called. It is called from a single non-master * thread in the server process, when the process is run with more * than one lcore enabled. */ static void stats_display(void) { unsigned i = 0; unsigned j = 0; /* ANSI escape sequences for terminal display. * 27 = ESC, 2J = Clear screen */ const char clr[] = {27, '[', '2', 'J', '\0'}; /* H = Home position for cursor*/ const char topLeft[] = {27, '[', '1', ';', '1', 'H','\0'}; uint64_t overruns = 0; /* Clear screen and move to top left */ printf("%s%s", clr, topLeft); printf("Physical Ports\n"); printf("-----\n"); for (i = 0; i < ports->num_ports; i++) printf("Port %u: '%s'\t", ports->id[i], get_printable_mac_addr(ports->id[i])); printf("\n\n"); printf("\nVport Statistics\n" "============ ============ ============ ============ ============\n" "Interface rx_packets rx_dropped tx_packets tx_dropped \n" "------------ ------------ ------------ ------------ ------------\n"); for (i = 0; i < MAX_VPORTS; i++) { if (i == 0) { printf("vswitchd "); } else if (i <= PORT_MASK) { printf("Client %2u", i); } else if (i <= KNI_MASK) { printf("Port %2u", i & PORT_MASK); } else { printf("KNI Port %2u", i & KNI_MASK); } printf("%13"PRIu64" %13"PRIu64" %13"PRIu64" %13"PRIu64"\n", stats_vport_rx_get(i), stats_vport_rx_drop_get(i), stats_vport_tx_get(i), stats_vport_tx_drop_get(i)); overruns += stats_vport_overrun_get(i); } printf("============ ============ ============ ============ ============\n"); printf("\n Switch rx dropped %d\n", stats_vswitch_rx_drop_get()); printf("\n Switch tx dropped %d\n", stats_vswitch_tx_drop_get()); printf("\n Queue overruns %d\n", overruns); printf("\n Mempool count %9u\n", rte_mempool_count(pktmbuf_pool)); printf("\n"); }
/* Try to get stats for all vswitch, which should succeed */ static void test_stats_vswitch_get(int argc, char *argv[]) { stats_init(); stats_vswitch_clear(); /* increment stats so there's something to check */ stats_vswitch_rx_drop_increment(23); stats_vswitch_tx_drop_increment(23); stats_vswitch_rx_drop_increment(19); stats_vswitch_tx_drop_increment(19); assert(stats_vswitch_rx_drop_get() == 42); assert(stats_vswitch_tx_drop_get() == 42); }