FILE
sctp_collision.c
File preview with syntax highlighting.
linux-6.19.14/tools/testing/selftests/net/netfilter/sctp_collision.c
1// SPDX-License-Identifier: GPL-2.0 2 3#include <stdio.h> 4#include <stdlib.h> 5#include <string.h> 6#include <unistd.h> 7#include <arpa/inet.h> 8 9int main(int argc, char *argv[]) 10{ 11 struct sockaddr_in saddr = {}, daddr = {}; 12 socklen_t len = sizeof(daddr); 13 struct timeval tv = {25, 0}; 14 char buf[] = "hello"; 15 int sd, ret; 16 17 if (argc != 6 || (strcmp(argv[1], "server") && strcmp(argv[1], "client"))) { 18 printf("%s <server|client> <LOCAL_IP> <LOCAL_PORT> <REMOTE_IP> <REMOTE_PORT>\n", 19 argv[0]); 20 return -1; 21 } 22 23 sd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); 24 if (sd < 0) { 25 printf("Failed to create sd\n"); 26 return -1; 27 } 28 29 saddr.sin_family = AF_INET; 30 saddr.sin_addr.s_addr = inet_addr(argv[2]); 31 saddr.sin_port = htons(atoi(argv[3])); 32 33 ret = bind(sd, (struct sockaddr *)&saddr, sizeof(saddr)); 34 if (ret < 0) { 35 printf("Failed to bind to address\n"); 36 goto out; 37 } 38 39 ret = listen(sd, 5); 40 if (ret < 0) { 41 printf("Failed to listen on port\n"); 42 goto out; 43 } 44 45 daddr.sin_family = AF_INET; 46 daddr.sin_addr.s_addr = inet_addr(argv[4]); 47 daddr.sin_port = htons(atoi(argv[5])); 48 49 /* make test shorter than 25s */ 50 ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 51 if (ret < 0) { 52 printf("Failed to setsockopt SO_RCVTIMEO\n"); 53 goto out; 54 } 55 56 if (!strcmp(argv[1], "server")) { 57 sleep(1); /* wait a bit for client's INIT */ 58 ret = connect(sd, (struct sockaddr *)&daddr, len); 59 if (ret < 0) { 60 printf("Failed to connect to peer\n"); 61 goto out; 62 } 63 ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len); 64 if (ret < 0) { 65 printf("Failed to recv msg %d\n", ret); 66 goto out; 67 } 68 ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len); 69 if (ret < 0) { 70 printf("Failed to send msg %d\n", ret); 71 goto out; 72 } 73 printf("Server: sent! %d\n", ret); 74 } 75 76 if (!strcmp(argv[1], "client")) { 77 usleep(300000); /* wait a bit for server's listening */ 78 ret = connect(sd, (struct sockaddr *)&daddr, len); 79 if (ret < 0) { 80 printf("Failed to connect to peer\n"); 81 goto out; 82 } 83 sleep(1); /* wait a bit for server's delayed INIT_ACK to reproduce the issue */ 84 ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len); 85 if (ret < 0) { 86 printf("Failed to send msg %d\n", ret); 87 goto out; 88 } 89 ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len); 90 if (ret < 0) { 91 printf("Failed to recv msg %d\n", ret); 92 goto out; 93 } 94 printf("Client: rcvd! %d\n", ret); 95 } 96 ret = 0; 97out: 98 close(sd); 99 return ret; 100}
~/
Read-only file preview.