Skip to content

Commit 8dfb348

Browse files
borkmannKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
selftests/bpf: Extend netkit tests to validate set {head,tail}room
Extend the netkit selftests to specify and validate the {head,tail}room on the netdevice: # ./vmtest.sh -- ./test_progs -t netkit [...] ./test_progs -t netkit [ 1.174147] bpf_testmod: loading out-of-tree module taints kernel. [ 1.174585] bpf_testmod: module verification failed: signature and/or required key missing - tainting kernel [ 1.422307] tsc: Refined TSC clocksource calibration: 3407.983 MHz [ 1.424511] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fc3e5084, max_idle_ns: 440795359833 ns [ 1.428092] clocksource: Switched to clocksource tsc #363 tc_netkit_basic:OK #364 tc_netkit_device:OK #365 tc_netkit_multi_links:OK #366 tc_netkit_multi_opts:OK #367 tc_netkit_neigh_links:OK #368 tc_netkit_pkt_type:OK #369 tc_netkit_scrub:OK Summary: 7/0 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Daniel Borkmann <[email protected]> Cc: Nikolay Aleksandrov <[email protected]>
1 parent d56e097 commit 8dfb348

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

tools/testing/selftests/bpf/prog_tests/tc_netkit.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
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
@@ -35,7 +38,7 @@ struct iplink_req {
3538
};
3639

3740
static int create_netkit(int mode, int policy, int peer_policy, int *ifindex,
38-
bool same_netns, int scrub, int peer_scrub)
41+
bool same_netns, int scrub, int peer_scrub, bool room)
3942
{
4043
struct rtnl_handle rth = { .fd = -1 };
4144
struct iplink_req req = {};
@@ -63,6 +66,10 @@ static int create_netkit(int mode, int policy, int peer_policy, int *ifindex,
6366
addattr32(&req.n, sizeof(req), IFLA_NETKIT_SCRUB, scrub);
6467
addattr32(&req.n, sizeof(req), IFLA_NETKIT_PEER_SCRUB, peer_scrub);
6568
addattr32(&req.n, sizeof(req), IFLA_NETKIT_MODE, mode);
69+
if (room) {
70+
addattr16(&req.n, sizeof(req), IFLA_NETKIT_HEADROOM, NETKIT_HEADROOM);
71+
addattr16(&req.n, sizeof(req), IFLA_NETKIT_TAILROOM, NETKIT_TAILROOM);
72+
}
6673
addattr_nest_end(&req.n, data);
6774
addattr_nest_end(&req.n, linkinfo);
6875

@@ -185,7 +192,7 @@ void serial_test_tc_netkit_basic(void)
185192

186193
err = create_netkit(NETKIT_L2, NETKIT_PASS, NETKIT_PASS,
187194
&ifindex, false, NETKIT_SCRUB_DEFAULT,
188-
NETKIT_SCRUB_DEFAULT);
195+
NETKIT_SCRUB_DEFAULT, false);
189196
if (err)
190197
return;
191198

@@ -300,7 +307,7 @@ static void serial_test_tc_netkit_multi_links_target(int mode, int target)
300307

301308
err = create_netkit(mode, NETKIT_PASS, NETKIT_PASS,
302309
&ifindex, false, NETKIT_SCRUB_DEFAULT,
303-
NETKIT_SCRUB_DEFAULT);
310+
NETKIT_SCRUB_DEFAULT, false);
304311
if (err)
305312
return;
306313

@@ -429,7 +436,7 @@ static void serial_test_tc_netkit_multi_opts_target(int mode, int target)
429436

430437
err = create_netkit(mode, NETKIT_PASS, NETKIT_PASS,
431438
&ifindex, false, NETKIT_SCRUB_DEFAULT,
432-
NETKIT_SCRUB_DEFAULT);
439+
NETKIT_SCRUB_DEFAULT, false);
433440
if (err)
434441
return;
435442

@@ -544,7 +551,7 @@ void serial_test_tc_netkit_device(void)
544551

545552
err = create_netkit(NETKIT_L3, NETKIT_PASS, NETKIT_PASS,
546553
&ifindex, true, NETKIT_SCRUB_DEFAULT,
547-
NETKIT_SCRUB_DEFAULT);
554+
NETKIT_SCRUB_DEFAULT, false);
548555
if (err)
549556
return;
550557

@@ -656,7 +663,7 @@ static void serial_test_tc_netkit_neigh_links_target(int mode, int target)
656663

