From eadc751af969b3880012a824e5debebf57cb7f42 Mon Sep 17 00:00:00 2001 From: Yan Chao Mei <1653720237@qq.com> Date: Mon, 30 Sep 2024 16:03:26 +0800 Subject: [PATCH] add sendmsg test --- bpf/kmesh/workload/sendmsg.c | 10 +++- bpf/test/workload/sendmsg_test.c | 93 ++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 bpf/test/workload/sendmsg_test.c diff --git a/bpf/kmesh/workload/sendmsg.c b/bpf/kmesh/workload/sendmsg.c index 401d2b29a..4acfa64b9 100644 --- a/bpf/kmesh/workload/sendmsg.c +++ b/bpf/kmesh/workload/sendmsg.c @@ -70,6 +70,10 @@ enum TLV_TYPE { TLV_PAYLOAD = 0xfe, }; +struct sk_msg_md g_msg = {0}; +struct bpf_sock_tuple g_dst_info = {0}; +__u32 g_encoded_length = 0; + static inline int check_overflow(struct sk_msg_md *msg, __u8 *begin, __u32 length) { if (msg->data_end < (void *)(begin + length)) { @@ -84,7 +88,9 @@ static inline int get_origin_dst(struct sk_msg_md *msg, struct ip_addr *dst_ip, __u64 *current_sk = (__u64 *)msg->sk; struct bpf_sock_tuple *dst; - dst = bpf_map_lookup_elem(&map_of_dst_info, ¤t_sk); + // dst = bpf_map_lookup_elem(&map_of_dst_info, ¤t_sk); + // 使用全局变量 g_dst_info 代替 map 查找 + dst = &g_dst_info; if (!dst) return -ENOENT; @@ -176,6 +182,8 @@ int sendmsg_prog(struct sk_msg_md *msg) // encode org dst addr encode_metadata_org_dst_addr(msg, &off, (msg->family == AF_INET)); + // 为测试目的,保存编码后的长度 + g_encoded_length = off; return SK_PASS; } diff --git a/bpf/test/workload/sendmsg_test.c b/bpf/test/workload/sendmsg_test.c new file mode 100644 index 000000000..ef04842b5 --- /dev/null +++ b/bpf/test/workload/sendmsg_test.c @@ -0,0 +1,93 @@ +// test_sendmsg.c +#include +#include +#include +#include +#include "sendmsg_test.skel.h" + + +void test_sendmsg_ipv4() +{ + struct sendmsg_test_bpf *skel; + int prog_fd, err; + + // 加载 eBPF 程序 + skel = sendmsg_test_bpf__open_and_load(); + assert(skel != NULL); + + // 准备测试数据 + skel->bss->g_msg.family = AF_INET; + skel->bss->g_msg.sk = (__u64)12345; // 模拟 socket 指针 + + skel->bss->g_dst_info.ipv4.daddr = 0x08080808; // 8.8.8.8 + skel->bss->g_dst_info.ipv4.dport = htons(80); + + struct bpf_test_run_opts opts = { + .sz = sizeof(struct bpf_test_run_opts), + .ctx_in = &skel->bss->g_msg, + .ctx_size_in = sizeof(skel->bss->g_msg), + .ctx_out = &skel->bss->g_msg, + .ctx_size_out = sizeof(skel->bss->g_msg) + }; + + // 运行测试 + prog_fd = bpf_program__fd(skel->progs.sendmsg_prog); + err = bpf_prog_test_run_opts(prog_fd, &opts); + + // 验证结果 + assert(err == 0); + assert(opts.retval == SK_PASS); + assert(skel->bss->g_encoded_length == TLV_ORG_DST_ADDR4_SIZE + TLV_END_SIZE); + + // 清理 + sendmsg_test_bpf__destroy(skel); +} + +void test_sendmsg_ipv6() +{ + struct sendmsg_test_bpf *skel; + int prog_fd, err; + + // 加载 eBPF 程序 + skel = sendmsg_test_bpf__open_and_load(); + assert(skel != NULL); + + // 准备测试数据 + skel->bss->g_msg.family = AF_INET6; + skel->bss->g_msg.sk = (__u64)12345; // 模拟 socket 指针 + + // 设置 IPv6 地址 (2001:4860:4860::8888) + skel->bss->g_dst_info.ipv6.daddr[0] = htonl(0x20010486); + skel->bss->g_dst_info.ipv6.daddr[1] = htonl(0x04860000); + skel->bss->g_dst_info.ipv6.daddr[2] = 0; + skel->bss->g_dst_info.ipv6.daddr[3] = htonl(0x8888); + skel->bss->g_dst_info.ipv6.dport = htons(80); + + struct bpf_test_run_opts opts = { + .sz = sizeof(struct bpf_test_run_opts), + .ctx_in = &skel->bss->g_msg, + .ctx_size_in = sizeof(skel->bss->g_msg), + .ctx_out = &skel->bss->g_msg, + .ctx_size_out = sizeof(skel->bss->g_msg) + }; + + // 运行测试 + prog_fd = bpf_program__fd(skel->progs.sendmsg_prog); + err = bpf_prog_test_run_opts(prog_fd, &opts); + + // 验证结果 + assert(err == 0); + assert(opts.retval == SK_PASS); + assert(skel->bss->g_encoded_length == TLV_ORG_DST_ADDR6_SIZE + TLV_END_SIZE); + + // 清理 + sendmsg_test_bpf__destroy(skel); +} + +int main() +{ + test_sendmsg_ipv4(); + test_sendmsg_ipv6(); + printf("All tests passed!\n"); + return 0; +} \ No newline at end of file