0001
0002 #include <linux/if_link.h>
0003 #include <test_progs.h>
0004
0005 #define IFINDEX_LO 1
0006
0007 void serial_test_xdp_info(void)
0008 {
0009 __u32 len = sizeof(struct bpf_prog_info), duration = 0, prog_id;
0010 const char *file = "./xdp_dummy.o";
0011 struct bpf_prog_info info = {};
0012 struct bpf_object *obj;
0013 int err, prog_fd;
0014
0015
0016
0017 err = bpf_xdp_query_id(IFINDEX_LO, 0, &prog_id);
0018 if (CHECK(err, "get_xdp_none", "errno=%d\n", errno))
0019 return;
0020 if (CHECK(prog_id, "prog_id_none", "unexpected prog_id=%u\n", prog_id))
0021 return;
0022
0023 err = bpf_xdp_query_id(IFINDEX_LO, XDP_FLAGS_SKB_MODE, &prog_id);
0024 if (CHECK(err, "get_xdp_none_skb", "errno=%d\n", errno))
0025 return;
0026 if (CHECK(prog_id, "prog_id_none_skb", "unexpected prog_id=%u\n",
0027 prog_id))
0028 return;
0029
0030
0031
0032 err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
0033 if (CHECK_FAIL(err))
0034 return;
0035
0036 err = bpf_obj_get_info_by_fd(prog_fd, &info, &len);
0037 if (CHECK(err, "get_prog_info", "errno=%d\n", errno))
0038 goto out_close;
0039
0040 err = bpf_xdp_attach(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE, NULL);
0041 if (CHECK(err, "set_xdp_skb", "errno=%d\n", errno))
0042 goto out_close;
0043
0044
0045
0046 err = bpf_xdp_query_id(IFINDEX_LO, 0, &prog_id);
0047 if (CHECK(err, "get_xdp", "errno=%d\n", errno))
0048 goto out;
0049 if (CHECK(prog_id != info.id, "prog_id", "prog_id not available\n"))
0050 goto out;
0051
0052 err = bpf_xdp_query_id(IFINDEX_LO, XDP_FLAGS_SKB_MODE, &prog_id);
0053 if (CHECK(err, "get_xdp_skb", "errno=%d\n", errno))
0054 goto out;
0055 if (CHECK(prog_id != info.id, "prog_id_skb", "prog_id not available\n"))
0056 goto out;
0057
0058 err = bpf_xdp_query_id(IFINDEX_LO, XDP_FLAGS_DRV_MODE, &prog_id);
0059 if (CHECK(err, "get_xdp_drv", "errno=%d\n", errno))
0060 goto out;
0061 if (CHECK(prog_id, "prog_id_drv", "unexpected prog_id=%u\n", prog_id))
0062 goto out;
0063
0064 out:
0065 bpf_xdp_detach(IFINDEX_LO, 0, NULL);
0066 out_close:
0067 bpf_object__close(obj);
0068 }