aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib/stress-testing/peg.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/stress-testing/peg.c')
-rw-r--r--contrib/stress-testing/peg.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/contrib/stress-testing/peg.c b/contrib/stress-testing/peg.c
new file mode 100644
index 0000000..6b539fa
--- /dev/null
+++ b/contrib/stress-testing/peg.c
@@ -0,0 +1,50 @@
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <linux/limits.h>
+#include <time.h>
+#include <stdio.h>
+#include <string.h>
+
+static unsigned long long interface_tx_bytes(const char *interface)
+{
+ char buf[PATH_MAX];
+ FILE *f;
+ unsigned long long ret;
+ snprintf(buf, PATH_MAX - 1, "/sys/class/net/%s/statistics/tx_bytes", interface);
+ f = fopen(buf, "r");
+ fscanf(f, "%llu", &ret);
+ fclose(f);
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ char buf[1500] = { 0 };
+ unsigned long long before, after, i;
+ struct timespec begin, end;
+ double elapsed;
+ struct ifreq req;
+ int fd = socket(AF_INET, SOCK_DGRAM, 0);
+ struct sockaddr_in addr = {
+ .sin_family = AF_INET,
+ .sin_port = htons(7271),
+ .sin_addr = inet_addr(argv[3])
+ };
+ strcpy(req.ifr_name, argv[1]);
+ ioctl(fd, SIOCGIFMTU, &req);
+
+ connect(fd, (struct sockaddr *)&addr, sizeof(addr));
+
+ before = interface_tx_bytes(argv[2]);
+ clock_gettime(CLOCK_MONOTONIC, &begin);
+ for (i = 0; i < 10000000; ++i)
+ send(fd, buf, req.ifr_mtu - 28, 0);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ after = interface_tx_bytes(argv[2]);
+ elapsed = end.tv_sec - begin.tv_sec + (end.tv_nsec - begin.tv_nsec) / 1000000000.0;
+
+ printf("%.4f mbps\n", ((after - before) * 8) / elapsed / 1000000.0);
+ return 0;
+}