aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib/stress-testing/peg.c
blob: 6b539faf8f2696900875cc134cff2a5569cffea6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
}