@@ -555,6 +555,213 @@ static void test_sockmap_unconnected_unix(void)
555
555
close (dgram );
556
556
}
557
557
558
+ static void test_sockmap_many_socket (void )
559
+ {
560
+ struct test_sockmap_pass_prog * skel ;
561
+ int stream [2 ], dgram , udp , tcp ;
562
+ int i , err , map , entry = 0 ;
563
+
564
+ skel = test_sockmap_pass_prog__open_and_load ();
565
+ if (!ASSERT_OK_PTR (skel , "open_and_load" ))
566
+ return ;
567
+
568
+ map = bpf_map__fd (skel -> maps .sock_map_rx );
569
+
570
+ dgram = xsocket (AF_UNIX , SOCK_DGRAM , 0 );
571
+ if (dgram < 0 ) {
572
+ test_sockmap_pass_prog__destroy (skel );
573
+ return ;
574
+ }
575
+
576
+ tcp = connected_socket_v4 ();
577
+ if (!ASSERT_GE (tcp , 0 , "connected_socket_v4" )) {
578
+ close (dgram );
579
+ test_sockmap_pass_prog__destroy (skel );
580
+ return ;
581
+ }
582
+
583
+ udp = xsocket (AF_INET , SOCK_DGRAM | SOCK_NONBLOCK , 0 );
584
+ if (udp < 0 ) {
585
+ close (dgram );
586
+ close (tcp );
587
+ test_sockmap_pass_prog__destroy (skel );
588
+ return ;
589
+ }
590
+
591
+ err = socketpair (AF_UNIX , SOCK_STREAM , 0 , stream );
592
+ ASSERT_OK (err , "socketpair(af_unix, sock_stream)" );
593
+ if (err )
594
+ goto out ;
595
+
596
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
597
+ err = bpf_map_update_elem (map , & entry , & stream [0 ], BPF_ANY );
598
+ ASSERT_OK (err , "bpf_map_update_elem(stream)" );
599
+ }
600
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
601
+ err = bpf_map_update_elem (map , & entry , & dgram , BPF_ANY );
602
+ ASSERT_OK (err , "bpf_map_update_elem(dgram)" );
603
+ }
604
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
605
+ err = bpf_map_update_elem (map , & entry , & udp , BPF_ANY );
606
+ ASSERT_OK (err , "bpf_map_update_elem(udp)" );
607
+ }
608
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
609
+ err = bpf_map_update_elem (map , & entry , & tcp , BPF_ANY );
610
+ ASSERT_OK (err , "bpf_map_update_elem(tcp)" );
611
+ }
612
+ for (entry -- ; entry >= 0 ; entry -- ) {
613
+ err = bpf_map_delete_elem (map , & entry );
614
+ ASSERT_OK (err , "bpf_map_delete_elem(entry)" );
615
+ }
616
+
617
+ close (stream [0 ]);
618
+ close (stream [1 ]);
619
+ out :
620
+ close (dgram );
621
+ close (tcp );
622
+ close (udp );
623
+ test_sockmap_pass_prog__destroy (skel );
624
+ }
625
+
626
+ static void test_sockmap_many_maps (void )
627
+ {
628
+ struct test_sockmap_pass_prog * skel ;
629
+ int stream [2 ], dgram , udp , tcp ;
630
+ int i , err , map [2 ], entry = 0 ;
631
+
632
+ skel = test_sockmap_pass_prog__open_and_load ();
633
+ if (!ASSERT_OK_PTR (skel , "open_and_load" ))
634
+ return ;
635
+
636
+ map [0 ] = bpf_map__fd (skel -> maps .sock_map_rx );
637
+ map [1 ] = bpf_map__fd (skel -> maps .sock_map_tx );
638
+
639
+ dgram = xsocket (AF_UNIX , SOCK_DGRAM , 0 );
640
+ if (dgram < 0 ) {
641
+ test_sockmap_pass_prog__destroy (skel );
642
+ return ;
643
+ }
644
+
645
+ tcp = connected_socket_v4 ();
646
+ if (!ASSERT_GE (tcp , 0 , "connected_socket_v4" )) {
647
+ close (dgram );
648
+ test_sockmap_pass_prog__destroy (skel );
649
+ return ;
650
+ }
651
+
652
+ udp = xsocket (AF_INET , SOCK_DGRAM | SOCK_NONBLOCK , 0 );
653
+ if (udp < 0 ) {
654
+ close (dgram );
655
+ close (tcp );
656
+ test_sockmap_pass_prog__destroy (skel );
657
+ return ;
658
+ }
659
+
660
+ err = socketpair (AF_UNIX , SOCK_STREAM , 0 , stream );
661
+ ASSERT_OK (err , "socketpair(af_unix, sock_stream)" );
662
+ if (err )
663
+ goto out ;
664
+
665
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
666
+ err = bpf_map_update_elem (map [i ], & entry , & stream [0 ], BPF_ANY );
667
+ ASSERT_OK (err , "bpf_map_update_elem(stream)" );
668
+ }
669
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
670
+ err = bpf_map_update_elem (map [i ], & entry , & dgram , BPF_ANY );
671
+ ASSERT_OK (err , "bpf_map_update_elem(dgram)" );
672
+ }
673
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
674
+ err = bpf_map_update_elem (map [i ], & entry , & udp , BPF_ANY );
675
+ ASSERT_OK (err , "bpf_map_update_elem(udp)" );
676
+ }
677
+ for (i = 0 ; i < 2 ; i ++ , entry ++ ) {
678
+ err = bpf_map_update_elem (map [i ], & entry , & tcp , BPF_ANY );
679
+ ASSERT_OK (err , "bpf_map_update_elem(tcp)" );
680
+ }
681
+ for (entry -- ; entry >= 0 ; entry -- ) {
682
+ err = bpf_map_delete_elem (map [1 ], & entry );
683
+ entry -- ;
684
+ ASSERT_OK (err , "bpf_map_delete_elem(entry)" );
685
+ err = bpf_map_delete_elem (map [0 ], & entry );
686
+ ASSERT_OK (err , "bpf_map_delete_elem(entry)" );
687
+ }
688
+
689
+ close (stream [0 ]);
690
+ close (stream [1 ]);
691
+ out :
692
+ close (dgram );
693
+ close (tcp );
694
+ close (udp );
695
+ test_sockmap_pass_prog__destroy (skel );
696
+ }
697
+
698
+ static void test_sockmap_same_sock (void )
699
+ {
700
+ struct test_sockmap_pass_prog * skel ;
701
+ int stream [2 ], dgram , udp , tcp ;
702
+ int i , err , map , zero = 0 ;
703
+
704
+ skel = test_sockmap_pass_prog__open_and_load ();
705
+ if (!ASSERT_OK_PTR (skel , "open_and_load" ))
706
+ return ;
707
+
708
+ map = bpf_map__fd (skel -> maps .sock_map_rx );
709
+
710
+ dgram = xsocket (AF_UNIX , SOCK_DGRAM , 0 );
711
+ if (dgram < 0 ) {
712
+ test_sockmap_pass_prog__destroy (skel );
713
+ return ;
714
+ }
715
+
716
+ tcp = connected_socket_v4 ();
717
+ if (!ASSERT_GE (tcp , 0 , "connected_socket_v4" )) {
718
+ close (dgram );
719
+ test_sockmap_pass_prog__destroy (skel );
720
+ return ;
721
+ }
722
+
723
+ udp = xsocket (AF_INET , SOCK_DGRAM | SOCK_NONBLOCK , 0 );
724
+ if (udp < 0 ) {
725
+ close (dgram );
726
+ close (tcp );
727
+ test_sockmap_pass_prog__destroy (skel );
728
+ return ;
729
+ }
730
+
731
+ err = socketpair (AF_UNIX , SOCK_STREAM , 0 , stream );
732
+ ASSERT_OK (err , "socketpair(af_unix, sock_stream)" );
733
+ if (err )
734
+ goto out ;
735
+
736
+ for (i = 0 ; i < 2 ; i ++ ) {
737
+ err = bpf_map_update_elem (map , & zero , & stream [0 ], BPF_ANY );
738
+ ASSERT_OK (err , "bpf_map_update_elem(stream)" );
739
+ }
740
+ for (i = 0 ; i < 2 ; i ++ ) {
741
+ err = bpf_map_update_elem (map , & zero , & dgram , BPF_ANY );
742
+ ASSERT_OK (err , "bpf_map_update_elem(dgram)" );
743
+ }
744
+ for (i = 0 ; i < 2 ; i ++ ) {
745
+ err = bpf_map_update_elem (map , & zero , & udp , BPF_ANY );
746
+ ASSERT_OK (err , "bpf_map_update_elem(udp)" );
747
+ }
748
+ for (i = 0 ; i < 2 ; i ++ ) {
749
+ err = bpf_map_update_elem (map , & zero , & tcp , BPF_ANY );
750
+ ASSERT_OK (err , "bpf_map_update_elem(tcp)" );
751
+ }
752
+
753
+ err = bpf_map_delete_elem (map , & zero );
754
+ ASSERT_OK (err , "bpf_map_delete_elem(entry)" );
755
+
756
+ close (stream [0 ]);
757
+ close (stream [1 ]);
758
+ out :
759
+ close (dgram );
760
+ close (tcp );
761
+ close (udp );
762
+ test_sockmap_pass_prog__destroy (skel );
763
+ }
764
+
558
765
void test_sockmap_basic (void )
559
766
{
560
767
if (test__start_subtest ("sockmap create_update_free" ))
@@ -597,7 +804,12 @@ void test_sockmap_basic(void)
597
804
test_sockmap_skb_verdict_fionread (false);
598
805
if (test__start_subtest ("sockmap skb_verdict msg_f_peek" ))
599
806
test_sockmap_skb_verdict_peek ();
600
-
601
807
if (test__start_subtest ("sockmap unconnected af_unix" ))
602
808
test_sockmap_unconnected_unix ();
809
+ if (test__start_subtest ("sockmap one socket to many map entries" ))
810
+ test_sockmap_many_socket ();
811
+ if (test__start_subtest ("sockmap one socket to many maps" ))
812
+ test_sockmap_many_maps ();
813
+ if (test__start_subtest ("sockmap same socket replace" ))
814
+ test_sockmap_same_sock ();
603
815
}
0 commit comments