return 0;
}
+static void dump_err_stream(const struct bpf_program *prog)
+{
+ char buf[512];
+ int ret;
+
+ ret = 0;
+ do {
+ ret = bpf_prog_stream_read(bpf_program__fd(prog),
+ BPF_STREAM_STDERR, buf, sizeof(buf),
+ NULL);
+ if (ret > 0)
+ fwrite(buf, sizeof(buf[0]), ret, stderr);
+ } while (ret > 0);
+}
+
void test_xdp_context_veth(void)
{
LIBBPF_OPTS(bpf_tc_hook, tc_hook, .attach_point = BPF_TC_INGRESS);
if (!ASSERT_OK(ret, "send_test_packet"))
goto close;
- ASSERT_TRUE(skel->bss->test_pass, "test_pass");
+ if (!ASSERT_TRUE(skel->bss->test_pass, "test_pass"))
+ dump_err_stream(tc_prog);
close:
close_netns(nstoken);
if (!ASSERT_OK(ret, "write_test_packet"))
goto close;
- ASSERT_TRUE(*test_pass, "test_pass");
+ if (!ASSERT_TRUE(*test_pass, "test_pass"))
+ dump_err_stream(tc_prio_2_prog ? : tc_prio_1_prog);
close:
if (tap_fd >= 0)
if (!ASSERT_OK(ret, "write_test_packet"))
goto close;
- ASSERT_TRUE(*test_pass, "test_pass");
+ if (!ASSERT_TRUE(*test_pass, "test_pass"))
+ dump_err_stream(tc_prog);
close:
if (tap_fd >= 0)
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
};
+static bool check_metadata(const char *file, int line, __u8 *meta_have)
+{
+ if (!__builtin_memcmp(meta_have, meta_want, META_SIZE))
+ return true;
+
+ bpf_stream_printk(BPF_STREAM_STDERR,
+ "FAIL:%s:%d: metadata mismatch\n"
+ " have:\n %pI6\n %pI6\n"
+ " want:\n %pI6\n %pI6\n",
+ file, line,
+ &meta_have[0x00], &meta_have[0x10],
+ &meta_want[0x00], &meta_want[0x10]);
+ return false;
+}
+
+#define check_metadata(meta_have) check_metadata(__FILE__, __LINE__, meta_have)
+
SEC("tc")
int ing_cls(struct __sk_buff *ctx)
{
if (meta_have + META_SIZE > data)
goto out;
- if (__builtin_memcmp(meta_want, meta_have, META_SIZE))
+ if (!check_metadata(meta_have))
goto out;
test_pass = true;
bpf_dynptr_from_skb_meta(ctx, 0, &meta);
bpf_dynptr_read(meta_have, META_SIZE, &meta, 0, 0);
- if (__builtin_memcmp(meta_want, meta_have, META_SIZE))
+ if (!check_metadata(meta_have))
goto out;
test_pass = true;
if (!meta_have)
goto out;
- if (__builtin_memcmp(meta_want, meta_have, META_SIZE))
+ if (!check_metadata(meta_have))
goto out;
test_pass = true;
goto out;
__builtin_memcpy(dst, src, chunk_len);
- if (__builtin_memcmp(meta_want, meta_have, META_SIZE))
+ if (!check_metadata(meta_have))
goto out;
test_pass = true;