AF_XDP-interaction: steps towards using BTF id during pkt processing

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
This commit is contained in:
Jesper Dangaard Brouer
2021-11-03 18:14:17 +01:00
parent 20a07fa297
commit 8bb3d3ce3d
3 changed files with 82 additions and 10 deletions

View File

@@ -303,6 +303,55 @@ static inline void csum_replace2(__sum16 *sum, __be16 old, __be16 new)
*sum = ~csum16_add(csum16_sub(~(*sum), old), new);
}
struct xdp_hints {
struct xsk_btf_info *xbi;
const char *struct_name;
};
static struct xdp_hints xdp_meta_with_time = {
.struct_name = "xdp_hints_rx_time",
};
static struct xdp_hints xdp_meta_with_mark = {
.struct_name = "xdp_hints_mark",
};
int init_xdp_hints(struct btf *btf_obj, struct xdp_hints *xh)
{
int err;
err = xsk_btf__init_xdp_hint(btf_obj, xh->struct_name, &(xh->xbi));
if (err) {
fprintf(stderr, "ERR(%d): Cannot BTF find struct:%s\n",
err, xh->struct_name);
return err;
}
if (!xsk_btf__has_field("btf_id", xh->xbi)) {
fprintf(stderr, "ERR: %s doesn't contain member btf_id\n",
xh->struct_name);
return -ENOENT;
}
return 0;
}
int init_btf_info_via_bpf_object(struct bpf_object *bpf_obj)
{
struct btf *btf = bpf_object__btf(bpf_obj);
int err;
if ((err = init_xdp_hints(btf, &xdp_meta_with_time)))
return err;
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)) {
return -EBADSLT;
}
}
struct meta_info {
union {
struct {
@@ -328,6 +377,17 @@ static void print_meta_info(uint8_t *pkt, uint32_t len)
}
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);
}
}
/* As debug tool print some info about packet */
static void print_pkt_info(uint8_t *pkt, uint32_t len)
{
@@ -361,8 +421,10 @@ static bool process_packet(struct xsk_socket_info *xsk,
{
uint8_t *pkt = xsk_umem__get_data(xsk->umem->buffer, addr);
if (debug_meta)
print_meta_info(pkt, len);
if (debug_meta) {
// print_meta_info(pkt, len);
print_meta_info_via_btf(pkt);
}
if (debug)
printf("XXX addr:0x%lX pkt_ptr:0x%p\n", addr, pkt);
@@ -640,9 +702,6 @@ __s32 btf_find_struct(struct btf *btf, const char *name, __s64 *size)
return btf_id;
}
static const char *name1 = "xdp_hints_mark";
static const char *name2 = "xdp_hints_rx_time";
int btf_info_via_bpf_object(struct bpf_object *bpf_obj)
{
struct btf *btf = bpf_object__btf(bpf_obj);
@@ -651,6 +710,9 @@ int btf_info_via_bpf_object(struct bpf_object *bpf_obj)
struct xsk_btf_info *xdp_hint_rx_time = NULL;
static const char *name1 = "xdp_hints_mark";
static const char *name2 = "xdp_hints_rx_time";
btf_find_struct(btf, name1, &size);
btf_find_struct(btf, name2, &size);
@@ -726,9 +788,10 @@ int main(int argc, char **argv)
}
}
if (1) {
if (0) {
btf_info_via_bpf_object(bpf_obj);
}
init_btf_info_via_bpf_object(bpf_obj);
/* Allow unlimited locking of memory, so all memory needed for packet
* buffers can be locked.

View File

@@ -12,10 +12,11 @@
#include <bpf/btf.h> /* provided by libbpf */
int xsk_umem__btf_id(void *umem_pkt_data, const struct xsk_umem *umem)
int xsk_umem__btf_id(void *umem_pkt_data) // , const struct xsk_umem *umem)
{
// if (umem->config.xdp_headroom < sizeof(int))
// return -EINVAL;
// TODO: Need some check that know of metadata is enabled for frame
return *(int *)(umem_pkt_data - sizeof(int));
}
@@ -25,7 +26,7 @@ struct xsk_btf_info {
struct hashmap map;
struct btf *btf;
const struct btf_type *type;
//__u32 btf_id;
__u32 btf_type_id;
};
struct xsk_btf_entry {
@@ -33,6 +34,12 @@ struct xsk_btf_entry {
__u32 size;
};
__u32 xsk_btf__btf_type_id(struct xsk_btf_info *xbi)
{
return xbi->btf_type_id;
}
static void __xsk_btf_free_hash(struct xsk_btf_info *xbi)
{
struct hashmap_entry *entry;
@@ -113,7 +120,7 @@ int xsk_btf__init_xdp_hint(struct btf *btf_obj,
(*xbi)->btf = btf_obj;
(*xbi)->type = t;
// (*xbi)->btf_id = id;
(*xbi)->btf_type_id = id;
return ret;

View File

@@ -5,7 +5,7 @@
//#define LIBBPF_API ""
LIBBPF_API int xsk_umem__btf_id(void *umem_data, const struct xsk_umem *umem);
LIBBPF_API int xsk_umem__btf_id(void *umem_data);
struct xsk_btf_info;
@@ -15,6 +15,8 @@ LIBBPF_API int xsk_btf__init_xdp_hint(struct btf *btf_obj,
LIBBPF_API void xsk_btf__free_xdp_hint(struct xsk_btf_info *xbi);
LIBBPF_API __u32 xsk_btf__btf_type_id(struct xsk_btf_info *xbi);
LIBBPF_API int xsk_btf__read(void **dest, size_t size, const char *field, struct xsk_btf_info *xbi,
const void *addr);
LIBBPF_API bool xsk_btf__has_field(const char *field, struct xsk_btf_info *xbi);