Commit 0165cc81 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Alexei Starovoitov

bpf: introduce bpf_xdp_get_buff_len helper

Introduce bpf_xdp_get_buff_len helper in order to return the xdp buffer
total size (linear and paged area)
Acked-by: default avatarToke Hoiland-Jorgensen <toke@redhat.com>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Link: https://lore.kernel.org/r/aac9ac3504c84026cf66a3c71b7c5ae89bc991be.1642758637.git.lorenzo@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent e121d270
...@@ -145,6 +145,20 @@ xdp_get_shared_info_from_buff(struct xdp_buff *xdp) ...@@ -145,6 +145,20 @@ xdp_get_shared_info_from_buff(struct xdp_buff *xdp)
return (struct skb_shared_info *)xdp_data_hard_end(xdp); return (struct skb_shared_info *)xdp_data_hard_end(xdp);
} }
static __always_inline unsigned int xdp_get_buff_len(struct xdp_buff *xdp)
{
unsigned int len = xdp->data_end - xdp->data;
struct skb_shared_info *sinfo;
if (likely(!xdp_buff_has_frags(xdp)))
goto out;
sinfo = xdp_get_shared_info_from_buff(xdp);
len += sinfo->xdp_frags_size;
out:
return len;
}
struct xdp_frame { struct xdp_frame {
void *data; void *data;
u16 len; u16 len;
......
...@@ -5054,6 +5054,12 @@ union bpf_attr { ...@@ -5054,6 +5054,12 @@ union bpf_attr {
* This helper is currently supported by cgroup programs only. * This helper is currently supported by cgroup programs only.
* Return * Return
* 0 on success, or a negative error in case of failure. * 0 on success, or a negative error in case of failure.
*
* u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md)
* Description
* Get the total size of a given xdp buff (linear and paged area)
* Return
* The total size of a given xdp buffer.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -5244,6 +5250,7 @@ union bpf_attr { ...@@ -5244,6 +5250,7 @@ union bpf_attr {
FN(get_func_arg_cnt), \ FN(get_func_arg_cnt), \
FN(get_retval), \ FN(get_retval), \
FN(set_retval), \ FN(set_retval), \
FN(xdp_get_buff_len), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
...@@ -3783,6 +3783,19 @@ static const struct bpf_func_proto sk_skb_change_head_proto = { ...@@ -3783,6 +3783,19 @@ static const struct bpf_func_proto sk_skb_change_head_proto = {
.arg2_type = ARG_ANYTHING, .arg2_type = ARG_ANYTHING,
.arg3_type = ARG_ANYTHING, .arg3_type = ARG_ANYTHING,
}; };
BPF_CALL_1(bpf_xdp_get_buff_len, struct xdp_buff*, xdp)
{
return xdp_get_buff_len(xdp);
}
static const struct bpf_func_proto bpf_xdp_get_buff_len_proto = {
.func = bpf_xdp_get_buff_len,
.gpl_only = false,
.ret_type = RET_INTEGER,
.arg1_type = ARG_PTR_TO_CTX,
};
static unsigned long xdp_get_metalen(const struct xdp_buff *xdp) static unsigned long xdp_get_metalen(const struct xdp_buff *xdp)
{ {
return xdp_data_meta_unsupported(xdp) ? 0 : return xdp_data_meta_unsupported(xdp) ? 0 :
...@@ -7533,6 +7546,8 @@ xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) ...@@ -7533,6 +7546,8 @@ xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
return &bpf_xdp_redirect_map_proto; return &bpf_xdp_redirect_map_proto;
case BPF_FUNC_xdp_adjust_tail: case BPF_FUNC_xdp_adjust_tail:
return &bpf_xdp_adjust_tail_proto; return &bpf_xdp_adjust_tail_proto;
case BPF_FUNC_xdp_get_buff_len:
return &bpf_xdp_get_buff_len_proto;
case BPF_FUNC_fib_lookup: case BPF_FUNC_fib_lookup:
return &bpf_xdp_fib_lookup_proto; return &bpf_xdp_fib_lookup_proto;
case BPF_FUNC_check_mtu: case BPF_FUNC_check_mtu:
......
...@@ -5054,6 +5054,12 @@ union bpf_attr { ...@@ -5054,6 +5054,12 @@ union bpf_attr {
* This helper is currently supported by cgroup programs only. * This helper is currently supported by cgroup programs only.
* Return * Return
* 0 on success, or a negative error in case of failure. * 0 on success, or a negative error in case of failure.
*
* u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md)
* Description
* Get the total size of a given xdp buff (linear and paged area)
* Return
* The total size of a given xdp buffer.
*/ */
#define __BPF_FUNC_MAPPER(FN) \ #define __BPF_FUNC_MAPPER(FN) \
FN(unspec), \ FN(unspec), \
...@@ -5244,6 +5250,7 @@ union bpf_attr { ...@@ -5244,6 +5250,7 @@ union bpf_attr {
FN(get_func_arg_cnt), \ FN(get_func_arg_cnt), \
FN(get_retval), \ FN(get_retval), \
FN(set_retval), \ FN(set_retval), \
FN(xdp_get_buff_len), \
/* */ /* */
/* integer value in 'imm' field of BPF_CALL instruction selects which helper /* integer value in 'imm' field of BPF_CALL instruction selects which helper
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment