Skip to content

Commit 1cff992

Browse files
test/udp: Add TOS test
1 parent d037a5f commit 1cff992

File tree

3 files changed

+166
-1
lines changed

3 files changed

+166
-1
lines changed

test/test.c

+1
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ static const struct test tests[] = {
236236
TEST(test_turn),
237237
TEST(test_turn_tcp),
238238
TEST(test_udp),
239+
TEST(test_udp_tos),
239240
TEST(test_unixsock),
240241
TEST(test_uri),
241242
TEST(test_uri_encode),

test/test.h

+1
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ int test_turn(void);
343343
int test_turn_tcp(void);
344344
int test_turn_thread(void);
345345
int test_udp(void);
346+
int test_udp_tos(void);
346347
int test_unixsock(void);
347348
int test_uri(void);
348349
int test_uri_encode(void);

test/udp.c

+164-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,48 @@
66
#include <string.h>
77
#include <re.h>
88
#include "test.h"
9-
9+
#if defined(WIN32)
10+
#include <winsock2.h>
11+
#include <ws2tcpip.h>
12+
#else
13+
#include <sys/types.h>
14+
#ifndef _BSD_SOCKLEN_T_
15+
#define _BSD_SOCKLEN_T_ int /**< Defines the BSD socket length type */
16+
#endif
17+
#include <sys/socket.h>
18+
#endif
19+
20+
#ifdef HAVE_UNISTD_H
21+
#include <unistd.h>
22+
#endif
23+
#ifdef HAVE_IO_H
24+
#include <io.h>
25+
#endif
26+
#if !defined(WIN32)
27+
#include <netdb.h>
28+
#endif
1029

1130
#define DEBUG_MODULE "udptest"
1231
#define DEBUG_LEVEL 5
1332
#include <re_dbg.h>
1433

1534

35+
/** Platform independent buffer type cast */
36+
#ifdef WIN32
37+
#define BUF_CAST (char *)
38+
#define SIZ_CAST (int)
39+
#define close closesocket
40+
#else
41+
#define BUF_CAST
42+
#define SIZ_CAST
43+
#endif
44+
45+
46+
enum {
47+
UDP_RXSZ = 1024
48+
};
49+
50+
1651
struct udp_test {
1752
struct udp_sock *usc;
1853
struct udp_sock *uss;
@@ -21,6 +56,8 @@ struct udp_test {
2156
struct sa srv;
2257
int tindex;
2358
int err;
59+
re_sock_t fds;
60+
int tos;
2461
};
2562

2663

@@ -213,3 +250,129 @@ int test_udp(void)
213250

214251
return err;
215252
}
253+
254+
255+
static void udp_read_msg_handler(int flags, void *arg)
256+
{
257+
struct cmsghdr *cmh;
258+
struct iovec iov;
259+
ssize_t n;
260+
struct msghdr msg = {0};
261+
char control_buffer[1024] = {0};
262+
struct udp_test *ut = arg;
263+
struct mbuf *mb = mbuf_alloc(UDP_RXSZ);
264+
int tos = 0;
265+
int err = 0;
266+
267+
(void)flags;
268+
269+
if (!mb)
270+
return;
271+
272+
iov.iov_base = mbuf_buf(mb);
273+
iov.iov_len = UDP_RXSZ;
274+
275+
msg.msg_iov = &iov;
276+
msg.msg_iovlen = 1;
277+
msg.msg_control = control_buffer;
278+
msg.msg_controllen = sizeof(control_buffer);
279+
280+
n = recvmsg(ut->fds, &msg, 0);
281+
if (n < 0)
282+
goto out;
283+
284+
for (cmh = CMSG_FIRSTHDR(&msg); cmh != NULL;
285+
cmh = CMSG_NXTHDR(&msg, cmh)) {
286+
if (cmh->cmsg_level == IPPROTO_IP && cmh->cmsg_type == IP_TOS)
287+
tos = *(unsigned char *)CMSG_DATA(cmh);
288+
}
289+
290+
TEST_EQUALS(ut->tos, tos);
291+
292+
out:
293+
if (err)
294+
ut->err = err;
295+
mem_deref(mb);
296+
re_cancel();
297+
}
298+
299+
300+
int test_udp_tos(void)
301+
{
302+
struct udp_test *ut;
303+
int err;
304+
const int recvtos = 1;
305+
struct re_fhs *fhss = NULL;
306+
char addr[64];
307+
char serv[6];
308+
struct addrinfo hints, *res = NULL;
309+
310+
ut = mem_zalloc(sizeof(*ut), destructor);
311+
if (!ut)
312+
return ENOMEM;
313+
314+
ut->tos = 120;
315+
316+
err = sa_set_str(&ut->cli, "127.0.0.1", 0);
317+
err |= sa_set_str(&ut->srv, "127.0.0.1", 0);
318+
TEST_ERR(err)
319+
320+
err = udp_open(&ut->usc, AF_INET);
321+
err |= udp_open(&ut->uss, AF_INET);
322+
TEST_ERR(err)
323+
324+
err = udp_settos(ut->usc, ut->tos);
325+
TEST_ERR(err)
326+
327+
/* Setup server */
328+
memset(&hints, 0, sizeof(hints));
329+
/* set-up hints structure */
330+
hints.ai_family = AF_INET;
331+
hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
332+
hints.ai_socktype = SOCK_DGRAM;
333+
hints.ai_protocol = IPPROTO_UDP;
334+
udp_rxsz_set(ut->uss, UDP_RXSZ);
335+
336+
(void)re_snprintf(addr, sizeof(addr), "%H", sa_print_addr, &ut->srv);
337+
(void)re_snprintf(serv, sizeof(serv), "%u", sa_port(&ut->srv));
338+
339+
ut->fds = udp_sock_fd(ut->uss, 0);
340+
TEST_NOT_EQUALS(RE_BAD_SOCK, ut->fds);
341+
342+
err = setsockopt(ut->fds, IPPROTO_IP, IP_RECVTOS, &recvtos,
343+
sizeof(recvtos));
344+
TEST_ERR(err);
345+
346+
err = net_sockopt_blocking_set(ut->fds, false);
347+
TEST_ERR(err);
348+
349+
err = getaddrinfo(addr, serv, &hints, &res);
350+
TEST_ERR(err);
351+
352+
err = bind(ut->fds, res->ai_addr, SIZ_CAST res->ai_addrlen);
353+
TEST_ERR(err);
354+
355+
err = fd_listen(&fhss, ut->fds, FD_READ, udp_read_msg_handler, ut);
356+
TEST_ERR(err);
357+
358+
err = udp_local_get(ut->uss, &ut->srv);
359+
TEST_ERR(err)
360+
361+
err = send_data(ut->usc, &ut->srv, data0);
362+
TEST_ERR(err)
363+
364+
err = re_main_timeout(100);
365+
TEST_ERR(err)
366+
367+
if (ut->err)
368+
err = ut->err;
369+
370+
out:
371+
freeaddrinfo(res);
372+
(void)close(ut->fds);
373+
374+
mem_deref(fhss);
375+
mem_deref(ut);
376+
377+
return err;
378+
}

0 commit comments

Comments
 (0)