Skip to content

Commit e28784e

Browse files
anakryikoAlexei Starovoitov
authored andcommitted
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 <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent 00c4edd commit e28784e

File tree

1 file changed

+66
-87
lines changed

1 file changed

+66
-87
lines changed

kernel/bpf/syscall.c

Lines changed: 66 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2535,36 +2535,18 @@ static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog,
25352535
}
25362536
}
25372537

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)
25442540
{
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) {
25592542
case BPF_CGROUP_INET_INGRESS:
25602543
case BPF_CGROUP_INET_EGRESS:
2561-
ptype = BPF_PROG_TYPE_CGROUP_SKB;
2544+
return BPF_PROG_TYPE_CGROUP_SKB;
25622545
break;
25632546
case BPF_CGROUP_INET_SOCK_CREATE:
25642547
case BPF_CGROUP_INET4_POST_BIND:
25652548
case BPF_CGROUP_INET6_POST_BIND:
2566-
ptype = BPF_PROG_TYPE_CGROUP_SOCK;
2567-
break;
2549+
return BPF_PROG_TYPE_CGROUP_SOCK;
25682550
case BPF_CGROUP_INET4_BIND:
25692551
case BPF_CGROUP_INET6_BIND:
25702552
case BPF_CGROUP_INET4_CONNECT:
@@ -2573,37 +2555,53 @@ static int bpf_prog_attach(const union bpf_attr *attr)
25732555
case BPF_CGROUP_UDP6_SENDMSG:
25742556
case BPF_CGROUP_UDP4_RECVMSG:
25752557
case BPF_CGROUP_UDP6_RECVMSG:
2576-
ptype = BPF_PROG_TYPE_CGROUP_SOCK_ADDR;
2577-
break;
2558+
return BPF_PROG_TYPE_CGROUP_SOCK_ADDR;
25782559
case BPF_CGROUP_SOCK_OPS:
2579-
ptype = BPF_PROG_TYPE_SOCK_OPS;
2580-
break;
2560+
return BPF_PROG_TYPE_SOCK_OPS;
25812561
case BPF_CGROUP_DEVICE:
2582-
ptype = BPF_PROG_TYPE_CGROUP_DEVICE;
2583-
break;
2562+
return BPF_PROG_TYPE_CGROUP_DEVICE;
25842563
case BPF_SK_MSG_VERDICT:
2585-
ptype = BPF_PROG_TYPE_SK_MSG;
2586-
break;
2564+
return BPF_PROG_TYPE_SK_MSG;
25872565
case BPF_SK_SKB_STREAM_PARSER:
25882566
case BPF_SK_SKB_STREAM_VERDICT:
2589-
ptype = BPF_PROG_TYPE_SK_SKB;
2590-
break;
2567+
return BPF_PROG_TYPE_SK_SKB;
25912568
case BPF_LIRC_MODE2:
2592-
ptype = BPF_PROG_TYPE_LIRC_MODE2;
2593-
break;
2569+
return BPF_PROG_TYPE_LIRC_MODE2;
25942570
case BPF_FLOW_DISSECTOR:
2595-
ptype = BPF_PROG_TYPE_FLOW_DISSECTOR;
2596-
break;
2571+
return BPF_PROG_TYPE_FLOW_DISSECTOR;
25972572
case BPF_CGROUP_SYSCTL:
2598-
ptype = BPF_PROG_TYPE_CGROUP_SYSCTL;
2599-
break;
2573+
return BPF_PROG_TYPE_CGROUP_SYSCTL;
26002574
case BPF_CGROUP_GETSOCKOPT:
26012575
case BPF_CGROUP_SETSOCKOPT:
2602-
ptype = BPF_PROG_TYPE_CGROUP_SOCKOPT;
2603-
break;
2576+
return BPF_PROG_TYPE_CGROUP_SOCKOPT;
26042577
default:
2605-
return -EINVAL;
2578+
return BPF_PROG_TYPE_UNSPEC;
26062579
}
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;
26072605

26082606
prog = bpf_prog_get_type(attr->attach_bpf_fd, ptype);
26092607
if (IS_ERR(prog))
@@ -2625,8 +2623,17 @@ static int bpf_prog_attach(const union bpf_attr *attr)
26252623
case BPF_PROG_TYPE_FLOW_DISSECTOR:
26262624
ret = skb_flow_dissector_bpf_prog_attach(attr, prog);
26272625
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:
26292633
ret = cgroup_bpf_prog_attach(attr, ptype, prog);
2634+
break;
2635+
default:
2636+
ret = -EINVAL;
26302637
}
26312638

26322639
if (ret)
@@ -2646,53 +2653,27 @@ static int bpf_prog_detach(const union bpf_attr *attr)
26462653
if (CHECK_ATTR(BPF_PROG_DETACH))
26472654
return -EINVAL;
26482655

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:
26792661
return sock_map_get_from_fd(attr, NULL);
2680-
case BPF_LIRC_MODE2:
2662+
case BPF_PROG_TYPE_LIRC_MODE2:
26812663
return lirc_prog_detach(attr);
2682-
case BPF_FLOW_DISSECTOR:
2664+
case BPF_PROG_TYPE_FLOW_DISSECTOR:
26832665
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);
26912674
default:
26922675
return -EINVAL;
26932676
}
2694-
2695-
return cgroup_bpf_prog_detach(attr, ptype);
26962677
}
26972678

26982679
#define BPF_PROG_QUERY_LAST_FIELD query.prog_cnt
@@ -2726,16 +2707,14 @@ static int bpf_prog_query(const union bpf_attr *attr,
27262707
case BPF_CGROUP_SYSCTL:
27272708
case BPF_CGROUP_GETSOCKOPT:
27282709
case BPF_CGROUP_SETSOCKOPT:
2729-
break;
2710+
return cgroup_bpf_prog_query(attr, uattr);
27302711
case BPF_LIRC_MODE2:
27312712
return lirc_prog_query(attr, uattr);
27322713
case BPF_FLOW_DISSECTOR:
27332714
return skb_flow_dissector_prog_query(attr, uattr);
27342715
default:
27352716
return -EINVAL;
27362717
}
2737-
2738-
return cgroup_bpf_prog_query(attr, uattr);
27392718
}
27402719

27412720
#define BPF_PROG_TEST_RUN_LAST_FIELD test.ctx_out

0 commit comments

Comments
 (0)