0001
0002 #include <test_progs.h>
0003 #include <network_helpers.h>
0004
0005 void test_skb_ctx(void)
0006 {
0007 struct __sk_buff skb = {
0008 .cb[0] = 1,
0009 .cb[1] = 2,
0010 .cb[2] = 3,
0011 .cb[3] = 4,
0012 .cb[4] = 5,
0013 .priority = 6,
0014 .ingress_ifindex = 11,
0015 .ifindex = 1,
0016 .tstamp = 7,
0017 .wire_len = 100,
0018 .gso_segs = 8,
0019 .mark = 9,
0020 .gso_size = 10,
0021 .hwtstamp = 11,
0022 };
0023 LIBBPF_OPTS(bpf_test_run_opts, tattr,
0024 .data_in = &pkt_v4,
0025 .data_size_in = sizeof(pkt_v4),
0026 .ctx_in = &skb,
0027 .ctx_size_in = sizeof(skb),
0028 .ctx_out = &skb,
0029 .ctx_size_out = sizeof(skb),
0030 );
0031 struct bpf_object *obj;
0032 int err, prog_fd, i;
0033
0034 err = bpf_prog_test_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS,
0035 &obj, &prog_fd);
0036 if (!ASSERT_OK(err, "load"))
0037 return;
0038
0039
0040
0041 tattr.ctx_size_in = 0;
0042 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0043 ASSERT_NEQ(err, 0, "ctx_size_in");
0044 tattr.ctx_size_in = sizeof(skb);
0045
0046
0047
0048 tattr.ctx_size_out = 0;
0049 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0050 ASSERT_NEQ(err, 0, "ctx_size_out");
0051 tattr.ctx_size_out = sizeof(skb);
0052
0053
0054
0055 skb.len = 1;
0056 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0057 ASSERT_NEQ(err, 0, "len");
0058 skb.len = 0;
0059
0060 skb.tc_index = 1;
0061 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0062 ASSERT_NEQ(err, 0, "tc_index");
0063 skb.tc_index = 0;
0064
0065
0066
0067 skb.hash = 1;
0068 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0069 ASSERT_NEQ(err, 0, "hash");
0070 skb.hash = 0;
0071
0072 skb.sk = (struct bpf_sock *)1;
0073 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0074 ASSERT_NEQ(err, 0, "sk");
0075 skb.sk = 0;
0076
0077 err = bpf_prog_test_run_opts(prog_fd, &tattr);
0078 ASSERT_OK(err, "test_run");
0079 ASSERT_OK(tattr.retval, "test_run retval");
0080 ASSERT_EQ(tattr.ctx_size_out, sizeof(skb), "ctx_size_out");
0081
0082 for (i = 0; i < 5; i++)
0083 ASSERT_EQ(skb.cb[i], i + 2, "ctx_out_cb");
0084 ASSERT_EQ(skb.priority, 7, "ctx_out_priority");
0085 ASSERT_EQ(skb.ifindex, 1, "ctx_out_ifindex");
0086 ASSERT_EQ(skb.ingress_ifindex, 11, "ctx_out_ingress_ifindex");
0087 ASSERT_EQ(skb.tstamp, 8, "ctx_out_tstamp");
0088 ASSERT_EQ(skb.mark, 10, "ctx_out_mark");
0089
0090 bpf_object__close(obj);
0091 }