@@ -938,4 +938,107 @@ ZTEST(test_utils_fn, test_ip_checksum)
938
938
}
939
939
}
940
940
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
+
941
1044
ZTEST_SUITE (test_utils_fn , NULL , NULL , NULL , NULL , NULL );
0 commit comments