Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

bpf: Factor out attach_type to prog_type mapping for attach/detach

Factor out logic mapping expected program attach type to program type and
subsequent handling of program attach/detach. Also list out all supported
cgroup BPF program types explicitly to prevent accidental bugs once more
program types are added to a mapping. Do the same for prog_query API.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200325065746.640559-3-andriin@fb.com

authored by

Andrii Nakryiko and committed by
Alexei Starovoitov
e28784e3 00c4eddf

+72 -93
+72 -93
kernel/bpf/syscall.c
··· 2535 2535 } 2536 2536 } 2537 2537 2538 + static enum bpf_prog_type 2539 + attach_type_to_prog_type(enum bpf_attach_type attach_type) 2540 + { 2541 + switch (attach_type) { 2542 + case BPF_CGROUP_INET_INGRESS: 2543 + case BPF_CGROUP_INET_EGRESS: 2544 + return BPF_PROG_TYPE_CGROUP_SKB; 2545 + break; 2546 + case BPF_CGROUP_INET_SOCK_CREATE: 2547 + case BPF_CGROUP_INET4_POST_BIND: 2548 + case BPF_CGROUP_INET6_POST_BIND: 2549 + return BPF_PROG_TYPE_CGROUP_SOCK; 2550 + case BPF_CGROUP_INET4_BIND: 2551 + case BPF_CGROUP_INET6_BIND: 2552 + case BPF_CGROUP_INET4_CONNECT: 2553 + case BPF_CGROUP_INET6_CONNECT: 2554 + case BPF_CGROUP_UDP4_SENDMSG: 2555 + case BPF_CGROUP_UDP6_SENDMSG: 2556 + case BPF_CGROUP_UDP4_RECVMSG: 2557 + case BPF_CGROUP_UDP6_RECVMSG: 2558 + return BPF_PROG_TYPE_CGROUP_SOCK_ADDR; 2559 + case BPF_CGROUP_SOCK_OPS: 2560 + return BPF_PROG_TYPE_SOCK_OPS; 2561 + case BPF_CGROUP_DEVICE: 2562 + return BPF_PROG_TYPE_CGROUP_DEVICE; 2563 + case BPF_SK_MSG_VERDICT: 2564 + return BPF_PROG_TYPE_SK_MSG; 2565 + case BPF_SK_SKB_STREAM_PARSER: 2566 + case BPF_SK_SKB_STREAM_VERDICT: 2567 + return BPF_PROG_TYPE_SK_SKB; 2568 + case BPF_LIRC_MODE2: 2569 + return BPF_PROG_TYPE_LIRC_MODE2; 2570 + case BPF_FLOW_DISSECTOR: 2571 + return BPF_PROG_TYPE_FLOW_DISSECTOR; 2572 + case BPF_CGROUP_SYSCTL: 2573 + return BPF_PROG_TYPE_CGROUP_SYSCTL; 2574 + case BPF_CGROUP_GETSOCKOPT: 2575 + case BPF_CGROUP_SETSOCKOPT: 2576 + return BPF_PROG_TYPE_CGROUP_SOCKOPT; 2577 + default: 2578 + return BPF_PROG_TYPE_UNSPEC; 2579 + } 2580 + } 2581 + 2538 2582 #define BPF_PROG_ATTACH_LAST_FIELD replace_bpf_fd 2539 2583 2540 2584 #define BPF_F_ATTACH_MASK \ ··· 2599 2555 if (attr->attach_flags & ~BPF_F_ATTACH_MASK) 2600 2556 return -EINVAL; 2601 2557 2602 - switch (attr->attach_type) { 2603 - case BPF_CGROUP_INET_INGRESS: 2604 - case BPF_CGROUP_INET_EGRESS: 2605 - ptype = BPF_PROG_TYPE_CGROUP_SKB; 2606 - break; 2607 - case BPF_CGROUP_INET_SOCK_CREATE: 2608 - case BPF_CGROUP_INET4_POST_BIND: 2609 - case BPF_CGROUP_INET6_POST_BIND: 2610 - ptype = BPF_PROG_TYPE_CGROUP_SOCK; 2611 - break; 2612 - case BPF_CGROUP_INET4_BIND: 2613 - case BPF_CGROUP_INET6_BIND: 2614 - case BPF_CGROUP_INET4_CONNECT: 2615 - case BPF_CGROUP_INET6_CONNECT: 2616 - case BPF_CGROUP_UDP4_SENDMSG: 2617 - case BPF_CGROUP_UDP6_SENDMSG: 2618 - case BPF_CGROUP_UDP4_RECVMSG: 2619 - case BPF_CGROUP_UDP6_RECVMSG: 2620 - ptype = BPF_PROG_TYPE_CGROUP_SOCK_ADDR; 2621 - break; 2622 - case BPF_CGROUP_SOCK_OPS: 2623 - ptype = BPF_PROG_TYPE_SOCK_OPS; 2624 - break; 2625 - case BPF_CGROUP_DEVICE: 2626 - ptype = BPF_PROG_TYPE_CGROUP_DEVICE; 2627 - break; 2628 - case BPF_SK_MSG_VERDICT: 2629 - ptype = BPF_PROG_TYPE_SK_MSG; 2630 - break; 2631 - case BPF_SK_SKB_STREAM_PARSER: 2632 - case BPF_SK_SKB_STREAM_VERDICT: 2633 - ptype = BPF_PROG_TYPE_SK_SKB; 2634 - break; 2635 - case BPF_LIRC_MODE2: 2636 - ptype = BPF_PROG_TYPE_LIRC_MODE2; 2637 - break; 2638 - case BPF_FLOW_DISSECTOR: 2639 - ptype = BPF_PROG_TYPE_FLOW_DISSECTOR; 2640 - break; 2641 - case BPF_CGROUP_SYSCTL: 2642 - ptype = BPF_PROG_TYPE_CGROUP_SYSCTL; 2643 - break; 2644 - case BPF_CGROUP_GETSOCKOPT: 2645 - case BPF_CGROUP_SETSOCKOPT: 2646 - ptype = BPF_PROG_TYPE_CGROUP_SOCKOPT; 2647 - break; 2648 - default: 2558 + ptype = attach_type_to_prog_type(attr->attach_type); 2559 + if (ptype == BPF_PROG_TYPE_UNSPEC) 2649 2560 return -EINVAL; 2650 - } 2651 2561 2652 2562 prog = bpf_prog_get_type(attr->attach_bpf_fd, ptype); 2653 2563 if (IS_ERR(prog)) ··· 2623 2625 case BPF_PROG_TYPE_FLOW_DISSECTOR: 2624 2626 ret = skb_flow_dissector_bpf_prog_attach(attr, prog); 2625 2627 break; 2626 - default: 2628 + case BPF_PROG_TYPE_CGROUP_DEVICE: 2629 + case BPF_PROG_TYPE_CGROUP_SKB: 2630 + case BPF_PROG_TYPE_CGROUP_SOCK: 2631 + case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: 2632 + case BPF_PROG_TYPE_CGROUP_SOCKOPT: 2633 + case BPF_PROG_TYPE_CGROUP_SYSCTL: 2634 + case BPF_PROG_TYPE_SOCK_OPS: 2627 2635 ret = cgroup_bpf_prog_attach(attr, ptype, prog); 2636 + break; 2637 + default: 2638 + ret = -EINVAL; 2628 2639 } 2629 2640 2630 2641 if (ret) ··· 2653 2646 if (CHECK_ATTR(BPF_PROG_DETACH)) 2654 2647 return -EINVAL; 2655 2648 2656 - switch (attr->attach_type) { 2657 - case BPF_CGROUP_INET_INGRESS: 2658 - case BPF_CGROUP_INET_EGRESS: 2659 - ptype = BPF_PROG_TYPE_CGROUP_SKB; 2660 - break; 2661 - case BPF_CGROUP_INET_SOCK_CREATE: 2662 - case BPF_CGROUP_INET4_POST_BIND: 2663 - case BPF_CGROUP_INET6_POST_BIND: 2664 - ptype = BPF_PROG_TYPE_CGROUP_SOCK; 2665 - break; 2666 - case BPF_CGROUP_INET4_BIND: 2667 - case BPF_CGROUP_INET6_BIND: 2668 - case BPF_CGROUP_INET4_CONNECT: 2669 - case BPF_CGROUP_INET6_CONNECT: 2670 - case BPF_CGROUP_UDP4_SENDMSG: 2671 - case BPF_CGROUP_UDP6_SENDMSG: 2672 - case BPF_CGROUP_UDP4_RECVMSG: 2673 - case BPF_CGROUP_UDP6_RECVMSG: 2674 - ptype = BPF_PROG_TYPE_CGROUP_SOCK_ADDR; 2675 - break; 2676 - case BPF_CGROUP_SOCK_OPS: 2677 - ptype = BPF_PROG_TYPE_SOCK_OPS; 2678 - break; 2679 - case BPF_CGROUP_DEVICE: 2680 - ptype = BPF_PROG_TYPE_CGROUP_DEVICE; 2681 - break; 2682 - case BPF_SK_MSG_VERDICT: 2649 + ptype = attach_type_to_prog_type(attr->attach_type); 2650 + 2651 + switch (ptype) { 2652 + case BPF_PROG_TYPE_SK_MSG: 2653 + case BPF_PROG_TYPE_SK_SKB: 2683 2654 return sock_map_get_from_fd(attr, NULL); 2684 - case BPF_SK_SKB_STREAM_PARSER: 2685 - case BPF_SK_SKB_STREAM_VERDICT: 2686 - return sock_map_get_from_fd(attr, NULL); 2687 - case BPF_LIRC_MODE2: 2655 + case BPF_PROG_TYPE_LIRC_MODE2: 2688 2656 return lirc_prog_detach(attr); 2689 - case BPF_FLOW_DISSECTOR: 2657 + case BPF_PROG_TYPE_FLOW_DISSECTOR: 2690 2658 return skb_flow_dissector_bpf_prog_detach(attr); 2691 - case BPF_CGROUP_SYSCTL: 2692 - ptype = BPF_PROG_TYPE_CGROUP_SYSCTL; 2693 - break; 2694 - case BPF_CGROUP_GETSOCKOPT: 2695 - case BPF_CGROUP_SETSOCKOPT: 2696 - ptype = BPF_PROG_TYPE_CGROUP_SOCKOPT; 2697 - break; 2659 + case BPF_PROG_TYPE_CGROUP_DEVICE: 2660 + case BPF_PROG_TYPE_CGROUP_SKB: 2661 + case BPF_PROG_TYPE_CGROUP_SOCK: 2662 + case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: 2663 + case BPF_PROG_TYPE_CGROUP_SOCKOPT: 2664 + case BPF_PROG_TYPE_CGROUP_SYSCTL: 2665 + case BPF_PROG_TYPE_SOCK_OPS: 2666 + return cgroup_bpf_prog_detach(attr, ptype); 2698 2667 default: 2699 2668 return -EINVAL; 2700 2669 } 2701 - 2702 - return cgroup_bpf_prog_detach(attr, ptype); 2703 2670 } 2704 2671 2705 2672 #define BPF_PROG_QUERY_LAST_FIELD query.prog_cnt ··· 2707 2726 case BPF_CGROUP_SYSCTL: 2708 2727 case BPF_CGROUP_GETSOCKOPT: 2709 2728 case BPF_CGROUP_SETSOCKOPT: 2710 - break; 2729 + return cgroup_bpf_prog_query(attr, uattr); 2711 2730 case BPF_LIRC_MODE2: 2712 2731 return lirc_prog_query(attr, uattr); 2713 2732 case BPF_FLOW_DISSECTOR: ··· 2715 2734 default: 2716 2735 return -EINVAL; 2717 2736 } 2718 - 2719 - return cgroup_bpf_prog_query(attr, uattr); 2720 2737 } 2721 2738 2722 2739 #define BPF_PROG_TEST_RUN_LAST_FIELD test.ctx_out