130070984SDaniel Mack #ifndef _BPF_CGROUP_H 230070984SDaniel Mack #define _BPF_CGROUP_H 330070984SDaniel Mack 430070984SDaniel Mack #include <linux/jump_label.h> 530070984SDaniel Mack #include <uapi/linux/bpf.h> 630070984SDaniel Mack 730070984SDaniel Mack struct sock; 830070984SDaniel Mack struct cgroup; 930070984SDaniel Mack struct sk_buff; 1040304b2aSLawrence Brakmo struct bpf_sock_ops_kern; 1130070984SDaniel Mack 1230070984SDaniel Mack #ifdef CONFIG_CGROUP_BPF 1330070984SDaniel Mack 1430070984SDaniel Mack extern struct static_key_false cgroup_bpf_enabled_key; 1530070984SDaniel Mack #define cgroup_bpf_enabled static_branch_unlikely(&cgroup_bpf_enabled_key) 1630070984SDaniel Mack 17324bda9eSAlexei Starovoitov struct bpf_prog_list { 18324bda9eSAlexei Starovoitov struct list_head node; 19324bda9eSAlexei Starovoitov struct bpf_prog *prog; 20324bda9eSAlexei Starovoitov }; 21324bda9eSAlexei Starovoitov 22324bda9eSAlexei Starovoitov struct bpf_prog_array; 23324bda9eSAlexei Starovoitov 2430070984SDaniel Mack struct cgroup_bpf { 25324bda9eSAlexei Starovoitov /* array of effective progs in this cgroup */ 26324bda9eSAlexei Starovoitov struct bpf_prog_array __rcu *effective[MAX_BPF_ATTACH_TYPE]; 27324bda9eSAlexei Starovoitov 28324bda9eSAlexei Starovoitov /* attached progs to this cgroup and attach flags 29324bda9eSAlexei Starovoitov * when flags == 0 or BPF_F_ALLOW_OVERRIDE the progs list will 30324bda9eSAlexei Starovoitov * have either zero or one element 31324bda9eSAlexei Starovoitov * when BPF_F_ALLOW_MULTI the list can have up to BPF_CGROUP_MAX_PROGS 3230070984SDaniel Mack */ 33324bda9eSAlexei Starovoitov struct list_head progs[MAX_BPF_ATTACH_TYPE]; 34324bda9eSAlexei Starovoitov u32 flags[MAX_BPF_ATTACH_TYPE]; 35324bda9eSAlexei Starovoitov 36324bda9eSAlexei Starovoitov /* temp storage for effective prog array used by prog_attach/detach */ 37324bda9eSAlexei Starovoitov struct bpf_prog_array __rcu *inactive; 3830070984SDaniel Mack }; 3930070984SDaniel Mack 4030070984SDaniel Mack void cgroup_bpf_put(struct cgroup *cgrp); 41324bda9eSAlexei Starovoitov int cgroup_bpf_inherit(struct cgroup *cgrp); 4230070984SDaniel Mack 43324bda9eSAlexei Starovoitov int __cgroup_bpf_attach(struct cgroup *cgrp, struct bpf_prog *prog, 44324bda9eSAlexei Starovoitov enum bpf_attach_type type, u32 flags); 45324bda9eSAlexei Starovoitov int __cgroup_bpf_detach(struct cgroup *cgrp, struct bpf_prog *prog, 46324bda9eSAlexei Starovoitov enum bpf_attach_type type, u32 flags); 47*468e2f64SAlexei Starovoitov int __cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr, 48*468e2f64SAlexei Starovoitov union bpf_attr __user *uattr); 4930070984SDaniel Mack 50324bda9eSAlexei Starovoitov /* Wrapper for __cgroup_bpf_*() protected by cgroup_mutex */ 51324bda9eSAlexei Starovoitov int cgroup_bpf_attach(struct cgroup *cgrp, struct bpf_prog *prog, 52324bda9eSAlexei Starovoitov enum bpf_attach_type type, u32 flags); 53324bda9eSAlexei Starovoitov int cgroup_bpf_detach(struct cgroup *cgrp, struct bpf_prog *prog, 54324bda9eSAlexei Starovoitov enum bpf_attach_type type, u32 flags); 55*468e2f64SAlexei Starovoitov int cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr, 56*468e2f64SAlexei Starovoitov union bpf_attr __user *uattr); 5730070984SDaniel Mack 58b2cd1257SDavid Ahern int __cgroup_bpf_run_filter_skb(struct sock *sk, 5930070984SDaniel Mack struct sk_buff *skb, 6030070984SDaniel Mack enum bpf_attach_type type); 6130070984SDaniel Mack 6261023658SDavid Ahern int __cgroup_bpf_run_filter_sk(struct sock *sk, 6361023658SDavid Ahern enum bpf_attach_type type); 6461023658SDavid Ahern 6540304b2aSLawrence Brakmo int __cgroup_bpf_run_filter_sock_ops(struct sock *sk, 6640304b2aSLawrence Brakmo struct bpf_sock_ops_kern *sock_ops, 6740304b2aSLawrence Brakmo enum bpf_attach_type type); 6840304b2aSLawrence Brakmo 69b2cd1257SDavid Ahern /* Wrappers for __cgroup_bpf_run_filter_skb() guarded by cgroup_bpf_enabled. */ 7030070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk, skb) \ 7130070984SDaniel Mack ({ \ 7230070984SDaniel Mack int __ret = 0; \ 7330070984SDaniel Mack if (cgroup_bpf_enabled) \ 74b2cd1257SDavid Ahern __ret = __cgroup_bpf_run_filter_skb(sk, skb, \ 7530070984SDaniel Mack BPF_CGROUP_INET_INGRESS); \ 7630070984SDaniel Mack \ 7730070984SDaniel Mack __ret; \ 7830070984SDaniel Mack }) 7930070984SDaniel Mack 8030070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb) \ 8130070984SDaniel Mack ({ \ 8230070984SDaniel Mack int __ret = 0; \ 8330070984SDaniel Mack if (cgroup_bpf_enabled && sk && sk == skb->sk) { \ 8430070984SDaniel Mack typeof(sk) __sk = sk_to_full_sk(sk); \ 8530070984SDaniel Mack if (sk_fullsock(__sk)) \ 86b2cd1257SDavid Ahern __ret = __cgroup_bpf_run_filter_skb(__sk, skb, \ 8730070984SDaniel Mack BPF_CGROUP_INET_EGRESS); \ 8830070984SDaniel Mack } \ 8930070984SDaniel Mack __ret; \ 9030070984SDaniel Mack }) 9130070984SDaniel Mack 9261023658SDavid Ahern #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk) \ 9361023658SDavid Ahern ({ \ 9461023658SDavid Ahern int __ret = 0; \ 9561023658SDavid Ahern if (cgroup_bpf_enabled && sk) { \ 9661023658SDavid Ahern __ret = __cgroup_bpf_run_filter_sk(sk, \ 9761023658SDavid Ahern BPF_CGROUP_INET_SOCK_CREATE); \ 9861023658SDavid Ahern } \ 9961023658SDavid Ahern __ret; \ 10061023658SDavid Ahern }) 10161023658SDavid Ahern 10240304b2aSLawrence Brakmo #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) \ 10340304b2aSLawrence Brakmo ({ \ 10440304b2aSLawrence Brakmo int __ret = 0; \ 10540304b2aSLawrence Brakmo if (cgroup_bpf_enabled && (sock_ops)->sk) { \ 10640304b2aSLawrence Brakmo typeof(sk) __sk = sk_to_full_sk((sock_ops)->sk); \ 107df39a9f1SWANG Cong if (__sk && sk_fullsock(__sk)) \ 10840304b2aSLawrence Brakmo __ret = __cgroup_bpf_run_filter_sock_ops(__sk, \ 10940304b2aSLawrence Brakmo sock_ops, \ 11040304b2aSLawrence Brakmo BPF_CGROUP_SOCK_OPS); \ 11140304b2aSLawrence Brakmo } \ 11240304b2aSLawrence Brakmo __ret; \ 11340304b2aSLawrence Brakmo }) 11430070984SDaniel Mack #else 11530070984SDaniel Mack 11630070984SDaniel Mack struct cgroup_bpf {}; 11730070984SDaniel Mack static inline void cgroup_bpf_put(struct cgroup *cgrp) {} 118324bda9eSAlexei Starovoitov static inline int cgroup_bpf_inherit(struct cgroup *cgrp) { return 0; } 11930070984SDaniel Mack 12030070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk,skb) ({ 0; }) 12130070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk,skb) ({ 0; }) 12261023658SDavid Ahern #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk) ({ 0; }) 12340304b2aSLawrence Brakmo #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; }) 12430070984SDaniel Mack 12530070984SDaniel Mack #endif /* CONFIG_CGROUP_BPF */ 12630070984SDaniel Mack 12730070984SDaniel Mack #endif /* _BPF_CGROUP_H */ 128