xref: /freebsd/contrib/netbsd-tests/net/net/t_udp.c (revision b00ab754)
1 #include <sys/cdefs.h>
2 __RCSID("$NetBSD: t_udp.c,v 1.2 2013/01/06 02:22:50 christos Exp $");
3 
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 
7 #include <netdb.h>
8 #include <string.h>
9 #include <errno.h>
10 #include <unistd.h>
11 
12 #include <atf-c.h>
13 
14 static const char msg[] = "sendto test";
15 
16 static void
17 sendit(int family)
18 {
19 	struct addrinfo hints;
20 	struct addrinfo *res;
21 	int             S, s;
22 	int             e;
23 
24 	/* lookup localhost addr, depending on argv[1] */
25 	memset(&hints, 0, sizeof(hints));
26 	hints.ai_family = family;
27 	hints.ai_socktype = SOCK_DGRAM;
28 	hints.ai_protocol = IPPROTO_UDP;
29 	hints.ai_flags = 0;
30 
31 	e = getaddrinfo("localhost", "9999", &hints, &res);
32 	ATF_REQUIRE_MSG(e == 0, "getaddrinfo AF=%d: %s", family,
33 	    gai_strerror(e));
34 
35 	/* server socket */
36 	S = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
37 	ATF_REQUIRE_MSG(S >= 0, "server-socket AF=%d: %s", family,
38 	    strerror(errno));
39 
40 	e = bind(S, res->ai_addr, res->ai_addrlen);
41 	ATF_REQUIRE_MSG(e == 0, "bind AF=%d: %s", family,
42 	    strerror(errno));
43 
44 	/* client socket */
45 	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
46 	ATF_REQUIRE_MSG(s >= 0, "client-socket AF=%d: %s", family,
47 	    strerror(errno));
48 
49 	/* sendto */
50 	e = sendto(s, msg, sizeof(msg), 0, res->ai_addr, res->ai_addrlen);
51 	ATF_REQUIRE_MSG(e == sizeof(msg), "sendto(1) AF=%d: %s", family,
52 	    strerror(errno));
53 
54 	e = sendto(s, msg, sizeof(msg), 0, res->ai_addr, res->ai_addrlen);
55 	ATF_REQUIRE_MSG(e == sizeof(msg), "sendto(2) AF=%d: %s", family,
56 	    strerror(errno));
57 
58 	/* connect + send */
59 	e = connect(s, res->ai_addr, res->ai_addrlen);
60 	ATF_REQUIRE_MSG(e == 0, "connect(1) AF=%d: %s", family,
61 	    strerror(errno));
62 
63 	e = send(s, msg, sizeof(msg), 0);
64 	ATF_REQUIRE_MSG(e == sizeof(msg), "send(1) AF=%d: %s", family,
65 	    strerror(errno));
66 
67 	e = connect(s, res->ai_addr, res->ai_addrlen);
68 	ATF_REQUIRE_MSG(e == 0, "connect(2) AF=%d: %s", family,
69 	    strerror(errno));
70 
71 	e = send(s, msg, sizeof(msg), 0);
72 	ATF_REQUIRE_MSG(e == sizeof(msg), "send(2) AF=%d: %s", family,
73 	    strerror(errno));
74 
75 	close(s);
76 }
77 
78 ATF_TC(udp4_send);
79 ATF_TC_HEAD(udp4_send, tc)
80 {
81 
82 	atf_tc_set_md_var(tc, "descr", "Check that inet4 udp send works both"
83 	    " for connected and unconnected sockets");
84 }
85 
86 ATF_TC_BODY(udp4_send, tc)
87 {
88 	sendit(AF_INET);
89 }
90 
91 ATF_TC(udp6_send);
92 ATF_TC_HEAD(udp6_send, tc)
93 {
94 
95 	atf_tc_set_md_var(tc, "descr", "Check that inet6 udp send works both"
96 	    " for connected and unconnected sockets");
97 }
98 
99 ATF_TC_BODY(udp6_send, tc)
100 {
101 	sendit(AF_INET6);
102 }
103 
104 ATF_TP_ADD_TCS(tp)
105 {
106 
107 	ATF_TP_ADD_TC(tp, udp4_send);
108 	ATF_TP_ADD_TC(tp, udp6_send);
109 	return atf_no_error();
110 }
111