@@ -2535,36 +2535,18 @@ static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog,
2535
2535
}
2536
2536
}
2537
2537
2538
- #define BPF_PROG_ATTACH_LAST_FIELD replace_bpf_fd
2539
-
2540
- #define BPF_F_ATTACH_MASK \
2541
- (BPF_F_ALLOW_OVERRIDE | BPF_F_ALLOW_MULTI | BPF_F_REPLACE)
2542
-
2543
- static int bpf_prog_attach (const union bpf_attr * attr )
2538
+ static enum bpf_prog_type
2539
+ attach_type_to_prog_type (enum bpf_attach_type attach_type )
2544
2540
{
2545
- enum bpf_prog_type ptype ;
2546
- struct bpf_prog * prog ;
2547
- int ret ;
2548
-
2549
- if (!capable (CAP_NET_ADMIN ))
2550
- return - EPERM ;
2551
-
2552
- if (CHECK_ATTR (BPF_PROG_ATTACH ))
2553
- return - EINVAL ;
2554
-
2555
- if (attr -> attach_flags & ~BPF_F_ATTACH_MASK )
2556
- return - EINVAL ;
2557
-
2558
- switch (attr -> attach_type ) {
2541
+ switch (attach_type ) {
2559
2542
case BPF_CGROUP_INET_INGRESS :
2560
2543
case BPF_CGROUP_INET_EGRESS :
2561
- ptype = BPF_PROG_TYPE_CGROUP_SKB ;
2544
+ return BPF_PROG_TYPE_CGROUP_SKB ;
2562
2545
break ;
2563
2546
case BPF_CGROUP_INET_SOCK_CREATE :
2564
2547
case BPF_CGROUP_INET4_POST_BIND :
2565
2548
case BPF_CGROUP_INET6_POST_BIND :
2566
- ptype = BPF_PROG_TYPE_CGROUP_SOCK ;
2567
- break ;
2549
+ return BPF_PROG_TYPE_CGROUP_SOCK ;
2568
2550
case BPF_CGROUP_INET4_BIND :
2569
2551
case BPF_CGROUP_INET6_BIND :
2570
2552
case BPF_CGROUP_INET4_CONNECT :
@@ -2573,37 +2555,53 @@ static int bpf_prog_attach(const union bpf_attr *attr)
2573
2555
case BPF_CGROUP_UDP6_SENDMSG :
2574
2556
case BPF_CGROUP_UDP4_RECVMSG :
2575
2557
case BPF_CGROUP_UDP6_RECVMSG :
2576
- ptype = BPF_PROG_TYPE_CGROUP_SOCK_ADDR ;
2577
- break ;
2558
+ return BPF_PROG_TYPE_CGROUP_SOCK_ADDR ;
2578
2559
case BPF_CGROUP_SOCK_OPS :
2579
- ptype = BPF_PROG_TYPE_SOCK_OPS ;
2580
- break ;
2560
+ return BPF_PROG_TYPE_SOCK_OPS ;
2581
2561
case BPF_CGROUP_DEVICE :
2582
- ptype = BPF_PROG_TYPE_CGROUP_DEVICE ;
2583
- break ;
2562
+ return BPF_PROG_TYPE_CGROUP_DEVICE ;
2584
2563
case BPF_SK_MSG_VERDICT :
2585
- ptype = BPF_PROG_TYPE_SK_MSG ;
2586
- break ;
2564
+ return BPF_PROG_TYPE_SK_MSG ;
2587
2565
case BPF_SK_SKB_STREAM_PARSER :
2588
2566
case BPF_SK_SKB_STREAM_VERDICT :
2589
- ptype = BPF_PROG_TYPE_SK_SKB ;
2590
- break ;
2567
+ return BPF_PROG_TYPE_SK_SKB ;
2591
2568
case BPF_LIRC_MODE2 :
2592
- ptype = BPF_PROG_TYPE_LIRC_MODE2 ;
2593
- break ;
2569
+ return BPF_PROG_TYPE_LIRC_MODE2 ;
2594
2570
case BPF_FLOW_DISSECTOR :
2595
- ptype = BPF_PROG_TYPE_FLOW_DISSECTOR ;
2596
- break ;
2571
+ return BPF_PROG_TYPE_FLOW_DISSECTOR ;
2597
2572
case BPF_CGROUP_SYSCTL :
2598
- ptype = BPF_PROG_TYPE_CGROUP_SYSCTL ;
2599
- break ;
2573
+ return BPF_PROG_TYPE_CGROUP_SYSCTL ;
2600
2574
case BPF_CGROUP_GETSOCKOPT :
2601
2575
case BPF_CGROUP_SETSOCKOPT :
2602
- ptype = BPF_PROG_TYPE_CGROUP_SOCKOPT ;
2603
- break ;
2576
+ return BPF_PROG_TYPE_CGROUP_SOCKOPT ;
2604
2577
default :
2605
- return - EINVAL ;
2578
+ return BPF_PROG_TYPE_UNSPEC ;
2606
2579
}
2580
+ }
2581
+
2582
+ #define BPF_PROG_ATTACH_LAST_FIELD replace_bpf_fd
2583
+
2584
+ #define BPF_F_ATTACH_MASK \
2585
+ (BPF_F_ALLOW_OVERRIDE | BPF_F_ALLOW_MULTI | BPF_F_REPLACE)
2586
+
2587
+ static int bpf_prog_attach (const union bpf_attr * attr )
2588
+ {
2589
+ enum bpf_prog_type ptype ;
2590
+ struct bpf_prog * prog ;
2591
+ int ret ;
2592
+
2593
+ if (!capable (CAP_NET_ADMIN ))
2594
+ return - EPERM ;
2595
+
2596
+ if (CHECK_ATTR (BPF_PROG_ATTACH ))
2597
+ return - EINVAL ;
2598
+
2599
+ if (attr -> attach_flags & ~BPF_F_ATTACH_MASK )
2600
+ return - EINVAL ;
2601
+
2602
+ ptype = attach_type_to_prog_type (attr -> attach_type );
2603
+ if (ptype == BPF_PROG_TYPE_UNSPEC )
2604
+ return - EINVAL ;
2607
2605
2608
2606
prog = bpf_prog_get_type (attr -> attach_bpf_fd , ptype );
2609
2607
if (IS_ERR (prog ))
@@ -2625,8 +2623,17 @@ static int bpf_prog_attach(const union bpf_attr *attr)
2625
2623
case BPF_PROG_TYPE_FLOW_DISSECTOR :
2626
2624
ret = skb_flow_dissector_bpf_prog_attach (attr , prog );
2627
2625
break ;
2628
- default :
2626
+ case BPF_PROG_TYPE_CGROUP_DEVICE :
2627
+ case BPF_PROG_TYPE_CGROUP_SKB :
2628
+ case BPF_PROG_TYPE_CGROUP_SOCK :
2629
+ case BPF_PROG_TYPE_CGROUP_SOCK_ADDR :
2630
+ case BPF_PROG_TYPE_CGROUP_SOCKOPT :
2631
+ case BPF_PROG_TYPE_CGROUP_SYSCTL :
2632
+ case BPF_PROG_TYPE_SOCK_OPS :
2629
2633
ret = cgroup_bpf_prog_attach (attr , ptype , prog );
2634
+ break ;
2635
+ default :
2636
+ ret = - EINVAL ;
2630
2637
}
2631
2638
2632
2639
if (ret )
@@ -2646,53 +2653,27 @@ static int bpf_prog_detach(const union bpf_attr *attr)
2646
2653
if (CHECK_ATTR (BPF_PROG_DETACH ))
2647
2654
return - EINVAL ;
2648
2655
2649
- switch (attr -> attach_type ) {
2650
- case BPF_CGROUP_INET_INGRESS :
2651
- case BPF_CGROUP_INET_EGRESS :
2652
- ptype = BPF_PROG_TYPE_CGROUP_SKB ;
2653
- break ;
2654
- case BPF_CGROUP_INET_SOCK_CREATE :
2655
- case BPF_CGROUP_INET4_POST_BIND :
2656
- case BPF_CGROUP_INET6_POST_BIND :
2657
- ptype = BPF_PROG_TYPE_CGROUP_SOCK ;
2658
- break ;
2659
- case BPF_CGROUP_INET4_BIND :
2660
- case BPF_CGROUP_INET6_BIND :
2661
- case BPF_CGROUP_INET4_CONNECT :
2662
- case BPF_CGROUP_INET6_CONNECT :
2663
- case BPF_CGROUP_UDP4_SENDMSG :
2664
- case BPF_CGROUP_UDP6_SENDMSG :
2665
- case BPF_CGROUP_UDP4_RECVMSG :
2666
- case BPF_CGROUP_UDP6_RECVMSG :
2667
- ptype = BPF_PROG_TYPE_CGROUP_SOCK_ADDR ;
2668
- break ;
2669
- case BPF_CGROUP_SOCK_OPS :
2670
- ptype = BPF_PROG_TYPE_SOCK_OPS ;
2671
- break ;
2672
- case BPF_CGROUP_DEVICE :
2673
- ptype = BPF_PROG_TYPE_CGROUP_DEVICE ;
2674
- break ;
2675
- case BPF_SK_MSG_VERDICT :
2676
- return sock_map_get_from_fd (attr , NULL );
2677
- case BPF_SK_SKB_STREAM_PARSER :
2678
- case BPF_SK_SKB_STREAM_VERDICT :
2656
+ ptype = attach_type_to_prog_type (attr -> attach_type );
2657
+
2658
+ switch (ptype ) {
2659
+ case BPF_PROG_TYPE_SK_MSG :
2660
+ case BPF_PROG_TYPE_SK_SKB :
2679
2661
return sock_map_get_from_fd (attr , NULL );
2680
- case BPF_LIRC_MODE2 :
2662
+ case BPF_PROG_TYPE_LIRC_MODE2 :
2681
2663
return lirc_prog_detach (attr );
2682
- case BPF_FLOW_DISSECTOR :
2664
+ case BPF_PROG_TYPE_FLOW_DISSECTOR :
2683
2665
return skb_flow_dissector_bpf_prog_detach (attr );
2684
- case BPF_CGROUP_SYSCTL :
2685
- ptype = BPF_PROG_TYPE_CGROUP_SYSCTL ;
2686
- break ;
2687
- case BPF_CGROUP_GETSOCKOPT :
2688
- case BPF_CGROUP_SETSOCKOPT :
2689
- ptype = BPF_PROG_TYPE_CGROUP_SOCKOPT ;
2690
- break ;
2666
+ case BPF_PROG_TYPE_CGROUP_DEVICE :
2667
+ case BPF_PROG_TYPE_CGROUP_SKB :
2668
+ case BPF_PROG_TYPE_CGROUP_SOCK :
2669
+ case BPF_PROG_TYPE_CGROUP_SOCK_ADDR :
2670
+ case BPF_PROG_TYPE_CGROUP_SOCKOPT :
2671
+ case BPF_PROG_TYPE_CGROUP_SYSCTL :
2672
+ case BPF_PROG_TYPE_SOCK_OPS :
2673
+ return cgroup_bpf_prog_detach (attr , ptype );
2691
2674
default :
2692
2675
return - EINVAL ;
2693
2676
}
2694
-
2695
- return cgroup_bpf_prog_detach (attr , ptype );
2696
2677
}
2697
2678
2698
2679
#define BPF_PROG_QUERY_LAST_FIELD query.prog_cnt
@@ -2726,16 +2707,14 @@ static int bpf_prog_query(const union bpf_attr *attr,
2726
2707
case BPF_CGROUP_SYSCTL :
2727
2708
case BPF_CGROUP_GETSOCKOPT :
2728
2709
case BPF_CGROUP_SETSOCKOPT :
2729
- break ;
2710
+ return cgroup_bpf_prog_query ( attr , uattr ) ;
2730
2711
case BPF_LIRC_MODE2 :
2731
2712
return lirc_prog_query (attr , uattr );
2732
2713
case BPF_FLOW_DISSECTOR :
2733
2714
return skb_flow_dissector_prog_query (attr , uattr );
2734
2715
default :
2735
2716
return - EINVAL ;
2736
2717
}
2737
-
2738
- return cgroup_bpf_prog_query (attr , uattr );
2739
2718
}
2740
2719
2741
2720
#define BPF_PROG_TEST_RUN_LAST_FIELD test.ctx_out
0 commit comments