1414#include "netlink_helpers.h"
1515#include "tc_helpers.h"
1616
17+ #define NETKIT_HEADROOM 32
18+ #define NETKIT_TAILROOM 8
19+
1720#define MARK 42
1821#define PRIO 0xeb9f
1922#define ICMP_ECHO 8
2023
24+ #define FLAG_ADJUST_ROOM (1 << 0)
25+ #define FLAG_SAME_NETNS (1 << 1)
26+
2127struct icmphdr {
2228 __u8 type ;
2329 __u8 code ;
@@ -35,7 +41,7 @@ struct iplink_req {
3541};
3642
3743static int create_netkit (int mode , int policy , int peer_policy , int * ifindex ,
38- bool same_netns , int scrub , int peer_scrub )
44+ int scrub , int peer_scrub , __u32 flags )
3945{
4046 struct rtnl_handle rth = { .fd = -1 };
4147 struct iplink_req req = {};
@@ -63,6 +69,10 @@ static int create_netkit(int mode, int policy, int peer_policy, int *ifindex,
6369 addattr32 (& req .n , sizeof (req ), IFLA_NETKIT_SCRUB , scrub );
6470 addattr32 (& req .n , sizeof (req ), IFLA_NETKIT_PEER_SCRUB , peer_scrub );
6571 addattr32 (& req .n , sizeof (req ), IFLA_NETKIT_MODE , mode );
72+ if (flags & FLAG_ADJUST_ROOM ) {
73+ addattr16 (& req .n , sizeof (req ), IFLA_NETKIT_HEADROOM , NETKIT_HEADROOM );
74+ addattr16 (& req .n , sizeof (req ), IFLA_NETKIT_TAILROOM , NETKIT_TAILROOM );
75+ }
6676 addattr_nest_end (& req .n , data );
6777 addattr_nest_end (& req .n , linkinfo );
6878
@@ -87,7 +97,7 @@ static int create_netkit(int mode, int policy, int peer_policy, int *ifindex,
8797 " addr ee:ff:bb:cc:aa:dd" ),
8898 "set hwaddress" );
8999 }
90- if (same_netns ) {
100+ if (flags & FLAG_SAME_NETNS ) {
91101 ASSERT_OK (system ("ip link set dev " netkit_peer " up" ),
92102 "up peer" );
93103 ASSERT_OK (system ("ip addr add dev " netkit_peer " 10.0.0.2/24" ),
@@ -184,8 +194,8 @@ void serial_test_tc_netkit_basic(void)
184194 int err , ifindex ;
185195
186196 err = create_netkit (NETKIT_L2 , NETKIT_PASS , NETKIT_PASS ,
187- & ifindex , false, NETKIT_SCRUB_DEFAULT ,
188- NETKIT_SCRUB_DEFAULT );
197+ & ifindex , NETKIT_SCRUB_DEFAULT ,
198+ NETKIT_SCRUB_DEFAULT , 0 );
189199 if (err )
190200 return ;
191201
@@ -299,8 +309,8 @@ static void serial_test_tc_netkit_multi_links_target(int mode, int target)
299309 int err , ifindex ;
300310
301311 err = create_netkit (mode , NETKIT_PASS , NETKIT_PASS ,
302- & ifindex , false, NETKIT_SCRUB_DEFAULT ,
303- NETKIT_SCRUB_DEFAULT );
312+ & ifindex , NETKIT_SCRUB_DEFAULT ,
313+ NETKIT_SCRUB_DEFAULT , 0 );
304314 if (err )
305315 return ;
306316
@@ -428,8 +438,8 @@ static void serial_test_tc_netkit_multi_opts_target(int mode, int target)
428438 int err , ifindex ;
429439
430440 err = create_netkit (mode , NETKIT_PASS , NETKIT_PASS ,
431- & ifindex , false, NETKIT_SCRUB_DEFAULT ,
432- NETKIT_SCRUB_DEFAULT );
441+ & ifindex , NETKIT_SCRUB_DEFAULT ,
442+ NETKIT_SCRUB_DEFAULT , 0 );
433443 if (err )
434444 return ;
435445
@@ -543,8 +553,8 @@ void serial_test_tc_netkit_device(void)
543553 int err , ifindex , ifindex2 ;
544554
545555 err = create_netkit (NETKIT_L3 , NETKIT_PASS , NETKIT_PASS ,
546- & ifindex , true, NETKIT_SCRUB_DEFAULT ,
547- NETKIT_SCRUB_DEFAULT );
556+ & ifindex , NETKIT_SCRUB_DEFAULT ,
557+ NETKIT_SCRUB_DEFAULT , FLAG_SAME_NETNS );
548558 if (err )
549559 return ;
550560
@@ -655,8 +665,8 @@ static void serial_test_tc_netkit_neigh_links_target(int mode, int target)
655665 int err , ifindex ;
656666
657667 err = create_netkit (mode , NETKIT_PASS , NETKIT_PASS ,
658- & ifindex , false, NETKIT_SCRUB_DEFAULT ,
659- NETKIT_SCRUB_DEFAULT );
668+ & ifindex , NETKIT_SCRUB_DEFAULT ,
669+ NETKIT_SCRUB_DEFAULT , 0 );
660670 if (err )
661671 return ;
662672
@@ -733,8 +743,8 @@ static void serial_test_tc_netkit_pkt_type_mode(int mode)
733743 struct bpf_link * link ;
734744
735745 err = create_netkit (mode , NETKIT_PASS , NETKIT_PASS ,
736- & ifindex , true, NETKIT_SCRUB_DEFAULT ,
737- NETKIT_SCRUB_DEFAULT );
746+ & ifindex , NETKIT_SCRUB_DEFAULT ,
747+ NETKIT_SCRUB_DEFAULT , FLAG_SAME_NETNS );
738748 if (err )
739749 return ;
740750
@@ -799,15 +809,16 @@ void serial_test_tc_netkit_pkt_type(void)
799809 serial_test_tc_netkit_pkt_type_mode (NETKIT_L3 );
800810}
801811
802- static void serial_test_tc_netkit_scrub_type (int scrub )
812+ static void serial_test_tc_netkit_scrub_type (int scrub , bool room )
803813{
804814 LIBBPF_OPTS (bpf_netkit_opts , optl );
805815 struct test_tc_link * skel ;
806816 struct bpf_link * link ;
807817 int err , ifindex ;
808818
809819 err = create_netkit (NETKIT_L2 , NETKIT_PASS , NETKIT_PASS ,
810- & ifindex , false, scrub , scrub );
820+ & ifindex , scrub , scrub ,
821+ room ? FLAG_ADJUST_ROOM : 0 );
811822 if (err )
812823 return ;
813824
@@ -842,6 +853,8 @@ static void serial_test_tc_netkit_scrub_type(int scrub)
842853 ASSERT_EQ (skel -> bss -> seen_tc8 , true, "seen_tc8" );
843854 ASSERT_EQ (skel -> bss -> mark , scrub == NETKIT_SCRUB_NONE ? MARK : 0 , "mark" );
844855 ASSERT_EQ (skel -> bss -> prio , scrub == NETKIT_SCRUB_NONE ? PRIO : 0 , "prio" );
856+ ASSERT_EQ (skel -> bss -> headroom , room ? NETKIT_HEADROOM : 0 , "headroom" );
857+ ASSERT_EQ (skel -> bss -> tailroom , room ? NETKIT_TAILROOM : 0 , "tailroom" );
845858cleanup :
846859 test_tc_link__destroy (skel );
847860
@@ -852,6 +865,6 @@ static void serial_test_tc_netkit_scrub_type(int scrub)
852865
853866void serial_test_tc_netkit_scrub (void )
854867{
855- serial_test_tc_netkit_scrub_type (NETKIT_SCRUB_DEFAULT );
856- serial_test_tc_netkit_scrub_type (NETKIT_SCRUB_NONE );
868+ serial_test_tc_netkit_scrub_type (NETKIT_SCRUB_DEFAULT , false );
869+ serial_test_tc_netkit_scrub_type (NETKIT_SCRUB_NONE , true );
857870}
0 commit comments