1 /*
2 * Copyright (c) 2020 Intel Corporation
3 * Copyright (c) 2025 Nordic Semiconductor ASA
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <zephyr/logging/log.h>
9 LOG_MODULE_REGISTER(net_test, CONFIG_NET_SOCKETS_LOG_LEVEL);
10
11 #include <stdio.h>
12 #include <zephyr/sys/mutex.h>
13 #include <zephyr/ztest_assert.h>
14
15 #include <zephyr/posix/fcntl.h>
16 #include <zephyr/net/socket.h>
17 #include <zephyr/net/ethernet.h>
18 #include <zephyr/net/net_ip.h>
19
20 /* This test suite verifies that NET_AF_PACKET sockets behave according to well known behaviors.
21 * Note, that this is not well standardized and relies on behaviors known from Linux or FreeBSD.
22 *
23 * Sending data (TX)
24 *
25 * * (NET_AF_PACKET, NET_SOCK_RAW, 0) - The packet contains already a valid L2 header:
26 * - test_raw_sock_sendto_no_proto_bound
27 * - test_raw_sock_sendto_no_proto_unbound
28 * - test_raw_sock_sendto_no_proto_unbound_no_iface
29 * - test_raw_sock_sendto_no_proto_unbound_no_addr
30 * - test_raw_sock_sendmsg_no_proto
31 *
32 * * (NET_AF_PACKET, NET_SOCK_DGRAM, 0) - User needs to supply `struct net_sockaddr_ll` with
33 * all the relevant fields filled so that L2 header can be constructed:
34 * - test_dgram_sock_sendto_no_proto_bound
35 * - test_dgram_sock_sendto_no_proto_unbound
36 * - test_dgram_sock_sendto_no_proto_unbound_no_iface
37 * - test_dgram_sock_sendto_no_proto_unbound_no_addr
38 * - test_dgram_sock_sendmsg_no_proto
39 *
40 * * (NET_AF_PACKET, NET_SOCK_RAW, <protocol>) - The packet contains already a valid
41 * L2 header. Not mentioned in packet(7) but as the L2 header needs to be
42 * supplied by the user, the protocol value is ignored:
43 * - test_raw_sock_sendto_proto_wildcard
44 * - test_raw_sock_sendmsg_proto_wildcard
45 *
46 * * (NET_AF_PACKET, NET_SOCK_DGRAM, <protocol>) - L2 header is constructed according
47 * to protocol and `struct net_sockaddr_ll`:
48 * - test_dgram_sock_sendto_proto_wildcard
49 * - test_dgram_sock_sendto_proto_match
50 * - test_dgram_sock_sendmsg_proto_wildcard
51 * - test_dgram_sock_sendmsg_proto_match
52 *
53 * Receiving data (RX)
54 *
55 * * (NET_AF_PACKET, NET_SOCK_RAW, 0) - The packet is dropped when received by this socket.
56 * See https://man7.org/linux/man-pages/man7/packet.7.html:
57 * - test_raw_sock_recv_no_proto
58 *
59 * * (NET_AF_PACKET, NET_SOCK_DGRAM, 0) - The packet is dropped when received by this socket.
60 * See https://man7.org/linux/man-pages/man7/packet.7.html
61 * - test_dgram_sock_recv_no_proto
62 *
63 * * (NET_AF_PACKET, NET_SOCK_RAW, <protocol>) - The packet is received for a given protocol
64 * only. The L2 header is not removed from the data:
65 * - NOT SUPPORTED
66 *
67 * * (NET_AF_PACKET, NET_SOCK_DGRAM, <protocol>) - The packet is received for a given protocol
68 * only. The L2 header is removed from the data:
69 * - test_dgram_sock_recv_proto_match
70 * - test_dgram_sock_recv_proto_mismatch
71 *
72 * * (NET_AF_PACKET, NET_SOCK_RAW, net_htons(ETH_P_ALL)) - The packet is received for all
73 * protocols. The L2 header is not removed from the data:
74 * - test_raw_sock_recv_proto_wildcard
75 * - test_raw_sock_recv_proto_wildcard_bound_other_iface
76 * - test_raw_sock_recvfrom_proto_wildcard
77 * - test_raw_sock_recvfrom_proto_wildcard_unbound
78 *
79 * * (NET_AF_PACKET, NET_SOCK_DGRAM, net_htons(ETH_P_ALL)) - The packet is received for all
80 * protocols. The L2 header is removed from the data:
81 * - test_dgram_sock_recv_proto_wildcard
82 * - test_dgram_sock_recv_proto_wildcard_bound_other_iface
83 * - test_dgram_sock_recvfrom_proto_wildcard
84 * - test_dgram_sock_recvfrom_proto_wildcard_unbound
85 */
86
87 #if defined(CONFIG_NET_SOCKETS_LOG_LEVEL_DBG)
88 #define DBG(fmt, ...) NET_DBG(fmt, ##__VA_ARGS__)
89 #else
90 #define DBG(fmt, ...)
91 #endif
92
93 #define IPV4_ADDR "192.0.2.1"
94
95 static int packet_sock_1 = -1;
96 static int packet_sock_2 = -1;
97 static int packet_sock_3 = -1;
98 static int udp_sock_1 = -1;
99 static int udp_sock_2 = -1;
100
101 static const uint8_t test_payload[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
102 static uint8_t rx_buf[64];
103 static uint8_t tx_buf[64];
104 static struct net_in_addr fake_src = { { { 192, 0, 2, 2 } } };
105
106 static uint8_t lladdr1[] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
107 static uint8_t lladdr2[] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02 };
108
109 struct eth_fake_context {
110 struct net_if *iface;
111 uint8_t *mac_address;
112 char *ip_address;
113 };
114
115 static struct eth_fake_context eth_fake_data1 = {
116 .mac_address = lladdr1,
117 .ip_address = IPV4_ADDR,
118 };
119 static struct eth_fake_context eth_fake_data2 = {
120 .mac_address = lladdr2
121 };
122
eth_fake_send(const struct device * dev,struct net_pkt * pkt)123 static int eth_fake_send(const struct device *dev, struct net_pkt *pkt)
124 {
125 struct net_pkt *recv_pkt;
126 int ret;
127 struct net_if *target_iface;
128
129 ARG_UNUSED(dev);
130 ARG_UNUSED(pkt);
131
132 DBG("Sending data (%d bytes) to iface %d\n",
133 net_pkt_get_len(pkt), net_if_get_by_iface(net_pkt_iface(pkt)));
134
135 if (memcmp(pkt->frags->data, lladdr1, sizeof(lladdr1)) == 0) {
136 target_iface = eth_fake_data1.iface;
137 } else if (memcmp(pkt->frags->data, lladdr2, sizeof(lladdr2)) == 0) {
138 target_iface = eth_fake_data2.iface;
139 } else {
140 return 0;
141 }
142
143 recv_pkt = net_pkt_rx_clone(pkt, K_NO_WAIT);
144
145 net_pkt_set_iface(recv_pkt, target_iface);
146
147 k_sleep(K_MSEC(10)); /* Let the receiver run */
148
149 ret = net_recv_data(net_pkt_iface(recv_pkt), recv_pkt);
150 zassert_equal(ret, 0, "Cannot receive data (%d)", ret);
151
152 return 0;
153 }
154
eth_fake_iface_init(struct net_if * iface)155 static void eth_fake_iface_init(struct net_if *iface)
156 {
157 const struct device *dev = net_if_get_device(iface);
158 struct eth_fake_context *ctx = dev->data;
159
160 ctx->iface = iface;
161
162 net_if_set_link_addr(iface, ctx->mac_address, 6, NET_LINK_ETHERNET);
163
164 if (ctx->ip_address != NULL) {
165 struct net_in_addr addr;
166
167 if (net_addr_pton(NET_AF_INET, ctx->ip_address, &addr) == 0) {
168 net_if_ipv4_addr_add(iface, &addr, NET_ADDR_MANUAL, 0);
169 }
170 }
171
172 ethernet_init(iface);
173 }
174
175 static struct ethernet_api eth_fake_api_funcs = {
176 .iface_api.init = eth_fake_iface_init,
177 .send = eth_fake_send,
178 };
179
180 ETH_NET_DEVICE_INIT(eth_fake1, "eth_fake1", NULL, NULL, ð_fake_data1, NULL,
181 CONFIG_ETH_INIT_PRIORITY, ð_fake_api_funcs,
182 NET_ETH_MTU);
183
184 ETH_NET_DEVICE_INIT(eth_fake2, "eth_fake2", NULL, NULL, ð_fake_data2, NULL,
185 CONFIG_ETH_INIT_PRIORITY, ð_fake_api_funcs,
186 NET_ETH_MTU);
187
setup_packet_socket(int * sock,int type,int proto)188 static void setup_packet_socket(int *sock, int type, int proto)
189 {
190 struct timeval optval = {
191 .tv_usec = 100000,
192 };
193 int ret;
194
195 *sock = zsock_socket(NET_AF_PACKET, type, proto);
196 zassert_true(*sock >= 0, "Cannot create packet socket (%d)", -errno);
197
198 ret = zsock_setsockopt(*sock, ZSOCK_SOL_SOCKET, ZSOCK_SO_RCVTIMEO, &optval,
199 sizeof(optval));
200 zassert_ok(ret, "setsockopt failed (%d)", errno);
201 }
202
bind_packet_socket(int sock,struct net_if * iface)203 static void bind_packet_socket(int sock, struct net_if *iface)
204 {
205 struct net_sockaddr_ll addr;
206 int ret;
207
208 memset(&addr, 0, sizeof(addr));
209
210 addr.sll_ifindex = (iface == NULL) ? 0 : net_if_get_by_iface(iface);
211 addr.sll_family = NET_AF_PACKET;
212
213 ret = zsock_bind(sock, (struct net_sockaddr *)&addr, sizeof(addr));
214 zassert_ok(ret, "Cannot bind packet socket (%d)", -errno);
215 }
216
prepare_packet_socket(int * sock,struct net_if * iface,int type,int proto)217 static void prepare_packet_socket(int *sock, struct net_if *iface, int type,
218 int proto)
219 {
220 setup_packet_socket(sock, type, proto);
221 bind_packet_socket(*sock, iface);
222 }
223
224 struct user_data {
225 struct net_if *first;
226 struct net_if *second;
227 } ud;
228
iface_cb(struct net_if * iface,void * user_data)229 static void iface_cb(struct net_if *iface, void *user_data)
230 {
231 struct user_data *test_data = user_data;
232 struct net_linkaddr *link_addr;
233
234 if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) {
235 return;
236 }
237
238 link_addr = net_if_get_link_addr(iface);
239 if (memcmp(link_addr->addr, lladdr1, sizeof(lladdr1)) != 0 &&
240 memcmp(link_addr->addr, lladdr2, sizeof(lladdr2)) != 0) {
241 return;
242 }
243
244 if (test_data->first == NULL) {
245 test_data->first = iface;
246 return;
247 }
248
249 test_data->second = iface;
250 }
251
252 #define SRC_PORT 4240
253 #define DST_PORT 4242
prepare_udp_socket(int * sock,struct net_sockaddr_in * sockaddr,uint16_t local_port)254 static void prepare_udp_socket(int *sock, struct net_sockaddr_in *sockaddr, uint16_t local_port)
255 {
256 struct timeval optval = {
257 .tv_usec = 100000,
258 };
259 int ret;
260
261 *sock = zsock_socket(NET_AF_INET, NET_SOCK_DGRAM, NET_IPPROTO_UDP);
262 zassert_true(*sock >= 0, "Cannot create DGRAM (UDP) socket (%d)", *sock);
263
264 sockaddr->sin_family = NET_AF_INET;
265 sockaddr->sin_port = net_htons(local_port);
266 ret = zsock_inet_pton(NET_AF_INET, IPV4_ADDR, &sockaddr->sin_addr);
267 zassert_equal(ret, 1, "inet_pton failed");
268
269 /* Bind UDP socket to local port */
270 ret = zsock_bind(*sock, (struct net_sockaddr *) sockaddr, sizeof(*sockaddr));
271 zassert_equal(ret, 0, "Cannot bind DGRAM (UDP) socket (%d)", -errno);
272
273 ret = zsock_setsockopt(*sock, ZSOCK_SOL_SOCKET, ZSOCK_SO_RCVTIMEO, &optval,
274 sizeof(optval));
275 zassert_ok(ret, "setsockopt failed (%d)", errno);
276 }
277
278 #define IP_HDR_SIZE 20
279 #define UDP_HDR_SIZE 8
280 #define HDR_SIZE (IP_HDR_SIZE + UDP_HDR_SIZE)
ZTEST(socket_packet,test_raw_packet_sockets_udp_send)281 ZTEST(socket_packet, test_raw_packet_sockets_udp_send)
282 {
283 uint8_t data_to_send[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
284 uint8_t data_to_receive[sizeof(data_to_send) + HDR_SIZE];
285 struct net_sockaddr_ll src;
286 struct net_sockaddr_in sockaddr;
287 int ret;
288 net_socklen_t addrlen;
289 ssize_t sent = 0;
290
291 prepare_packet_socket(&packet_sock_1, ud.first, NET_SOCK_RAW, net_htons(ETH_P_ALL));
292 prepare_packet_socket(&packet_sock_2, ud.second, NET_SOCK_RAW, net_htons(ETH_P_ALL));
293
294 /* Prepare UDP socket which will read data */
295 prepare_udp_socket(&udp_sock_1, &sockaddr, DST_PORT);
296
297 /* Prepare UDP socket from which data are going to be sent */
298 prepare_udp_socket(&udp_sock_2, &sockaddr, SRC_PORT);
299 /* Properly set destination port for UDP packet */
300 sockaddr.sin_port = net_htons(DST_PORT);
301
302 /*
303 * Send UDP datagram to us - as check_ip_addr() in net_send_data()
304 * returns 1 - the packet is processed immediately in the net stack
305 */
306 sent = zsock_sendto(udp_sock_2, data_to_send, sizeof(data_to_send),
307 0, (struct net_sockaddr *)&sockaddr, sizeof(sockaddr));
308 zassert_equal(sent, sizeof(data_to_send), "sendto failed");
309
310 memset(&data_to_receive, 0, sizeof(data_to_receive));
311 errno = 0;
312
313 /* Check if UDP packets can be read after being sent */
314 addrlen = sizeof(sockaddr);
315 ret = zsock_recvfrom(udp_sock_1, data_to_receive, sizeof(data_to_receive),
316 0, (struct net_sockaddr *)&sockaddr, &addrlen);
317 zassert_equal(ret, sizeof(data_to_send), "Cannot receive all data (%d)",
318 -errno);
319 zassert_mem_equal(data_to_receive, data_to_send, sizeof(data_to_send),
320 "Sent and received buffers do not match");
321
322 /* And if the packet has been also passed to RAW socket */
323 memset(&data_to_receive, 0, sizeof(data_to_receive));
324 memset(&src, 0, sizeof(src));
325 addrlen = sizeof(src);
326 errno = 0;
327
328 /* The recvfrom reads the whole received packet - including its
329 * IP (20B) and UDP (8) headers. After those we can expect payload,
330 * which have been sent.
331 */
332 ret = zsock_recvfrom(packet_sock_1, data_to_receive, sizeof(data_to_receive), 0,
333 (struct net_sockaddr *)&src, &addrlen);
334 zassert_equal(ret, sizeof(data_to_send) + HDR_SIZE,
335 "Cannot receive all data (%d vs %zd) (%d)",
336 ret, sizeof(data_to_send), -errno);
337 zassert_mem_equal(&data_to_receive[HDR_SIZE], data_to_send,
338 sizeof(data_to_send),
339 "Sent and received buffers do not match");
340 }
341
ZTEST(socket_packet,test_packet_sockets)342 ZTEST(socket_packet, test_packet_sockets)
343 {
344 prepare_packet_socket(&packet_sock_1, ud.first, NET_SOCK_RAW, net_htons(ETH_P_ALL));
345 prepare_packet_socket(&packet_sock_2, ud.second, NET_SOCK_RAW, net_htons(ETH_P_ALL));
346 }
347
ZTEST(socket_packet,test_packet_sockets_dgram)348 ZTEST(socket_packet, test_packet_sockets_dgram)
349 {
350 net_socklen_t addrlen = sizeof(struct net_sockaddr_ll);
351 struct net_sockaddr_ll dst, src;
352 int ret;
353
354 prepare_packet_socket(&packet_sock_1, ud.first, NET_SOCK_DGRAM, net_htons(ETH_P_TSN));
355 prepare_packet_socket(&packet_sock_2, ud.second, NET_SOCK_DGRAM, net_htons(ETH_P_TSN));
356
357 memset(&dst, 0, sizeof(dst));
358 dst.sll_family = NET_AF_PACKET;
359 dst.sll_protocol = net_htons(ETH_P_TSN);
360 memcpy(dst.sll_addr, lladdr1, sizeof(lladdr1));
361
362 ret = zsock_sendto(packet_sock_2, test_payload, sizeof(test_payload), 0,
363 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
364 zassert_equal(ret, sizeof(test_payload), "Cannot send all data (%d)",
365 -errno);
366
367 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf), 0,
368 (struct net_sockaddr *)&src, &addrlen);
369 zassert_equal(ret, -1, "Received something (%d)", ret);
370 zassert_equal(errno, EAGAIN, "Wrong errno (%d)", errno);
371
372 memset(&src, 0, sizeof(src));
373 errno = 0;
374 ret = zsock_recvfrom(packet_sock_1, rx_buf, sizeof(rx_buf),
375 0, (struct net_sockaddr *)&src, &addrlen);
376 zassert_equal(ret, sizeof(test_payload),
377 "Cannot receive all data (%d vs %zd) (%d)",
378 ret, sizeof(test_payload), -errno);
379
380 zassert_equal(addrlen, sizeof(struct net_sockaddr_ll),
381 "Invalid address length (%d)", addrlen);
382
383 struct net_sockaddr_ll src_expected = {
384 .sll_family = NET_AF_PACKET,
385 .sll_protocol = dst.sll_protocol,
386 .sll_ifindex = net_if_get_by_iface(ud.first),
387 .sll_pkttype = NET_PACKET_OTHERHOST,
388 .sll_hatype = NET_ARPHRD_ETHER,
389 .sll_halen = sizeof(lladdr2),
390 .sll_addr = {0},
391 };
392 memcpy(&src_expected.sll_addr, lladdr2, ARRAY_SIZE(lladdr2));
393 zassert_mem_equal(&src, &src_expected, addrlen, "Invalid source address");
394
395 zassert_mem_equal(test_payload, rx_buf, sizeof(test_payload),
396 "Data mismatch");
397
398 memcpy(dst.sll_addr, lladdr2, sizeof(lladdr2));
399
400 /* Send to socket 2 but read from socket 1. There should not be any
401 * data in socket 1
402 */
403 ret = zsock_sendto(packet_sock_2, test_payload, sizeof(test_payload), 0,
404 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
405 zassert_equal(ret, sizeof(test_payload), "Cannot send all data (%d)",
406 -errno);
407
408 memset(&src, 0, sizeof(src));
409
410 ret = zsock_recvfrom(packet_sock_1, rx_buf, sizeof(rx_buf), 0,
411 (struct net_sockaddr *)&src, &addrlen);
412 zassert_equal(ret, -1, "Received something (%d)", ret);
413 zassert_equal(errno, EAGAIN, "Wrong errno (%d)", errno);
414
415 memset(&src, 0, sizeof(src));
416
417 errno = 0;
418 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf),
419 0, (struct net_sockaddr *)&src, &addrlen);
420 zassert_equal(ret, sizeof(test_payload), "Cannot receive all data (%d)",
421 -errno);
422 zassert_equal(addrlen, sizeof(struct net_sockaddr_ll),
423 "Invalid address length (%d)", addrlen);
424
425 src_expected = (struct net_sockaddr_ll){
426 .sll_family = NET_AF_PACKET,
427 .sll_protocol = dst.sll_protocol,
428 .sll_ifindex = net_if_get_by_iface(ud.second),
429 .sll_pkttype = NET_PACKET_OTHERHOST,
430 .sll_hatype = NET_ARPHRD_ETHER,
431 .sll_halen = ARRAY_SIZE(lladdr2),
432 .sll_addr = {0},
433 };
434 memcpy(&src_expected.sll_addr, lladdr2, ARRAY_SIZE(lladdr2));
435 zassert_mem_equal(&src, &src_expected, addrlen, "Invalid source address");
436
437 zassert_mem_equal(test_payload, rx_buf, sizeof(test_payload),
438 "Data mismatch");
439
440 /* Send specially crafted payload to mimic IPv4 and IPv6 length field,
441 * to ckeck correct length returned.
442 */
443 uint8_t payload_ip_length[64], receive_ip_length[64];
444
445 memset(payload_ip_length, 0, sizeof(payload_ip_length));
446 /* Set ipv4 and ipv6 length fields to represent IP payload with the
447 * length of 1 byte.
448 */
449 payload_ip_length[3] = 21;
450 payload_ip_length[5] = 1;
451
452 ret = zsock_sendto(packet_sock_2, payload_ip_length, sizeof(payload_ip_length), 0,
453 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
454 zassert_equal(ret, sizeof(payload_ip_length), "Cannot send all data (%d)", -errno);
455
456 memset(&src, 0, sizeof(src));
457 errno = 0;
458 ret = zsock_recvfrom(packet_sock_2, receive_ip_length, sizeof(receive_ip_length), 0,
459 (struct net_sockaddr *)&src, &addrlen);
460
461 zassert_equal(ret, ARRAY_SIZE(payload_ip_length), "Cannot receive all data (%d)", -errno);
462 zassert_mem_equal(payload_ip_length, receive_ip_length, sizeof(payload_ip_length),
463 "Data mismatch");
464 }
465
ZTEST(socket_packet,test_raw_and_dgram_socket_exchange)466 ZTEST(socket_packet, test_raw_and_dgram_socket_exchange)
467 {
468 net_socklen_t addrlen = sizeof(struct net_sockaddr_ll);
469 struct net_sockaddr_ll dst, src;
470 int ret;
471 const uint8_t expected_payload_raw[] = {
472 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* Dst ll addr */
473 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* Src ll addr */
474 ETH_P_IP >> 8, ETH_P_IP & 0xFF, /* EtherType */
475 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 /* Payload */
476 };
477 const uint8_t send_payload_raw[] = {
478 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* Dst ll addr */
479 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* Src ll addr */
480 ETH_P_IP >> 8, ETH_P_IP & 0xFF, /* EtherType */
481 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 /* Payload */
482 };
483
484 prepare_packet_socket(&packet_sock_1, ud.first, NET_SOCK_DGRAM, net_htons(ETH_P_ALL));
485 prepare_packet_socket(&packet_sock_2, ud.second, NET_SOCK_RAW, net_htons(ETH_P_ALL));
486
487 memset(&dst, 0, sizeof(dst));
488 dst.sll_family = NET_AF_PACKET;
489 dst.sll_protocol = net_htons(ETH_P_IP);
490 memcpy(dst.sll_addr, lladdr2, sizeof(lladdr1));
491
492 /* NET_SOCK_DGRAM to NET_SOCK_RAW */
493
494 ret = zsock_sendto(packet_sock_1, test_payload, sizeof(test_payload), 0,
495 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
496 zassert_equal(ret, sizeof(test_payload), "Cannot send all data (%d)",
497 -errno);
498
499 k_msleep(10); /* Let the packet enter the system */
500 memset(&src, 0, sizeof(src));
501
502 errno = 0;
503 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf),
504 0, (struct net_sockaddr *)&src, &addrlen);
505 zassert_equal(ret, sizeof(expected_payload_raw),
506 "Cannot receive all data (%d vs %zd) (%d)",
507 ret, sizeof(expected_payload_raw), -errno);
508 zassert_mem_equal(expected_payload_raw, rx_buf,
509 sizeof(expected_payload_raw), "Data mismatch");
510
511 memset(&dst, 0, sizeof(dst));
512 dst.sll_family = NET_AF_PACKET;
513 dst.sll_protocol = net_htons(ETH_P_IP);
514
515 /* NET_SOCK_RAW to NET_SOCK_DGRAM */
516
517 ret = zsock_sendto(packet_sock_2, send_payload_raw, sizeof(send_payload_raw), 0,
518 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
519 zassert_equal(ret, sizeof(send_payload_raw), "Cannot send all data (%d)",
520 -errno);
521
522 memset(&src, 0, sizeof(src));
523
524 errno = 0;
525 ret = zsock_recvfrom(packet_sock_1, rx_buf, sizeof(rx_buf),
526 0, (struct net_sockaddr *)&src, &addrlen);
527 zassert_equal(ret, sizeof(test_payload), "Cannot receive all data (%d)",
528 -errno);
529 zassert_mem_equal(test_payload, rx_buf, sizeof(test_payload),
530 "Data mismatch");
531 }
532
ZTEST(socket_packet,test_raw_and_dgram_socket_recv)533 ZTEST(socket_packet, test_raw_and_dgram_socket_recv)
534 {
535 net_socklen_t addrlen = sizeof(struct net_sockaddr_ll);
536 struct net_sockaddr_ll dst, src;
537 int ret;
538 const uint8_t expected_payload_raw[] = {
539 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* Dst ll addr */
540 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* Src ll addr */
541 ETH_P_IP >> 8, ETH_P_IP & 0xFF, /* EtherType */
542 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 /* Payload */
543 };
544
545 prepare_packet_socket(&packet_sock_1, ud.first, NET_SOCK_DGRAM, net_htons(ETH_P_ALL));
546 prepare_packet_socket(&packet_sock_2, ud.second, NET_SOCK_RAW, net_htons(ETH_P_ALL));
547 prepare_packet_socket(&packet_sock_3, ud.second, NET_SOCK_DGRAM, net_htons(ETH_P_ALL));
548
549 memset(&dst, 0, sizeof(dst));
550 dst.sll_family = NET_AF_PACKET;
551 dst.sll_protocol = net_htons(ETH_P_IP);
552 memcpy(dst.sll_addr, lladdr2, sizeof(lladdr1));
553
554 ret = zsock_sendto(packet_sock_1, test_payload, sizeof(test_payload), 0,
555 (const struct net_sockaddr *)&dst, sizeof(struct net_sockaddr_ll));
556 zassert_equal(ret, sizeof(test_payload), "Cannot send all data (%d)",
557 -errno);
558
559 memset(&src, 0, sizeof(src));
560
561 /* Both NET_SOCK_DGRAM to NET_SOCK_RAW sockets should receive packet. */
562
563 errno = 0;
564 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf),
565 0, (struct net_sockaddr *)&src, &addrlen);
566 zassert_equal(ret, sizeof(expected_payload_raw),
567 "Cannot receive all data (%d vs %zd) (%d)",
568 ret, sizeof(expected_payload_raw), -errno);
569
570 zassert_mem_equal(expected_payload_raw, rx_buf,
571 sizeof(expected_payload_raw), "Data mismatch");
572
573 memset(&src, 0, sizeof(src));
574
575 errno = 0;
576 ret = zsock_recvfrom(packet_sock_3, rx_buf, sizeof(rx_buf),
577 0, (struct net_sockaddr *)&src, &addrlen);
578 zassert_equal(ret, sizeof(test_payload),
579 "Cannot receive all data (%d)", -errno);
580 zassert_mem_equal(test_payload, rx_buf, sizeof(test_payload),
581 "Data mismatch");
582 }
583
584 #define TEST_IPV4_CHKSUM 0xc3f6
585 #define TEST_UDP_CHKSUM 0x8b46
586
587 /* Prepare packet with optional IP/UDP headers and optional ethernet header. */
prepare_test_packet(int sock_type,uint16_t proto,uint8_t * ll_src,uint8_t * ll_dst,uint16_t * pkt_len)588 static void prepare_test_packet(int sock_type, uint16_t proto,
589 uint8_t *ll_src, uint8_t *ll_dst,
590 uint16_t *pkt_len)
591 {
592 uint16_t offset = 0;
593
594 if (sock_type == NET_SOCK_RAW) {
595 struct net_eth_hdr *eth = (struct net_eth_hdr *)tx_buf;
596
597 offset += sizeof(struct net_eth_hdr);
598 zassert_not_null(ll_src, "NULL LL src");
599 zassert_not_null(ll_dst, "NULL LL dst");
600 zassert_true(offset <= sizeof(tx_buf), "Packet too long");
601
602 memcpy(ð->dst, ll_dst, sizeof(eth->dst));
603 memcpy(ð->src, ll_src, sizeof(eth->src));
604 eth->type = net_htons(proto);
605 }
606
607 if (proto == ETH_P_IP) {
608 struct net_in_addr addr;
609 struct net_ipv4_hdr *ipv4 =
610 (struct net_ipv4_hdr *)(tx_buf + offset);
611 struct net_udp_hdr *udp =
612 (struct net_udp_hdr *)(tx_buf + offset + NET_IPV4H_LEN);
613
614 offset += NET_IPV4UDPH_LEN;
615 zassert_true(offset <= sizeof(tx_buf), "Packet too long");
616 zassert_ok(net_addr_pton(NET_AF_INET, IPV4_ADDR, &addr), "Address parse failed");
617
618 /* Prepare IPv4 header */
619 ipv4->vhl = 0x45;
620 ipv4->len = net_htons(sizeof(test_payload) + NET_IPV4UDPH_LEN);
621 ipv4->ttl = 64;
622 ipv4->proto = NET_IPPROTO_UDP;
623 ipv4->chksum = TEST_IPV4_CHKSUM;
624 memcpy(ipv4->src, &fake_src, sizeof(ipv4->src));
625 memcpy(ipv4->dst, &addr, sizeof(ipv4->dst));
626
627 /* Prepare UDP header */
628 udp->src_port = net_htons(SRC_PORT);
629 udp->dst_port = net_htons(DST_PORT);
630 udp->len = net_htons(sizeof(test_payload) + NET_UDPH_LEN);
631 udp->chksum = TEST_UDP_CHKSUM;
632 }
633
634 zassert_true(offset + sizeof(test_payload) <= sizeof(tx_buf), "Packet too long");
635 memcpy(tx_buf + offset, test_payload, sizeof(test_payload));
636
637 offset += sizeof(test_payload);
638 *pkt_len = offset;
639 }
640
prepare_test_dst_lladdr(struct net_sockaddr_ll * ll_dst,uint16_t proto,uint8_t * ll_addr,struct net_if * iface)641 static void prepare_test_dst_lladdr(struct net_sockaddr_ll *ll_dst, uint16_t proto,
642 uint8_t *ll_addr, struct net_if *iface)
643 {
644 memset(ll_dst, 0, sizeof(struct net_sockaddr_ll));
645
646 ll_dst->sll_family = NET_AF_PACKET;
647 ll_dst->sll_protocol = net_htons(proto);
648 memcpy(ll_dst->sll_addr, ll_addr, NET_ETH_ADDR_LEN);
649
650 if (iface != NULL) {
651 ll_dst->sll_ifindex = net_if_get_by_iface(iface);
652 }
653 }
654
test_sendto_common(int sock_type,int proto,bool do_bind,int custom_dst_iface,bool set_dst_addr,bool success)655 static void test_sendto_common(int sock_type, int proto, bool do_bind,
656 int custom_dst_iface, bool set_dst_addr,
657 bool success)
658 {
659 struct net_sockaddr_in ip_src;
660 struct net_sockaddr_ll ll_dst;
661 uint16_t pkt_len;
662 int ret;
663
664 setup_packet_socket(&packet_sock_1, sock_type, net_htons(proto));
665 if (do_bind) {
666 bind_packet_socket(packet_sock_1, ud.second);
667 }
668 prepare_udp_socket(&udp_sock_1, &ip_src, DST_PORT);
669 prepare_test_packet(sock_type, ETH_P_IP, lladdr2, lladdr1, &pkt_len);
670 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr1, ud.second);
671 if (custom_dst_iface != 0) {
672 ll_dst.sll_ifindex = custom_dst_iface;
673 }
674
675 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
676 set_dst_addr ? (struct net_sockaddr *)&ll_dst : NULL,
677 set_dst_addr ? sizeof(struct net_sockaddr_ll) : 0);
678 if (success) {
679 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
680 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
681
682 ret = zsock_recv(udp_sock_1, rx_buf, sizeof(rx_buf), 0);
683 zassert_not_equal(ret, -1, "Failed to receive UDP packet (%d)", errno);
684 zassert_equal(ret, sizeof(test_payload),
685 "Invalid data size received (%d, expected %d)",
686 ret, sizeof(test_payload));
687 zassert_mem_equal(rx_buf, test_payload, sizeof(test_payload),
688 "Invalid payload received");
689 } else {
690 zassert_equal(ret, -1, "Send should fail");
691 zassert_equal(errno, EDESTADDRREQ, "Wrong errno");
692 }
693 }
694
ZTEST(socket_packet,test_raw_sock_sendto_no_proto_bound)695 ZTEST(socket_packet, test_raw_sock_sendto_no_proto_bound)
696 {
697 test_sendto_common(NET_SOCK_RAW, 0, true, 0, true, true);
698 }
699
ZTEST(socket_packet,test_raw_sock_sendto_no_proto_unbound)700 ZTEST(socket_packet, test_raw_sock_sendto_no_proto_unbound)
701 {
702 test_sendto_common(NET_SOCK_RAW, 0, false, 0, true, true);
703 }
704
ZTEST(socket_packet,test_raw_sock_sendto_no_proto_unbound_no_iface)705 ZTEST(socket_packet, test_raw_sock_sendto_no_proto_unbound_no_iface)
706 {
707 test_sendto_common(NET_SOCK_RAW, 0, false, 10, true, false);
708 }
709
ZTEST(socket_packet,test_raw_sock_sendto_no_proto_unbound_no_addr)710 ZTEST(socket_packet, test_raw_sock_sendto_no_proto_unbound_no_addr)
711 {
712 test_sendto_common(NET_SOCK_RAW, 0, false, 0, false, false);
713 }
714
test_sendmsg_common(int sock_type,int proto)715 static void test_sendmsg_common(int sock_type, int proto)
716 {
717 struct net_sockaddr_in ip_src;
718 struct net_sockaddr_ll ll_dst;
719 struct net_iovec io_vector;
720 struct net_msghdr msg = { 0 };
721 uint16_t pkt_len;
722 int ret;
723
724 setup_packet_socket(&packet_sock_1, sock_type, net_htons(proto));
725 prepare_udp_socket(&udp_sock_1, &ip_src, DST_PORT);
726 prepare_test_packet(sock_type, ETH_P_IP, lladdr2, lladdr1, &pkt_len);
727 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr1, ud.second);
728
729 io_vector.iov_base = tx_buf;
730 io_vector.iov_len = pkt_len;
731 msg.msg_iov = &io_vector;
732 msg.msg_iovlen = 1;
733 msg.msg_name = &ll_dst;
734 msg.msg_namelen = sizeof(ll_dst);
735
736 ret = zsock_sendmsg(packet_sock_1, &msg, 0);
737 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
738 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
739
740 ret = zsock_recv(udp_sock_1, rx_buf, sizeof(rx_buf), 0);
741 zassert_not_equal(ret, -1, "Failed to receive UDP packet (%d)", errno);
742 zassert_equal(ret, sizeof(test_payload),
743 "Invalid data size received (%d, expected %d)",
744 ret, sizeof(test_payload));
745 zassert_mem_equal(rx_buf, test_payload, sizeof(test_payload),
746 "Invalid payload received");
747 }
748
ZTEST(socket_packet,test_raw_sock_sendmsg_no_proto)749 ZTEST(socket_packet, test_raw_sock_sendmsg_no_proto)
750 {
751 test_sendmsg_common(NET_SOCK_RAW, 0);
752 }
753
ZTEST(socket_packet,test_dgram_sock_sendto_no_proto_bound)754 ZTEST(socket_packet, test_dgram_sock_sendto_no_proto_bound)
755 {
756 test_sendto_common(NET_SOCK_DGRAM, 0, true, 0, true, true);
757 }
758
ZTEST(socket_packet,test_dgram_sock_sendto_no_proto_unbound)759 ZTEST(socket_packet, test_dgram_sock_sendto_no_proto_unbound)
760 {
761 test_sendto_common(NET_SOCK_DGRAM, 0, false, 0, true, true);
762 }
763
ZTEST(socket_packet,test_dgram_sock_sendto_no_proto_unbound_no_iface)764 ZTEST(socket_packet, test_dgram_sock_sendto_no_proto_unbound_no_iface)
765 {
766 test_sendto_common(NET_SOCK_DGRAM, 0, false, 10, true, false);
767 }
768
ZTEST(socket_packet,test_dgram_sock_sendto_no_proto_unbound_no_addr)769 ZTEST(socket_packet, test_dgram_sock_sendto_no_proto_unbound_no_addr)
770 {
771 test_sendto_common(NET_SOCK_DGRAM, 0, false, 0, false, false);
772 }
773
ZTEST(socket_packet,test_dgram_sock_sendmsg_no_proto)774 ZTEST(socket_packet, test_dgram_sock_sendmsg_no_proto)
775 {
776 test_sendmsg_common(NET_SOCK_DGRAM, 0);
777 }
778
ZTEST(socket_packet,test_raw_sock_sendto_proto_wildcard)779 ZTEST(socket_packet, test_raw_sock_sendto_proto_wildcard)
780 {
781 test_sendto_common(NET_SOCK_RAW, ETH_P_ALL, true, 0, true, true);
782 }
783
ZTEST(socket_packet,test_raw_sock_sendmsg_proto_wildcard)784 ZTEST(socket_packet, test_raw_sock_sendmsg_proto_wildcard)
785 {
786 test_sendmsg_common(NET_SOCK_RAW, ETH_P_ALL);
787 }
788
ZTEST(socket_packet,test_dgram_sock_sendto_proto_wildcard)789 ZTEST(socket_packet, test_dgram_sock_sendto_proto_wildcard)
790 {
791 test_sendto_common(NET_SOCK_DGRAM, ETH_P_ALL, true, 0, true, true);
792 }
793
ZTEST(socket_packet,test_dgram_sock_sendto_proto_match)794 ZTEST(socket_packet, test_dgram_sock_sendto_proto_match)
795 {
796 test_sendto_common(NET_SOCK_DGRAM, ETH_P_IP, true, 0, true, true);
797 }
798
ZTEST(socket_packet,test_dgram_sock_sendmsg_proto_wildcard)799 ZTEST(socket_packet, test_dgram_sock_sendmsg_proto_wildcard)
800 {
801 test_sendmsg_common(NET_SOCK_DGRAM, ETH_P_ALL);
802 }
803
ZTEST(socket_packet,test_dgram_sock_sendmsg_proto_match)804 ZTEST(socket_packet, test_dgram_sock_sendmsg_proto_match)
805 {
806 test_sendmsg_common(NET_SOCK_DGRAM, ETH_P_IP);
807 }
808
test_recv_common(int sock_type,int proto,bool success)809 static void test_recv_common(int sock_type, int proto, bool success)
810 {
811 struct net_sockaddr_ll ll_dst;
812 uint16_t offset = 0;
813 uint16_t pkt_len;
814 int ret;
815
816 /* Transmitting sock */
817 setup_packet_socket(&packet_sock_1, NET_SOCK_RAW, 0);
818 prepare_test_packet(NET_SOCK_RAW, ETH_P_IP, lladdr2, lladdr1, &pkt_len);
819 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr1, ud.second);
820 /* Receiving sock */
821 setup_packet_socket(&packet_sock_2, sock_type, net_htons(proto));
822 bind_packet_socket(packet_sock_2, ud.first);
823
824 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
825 (struct net_sockaddr *)&ll_dst,
826 sizeof(struct net_sockaddr_ll));
827 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
828 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
829
830 if (sock_type == NET_SOCK_DGRAM) {
831 offset = sizeof(struct net_eth_hdr);
832 pkt_len -= sizeof(struct net_eth_hdr);
833 }
834
835 ret = zsock_recv(packet_sock_2, rx_buf, sizeof(rx_buf), 0);
836 if (success) {
837 zassert_not_equal(ret, -1, "Failed to receive packet (%d)", errno);
838 zassert_equal(ret, pkt_len,
839 "Invalid data size received (%d, expected %d)",
840 ret, pkt_len);
841 zassert_mem_equal(rx_buf, tx_buf + offset, pkt_len,
842 "Invalid payload received");
843 } else {
844 zassert_equal(ret, -1, "Recv should fail");
845 zassert_equal(errno, EAGAIN, "Wrong errno");
846 }
847 }
848
ZTEST(socket_packet,test_raw_sock_recv_no_proto)849 ZTEST(socket_packet, test_raw_sock_recv_no_proto)
850 {
851 test_recv_common(NET_SOCK_RAW, 0, false);
852 }
853
ZTEST(socket_packet,test_dgram_sock_recv_no_proto)854 ZTEST(socket_packet, test_dgram_sock_recv_no_proto)
855 {
856 test_recv_common(NET_SOCK_DGRAM, 0, false);
857 }
858
ZTEST(socket_packet,test_dgram_sock_recv_proto_match)859 ZTEST(socket_packet, test_dgram_sock_recv_proto_match)
860 {
861 test_recv_common(NET_SOCK_DGRAM, ETH_P_IP, true);
862 }
863
ZTEST(socket_packet,test_dgram_sock_recv_proto_mismatch)864 ZTEST(socket_packet, test_dgram_sock_recv_proto_mismatch)
865 {
866 test_recv_common(NET_SOCK_DGRAM, ETH_P_IPV6, false);
867 }
868
ZTEST(socket_packet,test_raw_sock_recv_proto_wildcard)869 ZTEST(socket_packet, test_raw_sock_recv_proto_wildcard)
870 {
871 test_recv_common(NET_SOCK_RAW, ETH_P_ALL, true);
872 }
873
validate_recvfrom_addr(struct net_sockaddr_ll * ll_rx,net_socklen_t addrlen,int iface,uint8_t * lladdr)874 static void validate_recvfrom_addr(struct net_sockaddr_ll *ll_rx, net_socklen_t addrlen,
875 int iface, uint8_t *lladdr)
876 {
877 zassert_equal(addrlen, sizeof(struct net_sockaddr_ll),
878 "Invalid address length (%u)", addrlen);
879 zassert_equal(ll_rx->sll_family, NET_AF_PACKET, "Invalid family");
880 zassert_equal(ll_rx->sll_protocol, net_htons(ETH_P_IP), "Invalid protocol");
881 zassert_equal(ll_rx->sll_ifindex, iface, "Invalid interface");
882 zassert_equal(ll_rx->sll_hatype, NET_ARPHRD_ETHER, "Invalid hardware type");
883 zassert_equal(ll_rx->sll_pkttype, NET_PACKET_OTHERHOST, "Invalid packet type");
884 zassert_equal(ll_rx->sll_halen, NET_ETH_ADDR_LEN, "Invalid address length");
885 zassert_mem_equal(ll_rx->sll_addr, lladdr, NET_ETH_ADDR_LEN, "Invalid address");
886 }
887
test_recvfrom_common(int sock_type,int proto)888 static void test_recvfrom_common(int sock_type, int proto)
889 {
890 struct net_sockaddr_ll ll_dst;
891 struct net_sockaddr_ll ll_rx = { 0 };
892 net_socklen_t addrlen = sizeof(ll_rx);
893 uint16_t pkt_len;
894 uint16_t offset = 0;
895 int ret;
896
897 /* Transmitting sock */
898 setup_packet_socket(&packet_sock_1, NET_SOCK_RAW, 0);
899 prepare_test_packet(NET_SOCK_RAW, ETH_P_IP, lladdr2, lladdr1, &pkt_len);
900 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr1, ud.second);
901 /* Receiving sock */
902 setup_packet_socket(&packet_sock_2, sock_type, net_htons(proto));
903 bind_packet_socket(packet_sock_2, ud.first);
904
905 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
906 (struct net_sockaddr *)&ll_dst,
907 sizeof(struct net_sockaddr_ll));
908 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
909 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
910
911 if (sock_type == NET_SOCK_DGRAM) {
912 offset = sizeof(struct net_eth_hdr);
913 }
914
915 pkt_len -= offset;
916
917 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf), 0,
918 (struct net_sockaddr *)&ll_rx, &addrlen);
919 zassert_not_equal(ret, -1, "Failed to receive packet (%d)", errno);
920 zassert_equal(ret, pkt_len,
921 "Invalid data size received (%d, expected %d)",
922 ret, pkt_len);
923 zassert_mem_equal(rx_buf, tx_buf + offset, pkt_len,
924 "Invalid payload received");
925 zassert_equal(addrlen, sizeof(struct net_sockaddr_ll),
926 "Invalid address length (%u)", addrlen);
927 validate_recvfrom_addr(&ll_rx, addrlen, net_if_get_by_iface(ud.first),
928 lladdr2);
929 }
930
ZTEST(socket_packet,test_raw_sock_recvfrom_proto_wildcard)931 ZTEST(socket_packet, test_raw_sock_recvfrom_proto_wildcard)
932 {
933 test_recvfrom_common(NET_SOCK_RAW, ETH_P_ALL);
934 }
935
ZTEST(socket_packet,test_dgram_sock_recv_proto_wildcard)936 ZTEST(socket_packet, test_dgram_sock_recv_proto_wildcard)
937 {
938 test_recv_common(NET_SOCK_DGRAM, ETH_P_ALL, true);
939 }
940
ZTEST(socket_packet,test_dgram_sock_recvfrom_proto_wildcard)941 ZTEST(socket_packet, test_dgram_sock_recvfrom_proto_wildcard)
942 {
943 test_recvfrom_common(NET_SOCK_DGRAM, ETH_P_ALL);
944 }
945
test_recvfrom_unbound_round(int tx_sock,int rx_sock,int sock_type,uint8_t * src_addr,struct net_if * src_iface,uint8_t * dst_addr,struct net_if * dst_iface)946 static void test_recvfrom_unbound_round(int tx_sock, int rx_sock, int sock_type,
947 uint8_t *src_addr, struct net_if *src_iface,
948 uint8_t *dst_addr, struct net_if *dst_iface)
949 {
950 uint16_t offset = (sock_type == NET_SOCK_DGRAM) ? sizeof(struct net_eth_hdr) : 0;
951 struct net_sockaddr_ll ll_dst;
952 struct net_sockaddr_ll ll_rx = { 0 };
953 net_socklen_t addrlen = sizeof(ll_rx);
954 uint16_t pkt_len;
955 int ret;
956
957 prepare_test_packet(NET_SOCK_RAW, ETH_P_IP, src_addr, dst_addr, &pkt_len);
958 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, dst_addr, src_iface);
959
960 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
961 (struct net_sockaddr *)&ll_dst,
962 sizeof(struct net_sockaddr_ll));
963 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
964 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
965
966 pkt_len -= offset;
967
968 ret = zsock_recvfrom(packet_sock_2, rx_buf, sizeof(rx_buf), 0,
969 (struct net_sockaddr *)&ll_rx, &addrlen);
970 zassert_not_equal(ret, -1, "Failed to receive packet (%d)", errno);
971 zassert_equal(ret, pkt_len,
972 "Invalid data size received (%d, expected %d)",
973 ret, pkt_len);
974 zassert_mem_equal(rx_buf, tx_buf + offset, pkt_len,
975 "Invalid payload received");
976 validate_recvfrom_addr(&ll_rx, addrlen, net_if_get_by_iface(dst_iface),
977 src_addr);
978 }
979
test_recvfrom_common_unbound(int sock_type,bool bind_iface_0)980 static void test_recvfrom_common_unbound(int sock_type, bool bind_iface_0)
981 {
982 struct net_sockaddr_ll ll_dst;
983 static uint8_t dummy_lladdr[] = { 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
984 uint16_t pkt_len;
985 int ret;
986
987 /* Transmitting sock */
988 setup_packet_socket(&packet_sock_1, NET_SOCK_RAW, 0);
989 /* Receiving sock */
990 setup_packet_socket(&packet_sock_2, sock_type, net_htons(ETH_P_ALL));
991
992 if (bind_iface_0) {
993 bind_packet_socket(packet_sock_2, NULL);
994 }
995
996 /* Verify we get packet from iface 1 */
997 test_recvfrom_unbound_round(packet_sock_1, packet_sock_2, sock_type,
998 lladdr2, ud.second, lladdr1, ud.first);
999
1000 /* Verify we get packet from iface 2 */
1001 test_recvfrom_unbound_round(packet_sock_1, packet_sock_2, sock_type,
1002 lladdr1, ud.first, lladdr2, ud.second);
1003
1004 /* Send some dummy data into the void on the "receiving" socket and make
1005 * sure it doesn't get automatically "bound" to the target iface.
1006 */
1007 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, dummy_lladdr, ud.second);
1008 prepare_test_packet(sock_type, ETH_P_IP, lladdr2, dummy_lladdr, &pkt_len);
1009 ret = zsock_sendto(packet_sock_2, tx_buf, pkt_len, 0,
1010 (struct net_sockaddr *)&ll_dst,
1011 sizeof(struct net_sockaddr_ll));
1012 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
1013 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
1014
1015 /* And try to receive again. */
1016 /* Verify we get packet from iface 1 */
1017 test_recvfrom_unbound_round(packet_sock_1, packet_sock_2, sock_type,
1018 lladdr2, ud.second, lladdr1, ud.first);
1019
1020 /* Verify we get packet from iface 2 */
1021 test_recvfrom_unbound_round(packet_sock_1, packet_sock_2, sock_type,
1022 lladdr1, ud.first, lladdr2, ud.second);
1023 }
1024
ZTEST(socket_packet,test_raw_sock_recvfrom_proto_wildcard_unbound)1025 ZTEST(socket_packet, test_raw_sock_recvfrom_proto_wildcard_unbound)
1026 {
1027 test_recvfrom_common_unbound(NET_SOCK_RAW, false);
1028 }
1029
ZTEST(socket_packet,test_dgram_sock_recvfrom_proto_wildcard_unbound)1030 ZTEST(socket_packet, test_dgram_sock_recvfrom_proto_wildcard_unbound)
1031 {
1032 test_recvfrom_common_unbound(NET_SOCK_DGRAM, false);
1033 }
1034
ZTEST(socket_packet,test_raw_sock_recvfrom_proto_wildcard_bound_iface_0)1035 ZTEST(socket_packet, test_raw_sock_recvfrom_proto_wildcard_bound_iface_0)
1036 {
1037 test_recvfrom_common_unbound(NET_SOCK_RAW, true);
1038 }
1039
ZTEST(socket_packet,test_dgram_sock_recvfrom_proto_wildcard_bound_iface_0)1040 ZTEST(socket_packet, test_dgram_sock_recvfrom_proto_wildcard_bound_iface_0)
1041 {
1042 test_recvfrom_common_unbound(NET_SOCK_DGRAM, true);
1043 }
1044
test_recv_common_bound_other_iface(int sock_type)1045 static void test_recv_common_bound_other_iface(int sock_type)
1046 {
1047 struct net_sockaddr_ll ll_dst;
1048 struct net_sockaddr_in ip_src;
1049 uint16_t pkt_len;
1050 int ret;
1051
1052 /* Transmitting sock */
1053 setup_packet_socket(&packet_sock_1, NET_SOCK_RAW, 0);
1054 prepare_test_packet(NET_SOCK_RAW, ETH_P_IP, lladdr1, lladdr2, &pkt_len);
1055 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr2, ud.first);
1056 /* Receiving sock */
1057 setup_packet_socket(&packet_sock_2, sock_type, net_htons(ETH_P_ALL));
1058 bind_packet_socket(packet_sock_2, ud.first);
1059 prepare_udp_socket(&udp_sock_1, &ip_src, DST_PORT);
1060
1061 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
1062 (struct net_sockaddr *)&ll_dst,
1063 sizeof(struct net_sockaddr_ll));
1064 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
1065 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
1066
1067 /* Packet socket should not get the packet due to different binding */
1068 ret = zsock_recv(packet_sock_2, rx_buf, sizeof(rx_buf), 0);
1069 zassert_equal(ret, -1, "Recv should fail");
1070 zassert_equal(errno, EAGAIN, "Wrong errno");
1071
1072 /* But UDP socket should get the packet just fine. */
1073 ret = zsock_recv(udp_sock_1, rx_buf, sizeof(rx_buf), 0);
1074 zassert_not_equal(ret, -1, "Failed to receive UDP packet (%d)", errno);
1075 }
1076
ZTEST(socket_packet,test_raw_sock_recv_proto_wildcard_bound_other_iface)1077 ZTEST(socket_packet, test_raw_sock_recv_proto_wildcard_bound_other_iface)
1078 {
1079 test_recv_common_bound_other_iface(NET_SOCK_RAW);
1080 }
1081
ZTEST(socket_packet,test_dgram_sock_recv_proto_wildcard_bound_other_iface)1082 ZTEST(socket_packet, test_dgram_sock_recv_proto_wildcard_bound_other_iface)
1083 {
1084 test_recv_common_bound_other_iface(NET_SOCK_DGRAM);
1085 }
1086
ZTEST(socket_packet,test_raw_dgram_udp_socks_recv)1087 ZTEST(socket_packet, test_raw_dgram_udp_socks_recv)
1088 {
1089 struct net_sockaddr_in ip_src;
1090 struct net_sockaddr_ll ll_dst;
1091 uint8_t offset = 0;
1092 uint16_t pkt_len;
1093 int ret;
1094
1095 /* Transmitting sock */
1096 setup_packet_socket(&packet_sock_1, NET_SOCK_RAW, 0);
1097 prepare_test_packet(NET_SOCK_RAW, ETH_P_IP, lladdr2, lladdr1, &pkt_len);
1098 prepare_test_dst_lladdr(&ll_dst, ETH_P_IP, lladdr1, ud.second);
1099 /* Receiving sockets */
1100 setup_packet_socket(&packet_sock_2, NET_SOCK_RAW, net_htons(ETH_P_ALL));
1101 bind_packet_socket(packet_sock_2, ud.first);
1102 setup_packet_socket(&packet_sock_3, NET_SOCK_DGRAM, net_htons(ETH_P_ALL));
1103 bind_packet_socket(packet_sock_3, ud.first);
1104 prepare_udp_socket(&udp_sock_1, &ip_src, DST_PORT);
1105
1106 ret = zsock_sendto(packet_sock_1, tx_buf, pkt_len, 0,
1107 (struct net_sockaddr *)&ll_dst,
1108 sizeof(struct net_sockaddr_ll));
1109 zassert_not_equal(ret, -1, "Failed to send (%d)", errno);
1110 zassert_equal(ret, pkt_len, "Invalid data length sent (%d/%d)", ret, pkt_len);
1111
1112 /* All 3 sockets should get their packets */
1113 ret = zsock_recv(packet_sock_2, rx_buf, sizeof(rx_buf), 0);
1114 zassert_not_equal(ret, -1, "Failed to receive RAW packet (%d)", errno);
1115 zassert_equal(ret, pkt_len, "Invalid data size received (%d, expected %d)",
1116 ret, pkt_len);
1117 zassert_mem_equal(rx_buf, tx_buf, pkt_len, "Invalid payload received");
1118
1119 offset += sizeof(struct net_eth_hdr);
1120 pkt_len -= sizeof(struct net_eth_hdr);
1121
1122 ret = zsock_recv(packet_sock_3, rx_buf, sizeof(rx_buf), 0);
1123 zassert_not_equal(ret, -1, "Failed to receive DGRAM packet (%d)", errno);
1124 zassert_equal(ret, pkt_len, "Invalid data size received (%d, expected %d)",
1125 ret, pkt_len);
1126 zassert_mem_equal(rx_buf, tx_buf + offset, pkt_len, "Invalid payload received");
1127
1128 offset += NET_IPV4UDPH_LEN;
1129 pkt_len -= NET_IPV4UDPH_LEN;
1130
1131 ret = zsock_recv(udp_sock_1, rx_buf, sizeof(rx_buf), 0);
1132 zassert_not_equal(ret, -1, "Failed to receive UDP packet (%d)", errno);
1133 zassert_equal(ret, pkt_len,
1134 "Invalid data size received (%d, expected %d)",
1135 ret, pkt_len);
1136 zassert_mem_equal(rx_buf, tx_buf + offset, pkt_len, "Invalid payload received");
1137 }
1138
test_sockets_close(void)1139 static void test_sockets_close(void)
1140 {
1141 if (packet_sock_1 >= 0) {
1142 (void)zsock_close(packet_sock_1);
1143 packet_sock_1 = -1;
1144 }
1145
1146 if (packet_sock_2 >= 0) {
1147 (void)zsock_close(packet_sock_2);
1148 packet_sock_2 = -1;
1149 }
1150
1151 if (packet_sock_3 >= 0) {
1152 (void)zsock_close(packet_sock_3);
1153 packet_sock_3 = -1;
1154 }
1155
1156 if (udp_sock_1 >= 0) {
1157 (void)zsock_close(udp_sock_1);
1158 udp_sock_1 = -1;
1159 }
1160
1161 if (udp_sock_2 >= 0) {
1162 (void)zsock_close(udp_sock_2);
1163 udp_sock_2 = -1;
1164 }
1165 }
1166
test_after(void * arg)1167 static void test_after(void *arg)
1168 {
1169 ARG_UNUSED(arg);
1170
1171 memset(&rx_buf, 0, sizeof(rx_buf));
1172 memset(&tx_buf, 0, sizeof(tx_buf));
1173
1174 test_sockets_close();
1175 }
1176
test_setup(void)1177 static void *test_setup(void)
1178 {
1179 net_if_foreach(iface_cb, &ud);
1180
1181 zassert_not_null(ud.first, "1st Ethernet interface not found");
1182 zassert_not_null(ud.second, "2nd Ethernet interface not found");
1183
1184 return NULL;
1185 }
1186
1187 ZTEST_SUITE(socket_packet, NULL, test_setup, NULL, test_after, NULL);
1188