@@ -549,63 +549,117 @@ static void run_tests_skb_less(int tap_fd, struct bpf_map *keys)
549549 }
550550}
551551
552- static void test_skb_less_prog_attach ( struct bpf_flow * skel , int tap_fd )
552+ void test_flow_dissector_skb_less_direct_attach ( void )
553553{
554- int err , prog_fd ;
554+ int err , prog_fd , tap_fd ;
555+ struct bpf_flow * skel ;
556+ struct netns_obj * ns ;
557+
558+ ns = netns_new ("flow_dissector_skb_less_indirect_attach_ns" , true);
559+ if (!ASSERT_OK_PTR (ns , "create and open netns" ))
560+ return ;
561+
562+ skel = bpf_flow__open_and_load ();
563+ if (!ASSERT_OK_PTR (skel , "open/load skeleton" ))
564+ goto out_clean_ns ;
565+
566+ err = init_prog_array (skel -> obj , skel -> maps .jmp_table );
567+ if (!ASSERT_OK (err , "init_prog_array" ))
568+ goto out_destroy_skel ;
555569
556570 prog_fd = bpf_program__fd (skel -> progs ._dissect );
557571 if (!ASSERT_OK_FD (prog_fd , "bpf_program__fd" ))
558- return ;
572+ goto out_destroy_skel ;
559573
560574 err = bpf_prog_attach (prog_fd , 0 , BPF_FLOW_DISSECTOR , 0 );
561575 if (!ASSERT_OK (err , "bpf_prog_attach" ))
562- return ;
576+ goto out_destroy_skel ;
577+
578+ tap_fd = create_tap ("tap0" );
579+ if (!ASSERT_OK_FD (tap_fd , "create_tap" ))
580+ goto out_destroy_skel ;
581+ err = ifup ("tap0" );
582+ if (!ASSERT_OK (err , "ifup" ))
583+ goto out_close_tap ;
563584
564585 run_tests_skb_less (tap_fd , skel -> maps .last_dissection );
565586
566587 err = bpf_prog_detach2 (prog_fd , 0 , BPF_FLOW_DISSECTOR );
567588 ASSERT_OK (err , "bpf_prog_detach2" );
589+
590+ out_close_tap :
591+ close (tap_fd );
592+ out_destroy_skel :
593+ bpf_flow__destroy (skel );
594+ out_clean_ns :
595+ netns_free (ns );
568596}
569597
570- static void test_skb_less_link_create ( struct bpf_flow * skel , int tap_fd )
598+ void test_flow_dissector_skb_less_indirect_attach ( void )
571599{
600+ int err , net_fd , tap_fd ;
601+ struct bpf_flow * skel ;
572602 struct bpf_link * link ;
573- int err , net_fd ;
603+ struct netns_obj * ns ;
604+
605+ ns = netns_new ("flow_dissector_skb_less_indirect_attach_ns" , true);
606+ if (!ASSERT_OK_PTR (ns , "create and open netns" ))
607+ return ;
608+
609+ skel = bpf_flow__open_and_load ();
610+ if (!ASSERT_OK_PTR (skel , "open/load skeleton" ))
611+ goto out_clean_ns ;
574612
575613 net_fd = open ("/proc/self/ns/net" , O_RDONLY );
576614 if (!ASSERT_OK_FD (net_fd , "open(/proc/self/ns/net" ))
577- return ;
615+ goto out_destroy_skel ;
616+
617+ err = init_prog_array (skel -> obj , skel -> maps .jmp_table );
618+ if (!ASSERT_OK (err , "init_prog_array" ))
619+ goto out_destroy_skel ;
620+
621+ tap_fd = create_tap ("tap0" );
622+ if (!ASSERT_OK_FD (tap_fd , "create_tap" ))
623+ goto out_close_ns ;
624+ err = ifup ("tap0" );
625+ if (!ASSERT_OK (err , "ifup" ))
626+ goto out_close_tap ;
578627
579628 link = bpf_program__attach_netns (skel -> progs ._dissect , net_fd );
580629 if (!ASSERT_OK_PTR (link , "attach_netns" ))
581- goto out_close ;
630+ goto out_close_tap ;
582631
583632 run_tests_skb_less (tap_fd , skel -> maps .last_dissection );
584633
585634 err = bpf_link__destroy (link );
586635 ASSERT_OK (err , "bpf_link__destroy" );
587- out_close :
636+
637+ out_close_tap :
638+ close (tap_fd );
639+ out_close_ns :
588640 close (net_fd );
641+ out_destroy_skel :
642+ bpf_flow__destroy (skel );
643+ out_clean_ns :
644+ netns_free (ns );
589645}
590646
591- void test_flow_dissector (void )
647+ void test_flow_dissector_skb (void )
592648{
593- int i , err , prog_fd , keys_fd = -1 , tap_fd ;
594649 struct bpf_flow * skel ;
650+ int i , err , prog_fd ;
595651
596652 skel = bpf_flow__open_and_load ();
597653 if (!ASSERT_OK_PTR (skel , "open/load skeleton" ))
598654 return ;
599655
600- prog_fd = bpf_program__fd (skel -> progs ._dissect );
601- if (!ASSERT_OK_FD (prog_fd , "bpf_program__fd" ))
602- return ;
603- keys_fd = bpf_map__fd (skel -> maps .last_dissection );
604- if (!ASSERT_OK_FD (keys_fd , "bpf_map__fd" ))
605- return ;
606656 err = init_prog_array (skel -> obj , skel -> maps .jmp_table );
607657 if (!ASSERT_OK (err , "init_prog_array" ))
608- return ;
658+ goto out_destroy_skel ;
659+
660+ prog_fd = bpf_program__fd (skel -> progs ._dissect );
661+ if (!ASSERT_OK_FD (prog_fd , "bpf_program__fd" ))
662+ goto out_destroy_skel ;
609663
610664 for (i = 0 ; i < ARRAY_SIZE (tests ); i ++ ) {
611665 struct bpf_flow_keys flow_keys ;
@@ -635,24 +689,8 @@ void test_flow_dissector(void)
635689 sizeof (struct bpf_flow_keys ),
636690 "returned flow keys" );
637691 }
638- /* Do the same tests but for skb-less flow dissector.
639- * We use a known path in the net/tun driver that calls
640- * eth_get_headlen and we manually export bpf_flow_keys
641- * via BPF map in this case.
642- */
643- tap_fd = create_tap ("tap0" );
644- if (!ASSERT_OK_FD (tap_fd , "create_tap" ))
645- goto out_destroy_skel ;
646- err = ifup ("tap0" );
647- if (!ASSERT_OK (err , "ifup" ))
648- goto out_destroy_skel ;
649-
650- /* Test direct prog attachment */
651- test_skb_less_prog_attach (skel , tap_fd );
652- /* Test indirect prog attachment via link */
653- test_skb_less_link_create (skel , tap_fd );
654692
655- close (tap_fd );
656693out_destroy_skel :
657694 bpf_flow__destroy (skel );
658695}
696+
0 commit comments