Coder Social home page Coder Social logo

jwbensley / etherate Goto Github PK

View Code? Open in Web Editor NEW
174.0 22.0 19.0 1.16 MB

Linux CLI Ethernet and MPLS Testing Tool

License: MIT License

Shell 0.05% Makefile 0.11% M4 0.74% C 99.11%
ethernet mpls testing-tools c linux network-analysis traffic-generation packet-generator packet-crafting

etherate's People

Contributors

bitdeli-chef avatar bradleykite avatar jwbensley avatar thekafkaf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

etherate's Issues

Test not starting

Sent in via email:

I have tried some sample tests using etherate.

I have used below commands in that order

Test 1

In Rx
sudo etherate –r

In Tx
sudo etherate

I can able to see the speed, number of frames transmitted at Tx side but in Rx side I don’t see the frames received or its speed. It prints the “settings have been synchronized” some calculated delay values and the title row of result “ Seconds MbpsRx MBsRx FrmRx/s FramesRx” but no values below this row.

What could be the issue?

"Message too long" when running test

Hello

I'm trying to run tests atm in our LAN.

'sudo etherate -i enp0s25'
prints
'Delay test Tx error: Message tool long'
and
'Speed test Tx error: Message too long'

What can cause this? It does't matter if I define -f 1000 etc. We are using non managed switches.

Inline the build_tlv() and build_sub_tlv() functions

Email from Bruno:

Finally, the build_tlv() and build_sub_tlv() functions could be inlined and changed to :

    // Build the Etherate TLV header
    inline void
    build_tlv(struct FRAME_HEADERS *FRAME_HEADERS, uint16_t TLV_TYPE, uint32_t TLV_VALUE)
    {
        uint8_t *buffer_offset = FRAME_HEADERS->TX_DATA;

        *((uint16_t *) buffer_offset) = TLV_TYPE;
        buffer_offset += sizeof(uint16_t);
        *buffer_offset++ = sizeof(uint32_t);
        *((uint32_t *) buffer_offset) = TLV_VALUE;

        FRAME_HEADERS->RX_TLV_TYPE  = (uint16_t*) FRAME_HEADERS->RX_DATA;
        FRAME_HEADERS->RX_TLV_VALUE = (uint32_t*) (FRAME_HEADERS->RX_DATA + sizeof(uint16_t) + sizeof(uint8_t));
    }

    // Build a sub-TLV value after the TLV header
    inline void
    build_sub_tlv(struct FRAME_HEADERS *FRAME_HEADERS, uint16_t SUB_TLV_TYPE, uint64_t SUB_TLV_VALUE)
    {
        uint8_t *buffer_offset = FRAME_HEADERS->TX_DATA + FRAME_HEADERS->TLV_SIZE;

        *((uint16_t *) buffer_offset) = SUB_TLV_TYPE;
        buffer_offset += sizeof(uint16_t);
        *buffer_offset++ = sizeof(uint64_t);
        *((uint64_t *) buffer_offset) = SUB_TLV_VALUE;

        FRAME_HEADERS->RX_SUB_TLV_TYPE  = (uint16_t*) (FRAME_HEADERS->RX_DATA + FRAME_HEADERS->TLV_SIZE);
        FRAME_HEADERS->RX_SUB_TLV_VALUE = (uint64_t*) (FRAME_HEADERS->RX_DATA + FRAME_HEADERS->TLV_SIZE +
                                                       sizeof(uint16_t) + sizeof(uint8_t));
    }

This would be significantly faster than calling memcpy() repeatedly, and build_sub_tlv() is used a lot in the various tests.

This is in reference to: https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L322 and https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L346

Max jitter value isn't max jitter in results list

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
Etherate version 1.17 2018-04
SUMMARY

Results from Tx host below. The output says Min/Max jitter during test: 0.000000017s/0.000006009s but the highest jitter value recorded was 0.000122755s.

STEPS TO REPRODUCE

sudo ./etherate -I ens2f0 -Q 1000 1000

No.	rtt		Jitter
1:	0.000122755s	0.000122755s
2:	0.000064407s	0.000058348s
3:	0.000065850s	0.000001443s
4:	0.000071859s	0.000006009s
5:	0.000066288s	0.000005571s
6:	0.000062803s	0.000003485s
7:	0.000066670s	0.000003867s
8:	0.000063426s	0.000003244s
9:	0.000065757s	0.000002331s
10:	0.000067083s	0.000001326s
11:	0.000067066s	0.000000017s
12:	0.000065880s	0.000001186s
13:	0.000067321s	0.000001441s
14:	0.000063679s	0.000003642s
15:	0.000064127s	0.000000448s
16:	0.000064932s	0.000000805s
17:	0.000065436s	0.000000504s
18:	0.000063706s	0.000001730s
19:	0.000068546s	0.000004840s
20:	0.000066065s	0.000002481s
21:	0.000062928s	0.000003137s
22:	0.000066641s	0.000003713s
23:	0.000067589s	0.000000948s
24:	0.000065886s	0.000001703s
25:	0.000062733s	0.000003153s
26:	0.000064417s	0.000001684s
27:	0.000064453s	0.000000036s
28:	0.000065138s	0.000000685s
29:	0.000066881s	0.000001743s
30:	0.000063702s	0.000003179s
Link quality test complete
Test frames transmitted: 30
Test frames received: 30
Non test or out-of-order frames received: 0
Number of timeouts: 0
Min/Max rtt during test: 0.000062733s/0.000071859s
Min/Max jitter during test: 0.000000017s/0.000006009s
Ending test on Sat Apr 14 12:38:29 2018

