Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/tests/net/net add tests for 4->6 connections.
details: https://anonhg.NetBSD.org/src/rev/eef992d262bd
branches: trunk
changeset: 356038:eef992d262bd
user: christos <christos%NetBSD.org@localhost>
date: Mon Aug 28 10:19:57 2017 +0000
description:
add tests for 4->6 connections.
diffstat:
tests/net/net/t_tcp.c | 187 ++++++++++++++++++++++++++++++++++++-------------
1 files changed, 138 insertions(+), 49 deletions(-)
diffs (truncated from 340 to 300 lines):
diff -r ac640c4b598d -r eef992d262bd tests/net/net/t_tcp.c
--- a/tests/net/net/t_tcp.c Mon Aug 28 09:30:29 2017 +0000
+++ b/tests/net/net/t_tcp.c Mon Aug 28 10:19:57 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: t_tcp.c,v 1.5 2017/08/28 09:30:29 christos Exp $ */
+/* $NetBSD: t_tcp.c,v 1.6 2017/08/28 10:19:57 christos Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$Id: t_tcp.c,v 1.5 2017/08/28 09:30:29 christos Exp $");
+__RCSID("$Id: t_tcp.c,v 1.6 2017/08/28 10:19:57 christos Exp $");
#endif
/* Example code. Should block; does with accept not paccept. */
@@ -46,6 +46,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
+#include <sched.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
@@ -55,10 +56,18 @@
#include <signal.h>
#ifdef TEST
-#define FAIL(msg, ...) err(EXIT_FAILURE, msg, ## __VA_ARGS__)
+#define FAIL(msg) err(EXIT_FAILURE, msg)
+#define FAILX(msg, ...) err(EXIT_FAILURE, msg, ## __VA_ARGS__)
#else
#include <atf-c.h>
-#define FAIL(msg, ...) ATF_CHECK_MSG(0, msg, ## __VA_ARGS__); goto fail
+#define FAIL(msg) do { \
+ ATF_CHECK_MSG(0, msg " (%s)", strerror(errno)); \
+ goto fail; \
+ } while (/*CONSTCOND*/0)
+#define FAILX(msg, ...) do { \
+ ATF_CHECK_MSG(0, msg, ## __VA_ARGS__); \
+ goto fail; \
+ } while (/*CONSTCOND*/0)
#endif
#ifdef __linux__
@@ -71,10 +80,12 @@
}
static void
-paccept_block(sa_family_t family, bool pacceptblock, bool fcntlblock)
+paccept_block(sa_family_t sfamily, sa_family_t cfamily,
+ bool pacceptblock, bool fcntlblock)
{
int srvr = -1, clnt = -1, as = -1;
int ok, fl;
+ int count = 5;
ssize_t n;
char buf[10];
struct sockaddr_storage ss, bs;
@@ -83,12 +94,12 @@
struct sigaction sa;
socklen_t slen;
- srvr = socket(family, SOCK_STREAM | SOCK_NONBLOCK, 0);
+ srvr = socket(sfamily, SOCK_STREAM | SOCK_NONBLOCK, 0);
if (srvr == -1)
FAIL("socket");
memset(&ss, 0, sizeof(ss));
- switch (ss.ss_family = family) {
+ switch (ss.ss_family = sfamily) {
case AF_INET:
sin = (void *)&ss;
slen = sizeof(*sin);
@@ -99,7 +110,11 @@
sin6 = (void *)&ss;
slen = sizeof(*sin6);
sin6->sin6_port = htons(0);
- sin6->sin6_addr = in6addr_loopback;
+ if (sfamily == AF_INET6 && cfamily == AF_INET) {
+ sin6->sin6_addr = in6addr_any;
+ } else {
+ sin6->sin6_addr = in6addr_loopback;
+ }
break;
default:
errno = EINVAL;
@@ -108,6 +123,12 @@
#ifdef BSD4_4
ss.ss_len = slen;
#endif
+ if (sfamily == AF_INET6 && cfamily == AF_INET) {
+ int off = 0;
+ if (setsockopt(srvr, IPPROTO_IPV6, IPV6_V6ONLY,
+ (void *)&off, sizeof(off)) == -1)
+ FAIL("setsockopt IPV6_V6ONLY");
+ }
ok = bind(srvr, (const struct sockaddr *)&ss, slen);
if (ok == -1)
@@ -122,18 +143,44 @@
if (ok == -1)
FAIL("listen");
- clnt = socket(family, SOCK_STREAM | SOCK_NONBLOCK, 0);
+ clnt = socket(cfamily, SOCK_STREAM | SOCK_NONBLOCK, 0);
if (clnt == -1)
FAIL("socket");
+ if (sfamily == AF_INET6 && cfamily == AF_INET) {
+ ss = bs;
+ sin6 = (void *)&ss;
+ sin = (void *)&bs;
+ addrlen = sizeof(*sin);
+#ifdef BSD4_4
+ sin->sin_len = sizeof(*sin);
+#endif
+ sin->sin_family = AF_INET;
+ sin->sin_port = sin6->sin6_port;
+ sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ }
+
/* may not connect first time */
ok = connect(clnt, (struct sockaddr *) &bs, addrlen);
if (ok != -1 || errno != EINPROGRESS)
FAIL("expected connect to fail");
as = paccept(srvr, NULL, NULL, NULL, pacceptblock ? 0 : SOCK_NONBLOCK);
+again:
ok = connect(clnt, (struct sockaddr *) &bs, addrlen);
- if (ok == -1 && errno != EISCONN)
+ if (ok == -1 && errno != EISCONN) {
+ if (count-- && errno == EALREADY) {
+ fprintf(stderr, "retry\n");
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1000000;
+ nanosleep(&ts, NULL);
+#if 0
+ sched_yield();
+#endif
+ goto again;
+ }
FAIL("connect failed");
+ }
#if 0
fl = fcntl(srvr, F_GETFL, 0);
@@ -155,7 +202,7 @@
if (fl == -1)
FAIL("fnctl");
if (fl != (O_RDWR|O_NONBLOCK))
- FAIL("fl 0x%x != 0x%x\n", fl, O_RDWR|O_NONBLOCK);
+ FAILX("fl 0x%x != 0x%x\n", fl, O_RDWR|O_NONBLOCK);
ok = fcntl(as, F_SETFL, fl & ~O_NONBLOCK);
if (ok == -1)
FAIL("fnctl setfl");
@@ -187,101 +234,143 @@
#ifndef TEST
-ATF_TC(paccept4_reset_nonblock);
-ATF_TC_HEAD(paccept4_reset_nonblock, tc)
+ATF_TC(paccept44_reset_nonblock);
+ATF_TC_HEAD(paccept44_reset_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that paccept(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv4)");
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv4)");
}
-ATF_TC_BODY(paccept4_reset_nonblock, tc)
+ATF_TC_BODY(paccept44_reset_nonblock, tc)
{
- paccept_block(AF_INET, true, false);
+ paccept_block(AF_INET, AF_INET, true, false);
}
-ATF_TC(fcntl4_reset_nonblock);
-ATF_TC_HEAD(fcntl4_reset_nonblock, tc)
+ATF_TC(fcntl44_reset_nonblock);
+ATF_TC_HEAD(fcntl44_reset_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv4)");
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv4)");
+}
+
+ATF_TC_BODY(fcntl44_reset_nonblock, tc)
+{
+ paccept_block(AF_INET, AF_INET, false, true);
+}
+
+ATF_TC(paccept44_nonblock);
+ATF_TC_HEAD(paccept44_nonblock, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv4)");
}
-ATF_TC_BODY(fcntl4_reset_nonblock, tc)
+ATF_TC_BODY(paccept44_nonblock, tc)
{
- paccept_block(AF_INET, false, true);
+ paccept_block(AF_INET, AF_INET, false, false);
}
-ATF_TC(paccept4_nonblock);
-ATF_TC_HEAD(paccept4_nonblock, tc)
+ATF_TC(paccept66_reset_nonblock);
+ATF_TC_HEAD(paccept66_reset_nonblock, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "Check that paccept(2) resets "
+ "the non-blocking flag on non-blocking sockets (ipv6->ipv6)");
+}
+
+ATF_TC_BODY(paccept66_reset_nonblock, tc)
+{
+ paccept_block(AF_INET6, AF_INET6, true, false);
+}
+
+ATF_TC(fcntl66_reset_nonblock);
+ATF_TC_HEAD(fcntl66_reset_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv4)");
+ "the non-blocking flag on non-blocking sockets (ipv6->ipv6)");
+}
+
+ATF_TC_BODY(fcntl66_reset_nonblock, tc)
+{
+ paccept_block(AF_INET6, AF_INET6, false, true);
}
-ATF_TC_BODY(paccept4_nonblock, tc)
+ATF_TC(paccept66_nonblock);
+ATF_TC_HEAD(paccept66_nonblock, tc)
{
- paccept_block(AF_INET, false, false);
+
+ atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
+ "the non-blocking flag on non-blocking sockets (ipv6->ipv6)");
}
-ATF_TC(paccept6_reset_nonblock);
-ATF_TC_HEAD(paccept6_reset_nonblock, tc)
+ATF_TC_BODY(paccept66_nonblock, tc)
+{
+ paccept_block(AF_INET6, AF_INET6, false, false);
+}
+
+ATF_TC(paccept46_reset_nonblock);
+ATF_TC_HEAD(paccept46_reset_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that paccept(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv6)");
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv6)");
}
-ATF_TC_BODY(paccept6_reset_nonblock, tc)
+ATF_TC_BODY(paccept46_reset_nonblock, tc)
{
- paccept_block(AF_INET6, true, false);
+ paccept_block(AF_INET6, AF_INET, true, false);
}
-ATF_TC(fcntl6_reset_nonblock);
-ATF_TC_HEAD(fcntl6_reset_nonblock, tc)
+ATF_TC(fcntl46_reset_nonblock);
+ATF_TC_HEAD(fcntl46_reset_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv6)");
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv6)");
}
-ATF_TC_BODY(fcntl6_reset_nonblock, tc)
+ATF_TC_BODY(fcntl46_reset_nonblock, tc)
{
- paccept_block(AF_INET6, false, true);
+ paccept_block(AF_INET6, AF_INET, false, true);
}
-ATF_TC(paccept6_nonblock);
-ATF_TC_HEAD(paccept6_nonblock, tc)
+ATF_TC(paccept46_nonblock);
+ATF_TC_HEAD(paccept46_nonblock, tc)
{
atf_tc_set_md_var(tc, "descr", "Check that fcntl(2) resets "
- "the non-blocking flag on non-blocking sockets (ipv6)");
+ "the non-blocking flag on non-blocking sockets (ipv4->ipv6)");
Home |
Main Index |
Thread Index |
Old Index