10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <netinet/in.h>
13 #include <arpa/inet.h>
18 static int setup_echo_srv_udp_ipv4(void **state)
20 torture_setup_echo_srv_udp_ipv4(state);
26 static int setup_echo_srv_udp_ipv6(void **state)
28 torture_setup_echo_srv_udp_ipv6(state);
34 static int teardown(void **state)
36 torture_teardown_echo_srv(state);
41 static void test_sendmsg_recvmsg_ipv4(void **state)
43 struct torture_address addr = {
44 .sa_socklen = sizeof(struct sockaddr_in),
46 char send_buf[64] = {0};
47 char recv_buf[64] = {0};
53 (void) state; /* unused */
55 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
56 assert_int_not_equal(s, -1);
58 addr.sa.in.sin_family = AF_INET;
59 addr.sa.in.sin_port = htons(torture_server_port());
61 rc = inet_pton(AF_INET,
62 torture_server_address(AF_INET),
63 &addr.sa.in.sin_addr);
64 assert_int_equal(rc, 1);
66 for (i = 0; i < 10; i++) {
67 char ip[INET_ADDRSTRLEN] = {0};
69 struct torture_address srv_in = {
70 .sa_socklen = sizeof(struct sockaddr_in),
77 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
81 s_msg.msg_name = &addr.sa.s;
82 s_msg.msg_namelen = addr.sa_socklen;
84 s_iov.iov_base = send_buf;
85 s_iov.iov_len = sizeof(send_buf);
87 s_msg.msg_iov = &s_iov;
90 ret = sendmsg(s, &s_msg, 0);
91 assert_int_not_equal(ret, -1);
95 r_msg.msg_name = &srv_in.sa.s;
96 r_msg.msg_namelen = srv_in.sa_socklen;
98 r_iov.iov_base = recv_buf;
99 r_iov.iov_len = sizeof(recv_buf);
101 r_msg.msg_iov = &r_iov;
102 r_msg.msg_iovlen = 1;
104 ret = recvmsg(s, &r_msg, 0);
105 assert_int_not_equal(ret, -1);
107 assert_int_equal(r_msg.msg_namelen, sizeof(struct sockaddr_in));
109 a = inet_ntop(AF_INET, &srv_in.sa.in.sin_addr, ip, sizeof(ip));
111 assert_string_equal(a, torture_server_address(AF_INET));
113 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
120 static void test_sendmsg_recvmsg_ipv6(void **state)
122 struct torture_address addr = {
123 .sa_socklen = sizeof(struct sockaddr_in6),
125 char send_buf[64] = {0};
126 char recv_buf[64] = {0};
132 (void) state; /* unused */
134 s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
135 assert_int_not_equal(s, -1);
137 addr.sa.in6.sin6_family = AF_INET6;
138 addr.sa.in6.sin6_port = htons(torture_server_port());
140 rc = inet_pton(AF_INET6,
141 torture_server_address(AF_INET6),
142 &addr.sa.in6.sin6_addr);
143 assert_int_equal(rc, 1);
145 for (i = 0; i < 10; i++) {
146 char ip[INET6_ADDRSTRLEN] = {0};
148 struct torture_address srv_in6 = {
149 .sa_socklen = sizeof(struct sockaddr_in6),
156 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
160 s_msg.msg_name = &addr.sa.s;
161 s_msg.msg_namelen = addr.sa_socklen;
163 s_iov.iov_base = send_buf;
164 s_iov.iov_len = sizeof(send_buf);
166 s_msg.msg_iov = &s_iov;
167 s_msg.msg_iovlen = 1;
169 ret = sendmsg(s, &s_msg, 0);
170 assert_int_not_equal(ret, -1);
173 r_msg.msg_name = &srv_in6.sa.s;
174 r_msg.msg_namelen = srv_in6.sa_socklen;
176 r_iov.iov_base = recv_buf;
177 r_iov.iov_len = sizeof(recv_buf);
179 r_msg.msg_iov = &r_iov;
180 r_msg.msg_iovlen = 1;
182 ret = recvmsg(s, &r_msg, 0);
183 assert_int_not_equal(ret, -1);
185 assert_int_equal(r_msg.msg_namelen, sizeof(struct sockaddr_in6));
187 a = inet_ntop(AF_INET6, &srv_in6.sa.in6.sin6_addr, ip, sizeof(ip));
189 assert_string_equal(a, torture_server_address(AF_INET6));
191 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
198 static void test_sendmsg_recvmsg_ipv4_connected(void **state)
200 struct torture_address send_addr = {
201 .sa_socklen = sizeof(struct sockaddr_storage),
203 struct torture_address r_addr = {
204 .sa_socklen = sizeof(struct sockaddr_storage),
206 struct msghdr s_msg = {
209 struct msghdr r_msg = {
213 char ip[INET_ADDRSTRLEN] = {0};
214 char payload[] = "PACKET";
220 (void)state; /* unused */
222 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
223 assert_int_not_equal(s, -1);
225 send_addr.sa.in.sin_family = AF_INET;
226 send_addr.sa.in.sin_port = htons(torture_server_port());
228 rc = inet_pton(AF_INET,
229 torture_server_address(AF_INET),
230 &send_addr.sa.in.sin_addr);
231 assert_int_equal(rc, 1);
233 rc = connect(s, &send_addr.sa.s, send_addr.sa_socklen);
234 assert_return_code(rc, errno);
236 iov.iov_base = (void *)payload;
237 iov.iov_len = sizeof(payload);
239 /* msg_name is NULL */
241 s_msg.msg_iov = &iov;
242 s_msg.msg_iovlen = 1;
244 ret = sendmsg(s, &s_msg, 0);
245 assert_int_not_equal(ret, -1);
247 r_msg.msg_name = &r_addr.sa.ss;
248 r_msg.msg_namelen = r_addr.sa_socklen;
250 memset(payload, 0, sizeof(payload));
252 r_msg.msg_iov = &iov;
253 r_msg.msg_iovlen = 1;
255 ret = recvmsg(s, &r_msg, 0);
256 assert_int_not_equal(ret, -1);
258 assert_int_equal(r_msg.msg_namelen, sizeof(struct sockaddr_in));
260 a = inet_ntop(AF_INET, &r_addr.sa.in.sin_addr, ip, sizeof(ip));
262 assert_string_equal(a, torture_server_address(AF_INET));
267 static void test_sendmsg_recvmsg_ipv4_connected_null(void **state)
269 struct torture_address send_addr = {
270 .sa_socklen = sizeof(struct sockaddr_storage),
272 struct msghdr s_msg = {
275 struct msghdr r_msg = {
279 char payload[] = "PACKET";
284 (void)state; /* unused */
286 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
287 assert_int_not_equal(s, -1);
289 send_addr.sa.in.sin_family = AF_INET;
290 send_addr.sa.in.sin_port = htons(torture_server_port());
292 rc = inet_pton(AF_INET,
293 torture_server_address(AF_INET),
294 &send_addr.sa.in.sin_addr);
295 assert_int_equal(rc, 1);
297 rc = connect(s, &send_addr.sa.s, send_addr.sa_socklen);
298 assert_return_code(rc, errno);
300 /* msg_name = NULL */
302 iov.iov_base = (void *)payload;
303 iov.iov_len = sizeof(payload);
305 s_msg.msg_iov = &iov;
306 s_msg.msg_iovlen = 1;
308 ret = sendmsg(s, &s_msg, 0);
309 assert_int_not_equal(ret, -1);
311 /* msg_name = NULL */
313 memset(payload, 0, sizeof(payload));
315 r_msg.msg_iov = &iov;
316 r_msg.msg_iovlen = 1;
318 ret = recvmsg(s, &r_msg, 0);
319 assert_int_not_equal(ret, -1);
321 assert_int_equal(r_msg.msg_namelen, 0);
322 assert_null(r_msg.msg_name);
327 static void test_sendmsg_recvmsg_ipv4_connected_namelen(void **state)
329 struct torture_address send_addr = {
330 .sa_socklen = sizeof(struct sockaddr_storage),
332 struct msghdr s_msg = {
335 struct msghdr r_msg = {
336 .msg_namelen = sizeof(struct sockaddr_storage),
339 char payload[] = "PACKET";
344 (void)state; /* unused */
346 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
347 assert_int_not_equal(s, -1);
349 send_addr.sa.in.sin_family = AF_INET;
350 send_addr.sa.in.sin_port = htons(torture_server_port());
352 rc = inet_pton(AF_INET,
353 torture_server_address(AF_INET),
354 &send_addr.sa.in.sin_addr);
355 assert_int_equal(rc, 1);
357 rc = connect(s, &send_addr.sa.s, send_addr.sa_socklen);
358 assert_return_code(rc, errno);
360 /* msg_name = NULL */
362 iov.iov_base = (void *)payload;
363 iov.iov_len = sizeof(payload);
365 s_msg.msg_iov = &iov;
366 s_msg.msg_iovlen = 1;
368 ret = sendmsg(s, &s_msg, 0);
369 assert_int_not_equal(ret, -1);
371 /* msg_name = NULL */
373 memset(payload, 0, sizeof(payload));
375 r_msg.msg_iov = &iov;
376 r_msg.msg_iovlen = 1;
378 ret = recvmsg(s, &r_msg, 0);
379 assert_int_not_equal(ret, -1);
387 const struct CMUnitTest sendmsg_tests[] = {
388 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4,
389 setup_echo_srv_udp_ipv4,
392 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv6,
393 setup_echo_srv_udp_ipv6,
396 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4_connected,
397 setup_echo_srv_udp_ipv4,
399 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4_connected_null,
400 setup_echo_srv_udp_ipv4,
402 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4_connected_namelen,
403 setup_echo_srv_udp_ipv4,
407 rc = cmocka_run_group_tests(sendmsg_tests, NULL, NULL);