test/recvsend_bundle: add UDP tests as well

UDP skips the backlog testing, as that's not reliable to do on UDP.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/test/recvsend_bundle.c b/test/recvsend_bundle.c
index a5c9110..940cd44 100644
--- a/test/recvsend_bundle.c
+++ b/test/recvsend_bundle.c
@@ -18,6 +18,7 @@
 #define SEQ_SIZE	(MSG_SIZE / sizeof(unsigned long))
 
 static int nr_msgs;
+static int use_tcp;
 
 #define RECV_BIDS	8192
 #define RECV_BID_MASK	(RECV_BIDS - 1)
@@ -28,6 +29,8 @@
 #define PORT	10202
 #define HOST	"127.0.0.1"
 
+static int use_port = PORT;
+
 #define SEND_BGID	7
 #define RECV_BGID	8
 
@@ -60,9 +63,12 @@
 	memset(&saddr, 0, sizeof(saddr));
 	saddr.sin_family = AF_INET;
 	saddr.sin_addr.s_addr = htonl(INADDR_ANY);
-	saddr.sin_port = htons(PORT);
+	saddr.sin_port = htons(use_port);
 
-	sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	if (use_tcp)
+		sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	else
+		sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 	if (sockfd < 0) {
 		perror("socket");
 		return 1;
@@ -77,19 +83,24 @@
 		goto err;
 	}
 
-	ret = listen(sockfd, 1);
-	if (ret < 0) {
-		perror("listen");
-		goto err;
-	}
+	if (use_tcp) {
+		ret = listen(sockfd, 1);
+		if (ret < 0) {
+			perror("listen");
+			goto err;
+		}
 
-	pthread_barrier_wait(&rd->connect);
+		pthread_barrier_wait(&rd->connect);
 
-	socklen = sizeof(saddr);
-	use_fd = accept(sockfd, (struct sockaddr *)&saddr, &socklen);
-	if (use_fd < 0) {
-		perror("accept");
-		goto err;
+		socklen = sizeof(saddr);
+		use_fd = accept(sockfd, (struct sockaddr *)&saddr, &socklen);
+		if (use_fd < 0) {
+			perror("accept");
+			goto err;
+		}
+	} else {
+		use_fd = sockfd;
+		pthread_barrier_wait(&rd->connect);
 	}
 
 	rd->accept_fd = use_fd;
@@ -395,10 +406,13 @@
 
 	memset(&saddr, 0, sizeof(saddr));
 	saddr.sin_family = AF_INET;
-	saddr.sin_port = htons(PORT);
+	saddr.sin_port = htons(use_port);
 	inet_pton(AF_INET, HOST, &saddr.sin_addr);
 
-	sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	if (use_tcp)
+		sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	else
+		sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 	if (sockfd < 0) {
 		perror("socket");
 		goto err2;
@@ -418,8 +432,6 @@
 	len = 256 * MSG_SIZE;
 	setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &len, optlen);
 
-	getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &len, &optlen);
-
 	/* almost fill queue, leave room for one message */
 	send_seq = 0;
 	rd->to_eagain = 0;
@@ -485,6 +497,10 @@
 	int ret;
 	void *retval;
 
+	/* backlog not reliable on UDP, skip it */
+	if ((backlog || max_sends) && !use_tcp)
+		return T_EXIT_PASS;
+
 	memset(&rd, 0, sizeof(rd));
 	pthread_barrier_init(&rd.connect, NULL, 2);
 	pthread_barrier_init(&rd.startup, NULL, 2);
@@ -516,20 +532,16 @@
 	return (intptr_t)retval;
 }
 
-int main(int argc, char *argv[])
+static int run_tests(void)
 {
-	int eagain_hit;
-	int ret;
-
-	if (argc > 1)
-		return 0;
+	int ret, eagain_hit;
 
 	nr_msgs = NR_MIN_MSGS;
 
 	/* test basic send bundle first */
-	ret = test(0, 0, NULL, 1, 0);
+	ret = test(0, 0, NULL, 0, 0);
 	if (ret) {
-		fprintf(stderr, "test 0 failed\n");
+		fprintf(stderr, "test a failed\n");
 		return T_EXIT_FAIL;
 	}
 	if (no_send_mshot)
@@ -538,42 +550,42 @@
 	/* test recv bundle */
 	ret = test(0, 0, NULL, 0, 1);
 	if (ret) {
-		fprintf(stderr, "test 0 failed\n");
+		fprintf(stderr, "test b failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test bundling recv and send */
 	ret = test(0, 0, NULL, 1, 1);
 	if (ret) {
-		fprintf(stderr, "test 0 failed\n");
+		fprintf(stderr, "test c failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test bundling with full socket */
 	ret = test(1, 1000000, &eagain_hit, 1, 1);
 	if (ret) {
-		fprintf(stderr, "test 0 failed\n");
+		fprintf(stderr, "test d failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test bundling with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 1, 1);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test e failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test recv bundle with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 0, 1);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test f failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test send bundle with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), &eagain_hit, 1, 0);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test g failed\n");
 		return T_EXIT_FAIL;
 	}
 
@@ -583,23 +595,54 @@
 	/* test bundling with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 1, 1);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test h failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test recv bundle with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), NULL, 0, 1);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test i failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	/* test send bundle with almost full socket */
 	ret = test(1, eagain_hit - (nr_msgs / 2), &eagain_hit, 1, 0);
 	if (ret) {
-		fprintf(stderr, "test 1 failed\n");
+		fprintf(stderr, "test j failed\n");
 		return T_EXIT_FAIL;
 	}
 
 	return T_EXIT_PASS;
 }
+
+static int test_tcp(void)
+{
+	use_tcp = 1;
+	return run_tests();
+}
+
+static int test_udp(void)
+{
+	use_tcp = 0;
+	use_port++;
+	return run_tests();
+}
+
+int main(int argc, char *argv[])
+{
+	int ret;
+
+	if (argc > 1)
+		return 0;
+
+	ret = test_tcp();
+	if (ret != T_EXIT_PASS)
+		return ret;
+
+	ret = test_udp();
+	if (ret != T_EXIT_PASS)
+		return ret;
+
+	return T_EXIT_PASS;
+}