Skip to content

Commit fedd815

Browse files
jukkarkartben
authored andcommitted
tests: net: utils: Verify src and dst link addresses
Make sure that source and destination link addresses are correct after cloning and pulling net_pkt. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
1 parent 06847b5 commit fedd815

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

tests/net/utils/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ CONFIG_NET_UDP=y
1717
CONFIG_ZTEST=y
1818
CONFIG_MAIN_STACK_SIZE=1280
1919
CONFIG_TEST_USERSPACE=y
20+
CONFIG_NET_LOOPBACK=y
21+
CONFIG_NET_DRIVERS=y

tests/net/utils/src/main.c

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,4 +938,107 @@ ZTEST(test_utils_fn, test_ip_checksum)
938938
}
939939
}
940940

941+
/* Verify that the net_pkt pointer to the received link layer address
942+
* is correct.
943+
*/
944+
ZTEST(test_utils_fn, test_linkaddr_handling)
945+
{
946+
/* A simple Ethernet frame with IPv4 and UDP headers */
947+
static const uint8_t udp[] = {
948+
0x18, 0xfd, 0x74, 0x09, 0xcb, 0x62, 0xac, 0x91, /* 0000 */
949+
0xa1, 0x8f, 0x9d, 0xf8, 0x08, 0x00, 0x45, 0x00, /* 0008 */
950+
0x00, 0x4c, 0x48, 0x8e, 0x00, 0x00, 0x40, 0x11, /* 0010 */
951+
0x57, 0x34, 0xc0, 0xa8, 0x58, 0x29, 0xc1, 0xe5, /* 0018 */
952+
0x00, 0x28, 0xba, 0xf0, 0x00, 0x35, 0x00, 0x38, /* 0020 */
953+
0xdb, 0x28,
954+
};
955+
956+
/* Create net_pkt from the above data, then check the link layer
957+
* addresses are properly set even if we pull the data like how
958+
* the network stack would do in ethernet.c
959+
*/
960+
const uint8_t *dst = &udp[0];
961+
const uint8_t *src = &udp[NET_ETH_ADDR_LEN];
962+
uint8_t hdr_len = sizeof(struct net_eth_hdr);
963+
struct net_linkaddr *lladdr;
964+
struct net_eth_hdr *hdr;
965+
struct net_pkt *pkt, *pkt2;
966+
int ret;
967+
968+
pkt = net_pkt_rx_alloc_with_buffer(net_if_get_default(),
969+
sizeof(udp), AF_UNSPEC,
970+
0, K_NO_WAIT);
971+
zassert_not_null(pkt, "Cannot allocate pkt");
972+
973+
ret = net_pkt_write(pkt, udp, sizeof(udp));
974+
zassert_equal(ret, 0, "Cannot write data to pkt");
975+
976+
hdr = NET_ETH_HDR(pkt);
977+
978+
/* Set the pointers to ll src and dst addresses */
979+
lladdr = net_pkt_lladdr_src(pkt);
980+
memcpy(lladdr->addr, hdr->src.addr, sizeof(struct net_eth_addr));
981+
lladdr->len = sizeof(struct net_eth_addr);
982+
lladdr->type = NET_LINK_ETHERNET;
983+
984+
lladdr = net_pkt_lladdr_dst(pkt);
985+
memcpy(lladdr->addr, hdr->dst.addr, sizeof(struct net_eth_addr));
986+
lladdr->len = sizeof(struct net_eth_addr);
987+
lladdr->type = NET_LINK_ETHERNET;
988+
989+
zassert_mem_equal(net_pkt_lladdr_src(pkt)->addr,
990+
src, NET_ETH_ADDR_LEN,
991+
"Source address mismatch");
992+
zassert_mem_equal(net_pkt_lladdr_dst(pkt)->addr,
993+
dst, NET_ETH_ADDR_LEN,
994+
"Destination address mismatch");
995+
996+
pkt2 = net_pkt_clone(pkt, K_NO_WAIT);
997+
zassert_not_null(pkt2, "Cannot clone pkt");
998+
999+
/* Make sure we still point to the correct addresses after cloning */
1000+
zassert_mem_equal(net_pkt_lladdr_src(pkt2)->addr,
1001+
src, NET_ETH_ADDR_LEN,
1002+
"Source address mismatch");
1003+
zassert_mem_equal(net_pkt_lladdr_dst(pkt2)->addr,
1004+
dst, NET_ETH_ADDR_LEN,
1005+
"Destination address mismatch");
1006+
1007+
net_pkt_unref(pkt2);
1008+
1009+
/* Get rid of the Ethernet header. */
1010+
net_buf_pull(pkt->frags, hdr_len);
1011+
1012+
/* Make sure we still point to the correct addresses after pulling
1013+
* the Ethernet header.
1014+
*/
1015+
zassert_mem_equal(net_pkt_lladdr_src(pkt)->addr,
1016+
src, NET_ETH_ADDR_LEN,
1017+
"Source address mismatch");
1018+
zassert_mem_equal(net_pkt_lladdr_dst(pkt)->addr,
1019+
dst, NET_ETH_ADDR_LEN,
1020+
"Destination address mismatch");
1021+
1022+
/* Clone the packet and check that the link layer addresses are
1023+
* still correct.
1024+
*/
1025+
1026+
pkt2 = net_pkt_clone(pkt, K_NO_WAIT);
1027+
zassert_not_null(pkt2, "Cannot clone pkt");
1028+
1029+
zassert_not_equal(net_pkt_lladdr_src(pkt2)->addr,
1030+
net_pkt_lladdr_src(pkt)->addr,
1031+
"Source address should not be the same");
1032+
1033+
zassert_mem_equal(net_pkt_lladdr_src(pkt2)->addr,
1034+
src, NET_ETH_ADDR_LEN,
1035+
"Source address mismatch");
1036+
zassert_mem_equal(net_pkt_lladdr_dst(pkt2)->addr,
1037+
dst, NET_ETH_ADDR_LEN,
1038+
"Destination address mismatch");
1039+
1040+
net_pkt_unref(pkt);
1041+
net_pkt_unref(pkt2);
1042+
}
1043+
9411044
ZTEST_SUITE(test_utils_fn, NULL, NULL, NULL, NULL, NULL);

0 commit comments

Comments
 (0)