Ensure output is better aligned

The speed test output is missaligned (others test too probably):

Seconds         Mbps TX         MBs Tx          FrmTX/s         Frames TX
1               3998.94         499             333245          333245
2               10518.91                1814            876576          1209821

fail to compile on AlpineLinux

Hello,
Etherate failed to compile on Alpine Linux (musl libc based distro) with this error mesage.
In file included from etherate.cpp:77:0:
etherate.h:164:21: error: field 'TV_SELECT_DELAY' has incomplete type 'timeval'
struct timeval TV_SELECT_DELAY; // Elapsed time struct for polling the socket FD
^~~~~~~~~~~~~~~
etherate.h:164:13: note: forward declaration of 'struct timeval'
struct timeval TV_SELECT_DELAY; // Elapsed time struct for polling the socket FD
^~~~~~~
make: *** [Makefile:444: etherate.o] Error 1

Unsafe reference

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
user@R61:~$ uname -a
Linux R61 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

user@R61:~$ cat /etc/redhat-release || lsb_release -a || cat /etc/issue
cat: /etc/redhat-release: Tiedostoa tai hakemistoa ei ole
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.4 LTS
Release:	16.04
Codename:	xenial

user@R61:~$ lspci | grep -i eth
00:19.0 Ethernet controller: Intel Corporation 82566MM Gigabit Network Connection (rev 03)

user@R61:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1f:e2:1a:f6:67 brd ff:ff:ff:ff:ff:ff
3: wls3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 00:21:5c:75:df:b9 brd ff:ff:ff:ff:ff:ff

user@R61:~$ etherate -v
Oops! Missing 802.1p VLAN ID
Usage info: etherate -h|--h

user@R61:~$ sudo etherate -l
Device lo with address 00:00:00:00:00:00, has interface index 1
Device enp0s25 with address 00:1f:e2:1a:f6:67, has interface index 2
Device wls3 with address 00:21:5c:75:df:b9, has interface index 3

user@R61:~$ etherate -V
Etherate version 1.16 2018-01
SUMMARY

frame_headers->sub_tlv_size = frame_headers->tlv_size + sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint64_t); before we've set frame_headers->tlv_size.

Reported by @yskripachov

STEPS TO REPRODUCE
> diff --git a/defaults.c b/defaults.c
index 0eea55e..83e94d7 100644
--- a/defaults.c
+++ b/defaults.c
@@ -92,11 +92,11 @@ void set_default_values(struct app_params *app_params,
     frame_headers->src_mac[3]        = 0x00;
     frame_headers->src_mac[4]        = 0x00;
     frame_headers->src_mac[5]        = 0x01;
+    frame_headers->tlv_size          = sizeof(uint8_t) + sizeof(uint16_t) +
+                                       sizeof(uint32_t);
     frame_headers->sub_tlv_size      = frame_headers->tlv_size +
                                        sizeof(uint8_t) + sizeof(uint16_t) +
                                        sizeof(uint64_t);
-    frame_headers->tlv_size          = sizeof(uint8_t) + sizeof(uint16_t) +
-                                       sizeof(uint32_t);
     frame_headers->tx_buffer         = (uint8_t*)calloc(1, F_SIZE_MAX);
     frame_headers->vlan_dei          = 0;
     frame_headers->vlan_id           = VLAN_ID_DEF;
@@ -328,4 +328,4 @@ int16_t setup_socket_interface(struct frame_headers *frame_headers,

X710 10G interface produces "No buffer space available" error.

ISSUE TYPE

  • Bug Report
  • Enhancement/Feature Request
  • Question

VERSION DETAILS

$ uname -a
Linux ucpe_002 4.13.12-1.el7.elrepo.x86_64 #1 SMP Wed Nov 8 13:01:08 EST 2017 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release || lsb_release -a || cat /etc/issue
CentOS Linux release 7.4.1708 (Core)

$ lspci -nn | grep -i eth
02:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)
02:00.1 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)
06:00.0 Ethernet controller [0200]: Broadcom Limited NetXtreme BCM5719 Gigabit Ethernet PCIe [14e4:1657] (rev 01)
06:00.1 Ethernet controller [0200]: Broadcom Limited NetXtreme BCM5719 Gigabit Ethernet PCIe [14e4:1657] (rev 01)
06:00.2 Ethernet controller [0200]: Broadcom Limited NetXtreme BCM5719 Gigabit Ethernet PCIe [14e4:1657] (rev 01)
06:00.3 Ethernet controller [0200]: Broadcom Limited NetXtreme BCM5719 Gigabit Ethernet PCIe [14e4:1657] (rev 01)
09:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ [8086:1572] (rev 01)
09:00.1 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ [8086:1572] (rev 01)

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens2f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq portid 1402ec6d9dd0 state UP mode DEFAULT qlen 1000
    link/ether 14:02:ec:6d:9d:d0 brd ff:ff:ff:ff:ff:ff
