From 3488e02d00fa1b981cb72aa564f480e7cb1e8681 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Wed, 3 Nov 2021 19:21:16 +0100 Subject: [PATCH] AF_XDP-interaction: Trying to use xsk_btf__read This doesn't work with packet test. Signed-off-by: Jesper Dangaard Brouer --- AF_XDP-interaction/af_xdp_user.c | 42 ++++++++++++++++++++++------- AF_XDP-interaction/lib_xsk_extend.c | 6 +++-- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/AF_XDP-interaction/af_xdp_user.c b/AF_XDP-interaction/af_xdp_user.c index 26c3016..03db22f 100644 --- a/AF_XDP-interaction/af_xdp_user.c +++ b/AF_XDP-interaction/af_xdp_user.c @@ -346,10 +346,11 @@ int init_btf_info_via_bpf_object(struct bpf_object *bpf_obj) if ((err = init_xdp_hints(btf, &xdp_meta_with_mark))) return err; - /* Check member with "rx_time" exist */ - if (!xsk_btf__has_field("rx_time", xdp_meta_with_time.xbi)) { + /* Check member with "rx_ktime" exist */ + if (!xsk_btf__has_field("rx_ktime", xdp_meta_with_time.xbi)) { return -EBADSLT; } + return 0; } struct meta_info { @@ -377,14 +378,32 @@ static void print_meta_info(uint8_t *pkt, uint32_t len) } -static void print_meta_info_via_btf(uint8_t *pkt) +static void print_meta_info_time(uint8_t *pkt) +{ + struct xsk_btf_info *xbi = xdp_meta_with_time.xbi; + __u64 rx_ktime; + int err; + + err = xsk_btf__read(&rx_ktime, sizeof(rx_ktime), + "rx_ktime", xbi, pkt); + if (err) { + printf("DEBUG-meta-time ERROR(%d) no rx_ktime?! sz:%d\n", err, sizeof(rx_ktime)); + return; + } + + printf("DEBUG-meta-time rx_ktime:%llu\n", rx_ktime); +} + +static void print_meta_info_via_btf( uint8_t *pkt) { struct meta_info *meta = (void *)(pkt - sizeof(*meta)); __u32 btf_id = xsk_umem__btf_id(pkt); - if (btf_id == xsk_btf__btf_type_id(xdp_meta_with_time.xbi)) { - printf("DEBUG-meta btf_id:%d rx_time:%llu\n", - meta->btf_id, meta->rx_ktime); + __u32 meta_time = xsk_btf__btf_type_id(xdp_meta_with_time.xbi); + // __u32 meta_mark = xsk_btf__btf_type_id(xdp_meta_with_mark.xbi); + + if (btf_id == meta_time) { + print_meta_info_time(pkt); } } @@ -732,7 +751,7 @@ int btf_info_via_bpf_object(struct bpf_object *bpf_obj) int main(int argc, char **argv) { - int ret; + int ret, err; int xsks_map_fd; void *packet_buffer; uint64_t packet_buffer_size; @@ -788,10 +807,15 @@ int main(int argc, char **argv) } } - if (0) { + if (1) { btf_info_via_bpf_object(bpf_obj); } - init_btf_info_via_bpf_object(bpf_obj); + err = init_btf_info_via_bpf_object(bpf_obj); + if (err) { + fprintf(stderr, "ERROR(%d): Invalid BTF info: errno:%s\n", + err, strerror(errno)); + return EXIT_FAILURE; + } /* Allow unlimited locking of memory, so all memory needed for packet * buffers can be locked. diff --git a/AF_XDP-interaction/lib_xsk_extend.c b/AF_XDP-interaction/lib_xsk_extend.c index 2a9e36a..0026d2d 100644 --- a/AF_XDP-interaction/lib_xsk_extend.c +++ b/AF_XDP-interaction/lib_xsk_extend.c @@ -203,8 +203,10 @@ int xsk_btf__read(void **dest, size_t size, const char *field, struct xsk_btf_in hashmap__add(&(xbi->map), field, entry); } - if (entry->size != size) - return -EINVAL; + if (entry->size != size) { + printf("XXX entry->size(%ld) != size (%ld)\n", entry->size, size); + return -EFAULT; + } // XXX should we cache size for main xdp_hints struct? *dest = (void *)((char *)addr - xbi->type->size + entry->offset);