1*00b67f09SDavid van Moolenbroek /* $NetBSD: socket_test.c,v 1.1.1.6 2014/12/10 03:34:44 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek *
10*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek */
18*00b67f09SDavid van Moolenbroek
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek
21*00b67f09SDavid van Moolenbroek /*! \file */
22*00b67f09SDavid van Moolenbroek
23*00b67f09SDavid van Moolenbroek #include <config.h>
24*00b67f09SDavid van Moolenbroek
25*00b67f09SDavid van Moolenbroek #include <atf-c.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <unistd.h>
28*00b67f09SDavid van Moolenbroek #include <time.h>
29*00b67f09SDavid van Moolenbroek
30*00b67f09SDavid van Moolenbroek #include <isc/socket.h>
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek #include "../task_p.h"
33*00b67f09SDavid van Moolenbroek #include "../unix/socket_p.h"
34*00b67f09SDavid van Moolenbroek #include "isctest.h"
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek static isc_boolean_t recv_dscp;
37*00b67f09SDavid van Moolenbroek static unsigned int recv_dscp_value;
38*00b67f09SDavid van Moolenbroek
39*00b67f09SDavid van Moolenbroek /*
40*00b67f09SDavid van Moolenbroek * Helper functions
41*00b67f09SDavid van Moolenbroek */
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek typedef struct {
44*00b67f09SDavid van Moolenbroek isc_boolean_t done;
45*00b67f09SDavid van Moolenbroek isc_result_t result;
46*00b67f09SDavid van Moolenbroek isc_socket_t *socket;
47*00b67f09SDavid van Moolenbroek } completion_t;
48*00b67f09SDavid van Moolenbroek
49*00b67f09SDavid van Moolenbroek static void
completion_init(completion_t * completion)50*00b67f09SDavid van Moolenbroek completion_init(completion_t *completion) {
51*00b67f09SDavid van Moolenbroek completion->done = ISC_FALSE;
52*00b67f09SDavid van Moolenbroek completion->socket = NULL;
53*00b67f09SDavid van Moolenbroek }
54*00b67f09SDavid van Moolenbroek
55*00b67f09SDavid van Moolenbroek static void
accept_done(isc_task_t * task,isc_event_t * event)56*00b67f09SDavid van Moolenbroek accept_done(isc_task_t *task, isc_event_t *event) {
57*00b67f09SDavid van Moolenbroek isc_socket_newconnev_t *nevent = (isc_socket_newconnev_t *)event;
58*00b67f09SDavid van Moolenbroek completion_t *completion = event->ev_arg;
59*00b67f09SDavid van Moolenbroek
60*00b67f09SDavid van Moolenbroek UNUSED(task);
61*00b67f09SDavid van Moolenbroek
62*00b67f09SDavid van Moolenbroek completion->result = nevent->result;
63*00b67f09SDavid van Moolenbroek completion->done = ISC_TRUE;
64*00b67f09SDavid van Moolenbroek if (completion->result == ISC_R_SUCCESS)
65*00b67f09SDavid van Moolenbroek completion->socket = nevent->newsocket;
66*00b67f09SDavid van Moolenbroek
67*00b67f09SDavid van Moolenbroek isc_event_free(&event);
68*00b67f09SDavid van Moolenbroek }
69*00b67f09SDavid van Moolenbroek
70*00b67f09SDavid van Moolenbroek static void
event_done(isc_task_t * task,isc_event_t * event)71*00b67f09SDavid van Moolenbroek event_done(isc_task_t *task, isc_event_t *event) {
72*00b67f09SDavid van Moolenbroek isc_socketevent_t *dev;
73*00b67f09SDavid van Moolenbroek completion_t *completion = event->ev_arg;
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek UNUSED(task);
76*00b67f09SDavid van Moolenbroek
77*00b67f09SDavid van Moolenbroek dev = (isc_socketevent_t *) event;
78*00b67f09SDavid van Moolenbroek completion->result = dev->result;
79*00b67f09SDavid van Moolenbroek completion->done = ISC_TRUE;
80*00b67f09SDavid van Moolenbroek if ((dev->attributes & ISC_SOCKEVENTATTR_DSCP) != 0) {
81*00b67f09SDavid van Moolenbroek recv_dscp = ISC_TRUE;
82*00b67f09SDavid van Moolenbroek recv_dscp_value = dev->dscp;;
83*00b67f09SDavid van Moolenbroek } else
84*00b67f09SDavid van Moolenbroek recv_dscp = ISC_FALSE;
85*00b67f09SDavid van Moolenbroek isc_event_free(&event);
86*00b67f09SDavid van Moolenbroek }
87*00b67f09SDavid van Moolenbroek
88*00b67f09SDavid van Moolenbroek static isc_result_t
waitfor(completion_t * completion)89*00b67f09SDavid van Moolenbroek waitfor(completion_t *completion) {
90*00b67f09SDavid van Moolenbroek int i = 0;
91*00b67f09SDavid van Moolenbroek while (!completion->done && i++ < 5000) {
92*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_USETHREADS
93*00b67f09SDavid van Moolenbroek while (isc__taskmgr_ready(taskmgr))
94*00b67f09SDavid van Moolenbroek isc__taskmgr_dispatch(taskmgr);
95*00b67f09SDavid van Moolenbroek #endif
96*00b67f09SDavid van Moolenbroek isc_test_nap(1000);
97*00b67f09SDavid van Moolenbroek }
98*00b67f09SDavid van Moolenbroek if (completion->done)
99*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
100*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
101*00b67f09SDavid van Moolenbroek }
102*00b67f09SDavid van Moolenbroek
103*00b67f09SDavid van Moolenbroek #if 0
104*00b67f09SDavid van Moolenbroek static isc_result_t
105*00b67f09SDavid van Moolenbroek waitfor(completion_t *completion) {
106*00b67f09SDavid van Moolenbroek int i = 0;
107*00b67f09SDavid van Moolenbroek while (!completion->done && i++ < 5000) {
108*00b67f09SDavid van Moolenbroek waitbody();
109*00b67f09SDavid van Moolenbroek }
110*00b67f09SDavid van Moolenbroek if (completion->done)
111*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
112*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
113*00b67f09SDavid van Moolenbroek }
114*00b67f09SDavid van Moolenbroek #endif
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroek static void
waitbody(void)117*00b67f09SDavid van Moolenbroek waitbody(void) {
118*00b67f09SDavid van Moolenbroek #ifndef ISC_PLATFORM_USETHREADS
119*00b67f09SDavid van Moolenbroek struct timeval tv;
120*00b67f09SDavid van Moolenbroek isc_socketwait_t *swait = NULL;
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek while (isc__taskmgr_ready(taskmgr))
123*00b67f09SDavid van Moolenbroek isc__taskmgr_dispatch(taskmgr);
124*00b67f09SDavid van Moolenbroek if (socketmgr != NULL) {
125*00b67f09SDavid van Moolenbroek tv.tv_sec = 0;
126*00b67f09SDavid van Moolenbroek tv.tv_usec = 1000 ;
127*00b67f09SDavid van Moolenbroek if (isc__socketmgr_waitevents(socketmgr, &tv, &swait) > 0)
128*00b67f09SDavid van Moolenbroek isc__socketmgr_dispatch(socketmgr, swait);
129*00b67f09SDavid van Moolenbroek } else
130*00b67f09SDavid van Moolenbroek #endif
131*00b67f09SDavid van Moolenbroek isc_test_nap(1000);
132*00b67f09SDavid van Moolenbroek }
133*00b67f09SDavid van Moolenbroek
134*00b67f09SDavid van Moolenbroek static isc_result_t
waitfor2(completion_t * c1,completion_t * c2)135*00b67f09SDavid van Moolenbroek waitfor2(completion_t *c1, completion_t *c2) {
136*00b67f09SDavid van Moolenbroek int i = 0;
137*00b67f09SDavid van Moolenbroek
138*00b67f09SDavid van Moolenbroek while (!(c1->done && c2->done) && i++ < 5000) {
139*00b67f09SDavid van Moolenbroek waitbody();
140*00b67f09SDavid van Moolenbroek }
141*00b67f09SDavid van Moolenbroek if (c1->done && c2->done)
142*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
143*00b67f09SDavid van Moolenbroek return (ISC_R_FAILURE);
144*00b67f09SDavid van Moolenbroek }
145*00b67f09SDavid van Moolenbroek
146*00b67f09SDavid van Moolenbroek /*
147*00b67f09SDavid van Moolenbroek * Individual unit tests
148*00b67f09SDavid van Moolenbroek */
149*00b67f09SDavid van Moolenbroek
150*00b67f09SDavid van Moolenbroek /* Test UDP sendto/recv (IPv4) */
151*00b67f09SDavid van Moolenbroek ATF_TC(udp_sendto);
ATF_TC_HEAD(udp_sendto,tc)152*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(udp_sendto, tc) {
153*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "UDP sendto/recv");
154*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(udp_sendto,tc)155*00b67f09SDavid van Moolenbroek ATF_TC_BODY(udp_sendto, tc) {
156*00b67f09SDavid van Moolenbroek isc_result_t result;
157*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1, addr2;
158*00b67f09SDavid van Moolenbroek struct in_addr in;
159*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL;
160*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
161*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
162*00b67f09SDavid van Moolenbroek completion_t completion;
163*00b67f09SDavid van Moolenbroek isc_region_t r;
164*00b67f09SDavid van Moolenbroek
165*00b67f09SDavid van Moolenbroek UNUSED(tc);
166*00b67f09SDavid van Moolenbroek
167*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
168*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
169*00b67f09SDavid van Moolenbroek
170*00b67f09SDavid van Moolenbroek /*
171*00b67f09SDavid van Moolenbroek * Create two sockets: 127.0.0.1/5444 and 127.0.0.1/5445, talking to
172*00b67f09SDavid van Moolenbroek * each other.
173*00b67f09SDavid van Moolenbroek */
174*00b67f09SDavid van Moolenbroek in.s_addr = inet_addr("127.0.0.1");
175*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr1, &in, 5444);
176*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr2, &in, 5445);
177*00b67f09SDavid van Moolenbroek
178*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s1);
179*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
180*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
181*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
182*00b67f09SDavid van Moolenbroek
183*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s2);
184*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
185*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s2, &addr2, ISC_SOCKET_REUSEADDRESS);
186*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
187*00b67f09SDavid van Moolenbroek
188*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
189*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
190*00b67f09SDavid van Moolenbroek
191*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
192*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
193*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
194*00b67f09SDavid van Moolenbroek
195*00b67f09SDavid van Moolenbroek completion_init(&completion);
196*00b67f09SDavid van Moolenbroek result = isc_socket_sendto(s1, &r, task, event_done, &completion,
197*00b67f09SDavid van Moolenbroek &addr2, NULL);
198*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
199*00b67f09SDavid van Moolenbroek waitfor(&completion);
200*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
201*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
202*00b67f09SDavid van Moolenbroek
203*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
204*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
205*00b67f09SDavid van Moolenbroek completion_init(&completion);
206*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
207*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
208*00b67f09SDavid van Moolenbroek waitfor(&completion);
209*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
210*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
211*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
212*00b67f09SDavid van Moolenbroek
213*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
214*00b67f09SDavid van Moolenbroek
215*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
216*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
217*00b67f09SDavid van Moolenbroek
218*00b67f09SDavid van Moolenbroek isc_test_end();
219*00b67f09SDavid van Moolenbroek }
220*00b67f09SDavid van Moolenbroek
221*00b67f09SDavid van Moolenbroek /* Test UDP sendto/recv with duplicated socket */
222*00b67f09SDavid van Moolenbroek ATF_TC(udp_dup);
ATF_TC_HEAD(udp_dup,tc)223*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(udp_dup, tc) {
224*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "duplicated socket sendto/recv");
225*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(udp_dup,tc)226*00b67f09SDavid van Moolenbroek ATF_TC_BODY(udp_dup, tc) {
227*00b67f09SDavid van Moolenbroek isc_result_t result;
228*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1, addr2;
229*00b67f09SDavid van Moolenbroek struct in_addr in;
230*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL, *s3 = NULL;
231*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
232*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
233*00b67f09SDavid van Moolenbroek completion_t completion;
234*00b67f09SDavid van Moolenbroek isc_region_t r;
235*00b67f09SDavid van Moolenbroek
236*00b67f09SDavid van Moolenbroek UNUSED(tc);
237*00b67f09SDavid van Moolenbroek
238*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
239*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
240*00b67f09SDavid van Moolenbroek
241*00b67f09SDavid van Moolenbroek /*
242*00b67f09SDavid van Moolenbroek * Create two sockets: 127.0.0.1/5444 and 127.0.0.1/5445, talking to
243*00b67f09SDavid van Moolenbroek * each other.
244*00b67f09SDavid van Moolenbroek */
245*00b67f09SDavid van Moolenbroek in.s_addr = inet_addr("127.0.0.1");
246*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr1, &in, 5444);
247*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr2, &in, 5445);
248*00b67f09SDavid van Moolenbroek
249*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s1);
250*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
251*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
252*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
253*00b67f09SDavid van Moolenbroek
254*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s2);
255*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
256*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s2, &addr2, ISC_SOCKET_REUSEADDRESS);
257*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
258*00b67f09SDavid van Moolenbroek
259*00b67f09SDavid van Moolenbroek result = isc_socket_dup(s2, &s3);
260*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
261*00b67f09SDavid van Moolenbroek
262*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
263*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
264*00b67f09SDavid van Moolenbroek
265*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
266*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
267*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
268*00b67f09SDavid van Moolenbroek
269*00b67f09SDavid van Moolenbroek completion_init(&completion);
270*00b67f09SDavid van Moolenbroek result = isc_socket_sendto(s1, &r, task, event_done, &completion,
271*00b67f09SDavid van Moolenbroek &addr2, NULL);
272*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
273*00b67f09SDavid van Moolenbroek waitfor(&completion);
274*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
275*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
276*00b67f09SDavid van Moolenbroek
277*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "World");
278*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
279*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
280*00b67f09SDavid van Moolenbroek
281*00b67f09SDavid van Moolenbroek completion_init(&completion);
282*00b67f09SDavid van Moolenbroek result = isc_socket_sendto(s1, &r, task, event_done, &completion,
283*00b67f09SDavid van Moolenbroek &addr2, NULL);
284*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
285*00b67f09SDavid van Moolenbroek waitfor(&completion);
286*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
287*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
288*00b67f09SDavid van Moolenbroek
289*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
290*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
291*00b67f09SDavid van Moolenbroek completion_init(&completion);
292*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
293*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
294*00b67f09SDavid van Moolenbroek waitfor(&completion);
295*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
296*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
297*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
298*00b67f09SDavid van Moolenbroek
299*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
300*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
301*00b67f09SDavid van Moolenbroek completion_init(&completion);
302*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
303*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
304*00b67f09SDavid van Moolenbroek waitfor(&completion);
305*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
306*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
307*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "World");
308*00b67f09SDavid van Moolenbroek
309*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
310*00b67f09SDavid van Moolenbroek
311*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
312*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
313*00b67f09SDavid van Moolenbroek isc_socket_detach(&s3);
314*00b67f09SDavid van Moolenbroek
315*00b67f09SDavid van Moolenbroek isc_test_end();
316*00b67f09SDavid van Moolenbroek }
317*00b67f09SDavid van Moolenbroek
318*00b67f09SDavid van Moolenbroek /* Test TCP sendto/recv (IPv4) */
319*00b67f09SDavid van Moolenbroek ATF_TC(udp_dscp_v4);
ATF_TC_HEAD(udp_dscp_v4,tc)320*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(udp_dscp_v4, tc) {
321*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "UDP DSCP IPV4");
322*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(udp_dscp_v4,tc)323*00b67f09SDavid van Moolenbroek ATF_TC_BODY(udp_dscp_v4, tc) {
324*00b67f09SDavid van Moolenbroek isc_result_t result;
325*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1, addr2;
326*00b67f09SDavid van Moolenbroek struct in_addr in;
327*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL;
328*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
329*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
330*00b67f09SDavid van Moolenbroek completion_t completion;
331*00b67f09SDavid van Moolenbroek isc_region_t r;
332*00b67f09SDavid van Moolenbroek isc_socketevent_t *socketevent;
333*00b67f09SDavid van Moolenbroek
334*00b67f09SDavid van Moolenbroek UNUSED(tc);
335*00b67f09SDavid van Moolenbroek
336*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
337*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
338*00b67f09SDavid van Moolenbroek
339*00b67f09SDavid van Moolenbroek /*
340*00b67f09SDavid van Moolenbroek * Create two sockets: 127.0.0.1/5444 and 127.0.0.1/5445, talking to
341*00b67f09SDavid van Moolenbroek * each other.
342*00b67f09SDavid van Moolenbroek */
343*00b67f09SDavid van Moolenbroek in.s_addr = inet_addr("127.0.0.1");
344*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr1, &in, 5444);
345*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr2, &in, 5445);
346*00b67f09SDavid van Moolenbroek
347*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s1);
348*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
349*00b67f09SDavid van Moolenbroek isc_result_totext(result));
350*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
351*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
352*00b67f09SDavid van Moolenbroek isc_result_totext(result));
353*00b67f09SDavid van Moolenbroek
354*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp, &s2);
355*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
356*00b67f09SDavid van Moolenbroek isc_result_totext(result));
357*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s2, &addr2, ISC_SOCKET_REUSEADDRESS);
358*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
359*00b67f09SDavid van Moolenbroek isc_result_totext(result));
360*00b67f09SDavid van Moolenbroek
361*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
362*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
363*00b67f09SDavid van Moolenbroek isc_result_totext(result));
364*00b67f09SDavid van Moolenbroek
365*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
366*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
367*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
368*00b67f09SDavid van Moolenbroek
369*00b67f09SDavid van Moolenbroek completion_init(&completion);
370*00b67f09SDavid van Moolenbroek
371*00b67f09SDavid van Moolenbroek socketevent = isc_socket_socketevent(mctx, s1, ISC_SOCKEVENT_SENDDONE,
372*00b67f09SDavid van Moolenbroek event_done, &completion);
373*00b67f09SDavid van Moolenbroek ATF_REQUIRE(socketevent != NULL);
374*00b67f09SDavid van Moolenbroek
375*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPPKTV4) != 0) {
376*00b67f09SDavid van Moolenbroek socketevent->dscp = 056; /* EF */
377*00b67f09SDavid van Moolenbroek socketevent->attributes |= ISC_SOCKEVENTATTR_DSCP;
378*00b67f09SDavid van Moolenbroek } else if ((isc_net_probedscp() & ISC_NET_DSCPSETV4) != 0) {
379*00b67f09SDavid van Moolenbroek isc_socket_dscp(s1, 056); /* EF */
380*00b67f09SDavid van Moolenbroek socketevent->dscp = 0;
381*00b67f09SDavid van Moolenbroek socketevent->attributes &= ~ISC_SOCKEVENTATTR_DSCP;
382*00b67f09SDavid van Moolenbroek }
383*00b67f09SDavid van Moolenbroek
384*00b67f09SDavid van Moolenbroek recv_dscp = ISC_FALSE;
385*00b67f09SDavid van Moolenbroek recv_dscp_value = 0;
386*00b67f09SDavid van Moolenbroek
387*00b67f09SDavid van Moolenbroek result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
388*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
389*00b67f09SDavid van Moolenbroek isc_result_totext(result));
390*00b67f09SDavid van Moolenbroek waitfor(&completion);
391*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
392*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
393*00b67f09SDavid van Moolenbroek
394*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
395*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
396*00b67f09SDavid van Moolenbroek completion_init(&completion);
397*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
398*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
399*00b67f09SDavid van Moolenbroek waitfor(&completion);
400*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
401*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
402*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
403*00b67f09SDavid van Moolenbroek
404*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPRECVV4) != 0) {
405*00b67f09SDavid van Moolenbroek ATF_CHECK(recv_dscp);
406*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(recv_dscp_value, 056);
407*00b67f09SDavid van Moolenbroek } else
408*00b67f09SDavid van Moolenbroek ATF_CHECK(!recv_dscp);
409*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
410*00b67f09SDavid van Moolenbroek
411*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
412*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
413*00b67f09SDavid van Moolenbroek
414*00b67f09SDavid van Moolenbroek isc_test_end();
415*00b67f09SDavid van Moolenbroek }
416*00b67f09SDavid van Moolenbroek
417*00b67f09SDavid van Moolenbroek /* Test TCP sendto/recv (IPv4) */
418*00b67f09SDavid van Moolenbroek ATF_TC(udp_dscp_v6);
ATF_TC_HEAD(udp_dscp_v6,tc)419*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(udp_dscp_v6, tc) {
420*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "udp dscp ipv6");
421*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(udp_dscp_v6,tc)422*00b67f09SDavid van Moolenbroek ATF_TC_BODY(udp_dscp_v6, tc) {
423*00b67f09SDavid van Moolenbroek isc_result_t result;
424*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1, addr2;
425*00b67f09SDavid van Moolenbroek struct in6_addr in6;
426*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL;
427*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
428*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
429*00b67f09SDavid van Moolenbroek completion_t completion;
430*00b67f09SDavid van Moolenbroek isc_region_t r;
431*00b67f09SDavid van Moolenbroek isc_socketevent_t *socketevent;
432*00b67f09SDavid van Moolenbroek int n;
433*00b67f09SDavid van Moolenbroek
434*00b67f09SDavid van Moolenbroek UNUSED(tc);
435*00b67f09SDavid van Moolenbroek
436*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
437*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
438*00b67f09SDavid van Moolenbroek
439*00b67f09SDavid van Moolenbroek /*
440*00b67f09SDavid van Moolenbroek * Create two sockets: ::1/5444 and ::1/5445, talking to
441*00b67f09SDavid van Moolenbroek * each other.
442*00b67f09SDavid van Moolenbroek */
443*00b67f09SDavid van Moolenbroek n = inet_pton(AF_INET6, "::1", &in6.s6_addr);
444*00b67f09SDavid van Moolenbroek ATF_REQUIRE(n == 1);
445*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin6(&addr1, &in6, 5444);
446*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin6(&addr2, &in6, 5445);
447*00b67f09SDavid van Moolenbroek
448*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET6, isc_sockettype_udp,
449*00b67f09SDavid van Moolenbroek &s1);
450*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
451*00b67f09SDavid van Moolenbroek isc_result_totext(result));
452*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
453*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
454*00b67f09SDavid van Moolenbroek isc_result_totext(result));
455*00b67f09SDavid van Moolenbroek
456*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET6, isc_sockettype_udp,
457*00b67f09SDavid van Moolenbroek &s2);
458*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
459*00b67f09SDavid van Moolenbroek isc_result_totext(result));
460*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s2, &addr2, ISC_SOCKET_REUSEADDRESS);
461*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
462*00b67f09SDavid van Moolenbroek isc_result_totext(result));
463*00b67f09SDavid van Moolenbroek
464*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
465*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, "%s",
466*00b67f09SDavid van Moolenbroek isc_result_totext(result));
467*00b67f09SDavid van Moolenbroek
468*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
469*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
470*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
471*00b67f09SDavid van Moolenbroek
472*00b67f09SDavid van Moolenbroek completion_init(&completion);
473*00b67f09SDavid van Moolenbroek
474*00b67f09SDavid van Moolenbroek socketevent = isc_socket_socketevent(mctx, s1, ISC_SOCKEVENT_SENDDONE,
475*00b67f09SDavid van Moolenbroek event_done, &completion);
476*00b67f09SDavid van Moolenbroek ATF_REQUIRE(socketevent != NULL);
477*00b67f09SDavid van Moolenbroek
478*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPPKTV6) != 0) {
479*00b67f09SDavid van Moolenbroek socketevent->dscp = 056; /* EF */
480*00b67f09SDavid van Moolenbroek socketevent->attributes = ISC_SOCKEVENTATTR_DSCP;
481*00b67f09SDavid van Moolenbroek } else if ((isc_net_probedscp() & ISC_NET_DSCPSETV6) != 0)
482*00b67f09SDavid van Moolenbroek isc_socket_dscp(s1, 056); /* EF */
483*00b67f09SDavid van Moolenbroek
484*00b67f09SDavid van Moolenbroek recv_dscp = ISC_FALSE;
485*00b67f09SDavid van Moolenbroek recv_dscp_value = 0;
486*00b67f09SDavid van Moolenbroek
487*00b67f09SDavid van Moolenbroek result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
488*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
489*00b67f09SDavid van Moolenbroek waitfor(&completion);
490*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
491*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
492*00b67f09SDavid van Moolenbroek
493*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
494*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
495*00b67f09SDavid van Moolenbroek completion_init(&completion);
496*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
497*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
498*00b67f09SDavid van Moolenbroek waitfor(&completion);
499*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
500*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
501*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
502*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPRECVV6) != 0) {
503*00b67f09SDavid van Moolenbroek ATF_CHECK(recv_dscp);
504*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(recv_dscp_value, 056);
505*00b67f09SDavid van Moolenbroek } else
506*00b67f09SDavid van Moolenbroek ATF_CHECK(!recv_dscp);
507*00b67f09SDavid van Moolenbroek
508*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
509*00b67f09SDavid van Moolenbroek
510*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
511*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
512*00b67f09SDavid van Moolenbroek
513*00b67f09SDavid van Moolenbroek isc_test_end();
514*00b67f09SDavid van Moolenbroek }
515*00b67f09SDavid van Moolenbroek
516*00b67f09SDavid van Moolenbroek /* Test TCP sendto/recv (IPv4) */
517*00b67f09SDavid van Moolenbroek ATF_TC(tcp_dscp_v4);
ATF_TC_HEAD(tcp_dscp_v4,tc)518*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(tcp_dscp_v4, tc) {
519*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "tcp dscp ipv4");
520*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(tcp_dscp_v4,tc)521*00b67f09SDavid van Moolenbroek ATF_TC_BODY(tcp_dscp_v4, tc) {
522*00b67f09SDavid van Moolenbroek isc_result_t result;
523*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1;
524*00b67f09SDavid van Moolenbroek struct in_addr in;
525*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL, *s3 = NULL;
526*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
527*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
528*00b67f09SDavid van Moolenbroek completion_t completion, completion2;
529*00b67f09SDavid van Moolenbroek isc_region_t r;
530*00b67f09SDavid van Moolenbroek
531*00b67f09SDavid van Moolenbroek UNUSED(tc);
532*00b67f09SDavid van Moolenbroek
533*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
534*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
535*00b67f09SDavid van Moolenbroek
536*00b67f09SDavid van Moolenbroek /*
537*00b67f09SDavid van Moolenbroek * Create two sockets: 127.0.0.1/5444, talking to each other.
538*00b67f09SDavid van Moolenbroek */
539*00b67f09SDavid van Moolenbroek in.s_addr = inet_addr("127.0.0.1");
540*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin(&addr1, &in, 5444);
541*00b67f09SDavid van Moolenbroek
542*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_tcp, &s1);
543*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
544*00b67f09SDavid van Moolenbroek
545*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
546*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
547*00b67f09SDavid van Moolenbroek
548*00b67f09SDavid van Moolenbroek result = isc_socket_listen(s1, 3);
549*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
550*00b67f09SDavid van Moolenbroek
551*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET, isc_sockettype_tcp, &s2);
552*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
553*00b67f09SDavid van Moolenbroek
554*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
555*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
556*00b67f09SDavid van Moolenbroek
557*00b67f09SDavid van Moolenbroek completion_init(&completion2);
558*00b67f09SDavid van Moolenbroek result = isc_socket_accept(s1, task, accept_done, &completion2);
559*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
560*00b67f09SDavid van Moolenbroek
561*00b67f09SDavid van Moolenbroek completion_init(&completion);
562*00b67f09SDavid van Moolenbroek result = isc_socket_connect(s2, &addr1, task, event_done, &completion);
563*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
564*00b67f09SDavid van Moolenbroek waitfor2(&completion, &completion2);
565*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
566*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
567*00b67f09SDavid van Moolenbroek ATF_CHECK(completion2.done);
568*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion2.result, ISC_R_SUCCESS);
569*00b67f09SDavid van Moolenbroek s3 = completion2.socket;
570*00b67f09SDavid van Moolenbroek
571*00b67f09SDavid van Moolenbroek isc_socket_dscp(s2, 056); /* EF */
572*00b67f09SDavid van Moolenbroek
573*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
574*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
575*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
576*00b67f09SDavid van Moolenbroek
577*00b67f09SDavid van Moolenbroek recv_dscp = ISC_FALSE;
578*00b67f09SDavid van Moolenbroek recv_dscp_value = 0;
579*00b67f09SDavid van Moolenbroek
580*00b67f09SDavid van Moolenbroek completion_init(&completion);
581*00b67f09SDavid van Moolenbroek result = isc_socket_sendto(s2, &r, task, event_done, &completion,
582*00b67f09SDavid van Moolenbroek NULL, NULL);
583*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
584*00b67f09SDavid van Moolenbroek waitfor(&completion);
585*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
586*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
587*00b67f09SDavid van Moolenbroek
588*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
589*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
590*00b67f09SDavid van Moolenbroek completion_init(&completion);
591*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
592*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
593*00b67f09SDavid van Moolenbroek waitfor(&completion);
594*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
595*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
596*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
597*00b67f09SDavid van Moolenbroek
598*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPRECVV4) != 0) {
599*00b67f09SDavid van Moolenbroek if (recv_dscp)
600*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(recv_dscp_value, 056);
601*00b67f09SDavid van Moolenbroek } else
602*00b67f09SDavid van Moolenbroek ATF_CHECK(!recv_dscp);
603*00b67f09SDavid van Moolenbroek
604*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
605*00b67f09SDavid van Moolenbroek
606*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
607*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
608*00b67f09SDavid van Moolenbroek isc_socket_detach(&s3);
609*00b67f09SDavid van Moolenbroek
610*00b67f09SDavid van Moolenbroek isc_test_end();
611*00b67f09SDavid van Moolenbroek }
612*00b67f09SDavid van Moolenbroek
613*00b67f09SDavid van Moolenbroek /* Test TCP sendto/recv (IPv6) */
614*00b67f09SDavid van Moolenbroek ATF_TC(tcp_dscp_v6);
ATF_TC_HEAD(tcp_dscp_v6,tc)615*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(tcp_dscp_v6, tc) {
616*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "tcp dscp ipv6");
617*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(tcp_dscp_v6,tc)618*00b67f09SDavid van Moolenbroek ATF_TC_BODY(tcp_dscp_v6, tc) {
619*00b67f09SDavid van Moolenbroek isc_result_t result;
620*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr1;
621*00b67f09SDavid van Moolenbroek struct in6_addr in6;
622*00b67f09SDavid van Moolenbroek isc_socket_t *s1 = NULL, *s2 = NULL, *s3 = NULL;
623*00b67f09SDavid van Moolenbroek isc_task_t *task = NULL;
624*00b67f09SDavid van Moolenbroek char sendbuf[BUFSIZ], recvbuf[BUFSIZ];
625*00b67f09SDavid van Moolenbroek completion_t completion, completion2;
626*00b67f09SDavid van Moolenbroek isc_region_t r;
627*00b67f09SDavid van Moolenbroek int n;
628*00b67f09SDavid van Moolenbroek
629*00b67f09SDavid van Moolenbroek UNUSED(tc);
630*00b67f09SDavid van Moolenbroek
631*00b67f09SDavid van Moolenbroek result = isc_test_begin(NULL, ISC_TRUE);
632*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
633*00b67f09SDavid van Moolenbroek
634*00b67f09SDavid van Moolenbroek /*
635*00b67f09SDavid van Moolenbroek * Create two sockets: ::1/5444, talking to each other.
636*00b67f09SDavid van Moolenbroek */
637*00b67f09SDavid van Moolenbroek n = inet_pton(AF_INET6, "::1", &in6.s6_addr);
638*00b67f09SDavid van Moolenbroek ATF_REQUIRE(n == 1);
639*00b67f09SDavid van Moolenbroek isc_sockaddr_fromin6(&addr1, &in6, 5444);
640*00b67f09SDavid van Moolenbroek
641*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET6, isc_sockettype_tcp,
642*00b67f09SDavid van Moolenbroek &s1);
643*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
644*00b67f09SDavid van Moolenbroek
645*00b67f09SDavid van Moolenbroek result = isc_socket_bind(s1, &addr1, ISC_SOCKET_REUSEADDRESS);
646*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
647*00b67f09SDavid van Moolenbroek
648*00b67f09SDavid van Moolenbroek result = isc_socket_listen(s1, 3);
649*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
650*00b67f09SDavid van Moolenbroek
651*00b67f09SDavid van Moolenbroek result = isc_socket_create(socketmgr, PF_INET6, isc_sockettype_tcp,
652*00b67f09SDavid van Moolenbroek &s2);
653*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
654*00b67f09SDavid van Moolenbroek
655*00b67f09SDavid van Moolenbroek result = isc_task_create(taskmgr, 0, &task);
656*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
657*00b67f09SDavid van Moolenbroek
658*00b67f09SDavid van Moolenbroek completion_init(&completion2);
659*00b67f09SDavid van Moolenbroek result = isc_socket_accept(s1, task, accept_done, &completion2);
660*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
661*00b67f09SDavid van Moolenbroek
662*00b67f09SDavid van Moolenbroek completion_init(&completion);
663*00b67f09SDavid van Moolenbroek result = isc_socket_connect(s2, &addr1, task, event_done, &completion);
664*00b67f09SDavid van Moolenbroek ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
665*00b67f09SDavid van Moolenbroek waitfor2(&completion, &completion2);
666*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
667*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
668*00b67f09SDavid van Moolenbroek ATF_CHECK(completion2.done);
669*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion2.result, ISC_R_SUCCESS);
670*00b67f09SDavid van Moolenbroek s3 = completion2.socket;
671*00b67f09SDavid van Moolenbroek
672*00b67f09SDavid van Moolenbroek isc_socket_dscp(s2, 056); /* EF */
673*00b67f09SDavid van Moolenbroek
674*00b67f09SDavid van Moolenbroek strcpy(sendbuf, "Hello");
675*00b67f09SDavid van Moolenbroek r.base = (void *) sendbuf;
676*00b67f09SDavid van Moolenbroek r.length = strlen(sendbuf) + 1;
677*00b67f09SDavid van Moolenbroek
678*00b67f09SDavid van Moolenbroek recv_dscp = ISC_FALSE;
679*00b67f09SDavid van Moolenbroek recv_dscp_value = 0;
680*00b67f09SDavid van Moolenbroek
681*00b67f09SDavid van Moolenbroek completion_init(&completion);
682*00b67f09SDavid van Moolenbroek result = isc_socket_sendto(s2, &r, task, event_done, &completion,
683*00b67f09SDavid van Moolenbroek NULL, NULL);
684*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
685*00b67f09SDavid van Moolenbroek waitfor(&completion);
686*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
687*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
688*00b67f09SDavid van Moolenbroek
689*00b67f09SDavid van Moolenbroek r.base = (void *) recvbuf;
690*00b67f09SDavid van Moolenbroek r.length = BUFSIZ;
691*00b67f09SDavid van Moolenbroek completion_init(&completion);
692*00b67f09SDavid van Moolenbroek result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
693*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(result, ISC_R_SUCCESS);
694*00b67f09SDavid van Moolenbroek waitfor(&completion);
695*00b67f09SDavid van Moolenbroek ATF_CHECK(completion.done);
696*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(completion.result, ISC_R_SUCCESS);
697*00b67f09SDavid van Moolenbroek ATF_CHECK_STREQ(recvbuf, "Hello");
698*00b67f09SDavid van Moolenbroek
699*00b67f09SDavid van Moolenbroek if ((isc_net_probedscp() & ISC_NET_DSCPRECVV6) != 0) {
700*00b67f09SDavid van Moolenbroek /*
701*00b67f09SDavid van Moolenbroek * IPV6_RECVTCLASS is undefined for TCP however
702*00b67f09SDavid van Moolenbroek * if we do get it should be the the value we set.
703*00b67f09SDavid van Moolenbroek */
704*00b67f09SDavid van Moolenbroek if (recv_dscp)
705*00b67f09SDavid van Moolenbroek ATF_CHECK_EQ(recv_dscp_value, 056);
706*00b67f09SDavid van Moolenbroek } else
707*00b67f09SDavid van Moolenbroek ATF_CHECK(!recv_dscp);
708*00b67f09SDavid van Moolenbroek
709*00b67f09SDavid van Moolenbroek isc_task_detach(&task);
710*00b67f09SDavid van Moolenbroek
711*00b67f09SDavid van Moolenbroek isc_socket_detach(&s1);
712*00b67f09SDavid van Moolenbroek isc_socket_detach(&s2);
713*00b67f09SDavid van Moolenbroek isc_socket_detach(&s3);
714*00b67f09SDavid van Moolenbroek
715*00b67f09SDavid van Moolenbroek isc_test_end();
716*00b67f09SDavid van Moolenbroek }
717*00b67f09SDavid van Moolenbroek
718*00b67f09SDavid van Moolenbroek ATF_TC(net_probedscp);
ATF_TC_HEAD(net_probedscp,tc)719*00b67f09SDavid van Moolenbroek ATF_TC_HEAD(net_probedscp, tc) {
720*00b67f09SDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "probe dscp capabilities");
721*00b67f09SDavid van Moolenbroek }
ATF_TC_BODY(net_probedscp,tc)722*00b67f09SDavid van Moolenbroek ATF_TC_BODY(net_probedscp, tc) {
723*00b67f09SDavid van Moolenbroek unsigned int n;
724*00b67f09SDavid van Moolenbroek
725*00b67f09SDavid van Moolenbroek UNUSED(tc);
726*00b67f09SDavid van Moolenbroek
727*00b67f09SDavid van Moolenbroek n = isc_net_probedscp();
728*00b67f09SDavid van Moolenbroek ATF_CHECK((n & ~ISC_NET_DSCPALL) == 0);
729*00b67f09SDavid van Moolenbroek
730*00b67f09SDavid van Moolenbroek /* ISC_NET_DSCPSETV4 MUST be set if any is set. */
731*00b67f09SDavid van Moolenbroek if (n & (ISC_NET_DSCPSETV4|ISC_NET_DSCPPKTV4|ISC_NET_DSCPRECVV4))
732*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG((n & ISC_NET_DSCPSETV4) != 0,
733*00b67f09SDavid van Moolenbroek "IPv4:%s%s%s\n",
734*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPSETV4) ? " set" : " none",
735*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPPKTV4) ? " packet" : "",
736*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPRECVV4) ? " receive" : "");
737*00b67f09SDavid van Moolenbroek
738*00b67f09SDavid van Moolenbroek /* ISC_NET_DSCPSETV6 MUST be set if any is set. */
739*00b67f09SDavid van Moolenbroek if (n & (ISC_NET_DSCPSETV6|ISC_NET_DSCPPKTV4|ISC_NET_DSCPRECVV4))
740*00b67f09SDavid van Moolenbroek ATF_CHECK_MSG((n & ISC_NET_DSCPSETV6) != 0,
741*00b67f09SDavid van Moolenbroek "IPv6:%s%s%s\n",
742*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPSETV6) ? " set" : " none",
743*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPPKTV6) ? " packet" : "",
744*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPRECVV6) ? " receive" : "");
745*00b67f09SDavid van Moolenbroek
746*00b67f09SDavid van Moolenbroek #if 0
747*00b67f09SDavid van Moolenbroek fprintf(stdout, "IPv4:%s%s%s\n",
748*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPSETV4) ? " set" : "none",
749*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPPKTV4) ? " packet" : "",
750*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPRECVV4) ? " receive" : "");
751*00b67f09SDavid van Moolenbroek
752*00b67f09SDavid van Moolenbroek fprintf(stdout, "IPv6:%s%s%s\n",
753*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPSETV6) ? " set" : "none",
754*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPPKTV6) ? " packet" : "",
755*00b67f09SDavid van Moolenbroek (n & ISC_NET_DSCPRECVV6) ? " receive" : "");
756*00b67f09SDavid van Moolenbroek #endif
757*00b67f09SDavid van Moolenbroek }
758*00b67f09SDavid van Moolenbroek
759*00b67f09SDavid van Moolenbroek /*
760*00b67f09SDavid van Moolenbroek * Main
761*00b67f09SDavid van Moolenbroek */
ATF_TP_ADD_TCS(tp)762*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TCS(tp) {
763*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, udp_sendto);
764*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, udp_dup);
765*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, tcp_dscp_v4);
766*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, tcp_dscp_v6);
767*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, udp_dscp_v4);
768*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, udp_dscp_v6);
769*00b67f09SDavid van Moolenbroek ATF_TP_ADD_TC(tp, net_probedscp);
770*00b67f09SDavid van Moolenbroek
771*00b67f09SDavid van Moolenbroek return (atf_no_error());
772*00b67f09SDavid van Moolenbroek }
773