3: ens3f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:f8 brd ff:ff:ff:ff:ff:ff
4: ens3f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:f9 brd ff:ff:ff:ff:ff:ff
5: ens2f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq portid 1402ec6d9dd8 state UP mode DEFAULT qlen 10000
    link/ether 14:02:ec:6d:9d:d8 brd ff:ff:ff:ff:ff:ff
6: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 94:18:82:ab:ae:f3 brd ff:ff:ff:ff:ff:ff
7: ens3f2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fa brd ff:ff:ff:ff:ff:ff
8: ens3f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fb brd ff:ff:ff:ff:ff:ff
9: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 94:18:82:ab:ae:f4 brd ff:ff:ff:ff:ff:ff
10: ens3f3.501@ens3f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br501 state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fb brd ff:ff:ff:ff:ff:ff
11: br501: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fb brd ff:ff:ff:ff:ff:ff
12: ens3f3.502@ens3f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br502 state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fb brd ff:ff:ff:ff:ff:ff
13: br502: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 3c:a8:2a:e7:05:fb brd ff:ff:ff:ff:ff:ff
14: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
15: br1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
16: br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 02:84:2b:68:80:af brd ff:ff:ff:ff:ff:ff
17: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
    link/ether 52:54:00:41:c6:5e brd ff:ff:ff:ff:ff:ff
18: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 1000
    link/ether 52:54:00:41:c6:5e brd ff:ff:ff:ff:ff:ff

$ ./etherate -V
Etherate version 1.15 2017-10

$ sudo ./etherate -l
Device lo with address 00:00:00:00:00:00, has interface index 1
Device ens2f0 with address 14:02:ec:6d:9d:d0, has interface index 2
Device ens3f0 with address 3c:a8:2a:e7:05:f8, has interface index 3
Device ens3f1 with address 3c:a8:2a:e7:05:f9, has interface index 4
Device ens2f1 with address 14:02:ec:6d:9d:d8, has interface index 5
Device eno1 with address 94:18:82:ab:ae:f3, has interface index 6
Device ens3f2 with address 3c:a8:2a:e7:05:fa, has interface index 7
Device ens3f3 with address 3c:a8:2a:e7:05:fb, has interface index 8
Device eno2 with address 94:18:82:ab:ae:f4, has interface index 9
Device ens3f3.501 with address 3c:a8:2a:e7:05:fb, has interface index 10
Device br501 with address 3c:a8:2a:e7:05:fb, has interface index 11
Device ens3f3.502 with address 3c:a8:2a:e7:05:fb, has interface index 12
Device br502 with address 3c:a8:2a:e7:05:fb, has interface index 13
Device br0 with address 00:00:00:00:00:00, has interface index 14
Device br1 with address 00:00:00:00:00:00, has interface index 15
Device br2 with address 02:84:2b:68:80:af, has interface index 16
Device virbr0 with address 52:54:00:41:c6:5e, has interface index 17
Device virbr0-nic with address 52:54:00:41:c6:5e, has interface index 18

SUMMARY
Only on the two 10G interfaces is this issue experianced, not on the 1G interfaces. Does increasing the socket buffer help?

STEPS TO REPRODUCE
This is happeneing at all packet sizes, 256 is not specific to this issue:

$ sudo ./etherate -i ens2f1 -g -G -f 256
Running in TX mode
Using device ens2f1 with address 14:02:ec:6d:9d:d8, interface index 5
Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...
Done.
Frame size is 270 bytes
Starting test on Mon Nov 13 17:03:13 2017

Seconds         Mbps Tx         MBs Tx          FrmTx/s         Frames Tx
1               914.41          109             423336          423336
2               1174.33         248             543672          967008
3               1174.70         389             543841          1510849
4               1174.62         529             543805          2054654
Speed test Tx error : No buffer space available
Ending test on Mon Nov 13 17:03:17 2017


Leaving promiscuous mode

This issue doesn't occur using the 1G interface, which was tested using various packet sizes. However it does seem to be happening on the 10G interfaces at any packet size I try.

ACK every N frames

Add a CLI option to ACK one in every N frames, otherwise ACK mode is very slow on a stable link with no drops.

Rx host is double counting for first second

Example with Tx using -M 10000000:

[user@ucpe_002 Etherate-master]$ sudo ./etherate -r -i ens3f3 -v 4093
...
Seconds         Mbps Rx         MBs Rx          FrmRx/s         Frames Rx
1               19.89           2               1666            1666
2               9.94            3               833             2499
3               9.94            4               833             3332

Example with Tx using -F 1

[user@ucpe_002 Etherate-master]$ sudo ./etherate -r -i ens3f3 -v 4093
...
Seconds         Mbps Rx         MBs Rx          FrmRx/s         Frames Rx
1               0.02            0               2               2
2               0.01            0               1               3
3               0.01            0               1               4
4               0.01            0               1               5

Diff submitted via email to verify interface

Evalute if this code can be pulled into Etherate, submitted by Christophe via email, to check if an interface is connected:

