Quellcode durchsuchen

rmnet_core: Data activity hooks

Add APS data activity hooks.

Change-Id: Ic9daabd18682b0691123f635348f25a2671cc3fa
Signed-off-by: Weiyi Chen <[email protected]>
Weiyi Chen vor 2 Jahren
Ursprung
Commit
7ab163d7c4
8 geänderte Dateien mit 49 neuen und 14 gelöschten Zeilen
  1. 8 2
      core/qmi_rmnet.c
  2. 4 2
      core/qmi_rmnet.h
  3. 8 2
      core/rmnet_config.c
  4. 5 1
      core/rmnet_descriptor.c
  5. 3 3
      core/rmnet_handlers.c
  6. 16 1
      core/rmnet_hook.h
  7. 3 1
      core/rmnet_module.h
  8. 2 2
      core/rmnet_vnd.c

+ 8 - 2
core/qmi_rmnet.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -16,6 +16,8 @@
 #include "qmi_rmnet_i.h"
 #include "qmi_rmnet.h"
 #include "rmnet_qmi.h"
+#include "rmnet_module.h"
+#include "rmnet_hook.h"
 #include "dfc.h"
 #include <linux/rtnetlink.h>
 #include <uapi/linux/rtnetlink.h>
@@ -1364,6 +1366,7 @@ static void qmi_rmnet_check_stats_2(struct work_struct *work)
 	if (!rxd && !txd) {
 		qmi->ps_ignore_grant = true;
 		qmi->ps_enabled = true;
+		rmnet_module_hook_aps_data_inactive();
 		clear_bit(PS_WORK_ACTIVE_BIT, &qmi->ps_work_active);
 
 		smp_mb();
@@ -1441,7 +1444,7 @@ void qmi_rmnet_work_init(void *port)
 }
 EXPORT_SYMBOL(qmi_rmnet_work_init);
 
-void qmi_rmnet_work_maybe_restart(void *port)
+void qmi_rmnet_work_maybe_restart(void *port, void *desc, struct sk_buff *skb)
 {
 	struct qmi_info *qmi;
 
@@ -1452,6 +1455,9 @@ void qmi_rmnet_work_maybe_restart(void *port)
 	if (!test_and_set_bit(PS_WORK_ACTIVE_BIT, &qmi->ps_work_active)) {
 		qmi->ps_ignore_grant = false;
 		qmi_rmnet_work_restart(port);
+		if (desc || skb)
+			rmnet_module_hook_aps_data_active(
+				(struct rmnet_frag_descriptor *)desc, skb);
 	}
 }
 EXPORT_SYMBOL(qmi_rmnet_work_maybe_restart);

+ 4 - 2
core/qmi_rmnet.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -119,7 +120,7 @@ int qmi_rmnet_set_powersave_mode(void *port, uint8_t enable, u8 num_bearers,
 				 u8 *bearer_id);
 void qmi_rmnet_work_init(void *port);
 void qmi_rmnet_work_exit(void *port);
-void qmi_rmnet_work_maybe_restart(void *port);
+void qmi_rmnet_work_maybe_restart(void *port, void *desc, struct sk_buff *skb);
 void qmi_rmnet_set_dl_msg_active(void *port);
 bool qmi_rmnet_ignore_grant(void *port);
 
@@ -142,7 +143,8 @@ static inline void qmi_rmnet_work_init(void *port)
 static inline void qmi_rmnet_work_exit(void *port)
 {
 }
-static inline void qmi_rmnet_work_maybe_restart(void *port)
+static inline void qmi_rmnet_work_maybe_restart(void *port, void *desc,
+						struct sk_buff *skb)
 {
 
 }

+ 8 - 2
core/rmnet_config.c

