summaryrefslogtreecommitdiffstats
path: root/src/debug.cpp
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2016-02-08 11:25:07 +0200
committerIdo Barnea <ibarnea@cisco.com>2016-02-24 14:21:29 +0200
commitf0ab9eba97221e491cf7b3dd846eb8c23d920ec2 (patch)
treecaf0b2f4f9cc0874a53bb3af813d5bae8d644914 /src/debug.cpp
parent252b8ab3f41a18af8561cece71cf07bc9872f39f (diff)
Rx stat per flow. Low level working for xl710, and partly for i350.
added full clone (with CP VM) to stream
Diffstat (limited to 'src/debug.cpp')
-rw-r--r--src/debug.cpp285
1 files changed, 186 insertions, 99 deletions
diff --git a/src/debug.cpp b/src/debug.cpp
index ed4900f9..0ca34545 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -14,10 +14,10 @@
limitations under the License.
*/
-// DPDK c++ issue
+// DPDK c++ issue
#define UINT8_MAX 255
#define UINT16_MAX 0xFFFF
-// DPDK c++ issue
+// DPDK c++ issue
#include <stdio.h>
#include <unistd.h>
@@ -30,22 +30,22 @@
#include "main_dpdk.h"
#include "debug.h"
-const uint8_t udp_pkt[] = {
+const uint8_t udp_pkt[] = {
0x00,0x00,0x00,0x01,0x00,0x00,
0x00,0x00,0x00,0x01,0x00,0x00,
0x08,0x00,
-
+
0x45,0x00,0x00,0x81,
0xaf,0x7e,0x00,0x00,
0xfe,0x06,0xd9,0x23,
0x01,0x01,0x01,0x01,
0x3d,0xad,0x72,0x1b,
-
+
+ 0x11,0x11,
0x11,0x11,
- 0x11,0x11,
0x00,0x6d,
0x00,0x00,
-
+
0x64,0x31,0x3a,0x61,
0x64,0x32,0x3a,0x69,0x64,
0x32,0x30,0x3a,0xd0,0x0e,
@@ -63,9 +63,9 @@ const uint8_t udp_pkt[] = {
};
CTrexDebug::CTrexDebug(CPhyEthIF m_ports_arg[12], int max_ports) {
- m_test = NULL;
- m_ports = m_ports_arg;
- m_max_ports = max_ports;
+ m_test = NULL;
+ m_ports = m_ports_arg;
+ m_max_ports = max_ports;
}
int CTrexDebug::rcv_send(int port, int queue_id) {
@@ -86,6 +86,7 @@ int CTrexDebug::rcv_send(int port, int queue_id) {
return 0;
}
+// receive packets on queue_id
int CTrexDebug::rcv_send_all(int queue_id) {
int i;
for (i=0; i<m_max_ports; i++) {
@@ -95,76 +96,82 @@ int CTrexDebug::rcv_send_all(int queue_id) {
}
// For playing around, and testing packet sending in debug mode
-rte_mbuf_t *CTrexDebug::create_test_pkt(int pkt_type) {
+rte_mbuf_t *CTrexDebug::create_test_pkt(int pkt_type, uint8_t ttl, uint16_t ip_id) {
uint8_t proto;
int pkt_size = 0;
// ASA 2
- uint8_t dst_mac[6] = {0x74, 0xa2, 0xe6, 0xd5, 0x39, 0x25};
- uint8_t src_mac[6] = {0xa0, 0x36, 0x9f, 0x38, 0xa4, 0x02};
- // ASA 1
- // uint8_t dst_mac[6] = {0xd4, 0x8c, 0xb5, 0xc9, 0x54, 0x2b};
- // uint8_t src_mac[6] = {0xa0, 0x36, 0x9f, 0x38, 0xa4, 0x0};
+ uint8_t dst_mac[6] = {0x74, 0xa2, 0xe6, 0xd5, 0x39, 0x25};
+ uint8_t src_mac[6] = {0xa0, 0x36, 0x9f, 0x38, 0xa4, 0x02};
+ // ASA 1
+ // uint8_t dst_mac[6] = {0xd4, 0x8c, 0xb5, 0xc9, 0x54, 0x2b};
+ // uint8_t src_mac[6] = {0xa0, 0x36, 0x9f, 0x38, 0xa4, 0x0};
+ //#define VLAN
+#ifdef VLAN
+ uint16_t l2_proto = 0x0081;
+ uint8_t vlan_header[4] = {0x0a, 0xbc, 0x08, 0x00};
+#else
uint16_t l2_proto = 0x0008;
+#endif
uint8_t ip_header[] = {
- 0x45,0x02,0x00,0x30,
- 0x00,0x00,0x40,0x00,
- 0xff,0x01,0xbd,0x04,
- 0x10,0x0,0x0,0x1, //SIP
- 0x30,0x0,0x0,0x1, //DIP
- // 0x82, 0x0b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // IP option. change 45 to 48 (header len) if using it.
+ 0x45,0x02,0x00,0x30,
+ 0x00,0x00,0x40,0x00,
+ 0xff,0x01,0xbd,0x04,
+ 0x10,0x0,0x0,0x1, //SIP
+ 0x30,0x0,0x0,0x1, //DIP
+ // 0x82, 0x0b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // IP option. change 45 to 48 (header len) if using it.
};
uint8_t udp_header[] = {0x11, 0x11, 0x11,0x11, 0x00, 0x6d, 0x00, 0x00};
uint8_t udp_data[] = {0x64,0x31,0x3a,0x61,
- 0x64,0x32,0x3a,0x69,0x64,
- 0x32,0x30,0x3a,0xd0,0x0e,
- 0xa1,0x4b,0x7b,0xbd,0xbd,
- 0x16,0xc6,0xdb,0xc4,0xbb,0x43,
- 0xf9,0x4b,0x51,0x68,0x33,0x72,
- 0x20,0x39,0x3a,0x69,0x6e,0x66,0x6f,
- 0x5f,0x68,0x61,0x73,0x68,0x32,0x30,0x3a,0xee,0xc6,0xa3,
- 0xd3,0x13,0xa8,0x43,0x06,0x03,0xd8,0x9e,0x3f,0x67,0x6f,
- 0xe7,0x0a,0xfd,0x18,0x13,0x8d,0x65,0x31,0x3a,0x71,0x39,
- 0x3a,0x67,0x65,0x74,0x5f,0x70,0x65,0x65,0x72,0x73,0x31,
- 0x3a,0x74,0x38,0x3a,0x3d,0xeb,0x0c,0xbf,0x0d,0x6a,0x0d,
- 0xa5,0x31,0x3a,0x79,0x31,0x3a,0x71,0x65,0x87,0xa6,0x7d,
- 0xe7
+ 0x64,0x32,0x3a,0x69,0x64,
+ 0x32,0x30,0x3a,0xd0,0x0e,
+ 0xa1,0x4b,0x7b,0xbd,0xbd,
+ 0x16,0xc6,0xdb,0xc4,0xbb,0x43,
+ 0xf9,0x4b,0x51,0x68,0x33,0x72,
+ 0x20,0x39,0x3a,0x69,0x6e,0x66,0x6f,
+ 0x5f,0x68,0x61,0x73,0x68,0x32,0x30,0x3a,0xee,0xc6,0xa3,
+ 0xd3,0x13,0xa8,0x43,0x06,0x03,0xd8,0x9e,0x3f,0x67,0x6f,
+ 0xe7,0x0a,0xfd,0x18,0x13,0x8d,0x65,0x31,0x3a,0x71,0x39,
+ 0x3a,0x67,0x65,0x74,0x5f,0x70,0x65,0x65,0x72,0x73,0x31,
+ 0x3a,0x74,0x38,0x3a,0x3d,0xeb,0x0c,0xbf,0x0d,0x6a,0x0d,
+ 0xa5,0x31,0x3a,0x79,0x31,0x3a,0x71,0x65,0x87,0xa6,0x7d,
+ 0xe7
};
uint8_t tcp_header[] = {0xab, 0xcd, 0x00, 0x80, // src, dst ports
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, // seq num, ack num
- 0x50, 0x00, 0xff, 0xff, // Header size, flags, window size
- 0x00, 0x00, 0x00, 0x00, // checksum ,urgent pointer
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, // seq num, ack num
+ 0x50, 0x00, 0xff, 0xff, // Header size, flags, window size
+ 0x00, 0x00, 0x00, 0x00, // checksum ,urgent pointer
};
uint8_t tcp_data[] = {0x8, 0xa, 0x1, 0x2, 0x3, 0x4, 0x3, 0x4, 0x6, 0x5};
uint8_t icmp_header[] = {
- 0x08, 0x00,
- 0xb8, 0x21, //checksum
- 0xaa, 0xbb, // id
- 0x00, 0x01, // Sequence number
+ 0x08, 0x00,
+ 0xb8, 0x21, //checksum
+ 0xaa, 0xbb, // id
+ 0x00, 0x01, // Sequence number
};
uint8_t icmp_data[] = {
- 0xd6, 0x6e, 0x64, 0x34, // magic
- 0x6a, 0xad, 0x0f, 0x00, //64 bit counter
- 0x00, 0x56, 0x34, 0x12,
- 0x78, 0x56, 0x34, 0x12, 0x00, 0x00 // seq
+ 0xd6, 0x6e, 0x64, 0x34, // magic
+ 0x6a, 0xad, 0x0f, 0x00, //64 bit counter
+ 0x00, 0x56, 0x34, 0x12,
+ 0x78, 0x56, 0x34, 0x12, 0x00, 0x00 // seq
};
switch (pkt_type) {
case 1:
- proto = IPPROTO_ICMP;
- pkt_size = 14 + sizeof(ip_header) + sizeof(icmp_header) + sizeof (icmp_data);
- break;
+ proto = IPPROTO_ICMP;
+ pkt_size = 14 + sizeof(ip_header) + sizeof(icmp_header) + sizeof (icmp_data);
+ break;
case 2:
- proto = IPPROTO_UDP;
- pkt_size = 14 + sizeof(ip_header) + sizeof(udp_header) + sizeof (udp_data);
- break;
+ proto = IPPROTO_UDP;
+ pkt_size = 14 + sizeof(ip_header) + sizeof(udp_header) + sizeof (udp_data);
+ break;
case 3:
- proto = IPPROTO_TCP;
- pkt_size = 14 + sizeof(ip_header) + sizeof(tcp_header) + sizeof (tcp_data);
- break;
+ proto = IPPROTO_TCP;
+ pkt_size = 14 + sizeof(ip_header) + sizeof(tcp_header) + sizeof (tcp_data);
+ break;
default:
- return NULL;
+ return NULL;
}
rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc(0, pkt_size);
@@ -179,34 +186,39 @@ rte_mbuf_t *CTrexDebug::create_test_pkt(int pkt_type) {
memcpy(p, dst_mac, sizeof(dst_mac)); p += sizeof(dst_mac);
memcpy(p, src_mac, sizeof(src_mac)); p += sizeof(src_mac);
memcpy(p, &l2_proto, sizeof(l2_proto)); p += sizeof(l2_proto);
+#ifdef VLAN
+ memcpy(p, &vlan_header, sizeof(vlan_header)); p += sizeof(vlan_header);
+#endif
struct IPHeader *ip = (IPHeader *)p;
memcpy(p, ip_header, sizeof(ip_header)); p += sizeof(ip_header);
ip->setProtocol(proto);
ip->setTotalLength(pkt_size - 14);
+ ip->setId(ip_id);
- struct TCPHeader *tcp = (TCPHeader *)p;
+ struct TCPHeader *tcp = (TCPHeader *)p;
struct ICMPHeader *icmp= (ICMPHeader *)p;
switch (pkt_type) {
case 1:
- memcpy(p, icmp_header, sizeof(icmp_header)); p += sizeof(icmp_header);
- memcpy(p, icmp_data, sizeof(icmp_data)); p += sizeof(icmp_data);
- icmp->updateCheckSum(sizeof(icmp_header) + sizeof(icmp_data));
- break;
+ memcpy(p, icmp_header, sizeof(icmp_header)); p += sizeof(icmp_header);
+ memcpy(p, icmp_data, sizeof(icmp_data)); p += sizeof(icmp_data);
+ icmp->updateCheckSum(sizeof(icmp_header) + sizeof(icmp_data));
+ break;
case 2:
- memcpy(p, udp_header, sizeof(udp_header)); p += sizeof(udp_header);
- memcpy(p, udp_data, sizeof(udp_data)); p += sizeof(udp_data);
- break;
+ memcpy(p, udp_header, sizeof(udp_header)); p += sizeof(udp_header);
+ memcpy(p, udp_data, sizeof(udp_data)); p += sizeof(udp_data);
+ break;
case 3:
- memcpy(p, tcp_header, sizeof(tcp_header)); p += sizeof(tcp_header);
- memcpy(p, tcp_data, sizeof(tcp_data)); p += sizeof(tcp_data);
- tcp->setSynFlag(true);
- printf("Sending TCP header:");
- tcp->dump(stdout);
- break;
+ memcpy(p, tcp_header, sizeof(tcp_header)); p += sizeof(tcp_header);
+ memcpy(p, tcp_data, sizeof(tcp_data)); p += sizeof(tcp_data);
+ tcp->setSynFlag(true);
+ printf("Sending TCP header:");
+ tcp->dump(stdout);
+ break;
default:
- return NULL;
+ return NULL;
}
+ ip->setTimeToLive(ttl);
ip->updateCheckSum();
return m;
}
@@ -276,25 +288,81 @@ int CTrexDebug::set_promisc_all(bool enable) {
return 0;
}
+static void rte_stat_dump_array(const uint64_t *c, const char *name, int size) {
+ int i;
+
+ // dont print anything if all values are 0
+ for (i = 0; i < size; i++) {
+ if (c[i] != 0)
+ break;
+ }
+ if (i == size)
+ return;
+
+ printf("%s:", name);
+ for (i = 0; i < size; i++) {
+ if (((i % 32) == 0) && (size > 32)) {
+ printf ("\n %4d:", i);
+ }
+ printf(" %2ld", c[i]);
+ }
+ printf("\n");
+}
+
+static void rte_stat_dump_one(uint64_t c, const char *name) {
+ if (c != 0)
+ printf("%s:%ld\n", name, c);
+}
+
+static void rte_stats_dump(const struct rte_eth_stats &stats) {
+ rte_stat_dump_one(stats.ipackets, "ipackets");
+ rte_stat_dump_one(stats.opackets, "opackets");
+ rte_stat_dump_one(stats.ibytes, "ibytes");
+ rte_stat_dump_one(stats.obytes, "obytes");
+ rte_stat_dump_one(stats.imissed, "imissed");
+ rte_stat_dump_one(stats.ierrors, "ierrors");
+ rte_stat_dump_one(stats.oerrors, "oerrors");
+ rte_stat_dump_one(stats.rx_nombuf, "rx_nombuf");
+ rte_stat_dump_array(stats.q_ipackets, "queue rx", RTE_ETHDEV_QUEUE_STAT_CNTRS);
+ rte_stat_dump_array(stats.q_opackets, "queue tx", RTE_ETHDEV_QUEUE_STAT_CNTRS);
+ rte_stat_dump_array(stats.q_ibytes, "queue rx bytes", RTE_ETHDEV_QUEUE_STAT_CNTRS);
+ rte_stat_dump_array(stats.q_obytes, "queue tx bytes", RTE_ETHDEV_QUEUE_STAT_CNTRS);
+ rte_stat_dump_array(stats.q_errors, "queue dropped", RTE_ETHDEV_QUEUE_STAT_CNTRS);
+ rte_stat_dump_one(stats.ilbpackets, "rx loopback");
+ rte_stat_dump_one(stats.olbpackets, "tx loopback");
+ rte_stat_dump_one(stats.ilbbytes, "rx bytes loopback");
+ rte_stat_dump_one(stats.olbbytes, "tx bytes loopback");
+}
+
int CTrexDebug::test_send(uint pkt_type) {
+ int port_id;
+
set_promisc_all(true);
- rte_mbuf_t *m, *d;
+ rte_mbuf_t *m, *d, *d2=NULL, *d3=NULL;
if (pkt_type < 1 || pkt_type > 4) {
- printf("Unsupported packet type %d\n", pkt_type);
- printf("Supported packet types are: %d(ICMP), %d(UDP), %d(TCP) %d(9k UDP)\n", 1, 2, 3, 4);
- exit(-1);
+ printf("Unsupported packet type %d\n", pkt_type);
+ printf("Supported packet types are: %d(ICMP), %d(UDP), %d(TCP) %d(9k UDP)\n", 1, 2, 3, 4);
+ exit(-1);
}
if (pkt_type == 4) {
- m = create_udp_9k_pkt();
- assert (m);
- d = create_pkt_indirect(m, 9*1024+18);
+ m = create_udp_9k_pkt();
+ assert (m);
+ d = create_pkt_indirect(m, 9*1024+18);
} else {
- d = create_test_pkt(pkt_type);
+ d = create_test_pkt(pkt_type, 255, 0xff35);
+ // d2 = create_test_pkt(pkt_type, 253, 0xfe01);
+ // d3 = create_test_pkt(pkt_type, 251, 0xfe02);
}
if (d == NULL) {
- printf("Packet creation failed\n");
- exit(-1);
+ printf("Packet creation failed\n");
+ exit(-1);
+ }
+
+ // read first time to zero statistics
+ for (port_id = 0; port_id < m_max_ports; port_id++) {
+ CPhyEthIF * lp=&m_ports[port_id];
+ lp->get_rx_stats(NULL, -1, true);
}
printf("Sending packet:\n");
@@ -302,32 +370,51 @@ int CTrexDebug::test_send(uint pkt_type) {
test_send_pkts(d, 0, 2, 0);
test_send_pkts(d, 0, 1, 1);
+ if (d2) {
+ test_send_pkts(d2, 0, 4, 0);
+ test_send_pkts(d2, 0, 3, 1);
+ }
+ if (d3) {
+ test_send_pkts(d3, 0, 6, 0);
+ test_send_pkts(d3, 0, 5, 1);
+ }
delay(1000);
- printf(" ---------\n");
- printf(" rx queue 0 \n");
- printf(" ---------\n");
- rcv_send_all(0);
- printf("\n\n");
-
- printf(" ---------\n");
- printf(" rx queue 1 \n");
- printf(" ---------\n");
- rcv_send_all(1);
- printf(" ---------\n");
+ int j=0;
+ for (j = 0; j < 2; j++) {
+ printf(" =========\n");
+ printf(" rx queue %d \n", j);
+ printf(" =========\n");
+ rcv_send_all(j);
+ printf("\n\n");
+ }
delay(1000);
- int j=0;
- for (j=0; j<m_max_ports; j++) {
- CPhyEthIF * lp=&m_ports[j];
- printf(" port : %d \n",j);
- printf(" ----------\n");
- lp->update_counters();
- lp->get_stats().Dump(stdout);
+ struct rte_eth_stats stats;
+ for (port_id = 0; port_id < m_max_ports; port_id++) {
+ CPhyEthIF * lp=&m_ports[port_id];
+ std::cout << "=====================\n";
+ std::cout << "Statistics for port " << port_id << std::endl;
+ std::cout << "=====================\n";
+
+ if (rte_eth_stats_get(port_id, &stats) == 0) {
+ rte_stats_dump(stats);
+ } else {
+ // For NICs which does not support rte_eth_stats_get, we have our own implementation.
+ lp->update_counters();
+ lp->get_stats().Dump(stdout);
+ }
+
lp->dump_stats_extended(stdout);
}
+ for (port_id = 0; port_id < m_max_ports; port_id++) {
+ uint64_t fdir_stat[TREX_FDIR_STAT_SIZE];
+ CPhyEthIF *lp = &m_ports[port_id];
+ if (lp->get_rx_stats(fdir_stat, -1, false) == 0)
+ rte_stat_dump_array(fdir_stat, "FDIR stat", TREX_FDIR_STAT_SIZE);
+ }
return (0);
}