|
@@ -47,6 +47,16 @@ typedef void (*rmnet_perf_egress_hook1_t)(struct sk_buff *skb);
|
|
rmnet_perf_egress_hook1_t rmnet_perf_egress_hook1 __rcu __read_mostly;
|
|
rmnet_perf_egress_hook1_t rmnet_perf_egress_hook1 __rcu __read_mostly;
|
|
EXPORT_SYMBOL(rmnet_perf_egress_hook1);
|
|
EXPORT_SYMBOL(rmnet_perf_egress_hook1);
|
|
|
|
|
|
|
|
+typedef void (*rmnet_aps_pre_queue_t)(struct net_device *dev,
|
|
|
|
+ struct sk_buff *skb);
|
|
|
|
+rmnet_aps_pre_queue_t rmnet_aps_pre_queue __read_mostly;
|
|
|
|
+EXPORT_SYMBOL(rmnet_aps_pre_queue);
|
|
|
|
+
|
|
|
|
+typedef int (*rmnet_aps_post_queue_t)(struct net_device *dev,
|
|
|
|
+ struct sk_buff *skb);
|
|
|
|
+rmnet_aps_post_queue_t rmnet_aps_post_queue __read_mostly;
|
|
|
|
+EXPORT_SYMBOL(rmnet_aps_post_queue);
|
|
|
|
+
|
|
/* RX/TX Fixup */
|
|
/* RX/TX Fixup */
|
|
|
|
|
|
void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len)
|
|
void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len)
|
|
@@ -85,10 +95,20 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,
|
|
u32 mark;
|
|
u32 mark;
|
|
unsigned int len;
|
|
unsigned int len;
|
|
rmnet_perf_tether_egress_hook_t rmnet_perf_tether_egress;
|
|
rmnet_perf_tether_egress_hook_t rmnet_perf_tether_egress;
|
|
|
|
+ rmnet_aps_post_queue_t aps_post_queue;
|
|
bool low_latency = false;
|
|
bool low_latency = false;
|
|
bool need_to_drop = false;
|
|
bool need_to_drop = false;
|
|
|
|
|
|
priv = netdev_priv(dev);
|
|
priv = netdev_priv(dev);
|
|
|
|
+
|
|
|
|
+ aps_post_queue = rcu_dereference(rmnet_aps_post_queue);
|
|
|
|
+ if (aps_post_queue)
|
|
|
|
+ if (unlikely(aps_post_queue(dev, skb))) {
|
|
|
|
+ this_cpu_inc(priv->pcpu_stats->stats.tx_drops);
|
|
|
|
+ kfree_skb(skb);
|
|
|
|
+ return NETDEV_TX_OK;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (priv->real_dev) {
|
|
if (priv->real_dev) {
|
|
ip_type = (ip_hdr(skb)->version == 4) ?
|
|
ip_type = (ip_hdr(skb)->version == 4) ?
|
|
AF_INET : AF_INET6;
|
|
AF_INET : AF_INET6;
|
|
@@ -262,9 +282,6 @@ static void rmnet_get_stats64(struct net_device *dev,
|
|
s->tx_dropped = total_stats.tx_drops;
|
|
s->tx_dropped = total_stats.tx_drops;
|
|
}
|
|
}
|
|
|
|
|
|
-void (*rmnet_aps_set_prio)(struct net_device *dev, struct sk_buff *skb);
|
|
|
|
-EXPORT_SYMBOL(rmnet_aps_set_prio);
|
|
|
|
-
|
|
|
|
static u16 rmnet_vnd_select_queue(struct net_device *dev,
|
|
static u16 rmnet_vnd_select_queue(struct net_device *dev,
|
|
struct sk_buff *skb,
|
|
struct sk_buff *skb,
|
|
struct net_device *sb_dev)
|
|
struct net_device *sb_dev)
|
|
@@ -274,7 +291,7 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev,
|
|
int boost_trigger = 0;
|
|
int boost_trigger = 0;
|
|
int txq = 0;
|
|
int txq = 0;
|
|
rmnet_perf_egress_hook1_t rmnet_perf_egress1;
|
|
rmnet_perf_egress_hook1_t rmnet_perf_egress1;
|
|
- void (*aps_set_prio)(struct net_device *dev, struct sk_buff *skb);
|
|
|
|
|
|
+ rmnet_aps_pre_queue_t aps_pre_queue;
|
|
|
|
|
|
rmnet_perf_egress1 = rcu_dereference(rmnet_perf_egress_hook1);
|
|
rmnet_perf_egress1 = rcu_dereference(rmnet_perf_egress_hook1);
|
|
if (rmnet_perf_egress1) {
|
|
if (rmnet_perf_egress1) {
|
|
@@ -439,11 +456,9 @@ skip_trace:
|
|
(void) boost_period;
|
|
(void) boost_period;
|
|
}
|
|
}
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
|
- aps_set_prio = READ_ONCE(rmnet_aps_set_prio);
|
|
|
|
- if (aps_set_prio)
|
|
|
|
- aps_set_prio(dev, skb);
|
|
|
|
- rcu_read_unlock();
|
|
|
|
|
|
+ aps_pre_queue = rcu_dereference(rmnet_aps_pre_queue);
|
|
|
|
+ if (aps_pre_queue)
|
|
|
|
+ aps_pre_queue(dev, skb);
|
|
|
|
|
|
return (txq < dev->real_num_tx_queues) ? txq : 0;
|
|
return (txq < dev->real_num_tx_queues) ? txq : 0;
|
|
}
|
|
}
|