@@ -974,6 +974,90 @@ static void test_net_pkt_get_contiguous_len(void)
974
974
net_pkt_unref (pkt );
975
975
}
976
976
977
+ void test_net_pkt_remove_tail (void )
978
+ {
979
+ struct net_pkt * pkt ;
980
+ int err ;
981
+
982
+ pkt = net_pkt_alloc_with_buffer (NULL ,
983
+ CONFIG_NET_BUF_DATA_SIZE * 2 + 3 ,
984
+ AF_UNSPEC , 0 , K_NO_WAIT );
985
+ zassert_true (pkt != NULL , "Pkt not allocated" );
986
+
987
+ net_pkt_cursor_init (pkt );
988
+ net_pkt_write (pkt , small_buffer , CONFIG_NET_BUF_DATA_SIZE * 2 + 3 );
989
+
990
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE * 2 + 3 ,
991
+ "Pkt length is invalid" );
992
+ zassert_equal (pkt -> frags -> frags -> frags -> len , 3 ,
993
+ "3rd buffer length is invalid" );
994
+
995
+ /* Remove some bytes from last buffer */
996
+ err = net_pkt_remove_tail (pkt , 2 );
997
+ zassert_equal (err , 0 , "Failed to remove tail" );
998
+
999
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE * 2 + 1 ,
1000
+ "Pkt length is invalid" );
1001
+ zassert_not_equal (pkt -> frags -> frags -> frags , NULL ,
1002
+ "3rd buffer was removed" );
1003
+ zassert_equal (pkt -> frags -> frags -> frags -> len , 1 ,
1004
+ "3rd buffer length is invalid" );
1005
+
1006
+ /* Remove last byte from last buffer */
1007
+ err = net_pkt_remove_tail (pkt , 1 );
1008
+ zassert_equal (err , 0 , "Failed to remove tail" );
1009
+
1010
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE * 2 ,
1011
+ "Pkt length is invalid" );
1012
+ zassert_equal (pkt -> frags -> frags -> frags , NULL ,
1013
+ "3rd buffer was not removed" );
1014
+ zassert_equal (pkt -> frags -> frags -> len , CONFIG_NET_BUF_DATA_SIZE ,
1015
+ "2nd buffer length is invalid" );
1016
+
1017
+ /* Remove 2nd buffer and one byte from 1st buffer */
1018
+ err = net_pkt_remove_tail (pkt , CONFIG_NET_BUF_DATA_SIZE + 1 );
1019
+ zassert_equal (err , 0 , "Failed to remove tail" );
1020
+
1021
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE - 1 ,
1022
+ "Pkt length is invalid" );
1023
+ zassert_equal (pkt -> frags -> frags , NULL ,
1024
+ "2nd buffer was not removed" );
1025
+ zassert_equal (pkt -> frags -> len , CONFIG_NET_BUF_DATA_SIZE - 1 ,
1026
+ "1st buffer length is invalid" );
1027
+
1028
+ net_pkt_unref (pkt );
1029
+
1030
+ pkt = net_pkt_rx_alloc_with_buffer (NULL ,
1031
+ CONFIG_NET_BUF_DATA_SIZE * 2 + 3 ,
1032
+ AF_UNSPEC , 0 , K_NO_WAIT );
1033
+
1034
+ net_pkt_cursor_init (pkt );
1035
+ net_pkt_write (pkt , small_buffer , CONFIG_NET_BUF_DATA_SIZE * 2 + 3 );
1036
+
1037
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE * 2 + 3 ,
1038
+ "Pkt length is invalid" );
1039
+ zassert_equal (pkt -> frags -> frags -> frags -> len , 3 ,
1040
+ "3rd buffer length is invalid" );
1041
+
1042
+ /* Remove bytes spanning 3 buffers */
1043
+ err = net_pkt_remove_tail (pkt , CONFIG_NET_BUF_DATA_SIZE + 5 );
1044
+ zassert_equal (err , 0 , "Failed to remove tail" );
1045
+
1046
+ zassert_equal (net_pkt_get_len (pkt ), CONFIG_NET_BUF_DATA_SIZE - 2 ,
1047
+ "Pkt length is invalid" );
1048
+ zassert_equal (pkt -> frags -> frags , NULL ,
1049
+ "2nd buffer was not removed" );
1050
+ zassert_equal (pkt -> frags -> len , CONFIG_NET_BUF_DATA_SIZE - 2 ,
1051
+ "1st buffer length is invalid" );
1052
+
1053
+ /* Try to remove more bytes than packet has */
1054
+ err = net_pkt_remove_tail (pkt , CONFIG_NET_BUF_DATA_SIZE );
1055
+ zassert_equal (err , - EINVAL ,
1056
+ "Removing more bytes than available should fail" );
1057
+
1058
+ net_pkt_unref (pkt );
1059
+ }
1060
+
977
1061
void test_main (void )
978
1062
{
979
1063
eth_if = net_if_get_default ();
@@ -989,7 +1073,8 @@ void test_main(void)
989
1073
ztest_unit_test (test_net_pkt_clone ),
990
1074
ztest_unit_test (test_net_pkt_headroom ),
991
1075
ztest_unit_test (test_net_pkt_headroom_copy ),
992
- ztest_unit_test (test_net_pkt_get_contiguous_len )
1076
+ ztest_unit_test (test_net_pkt_get_contiguous_len ),
1077
+ ztest_unit_test (test_net_pkt_remove_tail )
993
1078
);
994
1079
995
1080
ztest_run_test_suite (net_pkt_tests );
0 commit comments