@@ -1,5 +1,5 @@
 /* Copyright (c) 2013-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -228,6 +228,8 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
 		flags = nla_data(data[IFLA_RMNET_FLAGS]);
 		data_format = flags->flags & flags->mask;
 		netdev_dbg(dev, "data format [0x%08X]\n", data_format);
+		if (port->data_format & RMNET_INGRESS_FORMAT_PS)
+			data_format |= RMNET_INGRESS_FORMAT_PS;
 		port->data_format = data_format;
 	}
 
@@ -403,6 +405,7 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
 	struct rmnet_endpoint *ep;
 	struct rmnet_port *port;
 	u16 mux_id;
+	u32 data_format;
 	int rc = 0;
 
 	real_dev = __dev_get_by_index(dev_net(dev),
@@ -430,7 +433,10 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
 		struct ifla_rmnet_flags *flags;
 
 		flags = nla_data(data[IFLA_RMNET_FLAGS]);
-		port->data_format = flags->flags & flags->mask;
+		data_format = flags->flags & flags->mask;
+		if (port->data_format & RMNET_INGRESS_FORMAT_PS)
+			data_format |= RMNET_INGRESS_FORMAT_PS;
+		port->data_format = data_format;
 	}
 
 	if (data[IFLA_RMNET_DFC_QOS]) {

+ 5 - 1
core/rmnet_descriptor.c

@@ -1839,7 +1839,11 @@ __rmnet_frag_ingress_handler(struct rmnet_frag_descriptor *frag_desc,
 	}
 
 	if (port->data_format & RMNET_INGRESS_FORMAT_PS)
-		qmi_rmnet_work_maybe_restart(port);
+		qmi_rmnet_work_maybe_restart(port,
+			list_first_entry_or_null(&segs,
+						 struct rmnet_frag_descriptor,
+						 list),
+			NULL);
 
 	if (skip_perf)
 		goto no_perf;

+ 3 - 3
core/rmnet_handlers.c

@@ -1,5 +1,5 @@
 /* Copyright (c) 2013-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -260,7 +260,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
 	}
 
 	if (port->data_format & RMNET_INGRESS_FORMAT_PS)
-		qmi_rmnet_work_maybe_restart(port);
+		qmi_rmnet_work_maybe_restart(port, NULL, skb_peek(&list));
 
 	rmnet_deliver_skb_list(&list, port);
 	return;
@@ -368,7 +368,7 @@ static int rmnet_map_egress_handler(struct sk_buff *skb,
 	}
 
 	if (port->data_format & RMNET_INGRESS_FORMAT_PS)
-		qmi_rmnet_work_maybe_restart(port);
+		qmi_rmnet_work_maybe_restart(port, NULL, NULL);
 
 	state = &port->agg_state[(low_latency) ? RMNET_LL_AGG_STATE :
 				 RMNET_DEFAULT_AGG_STATE];

+ 16 - 1
core/rmnet_hook.h

@@ -1,4 +1,4 @@
-/* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+/* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -113,4 +113,19 @@ RMNET_MODULE_HOOK(wlan_flow_match,
 	RMNET_MODULE_HOOK_RETURN_TYPE(void)
 );
 
+RMNET_MODULE_HOOK(aps_data_inactive,
+	RMNET_MODULE_HOOK_NUM(APS_DATA_INACTIVE),
+	RMNET_MODULE_HOOK_PROTOCOL(void),
+	RMNET_MODULE_HOOK_ARGS(),
+	RMNET_MODULE_HOOK_RETURN_TYPE(void)
+);
+
+RMNET_MODULE_HOOK(aps_data_active,
+	RMNET_MODULE_HOOK_NUM(APS_DATA_ACTIVE),
+	RMNET_MODULE_HOOK_PROTOCOL(struct rmnet_frag_descriptor *frag_desc,
+				   struct sk_buff *skb),
+	RMNET_MODULE_HOOK_ARGS(frag_desc, skb),
+	RMNET_MODULE_HOOK_RETURN_TYPE(void)
+);
+
 #endif

+ 3 - 1
core/rmnet_module.h

@@ -1,4 +1,4 @@
-/* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+/* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -29,6 +29,8 @@ enum {
 	RMNET_MODULE_HOOK_APS_PRE_QUEUE,
 	RMNET_MODULE_HOOK_APS_POST_QUEUE,
 	RMNET_MODULE_HOOK_WLAN_FLOW_MATCH,
+	RMNET_MODULE_HOOK_APS_DATA_INACTIVE,
+	RMNET_MODULE_HOOK_APS_DATA_ACTIVE,
 	__RMNET_MODULE_NUM_HOOKS,
 };
 

+ 2 - 2
core/rmnet_vnd.c

@@ -1,5 +1,5 @@
 /* Copyright (c) 2013-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -208,7 +208,7 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,
 			rmnet_egress_handler(skb, low_latency);
 		}
 		qmi_rmnet_burst_fc_check(dev, ip_type, mark, len);
-		qmi_rmnet_work_maybe_restart(rmnet_get_rmnet_port(dev));
+		qmi_rmnet_work_maybe_restart(rmnet_get_rmnet_port(dev), NULL, NULL);
 	} else {
 		this_cpu_inc(priv->pcpu_stats->stats.tx_drops);
 		kfree_skb(skb);