Module Name: src Committed By: christos Date: Sat Sep 24 18:34:19 UTC 2011
Modified Files: src/tests/net/sys: Makefile Added Files: src/tests/net/sys: t_rfc6056.c Log Message: Add an rfc6056 test. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/tests/net/sys/Makefile cvs rdiff -u -r0 -r1.1 src/tests/net/sys/t_rfc6056.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/net/sys/Makefile diff -u src/tests/net/sys/Makefile:1.2 src/tests/net/sys/Makefile:1.3 --- src/tests/net/sys/Makefile:1.2 Thu May 1 11:38:17 2008 +++ src/tests/net/sys/Makefile Sat Sep 24 14:34:18 2011 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.2 2008/05/01 15:38:17 jmmv Exp $ +# $NetBSD: Makefile,v 1.3 2011/09/24 18:34:18 christos Exp $ .include <bsd.own.mk> @@ -6,5 +6,6 @@ TESTSDIR= ${TESTSBASE}/net/sys TESTS_C= t_connect TESTS_C+= t_listen +TESTS_C+= t_rfc6056 .include <bsd.test.mk> Added files: Index: src/tests/net/sys/t_rfc6056.c diff -u /dev/null src/tests/net/sys/t_rfc6056.c:1.1 --- /dev/null Sat Sep 24 14:34:19 2011 +++ src/tests/net/sys/t_rfc6056.c Sat Sep 24 14:34:18 2011 @@ -0,0 +1,110 @@ + +#include <sys/cdefs.h> +__RCSID("$NetBSD: t_rfc6056.c,v 1.1 2011/09/24 18:34:18 christos Exp $"); + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/udp.h> +#include <arpa/inet.h> +#include <string.h> +#include <strings.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <stdlib.h> +#include <netdb.h> +#include <err.h> + +#include <atf-c.h> + +static void +test(const char *hostname, const char *service, int family, int al) +{ + static const char hello[] = "hello\n"; + int s, error; + struct sockaddr_storage ss; + struct addrinfo hints, *res; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_DGRAM; + + error = getaddrinfo(hostname, service, &hints, &res); + if (error) + errx(EXIT_FAILURE, "Cannot get address for %s (%s)", + hostname, gai_strerror(error)); + + s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (s == -1) + err(EXIT_FAILURE, "socket"); + + if (setsockopt(s, IPPROTO_UDP, UDP_RFC6056ALGO, &al, sizeof(al)) == -1) + err(EXIT_FAILURE, "setsockopt"); + + memset(&ss, 0, sizeof(ss)); + ss.ss_len = res->ai_addrlen; + ss.ss_family = res->ai_family; + + if (bind(s, (struct sockaddr *)&ss, ss.ss_len) == -1) + err(EXIT_FAILURE, "bind"); + + if (sendto(s, hello, sizeof(hello) - 1, 0, + res->ai_addr, res->ai_addrlen) == -1) + err(EXIT_FAILURE, "sendto"); + + if (close(s) == -1) + err(EXIT_FAILURE, "close"); + + s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (s == -1) + err(EXIT_FAILURE, "socket"); + + if (setsockopt(s, IPPROTO_UDP, UDP_RFC6056ALGO, &al, sizeof(al)) == -1) + err(EXIT_FAILURE, "setsockopt"); + + if (connect(s, res->ai_addr, res->ai_addrlen) == -1) + err(EXIT_FAILURE, "connect"); + + if (send(s, hello, sizeof(hello) - 1, 0) == -1) + err(EXIT_FAILURE, "send"); + + if (close(s) == -1) + err(EXIT_FAILURE, "close"); + + freeaddrinfo(res); +} + +ATF_TC(inet4); +ATF_TC_HEAD(inet4, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks random port allocation " + "for ipv4"); +} + +ATF_TC_BODY(inet4, tc) +{ + for (int i = 0; i < 6; i++) + test("localhost", "http", AF_INET, i); +} + +ATF_TC(inet6); +ATF_TC_HEAD(inet6, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks random port allocation " + "for ipv6"); +} + +ATF_TC_BODY(inet6, tc) +{ + for (int i = 0; i < 6; i++) + test("localhost", "http", AF_INET6, i); +} + +ATF_TP_ADD_TCS(tp) +{ + ATF_TP_ADD_TC(tp, inet4); + ATF_TP_ADD_TC(tp, inet6); + + return atf_no_error(); +}