xref: /linux-6.15/include/linux/bpf-cgroup.h (revision df39a9f1)
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 
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 
4640304b2aSLawrence Brakmo int __cgroup_bpf_run_filter_sock_ops(struct sock *sk,
4740304b2aSLawrence Brakmo 				     struct bpf_sock_ops_kern *sock_ops,
4840304b2aSLawrence Brakmo 				     enum bpf_attach_type type);
4940304b2aSLawrence 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 
8340304b2aSLawrence Brakmo #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops)				       \
8440304b2aSLawrence Brakmo ({									       \
8540304b2aSLawrence Brakmo 	int __ret = 0;							       \
8640304b2aSLawrence Brakmo 	if (cgroup_bpf_enabled && (sock_ops)->sk) {	       \
8740304b2aSLawrence Brakmo 		typeof(sk) __sk = sk_to_full_sk((sock_ops)->sk);	       \
88*df39a9f1SWANG Cong 		if (__sk && sk_fullsock(__sk))				       \
8940304b2aSLawrence Brakmo 			__ret = __cgroup_bpf_run_filter_sock_ops(__sk,	       \
9040304b2aSLawrence Brakmo 								 sock_ops,     \
9140304b2aSLawrence Brakmo 							 BPF_CGROUP_SOCK_OPS); \
9240304b2aSLawrence Brakmo 	}								       \
9340304b2aSLawrence Brakmo 	__ret;								       \
9440304b2aSLawrence 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; })
10540304b2aSLawrence 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