Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Minor conflict, a CHECK was placed into an if() statement in net-next, whilst a newline was added to that CHECK call in 'net'. Thanks to Daniel for the merge resolution. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -3627,6 +3627,44 @@ int dev_queue_xmit_accel(struct sk_buff *skb, void *accel_priv)
|
||||
}
|
||||
EXPORT_SYMBOL(dev_queue_xmit_accel);
|
||||
|
||||
int dev_direct_xmit(struct sk_buff *skb, u16 queue_id)
|
||||
{
|
||||
struct net_device *dev = skb->dev;
|
||||
struct sk_buff *orig_skb = skb;
|
||||
struct netdev_queue *txq;
|
||||
int ret = NETDEV_TX_BUSY;
|
||||
bool again = false;
|
||||
|
||||
if (unlikely(!netif_running(dev) ||
|
||||
!netif_carrier_ok(dev)))
|
||||
goto drop;
|
||||
|
||||
skb = validate_xmit_skb_list(skb, dev, &again);
|
||||
if (skb != orig_skb)
|
||||
goto drop;
|
||||
|
||||
skb_set_queue_mapping(skb, queue_id);
|
||||
txq = skb_get_tx_queue(dev, skb);
|
||||
|
||||
local_bh_disable();
|
||||
|
||||
HARD_TX_LOCK(dev, txq, smp_processor_id());
|
||||
if (!netif_xmit_frozen_or_drv_stopped(txq))
|
||||
ret = netdev_start_xmit(skb, dev, txq, false);
|
||||
HARD_TX_UNLOCK(dev, txq);
|
||||
|
||||
local_bh_enable();
|
||||
|
||||
if (!dev_xmit_complete(ret))
|
||||
kfree_skb(skb);
|
||||
|
||||
return ret;
|
||||
drop:
|
||||
atomic_long_inc(&dev->tx_dropped);
|
||||
kfree_skb_list(skb);
|
||||
return NET_XMIT_DROP;
|
||||
}
|
||||
EXPORT_SYMBOL(dev_direct_xmit);
|
||||
|
||||
/*************************************************************************
|
||||
* Receiver routines
|
||||
@@ -3996,12 +4034,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;
|
||||
|
||||
@@ -4036,19 +4074,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)
|
||||
@@ -4058,10 +4096,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) {
|
||||
@@ -4070,7 +4109,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;
|
||||
@@ -4120,17 +4159,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;
|
||||
|
Reference in New Issue
Block a user