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; 10*40304b2aSLawrence 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 1730070984SDaniel Mack struct cgroup_bpf { 1830070984SDaniel Mack /* 1930070984SDaniel Mack * Store two sets of bpf_prog pointers, one for programs that are 2030070984SDaniel Mack * pinned directly to this cgroup, and one for those that are effective 2130070984SDaniel Mack * when this cgroup is accessed. 2230070984SDaniel Mack */ 2330070984SDaniel Mack struct bpf_prog *prog[MAX_BPF_ATTACH_TYPE]; 24dcdc43d6SDaniel Mack struct bpf_prog __rcu *effective[MAX_BPF_ATTACH_TYPE]; 257f677633SAlexei Starovoitov bool disallow_override[MAX_BPF_ATTACH_TYPE]; 2630070984SDaniel Mack }; 2730070984SDaniel Mack 2830070984SDaniel Mack void cgroup_bpf_put(struct cgroup *cgrp); 2930070984SDaniel Mack void cgroup_bpf_inherit(struct cgroup *cgrp, struct cgroup *parent); 3030070984SDaniel Mack 317f677633SAlexei Starovoitov int __cgroup_bpf_update(struct cgroup *cgrp, struct cgroup *parent, 327f677633SAlexei Starovoitov struct bpf_prog *prog, enum bpf_attach_type type, 337f677633SAlexei Starovoitov bool overridable); 3430070984SDaniel Mack 3530070984SDaniel Mack /* Wrapper for __cgroup_bpf_update() protected by cgroup_mutex */ 367f677633SAlexei Starovoitov int cgroup_bpf_update(struct cgroup *cgrp, struct bpf_prog *prog, 377f677633SAlexei Starovoitov enum bpf_attach_type type, bool overridable); 3830070984SDaniel Mack 39b2cd1257SDavid Ahern int __cgroup_bpf_run_filter_skb(struct sock *sk, 4030070984SDaniel Mack struct sk_buff *skb, 4130070984SDaniel Mack enum bpf_attach_type type); 4230070984SDaniel Mack 4361023658SDavid Ahern int __cgroup_bpf_run_filter_sk(struct sock *sk, 4461023658SDavid Ahern enum bpf_attach_type type); 4561023658SDavid Ahern 46*40304b2aSLawrence Brakmo int __cgroup_bpf_run_filter_sock_ops(struct sock *sk, 47*40304b2aSLawrence Brakmo struct bpf_sock_ops_kern *sock_ops, 48*40304b2aSLawrence Brakmo enum bpf_attach_type type); 49*40304b2aSLawrence Brakmo 50b2cd1257SDavid Ahern /* Wrappers for __cgroup_bpf_run_filter_skb() guarded by cgroup_bpf_enabled. */ 5130070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk, skb) \ 5230070984SDaniel Mack ({ \ 5330070984SDaniel Mack int __ret = 0; \ 5430070984SDaniel Mack if (cgroup_bpf_enabled) \ 55b2cd1257SDavid Ahern __ret = __cgroup_bpf_run_filter_skb(sk, skb, \ 5630070984SDaniel Mack BPF_CGROUP_INET_INGRESS); \ 5730070984SDaniel Mack \ 5830070984SDaniel Mack __ret; \ 5930070984SDaniel Mack }) 6030070984SDaniel Mack 6130070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb) \ 6230070984SDaniel Mack ({ \ 6330070984SDaniel Mack int __ret = 0; \ 6430070984SDaniel Mack if (cgroup_bpf_enabled && sk && sk == skb->sk) { \ 6530070984SDaniel Mack typeof(sk) __sk = sk_to_full_sk(sk); \ 6630070984SDaniel Mack if (sk_fullsock(__sk)) \ 67b2cd1257SDavid Ahern __ret = __cgroup_bpf_run_filter_skb(__sk, skb, \ 6830070984SDaniel Mack BPF_CGROUP_INET_EGRESS); \ 6930070984SDaniel Mack } \ 7030070984SDaniel Mack __ret; \ 7130070984SDaniel Mack }) 7230070984SDaniel Mack 7361023658SDavid Ahern #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk) \ 7461023658SDavid Ahern ({ \ 7561023658SDavid Ahern int __ret = 0; \ 7661023658SDavid Ahern if (cgroup_bpf_enabled && sk) { \ 7761023658SDavid Ahern __ret = __cgroup_bpf_run_filter_sk(sk, \ 7861023658SDavid Ahern BPF_CGROUP_INET_SOCK_CREATE); \ 7961023658SDavid Ahern } \ 8061023658SDavid Ahern __ret; \ 8161023658SDavid Ahern }) 8261023658SDavid Ahern 83*40304b2aSLawrence Brakmo #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) \ 84*40304b2aSLawrence Brakmo ({ \ 85*40304b2aSLawrence Brakmo int __ret = 0; \ 86*40304b2aSLawrence Brakmo if (cgroup_bpf_enabled && (sock_ops)->sk) { \ 87*40304b2aSLawrence Brakmo typeof(sk) __sk = sk_to_full_sk((sock_ops)->sk); \ 88*40304b2aSLawrence Brakmo if (sk_fullsock(__sk)) \ 89*40304b2aSLawrence Brakmo __ret = __cgroup_bpf_run_filter_sock_ops(__sk, \ 90*40304b2aSLawrence Brakmo sock_ops, \ 91*40304b2aSLawrence Brakmo BPF_CGROUP_SOCK_OPS); \ 92*40304b2aSLawrence Brakmo } \ 93*40304b2aSLawrence Brakmo __ret; \ 94*40304b2aSLawrence Brakmo }) 9530070984SDaniel Mack #else 9630070984SDaniel Mack 9730070984SDaniel Mack struct cgroup_bpf {}; 9830070984SDaniel Mack static inline void cgroup_bpf_put(struct cgroup *cgrp) {} 9930070984SDaniel Mack static inline void cgroup_bpf_inherit(struct cgroup *cgrp, 10030070984SDaniel Mack struct cgroup *parent) {} 10130070984SDaniel Mack 10230070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk,skb) ({ 0; }) 10330070984SDaniel Mack #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk,skb) ({ 0; }) 10461023658SDavid Ahern #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk) ({ 0; }) 105*40304b2aSLawrence Brakmo #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; }) 10630070984SDaniel Mack 10730070984SDaniel Mack #endif /* CONFIG_CGROUP_BPF */ 10830070984SDaniel Mack 10930070984SDaniel Mack #endif /* _BPF_CGROUP_H */ 110