diff -urpN Etherate/defaults.c Etherate-clucas/defaults.c
--- Etherate/defaults.c	2017-06-12 13:53:17.446600433 +0200
+++ Etherate-clucas/defaults.c	2017-06-15 09:22:39.639698487 +0200
@@ -283,6 +283,11 @@ int16_t setup_socket_interface(struct fr
 
     }
 
+    if (verify_interface_connectivity(test_interface) != 1) {
+        printf("Error: Interace '%s' is DOWN.\n", (char*)test_interface->IF_NAME);
+            return EX_SOFTWARE;
+    }
+
 
     // Link layer socket setup
     test_interface->SOCKET_ADDRESS.sll_family   = PF_PACKET;    
diff -urpN Etherate/functions.c Etherate-clucas/functions.c
--- Etherate/functions.c	2017-06-12 13:53:17.456600422 +0200
+++ Etherate-clucas/functions.c	2017-06-15 09:23:27.819647543 +0200
@@ -38,6 +38,7 @@
  * print_usage()
  * remove_interface_promisc()
  * reset_app()
+ * verify_interface_connectivity()
  * set_interface_promisc()
  * set_sock_interface_index()
  * set_sock_interface_name()
@@ -1212,6 +1219,24 @@ void reset_app(struct frame_headers *fra
 
 }
 
+int16_t verify_interface_connectivity(struct test_interface *test_interface) 
+{
+    struct ifreq if_req;
+
+    int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
+    if (socId < 0) 
+        fprintf(stderr, "Socket failed. Errno = %d\n", errno);
+
+
+    (void) strncpy(if_req.ifr_name, (char*)test_interface->IF_NAME, sizeof(if_req.ifr_name));
+    int rv = ioctl(socId, SIOCGIFFLAGS, &if_req);
+    close(socId);
+
+    if (rv == -1) 
+        fprintf(stderr, "Ioctl failed. Errno = %d\n", errno);
+
+    return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING);
+}
 
 
 int16_t set_interface_promisc(struct test_interface *test_interface)

'etherate -l' does not show interfaces without IPs

'etherate -l' does not show interfaces that don't have IPs. However, it should not be required to send ethernet frames.

# ./etherate -l
Device lo with address 00:00:00:00:00:00, interface index 1
Device eth0 with address 00:00:17:2e:c1:14, interface index 3

# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:40:f4:cf:98:32 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:16:17:2e:c1:14 brd ff:ff:ff:ff:ff:ff

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:40:f4:cf:98:32 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::240:f4ff:fecf:9832/64 scope link 
       valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:17:2e:c1:14 brd ff:ff:ff:ff:ff:ff
    inet 192.2.0.2/24 brd 192.2.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:db8::20/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:17ff:fe2e:c114/64 scope link 
       valid_lft forever preferred_lft forever

# ./etherate -r -I 2
Error: Couldn't set interface with index, returned index was 0.

The average FPS and max FPS are always the same

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
bensley@ubuntu-laptop:~/C/github/etherate/dev$ ./etherate -V
Etherate version 1.16 2018-01
SUMMARY

The average FPS and max FPS from every speed test are the same.

STEPS TO REPRODUCE
Maximum speed during test: 11573.62Mbps, 955550Fps
Average speed during test: 11200.13Mbps, 955550Fps

Multiple ioctl() calls have no error checking

Email from Bruno:

SIOCGIFINDEX ioctl() calls are not checked for errors in file functions.cpp, functions set_sock_interface_name(), set_sock_interface_index(), list_interfaces(). In the same file a few close() calls are not checked for error either.

This is in reference to https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1392 also https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1312 and https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1065.

Also close() is unchecked here: https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1238

https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1254

https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1265

https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1084

-Q option not working, 100% frame loss

Via emai:

I try to use etherate and the -Q option.
I run etherate on two x86 ends, but I have the result as :

One side :

root@ubuntu:~# ./etherate -I 2 -Q 1000 1000
Running in TX mode
Using device eth0 with address 00:00:60:cb:fd:ba, interface index 2
Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...

Synchronising settings with RX host
Link quality tests enabled
Settings have been synchronised

Calculating delay between hosts...
Tx to Rx delay calculated as 0.000000051 seconds

Starting test on Fri Nov 4 12:19:09 2016

No. RTT Jitter
*
*
*
*
[...]
est frames transmitted: 30
Test frames received: 0
Non test or out-of-order frames received: 210
Number of timeouts: 31
Min/Max RTT during test: 999999.999999000s/0.000000000s
Min/Max jitter during test: 999999.999999000s/0.000000000s
Ending test on Fri Nov 4 12:19:39 2016

Leaving promiscuous mode
root@ubuntu:~#

Other side :

oot@iou:~/SRC/Etherate-master# ./etherate -r
Running in RX mode
Using device eth0 with address 00:00:24:8b:26:3d, interface index 2
Entering promiscuous mode
Source MAC 00:00:5e:00:00:02
Destination MAC 00:00:5e:00:00:01
Sending gratuitous broadcasts...

Waiting for settings from TX host
Link quality tests enabled
Settings have been synchronised

Calculating delay between hosts...
Tx to Rx delay calculated as 0.000000051 seconds

