44 lines
1.1 KiB
Diff
44 lines
1.1 KiB
Diff
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
||
|
index d23742f..1f0415f 100644
|
||
|
--- a/net/core/dev.c
|
||
|
+++ b/net/core/dev.c
|
||
|
@@ -3168,6 +3168,9 @@ void netdev_rx_handler_unregister(struct net_device *dev)
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);
|
||
|
|
||
|
+int (*athrs_fast_nat_recv)(struct sk_buff *skb) __rcu __read_mostly;
|
||
|
+EXPORT_SYMBOL_GPL(athrs_fast_nat_recv);
|
||
|
+
|
||
|
static int __netif_receive_skb(struct sk_buff *skb)
|
||
|
{
|
||
|
struct packet_type *ptype, *pt_prev;
|
||
|
@@ -3177,6 +3180,7 @@ static int __netif_receive_skb(struct sk_buff *skb)
|
||
|
bool deliver_exact = false;
|
||
|
int ret = NET_RX_DROP;
|
||
|
__be16 type;
|
||
|
+ int (*fast_recv)(struct sk_buff *skb);
|
||
|
|
||
|
net_timestamp_check(!netdev_tstamp_prequeue, skb);
|
||
|
|
||
|
@@ -3194,10 +3198,18 @@ static int __netif_receive_skb(struct sk_buff *skb)
|
||
|
skb_reset_transport_header(skb);
|
||
|
skb_reset_mac_len(skb);
|
||
|
|
||
|
- pt_prev = NULL;
|
||
|
-
|
||
|
rcu_read_lock();
|
||
|
|
||
|
+ fast_recv = rcu_dereference(athrs_fast_nat_recv);
|
||
|
+ if (fast_recv) {
|
||
|
+ if (fast_recv(skb)) {
|
||
|
+ rcu_read_unlock();
|
||
|
+ return NET_RX_SUCCESS;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ pt_prev = NULL;
|
||
|
+
|
||
|
another_round:
|
||
|
|
||
|
__this_cpu_inc(softnet_data.processed);
|