Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Rewrite recvmsg{4,6} asm progs to c in test_sock_addr

I'll extend them in the next patch. It's easier to work with C
than with asm.

Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210127232853.3753823-4-sdf@google.com

authored by

Stanislav Fomichev and committed by
Daniel Borkmann
35749060 073f4ec1

+92 -74
+37
tools/testing/selftests/bpf/progs/recvmsg4_prog.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include <linux/stddef.h> 4 + #include <linux/bpf.h> 5 + #include <linux/in.h> 6 + #include <sys/socket.h> 7 + 8 + #include <bpf/bpf_helpers.h> 9 + #include <bpf/bpf_endian.h> 10 + 11 + #define SERV4_IP 0xc0a801feU /* 192.168.1.254 */ 12 + #define SERV4_PORT 4040 13 + 14 + SEC("cgroup/recvmsg4") 15 + int recvmsg4_prog(struct bpf_sock_addr *ctx) 16 + { 17 + struct bpf_sock *sk; 18 + __u32 user_ip4; 19 + __u16 user_port; 20 + 21 + sk = ctx->sk; 22 + if (!sk) 23 + return 1; 24 + 25 + if (sk->family != AF_INET) 26 + return 1; 27 + 28 + if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM) 29 + return 1; 30 + 31 + ctx->user_ip4 = bpf_htonl(SERV4_IP); 32 + ctx->user_port = bpf_htons(SERV4_PORT); 33 + 34 + return 1; 35 + } 36 + 37 + char _license[] SEC("license") = "GPL";
+43
tools/testing/selftests/bpf/progs/recvmsg6_prog.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include <linux/stddef.h> 4 + #include <linux/bpf.h> 5 + #include <linux/in6.h> 6 + #include <sys/socket.h> 7 + 8 + #include <bpf/bpf_helpers.h> 9 + #include <bpf/bpf_endian.h> 10 + 11 + #define SERV6_IP_0 0xfaceb00c /* face:b00c:1234:5678::abcd */ 12 + #define SERV6_IP_1 0x12345678 13 + #define SERV6_IP_2 0x00000000 14 + #define SERV6_IP_3 0x0000abcd 15 + #define SERV6_PORT 6060 16 + 17 + SEC("cgroup/recvmsg6") 18 + int recvmsg6_prog(struct bpf_sock_addr *ctx) 19 + { 20 + struct bpf_sock *sk; 21 + __u32 user_ip4; 22 + __u16 user_port; 23 + 24 + sk = ctx->sk; 25 + if (!sk) 26 + return 1; 27 + 28 + if (sk->family != AF_INET6) 29 + return 1; 30 + 31 + if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM) 32 + return 1; 33 + 34 + ctx->user_ip6[0] = bpf_htonl(SERV6_IP_0); 35 + ctx->user_ip6[1] = bpf_htonl(SERV6_IP_1); 36 + ctx->user_ip6[2] = bpf_htonl(SERV6_IP_2); 37 + ctx->user_ip6[3] = bpf_htonl(SERV6_IP_3); 38 + ctx->user_port = bpf_htons(SERV6_PORT); 39 + 40 + return 1; 41 + } 42 + 43 + char _license[] SEC("license") = "GPL";
+12 -74
tools/testing/selftests/bpf/test_sock_addr.c
··· 31 31 #define CONNECT6_PROG_PATH "./connect6_prog.o" 32 32 #define SENDMSG4_PROG_PATH "./sendmsg4_prog.o" 33 33 #define SENDMSG6_PROG_PATH "./sendmsg6_prog.o" 34 + #define RECVMSG4_PROG_PATH "./recvmsg4_prog.o" 35 + #define RECVMSG6_PROG_PATH "./recvmsg6_prog.o" 34 36 #define BIND4_PROG_PATH "./bind4_prog.o" 35 37 #define BIND6_PROG_PATH "./bind6_prog.o" 36 38 ··· 96 94 static int recvmsg_allow_prog_load(const struct sock_addr_test *test); 97 95 static int recvmsg_deny_prog_load(const struct sock_addr_test *test); 98 96 static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test); 99 - static int recvmsg4_rw_asm_prog_load(const struct sock_addr_test *test); 97 + static int recvmsg4_rw_c_prog_load(const struct sock_addr_test *test); 100 98 static int sendmsg4_rw_c_prog_load(const struct sock_addr_test *test); 101 99 static int sendmsg6_rw_asm_prog_load(const struct sock_addr_test *test); 102 - static int recvmsg6_rw_asm_prog_load(const struct sock_addr_test *test); 100 + static int recvmsg6_rw_c_prog_load(const struct sock_addr_test *test); 103 101 static int sendmsg6_rw_c_prog_load(const struct sock_addr_test *test); 104 102 static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test); 105 103 static int sendmsg6_rw_wildcard_prog_load(const struct sock_addr_test *test); ··· 575 573 LOAD_REJECT, 576 574 }, 577 575 { 578 - "recvmsg4: rewrite IP & port (asm)", 579 - recvmsg4_rw_asm_prog_load, 576 + "recvmsg4: rewrite IP & port (C)", 577 + recvmsg4_rw_c_prog_load, 580 578 BPF_CGROUP_UDP4_RECVMSG, 581 579 BPF_CGROUP_UDP4_RECVMSG, 582 580 AF_INET, ··· 589 587 SUCCESS, 590 588 }, 591 589 { 592 - "recvmsg6: rewrite IP & port (asm)", 593 - recvmsg6_rw_asm_prog_load, 590 + "recvmsg6: rewrite IP & port (C)", 591 + recvmsg6_rw_c_prog_load, 594 592 BPF_CGROUP_UDP6_RECVMSG, 595 593 BPF_CGROUP_UDP6_RECVMSG, 596 594 AF_INET6, ··· 788 786 return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn)); 789 787 } 790 788 791 - static int recvmsg4_rw_asm_prog_load(const struct sock_addr_test *test) 789 + static int recvmsg4_rw_c_prog_load(const struct sock_addr_test *test) 792 790 { 793 - struct sockaddr_in src4_rw_addr; 794 - 795 - if (mk_sockaddr(AF_INET, SERV4_IP, SERV4_PORT, 796 - (struct sockaddr *)&src4_rw_addr, 797 - sizeof(src4_rw_addr)) == -1) 798 - return -1; 799 - 800 - struct bpf_insn insns[] = { 801 - BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 802 - 803 - /* if (sk.family == AF_INET && */ 804 - BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_6, 805 - offsetof(struct bpf_sock_addr, family)), 806 - BPF_JMP_IMM(BPF_JNE, BPF_REG_7, AF_INET, 6), 807 - 808 - /* sk.type == SOCK_DGRAM) { */ 809 - BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_6, 810 - offsetof(struct bpf_sock_addr, type)), 811 - BPF_JMP_IMM(BPF_JNE, BPF_REG_7, SOCK_DGRAM, 4), 812 - 813 - /* user_ip4 = src4_rw_addr.sin_addr */ 814 - BPF_MOV32_IMM(BPF_REG_7, src4_rw_addr.sin_addr.s_addr), 815 - BPF_STX_MEM(BPF_W, BPF_REG_6, BPF_REG_7, 816 - offsetof(struct bpf_sock_addr, user_ip4)), 817 - 818 - /* user_port = src4_rw_addr.sin_port */ 819 - BPF_MOV32_IMM(BPF_REG_7, src4_rw_addr.sin_port), 820 - BPF_STX_MEM(BPF_W, BPF_REG_6, BPF_REG_7, 821 - offsetof(struct bpf_sock_addr, user_port)), 822 - /* } */ 823 - 824 - /* return 1 */ 825 - BPF_MOV64_IMM(BPF_REG_0, 1), 826 - BPF_EXIT_INSN(), 827 - }; 828 - 829 - return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn)); 791 + return load_path(test, RECVMSG4_PROG_PATH); 830 792 } 831 793 832 794 static int sendmsg4_rw_c_prog_load(const struct sock_addr_test *test) ··· 856 890 return sendmsg6_rw_dst_asm_prog_load(test, SERV6_REWRITE_IP); 857 891 } 858 892 859 - static int recvmsg6_rw_asm_prog_load(const struct sock_addr_test *test) 893 + static int recvmsg6_rw_c_prog_load(const struct sock_addr_test *test) 860 894 { 861 - struct sockaddr_in6 src6_rw_addr; 862 - 863 - if (mk_sockaddr(AF_INET6, SERV6_IP, SERV6_PORT, 864 - (struct sockaddr *)&src6_rw_addr, 865 - sizeof(src6_rw_addr)) == -1) 866 - return -1; 867 - 868 - struct bpf_insn insns[] = { 869 - BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 870 - 871 - /* if (sk.family == AF_INET6) { */ 872 - BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_6, 873 - offsetof(struct bpf_sock_addr, family)), 874 - BPF_JMP_IMM(BPF_JNE, BPF_REG_7, AF_INET6, 10), 875 - 876 - STORE_IPV6(user_ip6, src6_rw_addr.sin6_addr.s6_addr32), 877 - 878 - /* user_port = dst6_rw_addr.sin6_port */ 879 - BPF_MOV32_IMM(BPF_REG_7, src6_rw_addr.sin6_port), 880 - BPF_STX_MEM(BPF_W, BPF_REG_6, BPF_REG_7, 881 - offsetof(struct bpf_sock_addr, user_port)), 882 - /* } */ 883 - 884 - /* return 1 */ 885 - BPF_MOV64_IMM(BPF_REG_0, 1), 886 - BPF_EXIT_INSN(), 887 - }; 888 - 889 - return load_insns(test, insns, sizeof(insns) / sizeof(struct bpf_insn)); 895 + return load_path(test, RECVMSG6_PROG_PATH); 890 896 } 891 897 892 898 static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test)