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, &eth_fake_data1, NULL,
181 		    CONFIG_ETH_INIT_PRIORITY, &eth_fake_api_funcs,
182 		    NET_ETH_MTU);
183 
184 ETH_NET_DEVICE_INIT(eth_fake2, "eth_fake2", NULL, NULL, &eth_fake_data2, NULL,
185 		    CONFIG_ETH_INIT_PRIORITY, &eth_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(&eth->dst, ll_dst, sizeof(eth->dst));
603 		memcpy(&eth->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