samples/bpf: fixup some tools to be able to support xdp multibuffer

Bugzilla: https://bugzilla.redhat.com/2137876

commit 772251742262bd651529a3cea3ee756b71e95a29
Author: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Date:   Tue Jun 21 17:54:02 2022 +0000

    samples/bpf: fixup some tools to be able to support xdp multibuffer
    
    This changes the section name for the bpf program embedded in these
    files to "xdp.frags" to allow the programs to be loaded on drivers that
    are using an MTU greater than PAGE_SIZE.  Rather than directly accessing
    the buffers, the packet data is now accessed via xdp helper functions to
    provide an example for those who may need to write more complex
    programs.
    
    v2: remove new unnecessary variable
    
    Signed-off-by: Andy Gospodarek <gospo@broadcom.com>
    Acked-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Link: https://lore.kernel.org/r/20220621175402.35327-1-gospo@broadcom.com
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Felix Maurer <fmaurer@redhat.com>
This commit is contained in:
Felix Maurer 2022-11-24 18:22:25 +01:00 committed by Artem Savkov
parent 1880f2a617
commit d56a83c037
3 changed files with 17 additions and 7 deletions

View File

@ -39,11 +39,13 @@ static int parse_ipv6(void *data, u64 nh_off, void *data_end)
return ip6h->nexthdr;
}
SEC("xdp1")
#define XDPBUFSIZE 64
SEC("xdp.frags")
int xdp_prog1(struct xdp_md *ctx)
{
void *data_end = (void *)(long)ctx->data_end;
void *data = (void *)(long)ctx->data;
__u8 pkt[XDPBUFSIZE] = {};
void *data_end = &pkt[XDPBUFSIZE-1];
void *data = pkt;
struct ethhdr *eth = data;
int rc = XDP_DROP;
long *value;
@ -51,6 +53,9 @@ int xdp_prog1(struct xdp_md *ctx)
u64 nh_off;
u32 ipproto;
if (bpf_xdp_load_bytes(ctx, 0, pkt, sizeof(pkt)))
return rc;
nh_off = sizeof(*eth);
if (data + nh_off > data_end)
return rc;

View File

@ -55,11 +55,13 @@ static int parse_ipv6(void *data, u64 nh_off, void *data_end)
return ip6h->nexthdr;
}
SEC("xdp1")
#define XDPBUFSIZE 64
SEC("xdp.frags")
int xdp_prog1(struct xdp_md *ctx)
{
void *data_end = (void *)(long)ctx->data_end;
void *data = (void *)(long)ctx->data;
__u8 pkt[XDPBUFSIZE] = {};
void *data_end = &pkt[XDPBUFSIZE-1];
void *data = pkt;
struct ethhdr *eth = data;
int rc = XDP_DROP;
long *value;
@ -67,6 +69,9 @@ int xdp_prog1(struct xdp_md *ctx)
u64 nh_off;
u32 ipproto;
if (bpf_xdp_load_bytes(ctx, 0, pkt, sizeof(pkt)))
return rc;
nh_off = sizeof(*eth);
if (data + nh_off > data_end)
return rc;

View File

@ -212,7 +212,7 @@ static __always_inline int handle_ipv6(struct xdp_md *xdp)
return XDP_TX;
}
SEC("xdp_tx_iptunnel")
SEC("xdp.frags")
int _xdp_tx_iptunnel(struct xdp_md *xdp)
{
void *data_end = (void *)(long)xdp->data_end;