@@ -62,6 +62,28 @@ static int attach_tc_prog(struct bpf_tc_hook *hook, int fd)
62
62
return 0 ;
63
63
}
64
64
65
+ /* The maximum permissible size is: PAGE_SIZE - sizeof(struct xdp_page_head) -
66
+ * sizeof(struct skb_shared_info) - XDP_PACKET_HEADROOM = 3368 bytes
67
+ */
68
+ #define MAX_PKT_SIZE 3368
69
+ static void test_max_pkt_size (int fd )
70
+ {
71
+ char data [MAX_PKT_SIZE + 1 ] = {};
72
+ int err ;
73
+ DECLARE_LIBBPF_OPTS (bpf_test_run_opts , opts ,
74
+ .data_in = & data ,
75
+ .data_size_in = MAX_PKT_SIZE ,
76
+ .flags = BPF_F_TEST_XDP_LIVE_FRAMES ,
77
+ .repeat = 1 ,
78
+ );
79
+ err = bpf_prog_test_run_opts (fd , & opts );
80
+ ASSERT_OK (err , "prog_run_max_size" );
81
+
82
+ opts .data_size_in += 1 ;
83
+ err = bpf_prog_test_run_opts (fd , & opts );
84
+ ASSERT_EQ (err , - EINVAL , "prog_run_too_big" );
85
+ }
86
+
65
87
#define NUM_PKTS 10000
66
88
void test_xdp_do_redirect (void )
67
89
{
@@ -167,6 +189,8 @@ void test_xdp_do_redirect(void)
167
189
ASSERT_EQ (skel -> bss -> pkts_seen_zero , 2 , "pkt_count_zero" );
168
190
ASSERT_EQ (skel -> bss -> pkts_seen_tc , NUM_PKTS - 2 , "pkt_count_tc" );
169
191
192
+ test_max_pkt_size (bpf_program__fd (skel -> progs .xdp_count_pkts ));
193
+
170
194
out_tc :
171
195
bpf_tc_hook_destroy (& tc_hook );
172
196
out :
0 commit comments