Starting test on Fri Nov 4 12:22:06 2016
-> It never ends up.

Do you know why I am not able to have a correct test ?

Remove the htonll() and ntohll() functions

Email from Bruno:

In the file functions.cpp, you could get rid of the htonll() and ntohll() functions and replace them with the following code in etherate.h :

    // HtoN & NtoH methods for ull values
     #if (__BYTE_ORDER == __BIG_ENDIAN)
     #define ntohll(val) return (val)
     #define htonll(val) return (val)
     #else
     #define ntohll(val) __bswap_64(val)
     #define htonll(val) __bswap_64(val)
     #endif

This is slightly faster as there's one less function call, it's also in line with the definition of the other hton and ntoh functions.

This is in relation to https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1017 and https://github.com/jwbensley/Etherate/blob/master/functions.cpp#L1091

Add reverse test direction option

Email from Christophe;

What do you think about be able to reverse tests between RX and TX, as iperf3 is able to do ?
So that you are able to test Download and Upload without any other action other than change on one side of the link.

Rx host shows Rx rate lower that Tx host's Tx rate

The Tx host is sending 1514 byte frames (1500 bytes of payload + 6 SRC MAC + 6 DST MAC + 2 Etype). The Tx host is limited to 10000000 bps (10Mbps) which below equates to 833 frames per second:

(833 * 1514) * 8 = 10089296 bits.

[user@ucpe_003 Etherate-master]$ sudo ./etherate -i ens3f2 -v 4093 -M 10000000
...
Seconds         Mbps Tx         MBs Tx          FrmTx/s         Frames Tx
1               10.00           1               833             833
2               10.00           2               833             1666
3               10.00           3               833             2499

Below it can be seen on the Rx host that it is receiving 833 fps however it shows 9.94 Mbps. This is excluding the headers from the ingress rate calculation which the Tx host is including on its egress rate calculation (in terms of stats gathering and rate limiting):

[user@ucpe_002 Etherate-master]$ sudo ./etherate -r -i ens3f3 -v 4093
...
Seconds         Mbps Rx         MBs Rx          FrmRx/s         Frames Rx
1               19.89           2               1666            1666
2               9.94            3               833             2499
3               9.94            4               833             3332
4               9.94            5               833             4165

Longer tests overflow end stats

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
Etherate version 1.17 2018-04
SUMMARY

When running a longer test, e.g.5 minutes, the average bps/fps counters are overflowing:
Average speed during test: 352123.25Mbps, 709925909Fps

STEPS TO REPRODUCE
sudo taskset -c 2 ./etherate -i ens2f0 -t 3600 -f 48
...
900		392.23		41929		790782		709133369
901		393.10		41976		792540		709925909
^CQuitting...
Test frames transmitted: 710465807
Test frames received: 0
Non test frames received: 16
In order ACK frames received: 0
Out of order ACK frames received early: 0
Out of order ACK frames received late: 0
Maximum speed during test: 393.10Mbps, 792540Fps
Average speed during test: 352123.25Mbps, 709925909Fps
Data transmitted during test: 42008MBs
Leaving promiscuous mode

Add test stats output when stopping with CTRL+C

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
Etherate version 0.13.beta 2017-07
SUMMARY

Quitting with CTRL+C before a running test has finished means that no "stats" are printed for the portion of a test that as run so far.

STEPS TO REPRODUCE
bensley@ubuntu-laptop:~/C/github/etherate/Etherate$ sudo ./etherate -i lo -g -G
[sudo] password for bensley: 
Running in TX mode
Using device lo with address 00:00:00:00:00:00, interface index 1

Physical interface MTU unknown, test might exceed physical MTU!

Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...
Done.
Frame size is 1514 bytes
Starting test on Sun Sep 24 15:30:51 2017

Seconds		Mbps Tx		MBs Tx		FrmTx/s		Frames Tx
1		971.18		115		80932		80932
2		9900.89		1296		825074		906006
3		9684.61		2450		807051		1713057
^CQuitting...
Leaving promiscuous mode

The stats that are printed when a test is fully completed (such as min/max/avg, frame counts etc) should be printed even when a test is stopped prematurely.

Doubling of stats on Rx host

DanP via Skype has shown that his Rx host is double counting frames received from Tx:

TX:
Seconds         Mbps Tx         MBs Tx          FrmTx/s         Frames Tx
1               661.46          78              55122           55122
2               975.24          195             81270           136392
3               975.23          311             81269           217661
4               975.42          427             81285           298946

RX
Seconds         Mbps Rx         MBs Rx          FrmRx/s         Frames Rx
1               767.50          91              64301           64301
2               1940.10         322             162542          226843
3               1940.29         554             162558          389401
4               1940.21         785             162551          551952
5               1940.32         1016            162560          714512

Traffis is being sent from Tx to FF:FF:FF:FF:FF:FF (because BUM testing is required) and a VLAN tag is being used on sender and receiver (the same at both sides). This is over an MPLS pseudowire, the ingress router interfaces (connected to Tx host) and egress router interface (connected to Rx host) both show the correct ingress and egress speed respectively (which is the speed shown by the Tx host). Only the Rx host is showing double the frame rate stats within Etherate.

