6
6
#include <string.h>
7
7
#include <re.h>
8
8
#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
10
29
11
30
#define DEBUG_MODULE "udptest"
12
31
#define DEBUG_LEVEL 5
13
32
#include <re_dbg.h>
14
33
15
34
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
+
16
51
struct udp_test {
17
52
struct udp_sock * usc ;
18
53
struct udp_sock * uss ;
@@ -21,6 +56,8 @@ struct udp_test {
21
56
struct sa srv ;
22
57
int tindex ;
23
58
int err ;
59
+ re_sock_t fds ;
60
+ int tos ;
24
61
};
25
62
26
63
@@ -213,3 +250,129 @@ int test_udp(void)
213
250
214
251
return err ;
215
252
}
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