xref: /freebsd-src/tools/test/stress2/misc/sctp.sh (revision 8a272653d9fbd9fc37691c9aad6a05089b4ecb4d)
1*8a272653SPeter Holm#!/bin/sh
2*8a272653SPeter Holm
3*8a272653SPeter Holm# Based on https://gist.github.com/zonque/7d03568eab14a2bb57cb by
4*8a272653SPeter Holm# Daniel Mack github@zonque.org
5*8a272653SPeter Holm
6*8a272653SPeter Holm# "panic: general protection fault" seen:
7*8a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/sctp.txt
8*8a272653SPeter Holm# Fixed by r350626
9*8a272653SPeter Holm
10*8a272653SPeter Holmkldstat -v | grep -q sctp || kldload sctp.ko
11*8a272653SPeter Holmcat > /tmp/sctp.c <<EOF
12*8a272653SPeter Holm#include <sys/types.h>
13*8a272653SPeter Holm#include <sys/socket.h>
14*8a272653SPeter Holm#include <unistd.h>
15*8a272653SPeter Holm#include <arpa/inet.h>
16*8a272653SPeter Holm#include <libgen.h>
17*8a272653SPeter Holm#include <netinet/in.h>
18*8a272653SPeter Holm#include <netinet/sctp.h>
19*8a272653SPeter Holm#include <stdio.h>
20*8a272653SPeter Holm#include <stdlib.h>
21*8a272653SPeter Holm#include <string.h>
22*8a272653SPeter Holm
23*8a272653SPeter Holmstatic int my_port_num;
24*8a272653SPeter Holm
25*8a272653SPeter Holmstatic void
26*8a272653SPeter Holmdie(const char *s)
27*8a272653SPeter Holm{
28*8a272653SPeter Holm	perror(s);
29*8a272653SPeter Holm	exit(1);
30*8a272653SPeter Holm}
31*8a272653SPeter Holm
32*8a272653SPeter Holm	static void
33*8a272653SPeter Holmserver(void)
34*8a272653SPeter Holm{
35*8a272653SPeter Holm	struct sctp_sndrcvinfo sndrcvinfo;
36*8a272653SPeter Holm	struct sockaddr_in servaddr = {
37*8a272653SPeter Holm		.sin_family = AF_INET,
38*8a272653SPeter Holm		.sin_addr.s_addr = htonl(INADDR_ANY),
39*8a272653SPeter Holm		.sin_port = htons(my_port_num),
40*8a272653SPeter Holm	};
41*8a272653SPeter Holm	struct sctp_initmsg initmsg = {
42*8a272653SPeter Holm		.sinit_num_ostreams = 5,
43*8a272653SPeter Holm		.sinit_max_instreams = 5,
44*8a272653SPeter Holm		.sinit_max_attempts = 4,
45*8a272653SPeter Holm	};
46*8a272653SPeter Holm	int listen_fd, conn_fd, flags, ret, in;
47*8a272653SPeter Holm
48*8a272653SPeter Holm	listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
49*8a272653SPeter Holm	if (listen_fd < 0)
50*8a272653SPeter Holm		die("socket");
51*8a272653SPeter Holm
52*8a272653SPeter Holm	ret = bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
53*8a272653SPeter Holm	if (ret < 0)
54*8a272653SPeter Holm		die("bind");
55*8a272653SPeter Holm
56*8a272653SPeter Holm	ret = setsockopt(listen_fd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg,
57*8a272653SPeter Holm			sizeof(initmsg));
58*8a272653SPeter Holm	if (ret < 0)
59*8a272653SPeter Holm		die("setsockopt");
60*8a272653SPeter Holm
61*8a272653SPeter Holm	ret = listen(listen_fd, initmsg.sinit_max_instreams);
62*8a272653SPeter Holm	if (ret < 0)
63*8a272653SPeter Holm		die("listen");
64*8a272653SPeter Holm
65*8a272653SPeter Holm	for (;;) {
66*8a272653SPeter Holm		char buffer[1024];
67*8a272653SPeter Holm
68*8a272653SPeter Holm		printf("Waiting for connection\n");
69*8a272653SPeter Holm		fflush(stdout);
70*8a272653SPeter Holm
71*8a272653SPeter Holm		conn_fd = accept(listen_fd, (struct sockaddr *) NULL, NULL);
72*8a272653SPeter Holm		if(conn_fd < 0)
73*8a272653SPeter Holm			die("accept()");
74*8a272653SPeter Holm
75*8a272653SPeter Holm		printf("New client connected\n");
76*8a272653SPeter Holm		fflush(stdout);
77*8a272653SPeter Holm
78*8a272653SPeter Holm		/* Note that flags is uninitialized here */
79*8a272653SPeter Holm		in = sctp_recvmsg(conn_fd, buffer, sizeof(buffer), NULL, 0,
80*8a272653SPeter Holm				&sndrcvinfo, &flags);
81*8a272653SPeter Holm		if (in > 0) {
82*8a272653SPeter Holm			printf("Received data: %s\n", buffer);
83*8a272653SPeter Holm			fflush(stdout);
84*8a272653SPeter Holm		}
85*8a272653SPeter Holm
86*8a272653SPeter Holm		close(conn_fd);
87*8a272653SPeter Holm	}
88*8a272653SPeter Holm}
89*8a272653SPeter Holm
90*8a272653SPeter Holmstatic void
91*8a272653SPeter Holmclient(void)
92*8a272653SPeter Holm{
93*8a272653SPeter Holm	struct sockaddr_in servaddr = {
94*8a272653SPeter Holm		.sin_family = AF_INET,
95*8a272653SPeter Holm		.sin_port = htons(my_port_num),
96*8a272653SPeter Holm		.sin_addr.s_addr = inet_addr("127.0.0.1"),
97*8a272653SPeter Holm	};
98*8a272653SPeter Holm	int conn_fd, ret;
99*8a272653SPeter Holm	const char *msg = "Hello, Server!";
100*8a272653SPeter Holm
101*8a272653SPeter Holm	conn_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
102*8a272653SPeter Holm	if (conn_fd < 0)
103*8a272653SPeter Holm		die("socket()");
104*8a272653SPeter Holm
105*8a272653SPeter Holm	ret = connect(conn_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
106*8a272653SPeter Holm	if (ret < 0)
107*8a272653SPeter Holm		die("connect()");
108*8a272653SPeter Holm
109*8a272653SPeter Holm	ret = sctp_sendmsg(conn_fd, (void *) msg, strlen(msg) + 1, NULL, 0, 0, 0, 0, 0, 0 );
110*8a272653SPeter Holm	if (ret < 0)
111*8a272653SPeter Holm		die("sctp_sendmsg");
112*8a272653SPeter Holm
113*8a272653SPeter Holm	close(conn_fd);
114*8a272653SPeter Holm}
115*8a272653SPeter Holm
116*8a272653SPeter Holmint
117*8a272653SPeter Holmmain(int argc __unused, char *argv[])
118*8a272653SPeter Holm{
119*8a272653SPeter Holm
120*8a272653SPeter Holm	my_port_num = atoi(argv[1]);
121*8a272653SPeter Holm	if (strstr(basename(argv[0]), "server"))
122*8a272653SPeter Holm		server();
123*8a272653SPeter Holm	else
124*8a272653SPeter Holm		client();
125*8a272653SPeter Holm
126*8a272653SPeter Holm	return (0);
127*8a272653SPeter Holm}
128*8a272653SPeter HolmEOF
129*8a272653SPeter Holm
130*8a272653SPeter Holmcc -o /tmp/server -Wall -Wextra -O2 /tmp/sctp.c || exit
131*8a272653SPeter Holmln -sf /tmp/server /tmp/client
132*8a272653SPeter Holm
133*8a272653SPeter Holmparallel=100
134*8a272653SPeter Holmfor i in `jot $parallel 62324`; do
135*8a272653SPeter Holm	/tmp/server $i > /dev/null &
136*8a272653SPeter Holmdone
137*8a272653SPeter Holm(cd ../testcases/swap; ./swap -t 1m -i 20 -l 100) &
138*8a272653SPeter Holmsleep 2
139*8a272653SPeter Holm
140*8a272653SPeter Holmstart=`date +%s`
141*8a272653SPeter Holmwhile [ $((`date +%s` - start)) -lt 60 ]; do
142*8a272653SPeter Holm	pids=
143*8a272653SPeter Holm	for i in `jot 50`; do
144*8a272653SPeter Holm		for j in `jot $parallel 62324`; do
145*8a272653SPeter Holm			/tmp/client $j &
146*8a272653SPeter Holm			pids="$pids $!"
147*8a272653SPeter Holm		done
148*8a272653SPeter Holm	done
149*8a272653SPeter Holm	for i in $pids; do
150*8a272653SPeter Holm		wait $i
151*8a272653SPeter Holm	done
152*8a272653SPeter Holmdone
153*8a272653SPeter Holmpkill server
154*8a272653SPeter Holmwait
155*8a272653SPeter Holmwhile pkill swap; do :; done
156*8a272653SPeter Holmwait
157*8a272653SPeter Holmrm -f /tmp/sctp.c /tmp/server /tmp/client
158*8a272653SPeter Holmexit 0
159