1 // SPDX-License-Identifier: GPL-2.0
9 int main(int argc, char *argv[])
11 struct sockaddr_in saddr = {}, daddr = {};
12 int sd, ret, len = sizeof(daddr);
13 struct timeval tv = {25, 0};
16 if (argc != 6 || (strcmp(argv[1], "server") && strcmp(argv[1], "client"))) {
17 printf("%s <server|client> <LOCAL_IP> <LOCAL_PORT> <REMOTE_IP> <REMOTE_PORT>\n",
22 sd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
24 printf("Failed to create sd\n");
28 saddr.sin_family = AF_INET;
29 saddr.sin_addr.s_addr = inet_addr(argv[2]);
30 saddr.sin_port = htons(atoi(argv[3]));
32 ret = bind(sd, (struct sockaddr *)&saddr, sizeof(saddr));
34 printf("Failed to bind to address\n");
40 printf("Failed to listen on port\n");
44 daddr.sin_family = AF_INET;
45 daddr.sin_addr.s_addr = inet_addr(argv[4]);
46 daddr.sin_port = htons(atoi(argv[5]));
48 /* make test shorter than 25s */
49 ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
51 printf("Failed to setsockopt SO_RCVTIMEO\n");
55 if (!strcmp(argv[1], "server")) {
56 sleep(1); /* wait a bit for client's INIT */
57 ret = connect(sd, (struct sockaddr *)&daddr, len);
59 printf("Failed to connect to peer\n");
62 ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len);
64 printf("Failed to recv msg %d\n", ret);
67 ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len);
69 printf("Failed to send msg %d\n", ret);
72 printf("Server: sent! %d\n", ret);
75 if (!strcmp(argv[1], "client")) {
76 usleep(300000); /* wait a bit for server's listening */
77 ret = connect(sd, (struct sockaddr *)&daddr, len);
79 printf("Failed to connect to peer\n");
82 sleep(1); /* wait a bit for server's delayed INIT_ACK to reproduce the issue */
83 ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len);
85 printf("Failed to send msg %d\n", ret);
88 ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len);
90 printf("Failed to recv msg %d\n", ret);
93 printf("Client: rcvd! %d\n", ret);