File Index
Files and directories
Sign in
FILE

sctp_collision.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/netfilter/sctp_collision.c 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.