AF_XDP-interaction: Improve comments explaning attributes

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
This commit is contained in:
Jesper Dangaard Brouer
2021-11-02 13:58:39 +01:00
parent c905867f29
commit 5245641946

View File

@@ -21,22 +21,25 @@ struct {
} xdp_stats_map SEC(".maps"); } xdp_stats_map SEC(".maps");
/* /*
* This struct is stored in the XDP 'data_meta' area, which is located * The xdp_hints_xxx struct's are stored in the XDP 'data_meta' area,
* just in-front-of the raw packet payload data. * which is located just in-front-of the raw packet payload data.
*
* Explaining the struct attribute's:
* ----------------------------------
* The struct must be 4 byte aligned (kernel requirement), which here
* is enforced by the struct __attribute__((aligned(4))).
*
* To avoid any C-struct padding attribute "packed" is used.
* *
* The struct must be 4 byte aligned, which here is enforced by the
* struct __attribute__((aligned(4))).
*/
struct xdp_hints_mark {
__u32 mark;
__u32 btf_id;
} __attribute__((aligned(4))) __attribute__((packed));
/*
* NOTICE: Do NOT define __attribute__((preserve_access_index)) here, * NOTICE: Do NOT define __attribute__((preserve_access_index)) here,
* as libbpf will try to find a matching kernel data-structure, * as libbpf will try to find a matching kernel data-structure,
* e.g. it will cause BPF-prog loading step to fail (with invalid func * e.g. it will cause BPF-prog loading step to fail (with invalid func
* unknown#195896080 which is 0xbad2310 in hex for "bad relo"). * unknown#195896080 which is 0xbad2310 in hex for "bad relo").
*/ */
struct xdp_hints_mark {
__u32 mark;
__u32 btf_id;
} __attribute__((aligned(4))) __attribute__((packed));
struct xdp_hints_rx_time { struct xdp_hints_rx_time {
__u64 rx_ktime; __u64 rx_ktime;
@@ -68,6 +71,7 @@ int meta_add_rx_time(struct xdp_md *ctx)
return -2; return -2;
meta->rx_ktime = bpf_ktime_get_ns(); meta->rx_ktime = bpf_ktime_get_ns();
/* Userspace can identify struct used by BTF id */
meta->btf_id = bpf_core_type_id_local(struct xdp_hints_rx_time); meta->btf_id = bpf_core_type_id_local(struct xdp_hints_rx_time);
return 0; return 0;
@@ -100,7 +104,6 @@ int xdp_sock_prog(struct xdp_md *ctx)
{ {
int index = ctx->rx_queue_index; int index = ctx->rx_queue_index;
__u32 *pkt_count; __u32 *pkt_count;
void *data;
int err; int err;
pkt_count = bpf_map_lookup_elem(&xdp_stats_map, &index); pkt_count = bpf_map_lookup_elem(&xdp_stats_map, &index);
@@ -108,6 +111,7 @@ int xdp_sock_prog(struct xdp_md *ctx)
return XDP_ABORTED; return XDP_ABORTED;
__u64 cnt = (*pkt_count)++; __u64 cnt = (*pkt_count)++;
/* Notice how two different xdp_hints meta-data are used */
if ((cnt % 2) == 0) { if ((cnt % 2) == 0) {
err = meta_add_rx_time(ctx); err = meta_add_rx_time(ctx);
if (err < 0) if (err < 0)