Skip to content

Commit cb20b08

Browse files
borkmannAlexei Starovoitov
authored and
Alexei Starovoitov
committed
bpf: add bpf_skb_cgroup_id helper
Add a new bpf_skb_cgroup_id() helper that allows to retrieve the cgroup id from the skb's socket. This is useful in particular to enable bpf_get_cgroup_classid()-like behavior for cgroup v1 in cgroup v2 by allowing ID based matching on egress. This can in particular be used in combination with applying policy e.g. from map lookups, and also complements the older bpf_skb_under_cgroup() interface. In user space the cgroup id for a given path can be retrieved through the f_handle as demonstrated in [0] recently. [0] https://lkml.org/lkml/2018/5/22/1190 Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 09772d9 commit cb20b08

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

include/uapi/linux/bpf.h

+18-1
Original file line numberDiff line numberDiff line change
@@ -2054,6 +2054,22 @@ union bpf_attr {
20542054
*
20552055
* Return
20562056
* 0
2057+
*
2058+
* uint64_t bpf_skb_cgroup_id(struct sk_buff *skb)
2059+
* Description
2060+
* Return the cgroup v2 id of the socket associated with the *skb*.
2061+
* This is roughly similar to the **bpf_get_cgroup_classid**\ ()
2062+
* helper for cgroup v1 by providing a tag resp. identifier that
2063+
* can be matched on or used for map lookups e.g. to implement
2064+
* policy. The cgroup v2 id of a given path in the hierarchy is
2065+
* exposed in user space through the f_handle API in order to get
2066+
* to the same 64-bit id.
2067+
*
2068+
* This helper can be used on TC egress path, but not on ingress,
2069+
* and is available only if the kernel was compiled with the
2070+
* **CONFIG_SOCK_CGROUP_DATA** configuration option.
2071+
* Return
2072+
* The id is returned or 0 in case the id could not be retrieved.
20572073
*/
20582074
#define __BPF_FUNC_MAPPER(FN) \
20592075
FN(unspec), \
@@ -2134,7 +2150,8 @@ union bpf_attr {
21342150
FN(lwt_seg6_adjust_srh), \
21352151
FN(lwt_seg6_action), \
21362152
FN(rc_repeat), \
2137-
FN(rc_keydown),
2153+
FN(rc_keydown), \
2154+
FN(skb_cgroup_id),
21382155

21392156
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
21402157
* function eBPF program intends to call

net/core/filter.c

+27-2
Original file line numberDiff line numberDiff line change
@@ -3661,6 +3661,27 @@ static const struct bpf_func_proto bpf_skb_under_cgroup_proto = {
36613661
.arg3_type = ARG_ANYTHING,
36623662
};
36633663

3664+
#ifdef CONFIG_SOCK_CGROUP_DATA
3665+
BPF_CALL_1(bpf_skb_cgroup_id, const struct sk_buff *, skb)
3666+
{
3667+
struct sock *sk = skb_to_full_sk(skb);
3668+
struct cgroup *cgrp;
3669+
3670+
if (!sk || !sk_fullsock(sk))
3671+
return 0;
3672+
3673+
cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data);
3674+
return cgrp->kn->id.id;
3675+
}
3676+
3677+
static const struct bpf_func_proto bpf_skb_cgroup_id_proto = {
3678+
.func = bpf_skb_cgroup_id,
3679+
.gpl_only = false,
3680+
.ret_type = RET_INTEGER,
3681+
.arg1_type = ARG_PTR_TO_CTX,
3682+
};
3683+
#endif
3684+
36643685
static unsigned long bpf_xdp_copy(void *dst_buff, const void *src_buff,
36653686
unsigned long off, unsigned long len)
36663687
{
@@ -4747,12 +4768,16 @@ tc_cls_act_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
47474768
return &bpf_get_socket_cookie_proto;
47484769
case BPF_FUNC_get_socket_uid:
47494770
return &bpf_get_socket_uid_proto;
4771+
case BPF_FUNC_fib_lookup:
4772+
return &bpf_skb_fib_lookup_proto;
47504773
#ifdef CONFIG_XFRM
47514774
case BPF_FUNC_skb_get_xfrm_state:
47524775
return &bpf_skb_get_xfrm_state_proto;
47534776
#endif
4754-
case BPF_FUNC_fib_lookup:
4755-
return &bpf_skb_fib_lookup_proto;
4777+
#ifdef CONFIG_SOCK_CGROUP_DATA
4778+
case BPF_FUNC_skb_cgroup_id:
4779+
return &bpf_skb_cgroup_id_proto;
4780+
#endif
47564781
default:
47574782
return bpf_base_func_proto(func_id);
47584783
}

0 commit comments

Comments
 (0)