@@ -501,6 +501,58 @@ static void test_sockmap_skb_verdict_shutdown(void)
501501 test_sockmap_pass_prog__destroy (skel );
502502}
503503
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+
504556static void test_sockmap_skb_verdict_fionread (bool pass_prog )
505557{
506558 int err , map , verdict , c0 = -1 , c1 = -1 , p0 = -1 , p1 = -1 ;
@@ -923,6 +975,8 @@ void test_sockmap_basic(void)
923975 test_sockmap_progs_query (BPF_SK_SKB_VERDICT );
924976 if (test__start_subtest ("sockmap skb_verdict shutdown" ))
925977 test_sockmap_skb_verdict_shutdown ();
978+ if (test__start_subtest ("sockmap stream parser and verdict pass" ))
979+ test_sockmap_stream_pass ();
926980 if (test__start_subtest ("sockmap skb_verdict fionread" ))
927981 test_sockmap_skb_verdict_fionread (true);
928982 if (test__start_subtest ("sockmap skb_verdict fionread on drop" ))
0 commit comments