|
@@ -3994,12 +3994,12 @@ static struct netdev_rx_queue *netif_get_rxqueue(struct sk_buff *skb)
|
|
|
}
|
|
|
|
|
|
static u32 netif_receive_generic_xdp(struct sk_buff *skb,
|
|
|
+ struct xdp_buff *xdp,
|
|
|
struct bpf_prog *xdp_prog)
|
|
|
{
|
|
|
struct netdev_rx_queue *rxqueue;
|
|
|
void *orig_data, *orig_data_end;
|
|
|
u32 metalen, act = XDP_DROP;
|
|
|
- struct xdp_buff xdp;
|
|
|
int hlen, off;
|
|
|
u32 mac_len;
|
|
|
|
|
@@ -4034,19 +4034,19 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
|
|
|
*/
|
|
|
mac_len = skb->data - skb_mac_header(skb);
|
|
|
hlen = skb_headlen(skb) + mac_len;
|
|
|
- xdp.data = skb->data - mac_len;
|
|
|
- xdp.data_meta = xdp.data;
|
|
|
- xdp.data_end = xdp.data + hlen;
|
|
|
- xdp.data_hard_start = skb->data - skb_headroom(skb);
|
|
|
- orig_data_end = xdp.data_end;
|
|
|
- orig_data = xdp.data;
|
|
|
+ xdp->data = skb->data - mac_len;
|
|
|
+ xdp->data_meta = xdp->data;
|
|
|
+ xdp->data_end = xdp->data + hlen;
|
|
|
+ xdp->data_hard_start = skb->data - skb_headroom(skb);
|
|
|
+ orig_data_end = xdp->data_end;
|
|
|
+ orig_data = xdp->data;
|
|
|
|
|
|
rxqueue = netif_get_rxqueue(skb);
|
|
|
- xdp.rxq = &rxqueue->xdp_rxq;
|
|
|
+ xdp->rxq = &rxqueue->xdp_rxq;
|
|
|
|
|
|
- act = bpf_prog_run_xdp(xdp_prog, &xdp);
|
|
|
+ act = bpf_prog_run_xdp(xdp_prog, xdp);
|
|
|
|
|
|
- off = xdp.data - orig_data;
|
|
|
+ off = xdp->data - orig_data;
|
|
|
if (off > 0)
|
|
|
__skb_pull(skb, off);
|
|
|
else if (off < 0)
|
|
@@ -4056,10 +4056,11 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
|
|
|
/* check if bpf_xdp_adjust_tail was used. it can only "shrink"
|
|
|
* pckt.
|
|
|
*/
|
|
|
- off = orig_data_end - xdp.data_end;
|
|
|
+ off = orig_data_end - xdp->data_end;
|
|
|
if (off != 0) {
|
|
|
- skb_set_tail_pointer(skb, xdp.data_end - xdp.data);
|
|
|
+ skb_set_tail_pointer(skb, xdp->data_end - xdp->data);
|
|
|
skb->len -= off;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
switch (act) {
|
|
@@ -4068,7 +4069,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
|
|
|
__skb_push(skb, mac_len);
|
|
|
break;
|
|
|
case XDP_PASS:
|
|
|
- metalen = xdp.data - xdp.data_meta;
|
|
|
+ metalen = xdp->data - xdp->data_meta;
|
|
|
if (metalen)
|
|
|
skb_metadata_set(skb, metalen);
|
|
|
break;
|
|
@@ -4118,17 +4119,19 @@ static struct static_key generic_xdp_needed __read_mostly;
|
|
|
int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb)
|
|
|
{
|
|
|
if (xdp_prog) {
|
|
|
- u32 act = netif_receive_generic_xdp(skb, xdp_prog);
|
|
|
+ struct xdp_buff xdp;
|
|
|
+ u32 act;
|
|
|
int err;
|
|
|
|
|
|
+ act = netif_receive_generic_xdp(skb, &xdp, xdp_prog);
|
|
|
if (act != XDP_PASS) {
|
|
|
switch (act) {
|
|
|
case XDP_REDIRECT:
|
|
|
err = xdp_do_generic_redirect(skb->dev, skb,
|
|
|
- xdp_prog);
|
|
|
+ &xdp, xdp_prog);
|
|
|
if (err)
|
|
|
goto out_redir;
|
|
|
- /* fallthru to submit skb */
|
|
|
+ break;
|
|
|
case XDP_TX:
|
|
|
generic_xdp_tx(skb, xdp_prog);
|
|
|
break;
|