selftests/bpf: Test [::] -> [::1] rewrite in sys_sendmsg in test_sock_addr
Test that sys_sendmsg BPF hook doesn't break sys_sendmsg behaviour to rewrite destination IPv6 = [::] with [::1] (BSD'ism). Two test cases are added: 1) User passes dst IPv6 = [::] and BPF_CGROUP_UDP6_SENDMSG program doesn't touch it. 2) User passes dst IPv6 != [::], but BPF_CGROUP_UDP6_SENDMSG program rewrites it with [::]. In both cases [::1] is used by sys_sendmsg code eventually and datagram is sent successfully for unconnected UDP socket. Example of relevant output: Test case: sendmsg6: set dst IP = [::] (BSD'ism) .. [PASS] Test case: sendmsg6: preserve dst IP = [::] (BSD'ism) .. [PASS] Signed-off-by: Andrey Ignatov <rdna@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
e8e3698408
commit
976b4f3a46
|
@ -44,6 +44,7 @@
|
||||||
#define SERV6_V4MAPPED_IP "::ffff:192.168.0.4"
|
#define SERV6_V4MAPPED_IP "::ffff:192.168.0.4"
|
||||||
#define SRC6_IP "::1"
|
#define SRC6_IP "::1"
|
||||||
#define SRC6_REWRITE_IP "::6"
|
#define SRC6_REWRITE_IP "::6"
|
||||||
|
#define WILDCARD6_IP "::"
|
||||||
#define SERV6_PORT 6060
|
#define SERV6_PORT 6060
|
||||||
#define SERV6_REWRITE_PORT 6666
|
#define SERV6_REWRITE_PORT 6666
|
||||||
|
|
||||||
|
@ -85,12 +86,14 @@ static int bind4_prog_load(const struct sock_addr_test *test);
|
||||||
static int bind6_prog_load(const struct sock_addr_test *test);
|
static int bind6_prog_load(const struct sock_addr_test *test);
|
||||||
static int connect4_prog_load(const struct sock_addr_test *test);
|
static int connect4_prog_load(const struct sock_addr_test *test);
|
||||||
static int connect6_prog_load(const struct sock_addr_test *test);
|
static int connect6_prog_load(const struct sock_addr_test *test);
|
||||||
|
static int sendmsg_allow_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg_deny_prog_load(const struct sock_addr_test *test);
|
static int sendmsg_deny_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test);
|
static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg4_rw_c_prog_load(const struct sock_addr_test *test);
|
static int sendmsg4_rw_c_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg6_rw_asm_prog_load(const struct sock_addr_test *test);
|
static int sendmsg6_rw_asm_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test);
|
static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test);
|
||||||
static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test);
|
static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test);
|
||||||
|
static int sendmsg6_rw_wildcard_prog_load(const struct sock_addr_test *test);
|
||||||
|
|
||||||
static struct sock_addr_test tests[] = {
|
static struct sock_addr_test tests[] = {
|
||||||
/* bind */
|
/* bind */
|
||||||
|
@ -462,6 +465,34 @@ static struct sock_addr_test tests[] = {
|
||||||
SRC6_REWRITE_IP,
|
SRC6_REWRITE_IP,
|
||||||
SYSCALL_ENOTSUPP,
|
SYSCALL_ENOTSUPP,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"sendmsg6: set dst IP = [::] (BSD'ism)",
|
||||||
|
sendmsg6_rw_wildcard_prog_load,
|
||||||
|
BPF_CGROUP_UDP6_SENDMSG,
|
||||||
|
BPF_CGROUP_UDP6_SENDMSG,
|
||||||
|
AF_INET6,
|
||||||
|
SOCK_DGRAM,
|
||||||
|
SERV6_IP,
|
||||||
|
SERV6_PORT,
|
||||||
|
SERV6_REWRITE_IP,
|
||||||
|
SERV6_REWRITE_PORT,
|
||||||
|
SRC6_REWRITE_IP,
|
||||||
|
SUCCESS,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sendmsg6: preserve dst IP = [::] (BSD'ism)",
|
||||||
|
sendmsg_allow_prog_load,
|
||||||
|
BPF_CGROUP_UDP6_SENDMSG,
|
||||||
|
BPF_CGROUP_UDP6_SENDMSG,
|
||||||
|
AF_INET6,
|
||||||
|
SOCK_DGRAM,
|
||||||
|
WILDCARD6_IP,
|
||||||
|
SERV6_PORT,
|
||||||
|
SERV6_REWRITE_IP,
|
||||||
|
SERV6_PORT,
|
||||||
|
SRC6_IP,
|
||||||
|
SUCCESS,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"sendmsg6: deny call",
|
"sendmsg6: deny call",
|
||||||
sendmsg_deny_prog_load,
|
sendmsg_deny_prog_load,
|
||||||
|
@ -734,16 +765,27 @@ static int connect6_prog_load(const struct sock_addr_test *test)
|
||||||
return load_path(test, CONNECT6_PROG_PATH);
|
return load_path(test, CONNECT6_PROG_PATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sendmsg_deny_prog_load(const struct sock_addr_test *test)
|
static int sendmsg_ret_only_prog_load(const struct sock_addr_test *test,
|
||||||
|
int32_t rc)
|
||||||
{
|
{
|
||||||
struct bpf_insn insns[] = {
|
struct bpf_insn insns[] = {
|
||||||
/* return 0 */
|
/* return rc */
|
||||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
BPF_MOV64_IMM(BPF_REG_0, rc),
|
||||||
BPF_EXIT_INSN(),
|
BPF_EXIT_INSN(),
|
||||||
};
|
};
|
||||||
return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn));
|
return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sendmsg_allow_prog_load(const struct sock_addr_test *test)
|
||||||
|
{
|
||||||
|
return sendmsg_ret_only_prog_load(test, /*rc*/ 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sendmsg_deny_prog_load(const struct sock_addr_test *test)
|
||||||
|
{
|
||||||
|
return sendmsg_ret_only_prog_load(test, /*rc*/ 0);
|
||||||
|
}
|
||||||
|
|
||||||
static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test)
|
static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test)
|
||||||
{
|
{
|
||||||
struct sockaddr_in dst4_rw_addr;
|
struct sockaddr_in dst4_rw_addr;
|
||||||
|
@ -864,6 +906,11 @@ static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test)
|
||||||
return sendmsg6_rw_dst_asm_prog_load(test, SERV6_V4MAPPED_IP);
|
return sendmsg6_rw_dst_asm_prog_load(test, SERV6_V4MAPPED_IP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sendmsg6_rw_wildcard_prog_load(const struct sock_addr_test *test)
|
||||||
|
{
|
||||||
|
return sendmsg6_rw_dst_asm_prog_load(test, WILDCARD6_IP);
|
||||||
|
}
|
||||||
|
|
||||||
static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test)
|
static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test)
|
||||||
{
|
{
|
||||||
return load_path(test, SENDMSG6_PROG_PATH);
|
return load_path(test, SENDMSG6_PROG_PATH);
|
||||||
|
|
Loading…
Reference in New Issue