Topology:
SERVER1 -> NE20 (BUM FILTER) -> MPLS -> MX104 -> SERVER2

When the BUM filters are enabled on the routers only 10Mbps of traffic is passing over the pseudowire but the Rx host shows 20Mbps of traffic incomming within Etherate. Physical device and router interfaces correctly show 10Mbps.

root@test1:~/Etherate# etherate -V
Etherate version 0.13.beta 2017-07

root@test1:~/Etherate# uname -a
Linux test1 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux

Replace sendto() with send()

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
bensley@ubuntu-laptop:~/C/github/etherate/dev$ uname -a
Linux ubuntu-laptop 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

bensley@ubuntu-laptop:~/C/github/etherate/dev$ cat /etc/redhat-release || lsb_release -a || cat /etc/issue
cat: /etc/redhat-release: No such file or directory
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.3 LTS
Release:	16.04
Codename:	xenial

bensley@ubuntu-laptop:~/C/github/etherate/dev$ lspci | grep -i eth
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)

bensley@ubuntu-laptop:~/C/github/etherate/dev$ ./etherate -V
Etherate version 1.16 2018-01
SUMMARY

Replace sendto() with send() in all speed test functions:

/*
                tx_ret = sendto(test_interface->sock_fd,
                                frame_headers->tx_buffer,
                                test_params->f_size_total, MSG_DONTWAIT, 
                                (struct sockaddr*)&test_interface->sock_addr,
                                sizeof(test_interface->sock_addr));
*/
                tx_ret = send(test_interface->sock_fd,
                              frame_headers->tx_buffer,
                              test_params->f_size_total, MSG_DONTWAIT);

bind() is used so we don't need to specify the link level details in the sendto() call. send() can be called directly without these extra arguments which saves a few CPU cycles and gives a minor performance boost.

STEPS TO REPRODUCE

Using send():

bensley@ubuntu-laptop:~/C/github/etherate/dev$ sudo taskset -c 3 ./etherate -i lo -g -G
...
Maximum speed during test: 12072.82Mbps, 996765Fps
Average speed during test: 11588.63Mbps, 996765Fps

Using sendto():

bensley@ubuntu-laptop:~/C/github/etherate/dev$ sudo taskset -c 3 ./etherate -i lo -g -G
...
Maximum speed during test: 11573.62Mbps, 955550Fps
Average speed during test: 11200.13Mbps, 955550Fps
``

Quality Tests are stil very buggy

This example test stalls indefinitely:

bensley@ubuntu-laptop:~/C/github/etherate/Etherate$ sudo ./etherate -I 1 -r
Running in RX mode
Using device lo with address 00:00:00:00:00:00, interface index 1

Physical interface MTU unknown, test might exceed physical MTU!

Entering promiscuous mode
Source MAC 00:00:5e:00:00:02
Destination MAC 00:00:5e:00:00:01
Sending gratuitous broadcasts...
Done.

Waiting for settings from TX host
Link quality tests enabled
Settings have been synchronised

Frame size if 1514 bytes
Calculating delay between hosts...
Tx to Rx delay calculated as 0.000000004 seconds

Starting test on Sun May 14 14:25:43 2017

No.	Echo Interval
1:	0.0s
2:	0.499983196s
bensley@ubuntu-laptop:~/C/github/etherate/Etherate$ sudo ./etherate -I 1 -Q 500 500
[sudo] password for bensley: 
Running in TX mode
Using device lo with address 00:00:00:00:00:00, interface index 1

Physical interface MTU unknown, test might exceed physical MTU!

Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...
Done.

Synchronising settings with RX host
Link quality tests enabled
Settings have been synchronised

Frame size if 1514 bytes
Calculating delay between hosts...
Tx to Rx delay calculated as 0.000000004 seconds

Starting test on Sun May 14 14:25:43 2017

No.	RTT		Jitter
1:	0.000027326s	0.000027326s
2:	0.000009499s	0.000017827s

Frame order detection is wrong

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
bensley@ubuntu-laptop:~/C/github/etherate/dev$ uname -a
Linux ubuntu-laptop 4.11.0-041100-generic #201705041534 SMP Thu May 4 19:36:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

bensley@ubuntu-laptop:~/C/github/etherate/dev$ cat /etc/redhat-release || lsb_release -a || cat /etc/issue
cat: /etc/redhat-release: No such file or directory
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.4 LTS
Release:	16.04
Codename:	xenial

bensley@ubuntu-laptop:~/C/github/etherate/dev$ lspci | grep -i eth
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)

bensley@ubuntu-laptop:~/C/github/etherate/dev$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 3c:97:0e:bd:62:82 brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 9c:4e:36:c9:b4:98 brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:dd:f2:ff brd ff:ff:ff:ff:ff:ff
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1412 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 500
    link/none 

bensley@ubuntu-laptop:~/C/github/etherate/dev$ ./etherate -V
Etherate version 1.17 2018-04

