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_tcp_ipv4(void **state)
20 torture_setup_echo_srv_tcp_ipv4(state);
26 static int setup_echo_srv_tcp_ipv6(void **state)
28 torture_setup_echo_srv_tcp_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_storage),
46 char send_buf[64] = {0};
47 char recv_buf[64] = {0};
53 (void) state; /* unused */
55 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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 rc = connect(s, &addr.sa.s, addr.sa_socklen);
67 assert_return_code(rc, errno);
69 for (i = 0; i < 10; i++) {
70 struct torture_address reply_addr = {
71 .sa_socklen = sizeof(struct sockaddr_storage),
73 struct msghdr s_msg = {
76 struct msghdr r_msg = {
82 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
84 /* This should be ignored */
85 rc = inet_pton(AF_INET,
87 &addr.sa.in.sin_addr);
88 assert_int_equal(rc, 1);
90 s_msg.msg_name = &addr.sa.s;
91 s_msg.msg_namelen = addr.sa_socklen;
93 s_iov.iov_base = send_buf;
94 s_iov.iov_len = sizeof(send_buf);
96 s_msg.msg_iov = &s_iov;
99 ret = sendmsg(s, &s_msg, 0);
100 assert_int_not_equal(ret, -1);
102 r_msg.msg_name = &reply_addr.sa.s;
103 r_msg.msg_namelen = reply_addr.sa_socklen;
105 r_iov.iov_base = recv_buf;
106 r_iov.iov_len = sizeof(recv_buf);
108 r_msg.msg_iov = &r_iov;
109 r_msg.msg_iovlen = 1;
111 ret = recvmsg(s, &r_msg, 0);
112 assert_int_not_equal(ret, -1);
114 assert_int_equal(r_msg.msg_namelen, 0);
116 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
123 static void test_sendmsg_recvmsg_ipv6(void **state)
125 struct torture_address addr = {
126 .sa_socklen = sizeof(struct sockaddr_storage),
128 char send_buf[64] = {0};
129 char recv_buf[64] = {0};
135 (void) state; /* unused */
137 s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
138 assert_int_not_equal(s, -1);
140 addr.sa.in.sin_family = AF_INET6;
141 addr.sa.in.sin_port = htons(torture_server_port());
143 rc = inet_pton(AF_INET6,
144 torture_server_address(AF_INET6),
145 &addr.sa.in6.sin6_addr);
146 assert_int_equal(rc, 1);
148 rc = connect(s, &addr.sa.s, addr.sa_socklen);
149 assert_return_code(rc, errno);
151 for (i = 0; i < 10; i++) {
152 struct torture_address reply_addr = {
153 .sa_socklen = sizeof(struct sockaddr_in),
155 struct msghdr s_msg = {
158 struct msghdr r_msg = {
164 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
166 s_iov.iov_base = send_buf;
167 s_iov.iov_len = sizeof(send_buf);
169 s_msg.msg_iov = &s_iov;
170 s_msg.msg_iovlen = 1;
172 ret = sendmsg(s, &s_msg, 0);
173 assert_int_not_equal(ret, -1);
175 r_msg.msg_name = &reply_addr.sa.s;
176 r_msg.msg_namelen = reply_addr.sa_socklen;
178 r_iov.iov_base = recv_buf;
179 r_iov.iov_len = sizeof(recv_buf);
181 r_msg.msg_iov = &r_iov;
182 r_msg.msg_iovlen = 1;
184 ret = recvmsg(s, &r_msg, 0);
185 assert_int_not_equal(ret, -1);
187 assert_int_equal(r_msg.msg_namelen, 0);
189 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
196 static void test_sendmsg_recvmsg_ipv4_null(void **state)
198 struct torture_address send_addr = {
199 .sa_socklen = sizeof(struct sockaddr_storage),
201 struct msghdr s_msg = {
204 struct msghdr r_msg = {
208 char payload[] = "PACKET";
213 (void)state; /* unused */
215 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
216 assert_int_not_equal(s, -1);
218 send_addr.sa.in.sin_family = AF_INET;
219 send_addr.sa.in.sin_port = htons(torture_server_port());
221 rc = inet_pton(AF_INET,
222 torture_server_address(AF_INET),
223 &send_addr.sa.in.sin_addr);
224 assert_int_equal(rc, 1);
226 rc = connect(s, &send_addr.sa.s, send_addr.sa_socklen);
227 assert_return_code(rc, errno);
229 /* msg_name = NULL */
231 iov.iov_base = (void *)payload;
232 iov.iov_len = sizeof(payload);
234 s_msg.msg_iov = &iov;
235 s_msg.msg_iovlen = 1;
237 ret = sendmsg(s, &s_msg, 0);
238 assert_int_not_equal(ret, -1);
240 /* msg_name = NULL */
242 memset(payload, 0, sizeof(payload));
244 r_msg.msg_iov = &iov;
245 r_msg.msg_iovlen = 1;
247 ret = recvmsg(s, &r_msg, 0);
248 assert_int_not_equal(ret, -1);
250 assert_int_equal(r_msg.msg_namelen, 0);
251 assert_null(r_msg.msg_name);
259 const struct CMUnitTest sendmsg_tests[] = {
260 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4,
261 setup_echo_srv_tcp_ipv4,
263 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4_null,
264 setup_echo_srv_tcp_ipv4,
267 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv6,
268 setup_echo_srv_tcp_ipv6,
273 rc = cmocka_run_group_tests(sendmsg_tests, NULL, NULL);