Skip to content

Commit 0a98a83

Browse files
rluboskartben
authored andcommitted
tests: net: socket: af_packet: Switch to blocking sockets with timeout
Packet socket tests used non-blocking sockets so in results the test code was overly complicated with delays and loops scattered all across the test code, making it difficult to read. As packet sockets do support blocking operation with timeout, reconfigure the sockets to use that and simplify the test code by getting rid of unnecessary loops and delays. Signed-off-by: Robert Lubos <[email protected]>
1 parent ff801c6 commit 0a98a83

File tree

2 files changed

+31
-97
lines changed

2 files changed

+31
-97
lines changed

tests/net/socket/af_packet/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ CONFIG_TEST_USERSPACE=y
2222
CONFIG_NET_MAX_CONTEXTS=8
2323
CONFIG_NET_MAX_CONN=8
2424
CONFIG_NET_IF_MAX_IPV4_COUNT=2
25+
CONFIG_NET_CONTEXT_RCVTIMEO=y
2526

2627
CONFIG_MAIN_STACK_SIZE=1024

tests/net/socket/af_packet/src/main.c

Lines changed: 30 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,17 @@ ETH_NET_DEVICE_INIT(eth_fake2, "eth_fake2", NULL, NULL, &eth_fake_data2, NULL,
112112
static void setup_packet_socket(int *sock, struct net_if *iface, int type,
113113
int proto)
114114
{
115+
struct timeval optval = {
116+
.tv_usec = 100000,
117+
};
118+
int ret;
119+
115120
*sock = zsock_socket(AF_PACKET, type, proto);
116121
zassert_true(*sock >= 0, "Cannot create packet socket (%d)", -errno);
122+
123+
ret = zsock_setsockopt(*sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
124+
sizeof(optval));
125+
zassert_ok(ret, "setsockopt failed (%d)", errno);
117126
}
118127

119128
static void bind_packet_socket(int sock, struct net_if *iface)
@@ -165,27 +174,13 @@ static void iface_cb(struct net_if *iface, void *user_data)
165174
ud->second = iface;
166175
}
167176

168-
static void setblocking(int fd, bool val)
169-
{
170-
int fl, res;
171-
172-
fl = zsock_fcntl(fd, F_GETFL, 0);
173-
zassert_not_equal(fl, -1, "Fail to set fcntl");
174-
175-
if (val) {
176-
fl &= ~O_NONBLOCK;
177-
} else {
178-
fl |= O_NONBLOCK;
179-
}
180-
181-
res = zsock_fcntl(fd, F_SETFL, fl);
182-
zassert_not_equal(res, -1, "Fail to set fcntl");
183-
}
184-
185177
#define SRC_PORT 4240
186178
#define DST_PORT 4242
187179
static void prepare_udp_socket(int *sock, struct sockaddr_in *sockaddr, uint16_t local_port)
188180
{
181+
struct timeval optval = {
182+
.tv_usec = 100000,
183+
};
189184
int ret;
190185

191186
*sock = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
@@ -199,6 +194,10 @@ static void prepare_udp_socket(int *sock, struct sockaddr_in *sockaddr, uint16_t
199194
/* Bind UDP socket to local port */
200195
ret = zsock_bind(*sock, (struct sockaddr *) sockaddr, sizeof(*sockaddr));
201196
zassert_equal(ret, 0, "Cannot bind DGRAM (UDP) socket (%d)", -errno);
197+
198+
ret = zsock_setsockopt(*sock, SOL_SOCKET, SO_RCVTIMEO, &optval,
199+
sizeof(optval));
200+
zassert_ok(ret, "setsockopt failed (%d)", errno);
202201
}
203202

204203
static void __test_packet_sockets(int *sock1, int *sock2)
@@ -245,9 +244,6 @@ ZTEST(socket_packet, test_raw_packet_sockets)
245244
0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
246245
zassert_equal(sent, sizeof(data_to_send), "sendto failed");
247246

248-
k_msleep(10); /* Let the packet enter the system */
249-
250-
setblocking(udp_sock_1, false);
251247
memset(&data_to_receive, 0, sizeof(data_to_receive));
252248
errno = 0;
253249

@@ -261,7 +257,6 @@ ZTEST(socket_packet, test_raw_packet_sockets)
261257
"Sent and received buffers do not match");
262258

263259
/* And if the packet has been also passed to RAW socket */
264-
setblocking(packet_sock_1, false);
265260
memset(&data_to_receive, 0, sizeof(data_to_receive));
266261
memset(&src, 0, sizeof(src));
267262
addrlen = sizeof(src);
@@ -294,7 +289,6 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
294289
struct user_data ud = { 0 };
295290
struct sockaddr_ll dst, src;
296291
int ret;
297-
int iter, max_iter = 10;
298292

