提交 9d4b4a05 编写于 作者: L Liu Jian 提交者: Zheng Zengkai

bpf: Add bpf_get_sockops_uid_gid helper function

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I545NW
CVE: NA

--------------------------------

Add the function for bpf sock_ops hook to get sock's uid and gid.
Signed-off-by: NLiu Jian <liujian56@huawei.com>
Reviewed-by: NWei Yongjun <weiyongjun1@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 f6740a11
......@@ -3742,6 +3742,13 @@ union bpf_attr {
* Return
* The helper returns **TC_ACT_REDIRECT** on success or
* **TC_ACT_SHOT** on error.
*
* u64 bpf_get_sockops_uid_gid(void *sockops)
* Description
* Get sock's uid and gid
* Return
* A 64-bit integer containing the current GID and UID, and
* created as such: *current_gid* **<< 32 \|** *current_uid*.
*/
#define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \
......@@ -3900,6 +3907,7 @@ union bpf_attr {
FN(per_cpu_ptr), \
FN(this_cpu_ptr), \
FN(redirect_peer), \
FN(get_sockops_uid_gid), \
/* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
......@@ -5006,6 +5006,29 @@ static const struct bpf_func_proto bpf_sock_addr_setsockopt_proto = {
.arg5_type = ARG_CONST_SIZE,
};
BPF_CALL_1(bpf_get_sockops_uid_gid, struct bpf_sock_ops_kern *, bpf_sock)
{
struct sock *sk = bpf_sock->sk;
kuid_t uid;
kgid_t gid;
if (!sk || !sk_fullsock(sk))
return -EINVAL;
uid = sock_net_uid(sock_net(sk), sk);
gid = sock_net_gid(sock_net(sk), sk);
return ((u64)from_kgid_munged(sock_net(sk)->user_ns, gid)) << 32 |
from_kuid_munged(sock_net(sk)->user_ns, uid);
}
static const struct bpf_func_proto bpf_get_sockops_uid_gid_proto = {
.func = bpf_get_sockops_uid_gid,
.gpl_only = false,
.ret_type = RET_INTEGER,
.arg1_type = ARG_PTR_TO_CTX,
};
BPF_CALL_5(bpf_sock_addr_getsockopt, struct bpf_sock_addr_kern *, ctx,
int, level, int, optname, char *, optval, int, optlen)
{
......@@ -7276,6 +7299,8 @@ sock_ops_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
return &bpf_sk_storage_get_proto;
case BPF_FUNC_sk_storage_delete:
return &bpf_sk_storage_delete_proto;
case BPF_FUNC_get_sockops_uid_gid:
return &bpf_get_sockops_uid_gid_proto;
#ifdef CONFIG_INET
case BPF_FUNC_load_hdr_opt:
return &bpf_sock_ops_load_hdr_opt_proto;
......
......@@ -3742,6 +3742,13 @@ union bpf_attr {
* Return
* The helper returns **TC_ACT_REDIRECT** on success or
* **TC_ACT_SHOT** on error.
*
* u64 bpf_get_sockops_uid_gid(void *sockops)
* Description
* Get sock's uid and gid
* Return
* A 64-bit integer containing the current GID and UID, and
* created as such: *current_gid* **<< 32 \|** *current_uid*.
*/
#define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \
......@@ -3900,6 +3907,7 @@ union bpf_attr {
FN(per_cpu_ptr), \
FN(this_cpu_ptr), \
FN(redirect_peer), \
FN(get_sockops_uid_gid), \
/* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册