Blame view

include/linux/bpf-cgroup.h 3.37 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
300709849   Daniel Mack   cgroup: add suppo...
2
3
  #ifndef _BPF_CGROUP_H
  #define _BPF_CGROUP_H
300709849   Daniel Mack   cgroup: add suppo...
4
5
6
7
8
9
  #include <linux/jump_label.h>
  #include <uapi/linux/bpf.h>
  
  struct sock;
  struct cgroup;
  struct sk_buff;
40304b2a1   Lawrence Brakmo   bpf: BPF support ...
10
  struct bpf_sock_ops_kern;
300709849   Daniel Mack   cgroup: add suppo...
11
12
13
14
15
16
17
18
19
20
21
22
23
  
  #ifdef CONFIG_CGROUP_BPF
  
  extern struct static_key_false cgroup_bpf_enabled_key;
  #define cgroup_bpf_enabled static_branch_unlikely(&cgroup_bpf_enabled_key)
  
  struct cgroup_bpf {
  	/*
  	 * Store two sets of bpf_prog pointers, one for programs that are
  	 * pinned directly to this cgroup, and one for those that are effective
  	 * when this cgroup is accessed.
  	 */
  	struct bpf_prog *prog[MAX_BPF_ATTACH_TYPE];
dcdc43d66   Daniel Mack   bpf: cgroup: anno...
24
  	struct bpf_prog __rcu *effective[MAX_BPF_ATTACH_TYPE];
7f6776333   Alexei Starovoitov   bpf: introduce BP...
25
  	bool disallow_override[MAX_BPF_ATTACH_TYPE];
300709849   Daniel Mack   cgroup: add suppo...
26
27
28
29
  };
  
  void cgroup_bpf_put(struct cgroup *cgrp);
  void cgroup_bpf_inherit(struct cgroup *cgrp, struct cgroup *parent);
7f6776333   Alexei Starovoitov   bpf: introduce BP...
30
31
32
  int __cgroup_bpf_update(struct cgroup *cgrp, struct cgroup *parent,
  			struct bpf_prog *prog, enum bpf_attach_type type,
  			bool overridable);
300709849   Daniel Mack   cgroup: add suppo...
33
34
  
  /* Wrapper for __cgroup_bpf_update() protected by cgroup_mutex */
7f6776333   Alexei Starovoitov   bpf: introduce BP...
35
36
  int cgroup_bpf_update(struct cgroup *cgrp, struct bpf_prog *prog,
  		      enum bpf_attach_type type, bool overridable);
300709849   Daniel Mack   cgroup: add suppo...
37

b2cd12574   David Ahern   bpf: Refactor cgr...
38
39
40
  int __cgroup_bpf_run_filter_skb(struct sock *sk,
  				struct sk_buff *skb,
  				enum bpf_attach_type type);
610236587   David Ahern   bpf: Add new cgro...
41
42
  int __cgroup_bpf_run_filter_sk(struct sock *sk,
  			       enum bpf_attach_type type);
40304b2a1   Lawrence Brakmo   bpf: BPF support ...
43
44
45
  int __cgroup_bpf_run_filter_sock_ops(struct sock *sk,
  				     struct bpf_sock_ops_kern *sock_ops,
  				     enum bpf_attach_type type);
b2cd12574   David Ahern   bpf: Refactor cgr...
46
47
48
49
50
51
52
53
54
  /* Wrappers for __cgroup_bpf_run_filter_skb() guarded by cgroup_bpf_enabled. */
  #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk, skb)			      \
  ({									      \
  	int __ret = 0;							      \
  	if (cgroup_bpf_enabled)						      \
  		__ret = __cgroup_bpf_run_filter_skb(sk, skb,		      \
  						    BPF_CGROUP_INET_INGRESS); \
  									      \
  	__ret;								      \
300709849   Daniel Mack   cgroup: add suppo...
55
  })
b2cd12574   David Ahern   bpf: Refactor cgr...
56
57
58
59
60
61
62
63
64
65
  #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb)			       \
  ({									       \
  	int __ret = 0;							       \
  	if (cgroup_bpf_enabled && sk && sk == skb->sk) {		       \
  		typeof(sk) __sk = sk_to_full_sk(sk);			       \
  		if (sk_fullsock(__sk))					       \
  			__ret = __cgroup_bpf_run_filter_skb(__sk, skb,	       \
  						      BPF_CGROUP_INET_EGRESS); \
  	}								       \
  	__ret;								       \
300709849   Daniel Mack   cgroup: add suppo...
66
  })
610236587   David Ahern   bpf: Add new cgro...
67
68
69
70
71
72
73
74
75
  #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk)				       \
  ({									       \
  	int __ret = 0;							       \
  	if (cgroup_bpf_enabled && sk) {					       \
  		__ret = __cgroup_bpf_run_filter_sk(sk,			       \
  						 BPF_CGROUP_INET_SOCK_CREATE); \
  	}								       \
  	__ret;								       \
  })
40304b2a1   Lawrence Brakmo   bpf: BPF support ...
76
77
78
79
80
  #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops)				       \
  ({									       \
  	int __ret = 0;							       \
  	if (cgroup_bpf_enabled && (sock_ops)->sk) {	       \
  		typeof(sk) __sk = sk_to_full_sk((sock_ops)->sk);	       \
df39a9f10   WANG Cong   bpf: check NULL f...
81
  		if (__sk && sk_fullsock(__sk))				       \
40304b2a1   Lawrence Brakmo   bpf: BPF support ...
82
83
84
85
86
87
  			__ret = __cgroup_bpf_run_filter_sock_ops(__sk,	       \
  								 sock_ops,     \
  							 BPF_CGROUP_SOCK_OPS); \
  	}								       \
  	__ret;								       \
  })
300709849   Daniel Mack   cgroup: add suppo...
88
89
90
91
92
93
94
95
96
  #else
  
  struct cgroup_bpf {};
  static inline void cgroup_bpf_put(struct cgroup *cgrp) {}
  static inline void cgroup_bpf_inherit(struct cgroup *cgrp,
  				      struct cgroup *parent) {}
  
  #define BPF_CGROUP_RUN_PROG_INET_INGRESS(sk,skb) ({ 0; })
  #define BPF_CGROUP_RUN_PROG_INET_EGRESS(sk,skb) ({ 0; })
610236587   David Ahern   bpf: Add new cgro...
97
  #define BPF_CGROUP_RUN_PROG_INET_SOCK(sk) ({ 0; })
40304b2a1   Lawrence Brakmo   bpf: BPF support ...
98
  #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; })
300709849   Daniel Mack   cgroup: add suppo...
99
100
101
102
  
  #endif /* CONFIG_CGROUP_BPF */
  
  #endif /* _BPF_CGROUP_H */