|
@@ -3778,6 +3778,32 @@ static const struct bpf_func_proto bpf_skb_cgroup_id_proto = {
|
|
|
.ret_type = RET_INTEGER,
|
|
|
.arg1_type = ARG_PTR_TO_CTX,
|
|
|
};
|
|
|
+
|
|
|
+BPF_CALL_2(bpf_skb_ancestor_cgroup_id, const struct sk_buff *, skb, int,
|
|
|
+ ancestor_level)
|
|
|
+{
|
|
|
+ struct sock *sk = skb_to_full_sk(skb);
|
|
|
+ struct cgroup *ancestor;
|
|
|
+ struct cgroup *cgrp;
|
|
|
+
|
|
|
+ if (!sk || !sk_fullsock(sk))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data);
|
|
|
+ ancestor = cgroup_ancestor(cgrp, ancestor_level);
|
|
|
+ if (!ancestor)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return ancestor->kn->id.id;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct bpf_func_proto bpf_skb_ancestor_cgroup_id_proto = {
|
|
|
+ .func = bpf_skb_ancestor_cgroup_id,
|
|
|
+ .gpl_only = false,
|
|
|
+ .ret_type = RET_INTEGER,
|
|
|
+ .arg1_type = ARG_PTR_TO_CTX,
|
|
|
+ .arg2_type = ARG_ANYTHING,
|
|
|
+};
|
|
|
#endif
|
|
|
|
|
|
static unsigned long bpf_xdp_copy(void *dst_buff, const void *src_buff,
|
|
@@ -4966,6 +4992,8 @@ tc_cls_act_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
|
|
#ifdef CONFIG_SOCK_CGROUP_DATA
|
|
|
case BPF_FUNC_skb_cgroup_id:
|
|
|
return &bpf_skb_cgroup_id_proto;
|
|
|
+ case BPF_FUNC_skb_ancestor_cgroup_id:
|
|
|
+ return &bpf_skb_ancestor_cgroup_id_proto;
|
|
|
#endif
|
|
|
default:
|
|
|
return bpf_base_func_proto(func_id);
|