299293
net_if_foreach(iface_cb, &ud);
300294

@@ -304,9 +298,6 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
304298
prepare_packet_socket(&packet_sock_1, ud.first, SOCK_DGRAM, htons(ETH_P_TSN));
305299
prepare_packet_socket(&packet_sock_2, ud.second, SOCK_DGRAM, htons(ETH_P_TSN));
306300

307-
setblocking(packet_sock_1, false);
308-
setblocking(packet_sock_2, false);
309-
310301
memset(&dst, 0, sizeof(dst));
311302
dst.sll_family = AF_PACKET;
312303
dst.sll_protocol = htons(ETH_P_TSN);
@@ -317,23 +308,15 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
317308
zassert_equal(ret, sizeof(data_to_send), "Cannot send all data (%d)",
318309
-errno);
319310

320-
k_msleep(10); /* Let the packet enter the system */
321-
322311
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive), 0,
323312
(struct sockaddr *)&src, &addrlen);
324313
zassert_equal(ret, -1, "Received something (%d)", ret);
325314
zassert_equal(errno, EAGAIN, "Wrong errno (%d)", errno);
326315

327316
memset(&src, 0, sizeof(src));
328317
errno = 0;
329-
iter = 0;
330-
do {
331-
ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive),
332-
0, (struct sockaddr *)&src, &addrlen);
333-
k_msleep(10);
334-
iter++;
335-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
336-
318+
ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive),
319+
0, (struct sockaddr *)&src, &addrlen);
337320
zassert_equal(ret, sizeof(data_to_send),
338321
"Cannot receive all data (%d vs %zd) (%d)",
339322
ret, sizeof(data_to_send), -errno);
@@ -366,7 +349,6 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
366349
zassert_equal(ret, sizeof(data_to_send), "Cannot send all data (%d)",
367350
-errno);
368351

369-
k_msleep(10);
370352
memset(&src, 0, sizeof(src));
371353

372354
ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive), 0,
@@ -377,14 +359,8 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
377359
memset(&src, 0, sizeof(src));
378360

379361
errno = 0;
380-
iter = 0;
381-
do {
382-
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
383-
0, (struct sockaddr *)&src, &addrlen);
384-
k_msleep(10);
385-
iter++;
386-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
387-
362+
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
363+
0, (struct sockaddr *)&src, &addrlen);
388364
zassert_equal(ret, sizeof(data_to_send), "Cannot receive all data (%d)",
389365
-errno);
390366
zassert_equal(addrlen, sizeof(struct sockaddr_ll),
@@ -421,17 +397,10 @@ ZTEST(socket_packet, test_packet_sockets_dgram)
421397
(const struct sockaddr *)&dst, sizeof(struct sockaddr_ll));
422398
zassert_equal(ret, sizeof(payload_ip_length), "Cannot send all data (%d)", -errno);
423399

424-
k_msleep(10);
425-
426400
memset(&src, 0, sizeof(src));
427401
errno = 0;
428-
iter = 0;
429-
do {
430-
ret = zsock_recvfrom(packet_sock_2, receive_ip_length, sizeof(receive_ip_length), 0,
431-
(struct sockaddr *)&src, &addrlen);
432-
k_msleep(10);
433-
iter++;
434-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
402+
ret = zsock_recvfrom(packet_sock_2, receive_ip_length, sizeof(receive_ip_length), 0,
403+
(struct sockaddr *)&src, &addrlen);
435404

436405
zassert_equal(ret, ARRAY_SIZE(payload_ip_length), "Cannot receive all data (%d)", -errno);
437406
zassert_mem_equal(payload_ip_length, receive_ip_length, sizeof(payload_ip_length),
@@ -446,7 +415,6 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_exchange)
446415
struct user_data ud = { 0 };
447416
struct sockaddr_ll dst, src;
448417
int ret;
449-
int iter, max_iter = 10;
450418
const uint8_t expected_payload_raw[] = {
451419
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* Dst ll addr */
452420
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* Src ll addr */
@@ -469,9 +437,6 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_exchange)
469437
prepare_packet_socket(&packet_sock_1, ud.first, SOCK_DGRAM, htons(ETH_P_ALL));
470438
prepare_packet_socket(&packet_sock_2, ud.second, SOCK_RAW, htons(ETH_P_ALL));
471439

472-
setblocking(packet_sock_1, false);
473-
setblocking(packet_sock_2, false);
474-
475440
memset(&dst, 0, sizeof(dst));
476441
dst.sll_family = AF_PACKET;
477442
dst.sll_protocol = htons(ETH_P_IP);
@@ -488,18 +453,11 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_exchange)
488453
memset(&src, 0, sizeof(src));
489454