657664
err = create_netkit(mode, NETKIT_PASS, NETKIT_PASS,
658665
&ifindex, false, NETKIT_SCRUB_DEFAULT,
659-
NETKIT_SCRUB_DEFAULT);
666+
NETKIT_SCRUB_DEFAULT, false);
660667
if (err)
661668
return;
662669

@@ -734,7 +741,7 @@ static void serial_test_tc_netkit_pkt_type_mode(int mode)
734741

735742
err = create_netkit(mode, NETKIT_PASS, NETKIT_PASS,
736743
&ifindex, true, NETKIT_SCRUB_DEFAULT,
737-
NETKIT_SCRUB_DEFAULT);
744+
NETKIT_SCRUB_DEFAULT, false);
738745
if (err)
739746
return;
740747

@@ -799,15 +806,15 @@ void serial_test_tc_netkit_pkt_type(void)
799806
serial_test_tc_netkit_pkt_type_mode(NETKIT_L3);
800807
}
801808

802-
static void serial_test_tc_netkit_scrub_type(int scrub)
809+
static void serial_test_tc_netkit_scrub_type(int scrub, bool room)
803810
{
804811
LIBBPF_OPTS(bpf_netkit_opts, optl);
805812
struct test_tc_link *skel;
806813
struct bpf_link *link;
807814
int err, ifindex;
808815

809816
err = create_netkit(NETKIT_L2, NETKIT_PASS, NETKIT_PASS,
810-
&ifindex, false, scrub, scrub);
817+
&ifindex, false, scrub, scrub, room);
811818
if (err)
812819
return;
813820

@@ -842,6 +849,8 @@ static void serial_test_tc_netkit_scrub_type(int scrub)
842849
ASSERT_EQ(skel->bss->seen_tc8, true, "seen_tc8");
843850
ASSERT_EQ(skel->bss->mark, scrub == NETKIT_SCRUB_NONE ? MARK : 0, "mark");
844851
ASSERT_EQ(skel->bss->prio, scrub == NETKIT_SCRUB_NONE ? PRIO : 0, "prio");
852+
ASSERT_EQ(skel->bss->headroom, room ? NETKIT_HEADROOM : 0, "headroom");
853+
ASSERT_EQ(skel->bss->tailroom, room ? NETKIT_TAILROOM : 0, "tailroom");
845854
cleanup:
846855
test_tc_link__destroy(skel);
847856

@@ -852,6 +861,6 @@ static void serial_test_tc_netkit_scrub_type(int scrub)
852861

853862
void serial_test_tc_netkit_scrub(void)
854863
{
855-
serial_test_tc_netkit_scrub_type(NETKIT_SCRUB_DEFAULT);
856-
serial_test_tc_netkit_scrub_type(NETKIT_SCRUB_NONE);
864+
serial_test_tc_netkit_scrub_type(NETKIT_SCRUB_DEFAULT, false);
865+
serial_test_tc_netkit_scrub_type(NETKIT_SCRUB_NONE, true);
857866
}

tools/testing/selftests/bpf/progs/test_tc_link.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/if_packet.h>
99
#include <bpf/bpf_endian.h>
1010
#include <bpf/bpf_helpers.h>
11+
#include <bpf/bpf_core_read.h>
1112

1213
char LICENSE[] SEC("license") = "GPL";
1314

@@ -27,6 +28,7 @@ bool seen_host;
2728
bool seen_mcast;
2829

2930
int mark, prio;
31+
unsigned short headroom, tailroom;
3032

3133
SEC("tc/ingress")
3234
int tc1(struct __sk_buff *skb)
@@ -104,11 +106,24 @@ int tc7(struct __sk_buff *skb)
104106
return TCX_PASS;
105107
}
106108

109+
struct sk_buff {
110+
struct net_device *dev;
111+
};
112+
113+
struct net_device {
114+
unsigned short needed_headroom;
115+
unsigned short needed_tailroom;
116+
};
117+
107118
SEC("tc/egress")
108119
int tc8(struct __sk_buff *skb)
109120
{
121+
struct net_device *dev = BPF_CORE_READ((struct sk_buff *)skb, dev);
122+
110123
seen_tc8 = true;
111124
mark = skb->mark;
112125
prio = skb->priority;
126+
headroom = BPF_CORE_READ(dev, needed_headroom);
127+
tailroom = BPF_CORE_READ(dev, needed_tailroom);
113128
return TCX_PASS;
114129
}

0 commit comments

Comments
 (0)