bensley@ubuntu-laptop:~/C/github/etherate/dev$ sudo ./etherate -l
Device lo with address 00:00:00:00:00:00, has interface index 1
Device enp0s25 with address 3c:97:0e:bd:62:82, has interface index 2
Device wlp3s0 with address 9c:4e:36:c9:b4:98, has interface index 3
Device virbr0 with address 00:00:00:00:00:00, has interface index 4
Device virbr0-nic with address 52:54:00:dd:f2:ff, has interface index 5
SUMMARY

The frame order checking code is comparing the wrong values.

STEPS TO REPRODUCE

Run any speed test - the out of order packets code is comparing f_speed_max instead of f_rx_count.

if (ntohll(*eth->frm.rx_sub_tlv_value) == (eth->speed_test.f_speed_max+1)) {
    eth->params.f_rx_ontime  += 1;
    eth->speed_test.f_speed_max += 1;
} else if (ntohll(*eth->frm.rx_sub_tlv_value) > (eth->params.f_rx_count)) {
    eth->speed_test.f_speed_max = ntohll(*eth->frm.rx_sub_tlv_value);
    eth->params.f_rx_early += 1;
} else if (ntohll(*eth->frm.rx_sub_tlv_value) <= eth->params.f_rx_count) {
    eth->params.f_rx_late += 1;
}

Fix warnings with -pedantic flag

When compiling by hand there are still some errors with -pedantic compile flag, also more errors are shown on CentOS than Ubuntu. Investigate these and see if they are genuine issues.

Stuck at "Calculating delay between hosts"

Whatever command I try from the examples, it gets stuck forever (well, at least several minutes) at "Calculating delay between hosts".

This is likely because my network blocks (all?) ICMP. Even if it's considered obvious, it would be nice to specify in the README (or maybe to give up after a while?).

$ sudo etherate -f 1500
Running in TX mode
Using device eth0 with address 64:00:6a:6c:5e:f5, interface index 2
Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...
Done.

Synchronising settings with RX host
Settings have been synchronised

Frame size if 1514 bytes
Calculating delay between hosts...
q^CLeaving promiscuous mode

See firewalls:

$ sudo lft -E ripe.net

Tracing _______________________.

TTL  LFT trace to www.ripe.net (193.0.6.139):80/tcp
 1   10.169.0.252 10.8/17.6ms
**   [firewall] the next gateway may statefully inspect packets
 2   10.169.174.177 5.3/15.9ms
**   [neglected] no reply packets received from TTLs 3 through 4
**   [4.2-3 BSD bug] the next gateway may errantly reply with reused TTLs
 5   * [target] www.ripe.net (193.0.6.139):80 18.4ms

I'm on:

$ uname -a
Linux fondazione-Precision-Tower-3620 4.10.0-22-generic #24-Ubuntu SMP Mon May 22 17:43:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Thanks for the patience and feel free to close as invalid. :-)

Update compile checks

Test these extra compiler arguments, see if they are beneficial:

-Wduplicated-branches (GCC 7):
Warn when an if-else has identical branches.

-Wduplicated-cond (GCC 6):
Warn about duplicated condition in if-else-if chains.

-Wnull-dereference (GCC 6):
Warn when the compiler detects paths that dereferences a null pointer.

-Wjump-misses-init (GCC 4.5):
Warn if a "goto" statement or a "switch" statement jumps forward across the initialization of a variable, or jumps backward to a label after the variable has been initialized. This only warns about variables that are initialized when they are declared.

-Wlogical-op (GCC 4.3):
Warn about suspicious uses of logical operators in expressions. This includes using logical operators in contexts where a bit-wise operator is likely to be expected.

-Wshadow (GCC 3):
Warn whenever a local variable or type declaration shadows another variable, parameter, type, class member (in C++), or instance variable (in Objective-C) or whenever a built-in function is shadowed.

-Wformat=2 (GCC 3.0):
-Wformat=1 checks calls to "printf" and "scanf", etc., to make sure that the arguments supplied have types appropriate to the format string specified, and that the conversions specified in the format string make sense. This includes standard functions, and others specified by format attributes, in the "printf", "scanf", "strftime" and "strfmon" families. -Wformat=2 enables -Wformat=1 plus additional format checks, currently equivalent to -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k.

-Wformat-signedness (GCC ?):
If -Wformat is specified, also warn if the format string requires an unsigned argument and the argument is signed and vice versa.

-Wextra (GCC ?):
This enables some extra warning flags that are not enabled by -Wall. The extra options are:
-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall).

Can we check gcc version and change options based on available version?

Can we automate some tests too?

-h option says "on the wire"

ISSUE TYPE

  • Bug Report
  • Enhancement/Feature Request
  • Question

VERSION DETAILS

2018-01

SUMMARY

The -h option says "on the wire" for the description of the -f option, which is incorrect.

STEPS TO REPRODUCE

./etherate -h

Packet pacing feature has an overflow in the max fps calculation

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
2018-01 (1.16)
SUMMARY

The value for calculating the max FPS is a uint64_t which should be a long double.

STEPS TO REPRODUCE
bensley@ubuntu-laptop:~/C/github/etherate/dev$ sudo taskset -c 3 ./etherate -i lo -g -G -T 50000
Running in TX mode
Using device lo with address 00:00:00:00:00:00, interface index 1

Physical interface MTU unknown, tests might exceed physical MTU!

