This source file includes following definitions.
- task_cls_classid
- sock_update_classid
- task_get_classid
- sock_update_classid
- task_get_classid
1
2
3
4
5
6
7
8 #ifndef _NET_CLS_CGROUP_H
9 #define _NET_CLS_CGROUP_H
10
11 #include <linux/cgroup.h>
12 #include <linux/hardirq.h>
13 #include <linux/rcupdate.h>
14 #include <net/sock.h>
15 #include <net/inet_sock.h>
16
17 #ifdef CONFIG_CGROUP_NET_CLASSID
18 struct cgroup_cls_state {
19 struct cgroup_subsys_state css;
20 u32 classid;
21 };
22
23 struct cgroup_cls_state *task_cls_state(struct task_struct *p);
24
25 static inline u32 task_cls_classid(struct task_struct *p)
26 {
27 u32 classid;
28
29 if (in_interrupt())
30 return 0;
31
32 rcu_read_lock();
33 classid = container_of(task_css(p, net_cls_cgrp_id),
34 struct cgroup_cls_state, css)->classid;
35 rcu_read_unlock();
36
37 return classid;
38 }
39
40 static inline void sock_update_classid(struct sock_cgroup_data *skcd)
41 {
42 u32 classid;
43
44 classid = task_cls_classid(current);
45 sock_cgroup_set_classid(skcd, classid);
46 }
47
48 static inline u32 task_get_classid(const struct sk_buff *skb)
49 {
50 u32 classid = task_cls_state(current)->classid;
51
52
53
54
55
56
57
58
59
60
61 if (in_serving_softirq()) {
62 struct sock *sk = skb_to_full_sk(skb);
63
64
65 if (!sk || !sk_fullsock(sk))
66 return 0;
67
68 classid = sock_cgroup_classid(&sk->sk_cgrp_data);
69 }
70
71 return classid;
72 }
73 #else
74 static inline void sock_update_classid(struct sock_cgroup_data *skcd)
75 {
76 }
77
78 static inline u32 task_get_classid(const struct sk_buff *skb)
79 {
80 return 0;
81 }
82 #endif
83 #endif