瀏覽代碼

core: Add hooks for perf tether ingress and egress

Define the hooks to be used be perf tether ingress and egress.

CRs-Fixed: 2813607
Change-Id: I68c4cc1e73c60e784fd4117679b3a373d29f539c
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 4 年之前
父節點
當前提交
eec13e2c69
共有 2 個文件被更改,包括 19 次插入0 次删除
  1. 9 0
      core/rmnet_descriptor.c
  2. 10 0
      core/rmnet_vnd.c

+ 9 - 0
core/rmnet_descriptor.c

@@ -37,6 +37,10 @@ typedef void (*rmnet_perf_desc_hook_t)(struct rmnet_frag_descriptor *frag_desc,
 				       struct rmnet_port *port);
 typedef void (*rmnet_perf_chain_hook_t)(void);
 
+typedef void (*rmnet_perf_tether_ingress_hook_t)(struct tcphdr *tp, struct sk_buff *skb);
+rmnet_perf_tether_ingress_hook_t rmnet_perf_tether_ingress_hook __rcu __read_mostly;
+EXPORT_SYMBOL(rmnet_perf_tether_ingress_hook);
+
 struct rmnet_frag_descriptor *
 rmnet_get_frag_descriptor(struct rmnet_port *port)
 {
@@ -731,6 +735,7 @@ static void rmnet_frag_gso_stamp(struct sk_buff *skb,
 static void rmnet_frag_partial_csum(struct sk_buff *skb,
 				    struct rmnet_frag_descriptor *frag_desc)
 {
+	rmnet_perf_tether_ingress_hook_t rmnet_perf_tether_ingress;
 	struct iphdr *iph = (struct iphdr *)skb->data;
 	__sum16 pseudo;
 	u16 pkt_len = skb->len - frag_desc->ip_len;
@@ -757,6 +762,10 @@ static void rmnet_frag_partial_csum(struct sk_buff *skb,
 
 		tp->check = pseudo;
 		skb->csum_offset = offsetof(struct tcphdr, check);
+
+		rmnet_perf_tether_ingress = rcu_dereference(rmnet_perf_tether_ingress_hook);
+		if (rmnet_perf_tether_ingress)
+			rmnet_perf_tether_ingress(tp, skb);
 	} else {
 		struct udphdr *up = (struct udphdr *)
 				    ((u8 *)iph + frag_desc->ip_len);

+ 10 - 0
core/rmnet_vnd.c

@@ -31,6 +31,11 @@
 #include "rmnet_qmi.h"
 #include "rmnet_trace.h"
 
+typedef void (*rmnet_perf_tether_egress_hook_t)(struct sk_buff *skb);
+
+rmnet_perf_tether_egress_hook_t rmnet_perf_tether_egress_hook __rcu __read_mostly;
+EXPORT_SYMBOL(rmnet_perf_tether_egress_hook);
+
 /* RX/TX Fixup */
 
 void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len)
@@ -68,6 +73,7 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,
 	int ip_type;
 	u32 mark;
 	unsigned int len;
+	rmnet_perf_tether_egress_hook_t rmnet_perf_tether_egress;
 
 	priv = netdev_priv(dev);
 	if (priv->real_dev) {
@@ -76,6 +82,10 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,
 		mark = skb->mark;
 		len = skb->len;
 		trace_rmnet_xmit_skb(skb);
+		rmnet_perf_tether_egress = rcu_dereference(rmnet_perf_tether_egress_hook);
+		if (rmnet_perf_tether_egress) {
+			rmnet_perf_tether_egress(skb);
+		}
 		rmnet_egress_handler(skb);
 		qmi_rmnet_burst_fc_check(dev, ip_type, mark, len);
 		qmi_rmnet_work_maybe_restart(rmnet_get_rmnet_port(dev));