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);
68 for (i = 0; i < 10; i++) {
69 struct torture_address reply_addr = {
70 .sa_socklen = sizeof(struct sockaddr_storage),
72 struct msghdr s_msg = {
75 struct msghdr r_msg = {
81 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
83 /* This should be ignored */
84 rc = inet_pton(AF_INET,
86 &addr.sa.in.sin_addr);
87 assert_int_equal(rc, 1);
89 s_msg.msg_name = &addr.sa.s;
90 s_msg.msg_namelen = addr.sa_socklen;
92 s_iov.iov_base = send_buf;
93 s_iov.iov_len = sizeof(send_buf);
95 s_msg.msg_iov = &s_iov;
98 ret = sendmsg(s, &s_msg, 0);
99 assert_int_not_equal(ret, -1);
101 r_msg.msg_name = &reply_addr.sa.s;
102 r_msg.msg_namelen = reply_addr.sa_socklen;
104 r_iov.iov_base = recv_buf;
105 r_iov.iov_len = sizeof(recv_buf);
107 r_msg.msg_iov = &r_iov;
108 r_msg.msg_iovlen = 1;
110 ret = recvmsg(s, &r_msg, 0);
111 assert_int_not_equal(ret, -1);
113 assert_int_equal(r_msg.msg_namelen, 0);
115 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
122 static void test_sendmsg_recvmsg_ipv6(void **state)
124 struct torture_address addr = {
125 .sa_socklen = sizeof(struct sockaddr_storage),
127 char send_buf[64] = {0};
128 char recv_buf[64] = {0};
134 (void) state; /* unused */
136 s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
137 assert_int_not_equal(s, -1);
139 addr.sa.in.sin_family = AF_INET6;
140 addr.sa.in.sin_port = htons(torture_server_port());
142 rc = inet_pton(AF_INET6,
143 torture_server_address(AF_INET6),
144 &addr.sa.in6.sin6_addr);
145 assert_int_equal(rc, 1);
147 rc = connect(s, &addr.sa.s, addr.sa_socklen);
149 for (i = 0; i < 10; i++) {
150 struct torture_address reply_addr = {
151 .sa_socklen = sizeof(struct sockaddr_in),
153 struct msghdr s_msg = {
156 struct msghdr r_msg = {
162 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
164 s_iov.iov_base = send_buf;
165 s_iov.iov_len = sizeof(send_buf);
167 s_msg.msg_iov = &s_iov;
168 s_msg.msg_iovlen = 1;
170 ret = sendmsg(s, &s_msg, 0);
171 assert_int_not_equal(ret, -1);
173 r_msg.msg_name = &reply_addr.sa.s;
174 r_msg.msg_namelen = reply_addr.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, 0);
187 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
194 static void test_sendmsg_recvmsg_ipv4_null(void **state)
196 struct torture_address s_addr = {
197 .sa_socklen = sizeof(struct sockaddr_storage),
199 struct msghdr s_msg = {
202 struct msghdr r_msg = {
206 char payload[] = "PACKET";
211 (void)state; /* unused */
213 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
214 assert_int_not_equal(s, -1);
216 s_addr.sa.in.sin_family = AF_INET;
217 s_addr.sa.in.sin_port = htons(torture_server_port());
219 rc = inet_pton(AF_INET,
220 torture_server_address(AF_INET),
221 &s_addr.sa.in.sin_addr);
222 assert_int_equal(rc, 1);
224 rc = connect(s, &s_addr.sa.s, s_addr.sa_socklen);
226 /* msg_name = NULL */
228 iov.iov_base = (void *)payload;
229 iov.iov_len = sizeof(payload);
231 s_msg.msg_iov = &iov;
232 s_msg.msg_iovlen = 1;
234 ret = sendmsg(s, &s_msg, 0);
235 assert_int_not_equal(ret, -1);
237 /* msg_name = NULL */
239 memset(payload, '0', sizeof(payload));
241 r_msg.msg_iov = &iov;
242 r_msg.msg_iovlen = 1;
244 ret = recvmsg(s, &r_msg, 0);
245 assert_int_not_equal(ret, -1);
247 assert_int_equal(r_msg.msg_namelen, 0);
248 assert_null(r_msg.msg_name);
256 const struct CMUnitTest sendmsg_tests[] = {
257 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4,
258 setup_echo_srv_tcp_ipv4,
260 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv4_null,
261 setup_echo_srv_tcp_ipv4,
264 cmocka_unit_test_setup_teardown(test_sendmsg_recvmsg_ipv6,
265 setup_echo_srv_tcp_ipv6,
270 rc = cmocka_run_group_tests(sendmsg_tests, NULL, NULL);