aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib/stress-testing
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/stress-testing')
-rw-r--r--contrib/stress-testing/badpacket.c27
-rw-r--r--contrib/stress-testing/peg.c50
-rwxr-xr-xcontrib/stress-testing/self-send.sh48
-rwxr-xr-xcontrib/stress-testing/threewayiperf.sh30
4 files changed, 155 insertions, 0 deletions
diff --git a/contrib/stress-testing/badpacket.c b/contrib/stress-testing/badpacket.c
new file mode 100644
index 0000000..eee61fc
--- /dev/null
+++ b/contrib/stress-testing/badpacket.c
@@ -0,0 +1,27 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <linux/limits.h>
+
+int main(int argc, char *argv[])
+{
+ static const unsigned char handshake1[143] = { 1, 0 };
+ int fd = socket(AF_INET, SOCK_DGRAM, 0);
+ struct sockaddr_in addr = {
+ .sin_family = AF_INET,
+ .sin_port = htons(atoi(argv[2])),
+ .sin_addr = inet_addr(argv[1])
+ };
+ connect(fd, (struct sockaddr *)&addr, sizeof(addr));
+
+ for (;;)
+ send(fd, handshake1, sizeof(handshake1), 0);
+
+ close(fd);
+
+ return 0;
+}
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;
+}
diff --git a/contrib/stress-testing/self-send.sh b/contrib/stress-testing/self-send.sh
new file mode 100755
index 0000000..eb7947b
--- /dev/null
+++ b/contrib/stress-testing/self-send.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+set -e
+
+PRIVATE_KEYS=("")
+PUBLIC_KEYS=("")
+
+resetwg() {
+ for i in {1..64}; do
+ ip link delete dev wg${i} 2>/dev/null >/dev/null || true
+ done
+}
+
+for i in {1..64}; do
+ next_key="$(wg genkey)"
+ PRIVATE_KEYS+=("$next_key")
+ PUBLIC_KEYS+=($(wg pubkey <<<"$next_key"))
+done
+
+resetwg
+trap resetwg INT TERM EXIT
+
+for i in {1..64}; do
+ { echo "[Interface]"
+ echo "ListenPort = $(( $i + 31222 ))"
+ echo "PrivateKey = ${PRIVATE_KEYS[$i]}"
+
+ for j in {1..64}; do
+ [[ $i == $j ]] && continue
+ echo "[Peer]"
+ echo "PublicKey = ${PUBLIC_KEYS[$j]}"
+ echo "AllowedIPs = 192.168.8.${j}/32"
+ echo "Endpoint = 127.0.0.1:$(( $j + 31222 ))"
+ done
+ } > "/tmp/deviceload.conf"
+
+ ip link add dev wg${i} type wireguard
+ wg setconf wg${i} "/tmp/deviceload.conf"
+ ip link set up dev wg${i}
+ rm "/tmp/deviceload.conf"
+done
+
+ip address add dev wg1 192.168.8.1/24
+
+while true; do
+ for i in {2..64}; do
+ echo hello | ncat -u 192.168.8.${i} 1234
+ done
+done
diff --git a/contrib/stress-testing/threewayiperf.sh b/contrib/stress-testing/threewayiperf.sh
new file mode 100755
index 0000000..932d666
--- /dev/null
+++ b/contrib/stress-testing/threewayiperf.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+set -e
+
+if [[ $(hostname) == "thinkpad" ]]; then
+ make -C "$(dirname "$0")/../../src" remote-run
+ for i in 128 129 130; do
+ scp "$0" root@172.16.48.${i}:
+ done
+ for i in 128 129 130; do
+ konsole --new-tab -e ssh -t root@172.16.48.${i} "./$(basename "$0")"
+ done
+ exit
+fi
+
+# perf top -U --dsos '[wireguard]'
+
+tmux new-session -s bigtest -d
+tmux new-window -n "server 6000" -t bigtest "iperf3 -p 6000 -s"
+tmux new-window -n "server 6001" -t bigtest "iperf3 -p 6001 -s"
+sleep 5
+me=$(ip -o -4 address show dev wg0 | sed 's/.*inet \([^ ]*\)\/.*/\1/' | cut -d . -f 4)
+for i in 1 2 3; do
+ [[ $i == $me ]] && continue
+ [[ $me == "1" ]] && port=6000
+ [[ $me == "3" ]] && port=6001
+ [[ $me == "2" && $i == "1" ]] && port=6000
+ [[ $me == "2" && $i == "3" ]] && port=6001
+ tmux new-window -n "client 192.168.2.${i}" -t bigtest "iperf3 -n 300000G -i 1 -p $port -c 192.168.2.${i}"
+done
+tmux attach -t bigtest