490455
errno = 0;
491-
iter = 0;
492-
do {
493-
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
494-
0, (struct sockaddr *)&src, &addrlen);
495-
k_msleep(10);
496-
iter++;
497-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
498-
456+
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
457+
0, (struct sockaddr *)&src, &addrlen);
499458
zassert_equal(ret, sizeof(expected_payload_raw),
500459
"Cannot receive all data (%d vs %zd) (%d)",
501460
ret, sizeof(expected_payload_raw), -errno);
502-
503461
zassert_mem_equal(expected_payload_raw, data_to_receive,
504462
sizeof(expected_payload_raw), "Data mismatch");
505463

@@ -514,18 +472,11 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_exchange)
514472
zassert_equal(ret, sizeof(send_payload_raw), "Cannot send all data (%d)",
515473
-errno);
516474

517-
k_msleep(10);
518475
memset(&src, 0, sizeof(src));
519476

520477
errno = 0;
521-
iter = 0;
522-
do {
523-
ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive),
524-
0, (struct sockaddr *)&src, &addrlen);
525-
k_msleep(10);
526-
iter++;
527-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
528-
478+
ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive),
479+
0, (struct sockaddr *)&src, &addrlen);
529480
zassert_equal(ret, sizeof(data_to_send), "Cannot receive all data (%d)",
530481
-errno);
531482
zassert_mem_equal(data_to_send, data_to_receive, sizeof(data_to_send),
@@ -540,7 +491,6 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_recv)
540491
struct user_data ud = { 0 };
541492
struct sockaddr_ll dst, src;
542493
int ret;
543-
int iter, max_iter = 10;
544494
const uint8_t expected_payload_raw[] = {
545495
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* Dst ll addr */
546496
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* Src ll addr */
@@ -557,10 +507,6 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_recv)
557507
prepare_packet_socket(&packet_sock_2, ud.second, SOCK_RAW, htons(ETH_P_ALL));
558508
prepare_packet_socket(&packet_sock_3, ud.second, SOCK_RAW, htons(ETH_P_ALL));
559509

560-
setblocking(packet_sock_1, false);
561-
setblocking(packet_sock_2, false);
562-
setblocking(packet_sock_3, false);
563-
564510
memset(&dst, 0, sizeof(dst));
565511
dst.sll_family = AF_PACKET;
566512
dst.sll_protocol = htons(ETH_P_IP);
@@ -571,20 +517,13 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_recv)
571517
zassert_equal(ret, sizeof(data_to_send), "Cannot send all data (%d)",
572518
-errno);
573519

574-
k_msleep(10); /* Let the packet enter the system */
575520
memset(&src, 0, sizeof(src));
576521

577522
/* Both SOCK_DGRAM to SOCK_RAW sockets should receive packet. */
578523

579524
errno = 0;
580-
iter = 0;
581-
do {
582-
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
583-
0, (struct sockaddr *)&src, &addrlen);
584-
k_msleep(10);
585-
iter++;
586-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
587-
525+
ret = zsock_recvfrom(packet_sock_2, data_to_receive, sizeof(data_to_receive),
526+
0, (struct sockaddr *)&src, &addrlen);
588527
zassert_equal(ret, sizeof(expected_payload_raw),
589528
"Cannot receive all data (%d vs %zd) (%d)",
590529
ret, sizeof(expected_payload_raw), -errno);
@@ -595,14 +534,8 @@ ZTEST(socket_packet, test_raw_and_dgram_socket_recv)
595534
memset(&src, 0, sizeof(src));
596535

597536
errno = 0;
598-
iter = 0;
599-
do {
600-
ret = zsock_recvfrom(packet_sock_3, data_to_receive, sizeof(data_to_receive),
601-
0, (struct sockaddr *)&src, &addrlen);
602-
k_msleep(10);
603-
iter++;
604-
} while (ret < 0 && errno == EAGAIN && iter < max_iter);
605-
537+
ret = zsock_recvfrom(packet_sock_3, data_to_receive, sizeof(data_to_receive),
538+
0, (struct sockaddr *)&src, &addrlen);
606539
zassert_equal(ret, sizeof(expected_payload_raw),
607540
"Cannot receive all data (%d)", -errno);
608541
zassert_mem_equal(expected_payload_raw, data_to_receive,

0 commit comments

Comments
 (0)