Entering promiscuous mode
Source MAC 00:00:5e:00:00:01
Destination MAC 00:00:5e:00:00:02
Sending gratuitous broadcasts...
Done.
Frame size is 1514 bytes
Floating point exception (core dumped)

Interface Selection Not Working

Via email:

...trying to use it to test 40Gb network connectivity but can’t get it to work:

[root@r6181-d5-us01 Etherate-master]# ./etherate

Running in TX mode

Error: Couldn't find appropriate interface ID, returned ID was 0!

 Try supplying a source MAC address with the -s option.

[root@r6181-d5-us01 Etherate-master]# ./etherate -s e4:1d:2d:af:c5:80

Running in TX mode

Error: Couldn't find appropriate interface ID, returned ID was 0!

 Try supplying a source MAC address with the -s option.

[root@r6181-d5-us01 Etherate-master]# uname -a

Linux r6181-d5-us01 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

MTU test frame count

When running the MTU test, as soon as the first frame is received at the final/maximum size on the Rx side it stops, so the test so received frames on Rx is always 2 less than Tx frame count on TX host;

Tx:

Test frames transmitted: 33
Test frames received: 33

Rx:

Test frames transmitted: 33
Test frames received: 31

Regression bug with speed limit display on Rx host

Bug sent in via email:

I sync between TX an RX a 10M test and on RX I always have 1M. I have made a port mirror and I see that my TLV value must be 0x2625A0 and I receive 0x2625A.

Confirm that the Rx host is incorrectly displaying a speed limit if one is set.

Remove -fstack-protector-all compile flag

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS

Any Etherate version.

SUMMARY

Remove -fstack-protector-all compile flag, this is having a negative performance impact.

STEPS TO REPRODUCE

The first set of results are with -fstack-protector-all compile flag present, the second set of results are without it.

Seconds         Mbps Tx         MBs Tx    FrmTx/s               Frames Tx
1       3671.73         437             303148          303148
2       5836.00         1133            481836          784984
3       5819.13         1827            480443          1265427
4       5818.16         2520            480363          1745790
5       5813.18         3213            479952          2225742
6       5820.41         3907            480549          2706291
7       5817.24         4600            480287          3186578
8       5816.74         5294            480246          3666824
9       5818.54         5988            480395          4147219
10      5816.81         6681            480252          4627471


Seconds         Mbps Tx         MBs Tx    FrmTx/s               Frames Tx
1       4508.76         537             372256          372256
2       6045.29         1258            499116          871372
3       6046.76         1978            499237          1370609
4       6044.54         2699            499054          1869663
5       6043.55         3419            498972          2368635
6       6041.28         4140            498785          2867420
7       6046.71         4860            499233          3366653
8       6045.51         5581            499134          3865787
9       6047.50         6302            499298          4365085
10      6045.84         7023            499161          4864246

VLAN tag not included frame size and rate limit

[user@ucpe_003 Etherate-master]$ sudo ./etherate -i ens3f2 -v 4093 -M 10000000
...
Physical interface MTU (1514 with headers) is less than
the test frame size (1518 with headers). Test frames shall
be limited to the interface MTU size
...
Frame size is 1514 bytes
...
Seconds         Mbps Tx         MBs Tx          FrmTx/s         Frames Tx
1               10.00           1               833             833
2               10.00           2               833             1666
3               10.00           3               833             2499

"Frame size is 1514 bytes" - should say 1518.

Also the MTU warning means that 4 bytes of payload are being chopped from the frame (confirmed with tcpdump).

-l option requires sudo

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS
$ ./etherate -V
Etherate version 1.15 2017-10
SUMMARY

Using the -l option exits with an error because sudo is required. Can this be prevented?

STEPS TO REPRODUCE
$ ./etherate -l
Couldn't close socket : Bad file descriptor

Add packet pacing feature

ISSUE TYPE
  • Bug Report
  • Enhancement/Feature Request
  • Question
VERSION DETAILS

N/A

SUMMARY

Provide a packet pacing feature to smooth the inter-frame transmission timing.

STEPS TO REPRODUCE

Have a CLI option to enable a "smoothed" transmission interval between frames (packet pacing). When setting a max speed with -m/-M the NIC burst until the rate-limit is reached and then for the remainder of the 1 second interval the NIC is idle. -T could set a delay between frame transmission which will smooth out the transmission rate of the max speed set in Mbps/MBps

e.g. -T could be a flag to enable traffic "smoothing" (packet pacing) to smooth out a 10Mbps stream so that 825 frames of 1514 bytes are evenly paced over a 1 second interval:

1514 * 8                  == 12112 bits per frame.
Target "smoothed" Tx rate == 10Mbps (10,000,000 bits per second)
10,000,000 / 12112        == ~825 frames per second
1Gbps NIC                 == 1,000,000,000 bits per second Tx rate
12112 / 1,000,000,000     == one frame takes 0.000012112 seconds to Tx.
0.000012112ns * 825       == 0.009992400 seconds required to Tx 825 frames
1.0 - 0.0099924           ==  0.990007600 remaining to be spread out as inter-frame delay
0.990007600 / 825         ==  0.00120000921 seconds inter-frame delay

sudo ./etherate -M 10000000 -T

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.