|
@@ -3919,7 +3919,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
|
|
/* When doing generic XDP we have to bypass the qdisc layer and the
|
|
/* When doing generic XDP we have to bypass the qdisc layer and the
|
|
* network taps in order to match in-driver-XDP behavior.
|
|
* network taps in order to match in-driver-XDP behavior.
|
|
*/
|
|
*/
|
|
-static void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog)
|
|
|
|
|
|
+void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog)
|
|
{
|
|
{
|
|
struct net_device *dev = skb->dev;
|
|
struct net_device *dev = skb->dev;
|
|
struct netdev_queue *txq;
|
|
struct netdev_queue *txq;
|
|
@@ -3940,13 +3940,12 @@ static void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog)
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL_GPL(generic_xdp_tx);
|
|
|
|
|
|
static struct static_key generic_xdp_needed __read_mostly;
|
|
static struct static_key generic_xdp_needed __read_mostly;
|
|
|
|
|
|
-static int do_xdp_generic(struct sk_buff *skb)
|
|
|
|
|
|
+int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb)
|
|
{
|
|
{
|
|
- struct bpf_prog *xdp_prog = rcu_dereference(skb->dev->xdp_prog);
|
|
|
|
-
|
|
|
|
if (xdp_prog) {
|
|
if (xdp_prog) {
|
|
u32 act = netif_receive_generic_xdp(skb, xdp_prog);
|
|
u32 act = netif_receive_generic_xdp(skb, xdp_prog);
|
|
int err;
|
|
int err;
|
|
@@ -3971,6 +3970,7 @@ out_redir:
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
return XDP_DROP;
|
|
return XDP_DROP;
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL_GPL(do_xdp_generic);
|
|
|
|
|
|
static int netif_rx_internal(struct sk_buff *skb)
|
|
static int netif_rx_internal(struct sk_buff *skb)
|
|
{
|
|
{
|
|
@@ -3981,7 +3981,8 @@ static int netif_rx_internal(struct sk_buff *skb)
|
|
trace_netif_rx(skb);
|
|
trace_netif_rx(skb);
|
|
|
|
|
|
if (static_key_false(&generic_xdp_needed)) {
|
|
if (static_key_false(&generic_xdp_needed)) {
|
|
- int ret = do_xdp_generic(skb);
|
|
|
|
|
|
+ int ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog),
|
|
|
|
+ skb);
|
|
|
|
|
|
/* Consider XDP consuming the packet a success from
|
|
/* Consider XDP consuming the packet a success from
|
|
* the netdev point of view we do not want to count
|
|
* the netdev point of view we do not want to count
|
|
@@ -4502,7 +4503,8 @@ static int netif_receive_skb_internal(struct sk_buff *skb)
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
|
|
if (static_key_false(&generic_xdp_needed)) {
|
|
if (static_key_false(&generic_xdp_needed)) {
|
|
- int ret = do_xdp_generic(skb);
|
|
|
|
|
|
+ int ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog),
|
|
|
|
+ skb);
|
|
|
|
|
|
if (ret != XDP_PASS) {
|
|
if (ret != XDP_PASS) {
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|