Skip to content

Commit 91843d5

Browse files
jrfastabborkmann
authored andcommitted
bpf: sockmap, add msg_cork_bytes() helper
In the case where we need a specific number of bytes before a verdict can be assigned, even if the data spans multiple sendmsg or sendfile calls. The BPF program may use msg_cork_bytes(). The extreme case is a user can call sendmsg repeatedly with 1-byte msg segments. Obviously, this is bad for performance but is still valid. If the BPF program needs N bytes to validate a header it can use msg_cork_bytes to specify N bytes and the BPF program will not be called again until N bytes have been accumulated. The infrastructure will attempt to coalesce data if possible so in many cases (most my use cases at least) the data will be in a single scatterlist element with data pointers pointing to start/end of the element. However, this is dependent on available memory so is not guaranteed. So BPF programs must validate data pointer ranges, but this is the case anyways to convince the verifier the accesses are valid. Signed-off-by: John Fastabend <[email protected]> Acked-by: David S. Miller <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 2a10031 commit 91843d5

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

include/uapi/linux/bpf.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,8 @@ union bpf_attr {
792792
FN(override_return), \
793793
FN(sock_ops_cb_flags_set), \
794794
FN(msg_redirect_map), \
795-
FN(msg_apply_bytes),
795+
FN(msg_apply_bytes), \
796+
FN(msg_cork_bytes),
796797

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

net/core/filter.c

+16
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,20 @@ static const struct bpf_func_proto bpf_msg_apply_bytes_proto = {
19421942
.arg2_type = ARG_ANYTHING,
19431943
};
19441944

1945+
BPF_CALL_2(bpf_msg_cork_bytes, struct sk_msg_buff *, msg, u32, bytes)
1946+
{
1947+
msg->cork_bytes = bytes;
1948+
return 0;
1949+
}
1950+
1951+
static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
1952+
.func = bpf_msg_cork_bytes,
1953+
.gpl_only = false,
1954+
.ret_type = RET_INTEGER,
1955+
.arg1_type = ARG_PTR_TO_CTX,
1956+
.arg2_type = ARG_ANYTHING,
1957+
};
1958+
19451959
BPF_CALL_1(bpf_get_cgroup_classid, const struct sk_buff *, skb)
19461960
{
19471961
return task_get_classid(skb);
@@ -3650,6 +3664,8 @@ static const struct bpf_func_proto *sk_msg_func_proto(enum bpf_func_id func_id)
36503664
return &bpf_msg_redirect_map_proto;
36513665
case BPF_FUNC_msg_apply_bytes:
36523666
return &bpf_msg_apply_bytes_proto;
3667+
case BPF_FUNC_msg_cork_bytes:
3668+
return &bpf_msg_cork_bytes_proto;
36533669
default:
36543670
return bpf_base_func_proto(func_id);
36553671
}

0 commit comments

Comments
 (0)