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