@@ -501,6 +501,58 @@ static void test_sockmap_skb_verdict_shutdown(void)
501
501
test_sockmap_pass_prog__destroy (skel );
502
502
}
503
503
504
+ static void test_sockmap_stream_pass (void )
505
+ {
506
+ int zero = 0 , sent , recvd ;
507
+ int verdict , parser ;
508
+ int err , map ;
509
+ int c = -1 , p = -1 ;
510
+ struct test_sockmap_pass_prog * pass = NULL ;
511
+ char snd [256 ] = "0123456789" ;
512
+ char rcv [256 ] = "0" ;
513
+
514
+ pass = test_sockmap_pass_prog__open_and_load ();
515
+ verdict = bpf_program__fd (pass -> progs .prog_skb_verdict );
516
+ parser = bpf_program__fd (pass -> progs .prog_skb_parser );
517
+ map = bpf_map__fd (pass -> maps .sock_map_rx );
518
+
519
+ err = bpf_prog_attach (parser , map , BPF_SK_SKB_STREAM_PARSER , 0 );
520
+ if (!ASSERT_OK (err , "bpf_prog_attach stream parser" ))
521
+ goto out ;
522
+
523
+ err = bpf_prog_attach (verdict , map , BPF_SK_SKB_STREAM_VERDICT , 0 );
524
+ if (!ASSERT_OK (err , "bpf_prog_attach stream verdict" ))
525
+ goto out ;
526
+
527
+ err = create_pair (AF_INET , SOCK_STREAM , & c , & p );
528
+ if (err )
529
+ goto out ;
530
+
531
+ /* sk_data_ready of 'p' will be replaced by strparser handler */
532
+ err = bpf_map_update_elem (map , & zero , & p , BPF_NOEXIST );
533
+ if (!ASSERT_OK (err , "bpf_map_update_elem(p)" ))
534
+ goto out_close ;
535
+
536
+ /*
537
+ * as 'prog_skb_parser' return the original skb len and
538
+ * 'prog_skb_verdict' return SK_PASS, the kernel will just
539
+ * pass it through to original socket 'p'
540
+ */
541
+ sent = xsend (c , snd , sizeof (snd ), 0 );
542
+ ASSERT_EQ (sent , sizeof (snd ), "xsend(c)" );
543
+
544
+ recvd = recv_timeout (p , rcv , sizeof (rcv ), SOCK_NONBLOCK ,
545
+ IO_TIMEOUT_SEC );
546
+ ASSERT_EQ (recvd , sizeof (rcv ), "recv_timeout(p)" );
547
+
548
+ out_close :
549
+ close (c );
550
+ close (p );
551
+
552
+ out :
553
+ test_sockmap_pass_prog__destroy (pass );
554
+ }
555
+
504
556
static void test_sockmap_skb_verdict_fionread (bool pass_prog )
505
557
{
506
558
int err , map , verdict , c0 = -1 , c1 = -1 , p0 = -1 , p1 = -1 ;
@@ -923,6 +975,8 @@ void test_sockmap_basic(void)
923
975
test_sockmap_progs_query (BPF_SK_SKB_VERDICT );
924
976
if (test__start_subtest ("sockmap skb_verdict shutdown" ))
925
977
test_sockmap_skb_verdict_shutdown ();
978
+ if (test__start_subtest ("sockmap stream parser and verdict pass" ))
979
+ test_sockmap_stream_pass ();
926
980
if (test__start_subtest ("sockmap skb_verdict fionread" ))
927
981
test_sockmap_skb_verdict_fionread (true);
928
982
if (test__start_subtest ("sockmap skb_verdict fionread on drop" ))
0 commit comments