Sfoglia il codice sorgente

core: Add rx_handler for rmnet devices

Add a new hook so that modules can utilize the rx_handler.

Change-Id: I7b29f2e212280703d0e9d16282d63c91abceacaf
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 2 anni fa
parent
commit
e51f2b6d08
5 ha cambiato i file con 49 aggiunte e 1 eliminazioni
  1. 17 0
      core/rmnet_config.c
  2. 14 0
      core/rmnet_handlers.c
  3. 2 1
      core/rmnet_handlers.h
  4. 14 0
      core/rmnet_hook.h
  5. 2 0
      core/rmnet_module.h

+ 17 - 0
core/rmnet_config.c

@@ -342,12 +342,29 @@ static int rmnet_config_notify_cb(struct notifier_block *nb,
 				  unsigned long event, void *data)
 {
 	struct net_device *dev = netdev_notifier_info_to_dev(data);
+	int rc;
 
 	if (!dev)
 		return NOTIFY_DONE;
 
 	switch (event) {
+	case NETDEV_REGISTER:
+		if (dev->rtnl_link_ops == &rmnet_link_ops) {
+			rc = netdev_rx_handler_register(dev,
+							rmnet_rx_priv_handler,
+							NULL);
+
+			if (rc)
+				return NOTIFY_BAD;
+		}
+
+		break;
 	case NETDEV_UNREGISTER:
+		if (dev->rtnl_link_ops == &rmnet_link_ops) {
+			netdev_rx_handler_unregister(dev);
+			break;
+		}
+
 		netdev_dbg(dev, "Kernel unregister\n");
 		rmnet_force_unassociate_device(dev);
 		break;

+ 14 - 0
core/rmnet_handlers.c

@@ -477,6 +477,20 @@ done:
 }
 EXPORT_SYMBOL(rmnet_rx_handler);
 
+rx_handler_result_t rmnet_rx_priv_handler(struct sk_buff **pskb)
+{
+	struct sk_buff *skb = *pskb;
+	rx_handler_result_t rc = RX_HANDLER_PASS;
+
+	rmnet_module_hook_wlan_ingress_rx_handler(&rc, pskb);
+	if (rc != RX_HANDLER_PASS)
+		return rc;
+
+	rmnet_module_hook_perf_ingress_rx_handler(skb);
+
+	return RX_HANDLER_PASS;
+}
+
 /* Modifies packet as per logical endpoint configuration and egress data format
  * for egress device configured in logical endpoint. Packet is then transmitted
  * on the egress device.

+ 2 - 1
core/rmnet_handlers.h

@@ -1,4 +1,5 @@
 /* Copyright (c) 2013, 2016-2017, 2019-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
@@ -32,5 +33,5 @@ bool rmnet_slow_start_on(u32 hash_key);
 rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb,
 					       struct rmnet_port *port);
 rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb);
-
+rx_handler_result_t rmnet_rx_priv_handler(struct sk_buff **pskb);
 #endif /* _RMNET_HANDLERS_H_ */

+ 14 - 0
core/rmnet_hook.h

@@ -142,4 +142,18 @@ RMNET_MODULE_HOOK(aps_data_report,
 	RMNET_MODULE_HOOK_RETURN_TYPE(void)
 );
 
+RMNET_MODULE_HOOK(perf_ingress_rx_handler,
+	RMNET_MODULE_HOOK_NUM(PERF_INGRESS_RX_HANDLER),
+	RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff *skb),
+	RMNET_MODULE_HOOK_ARGS(skb),
+	RMNET_MODULE_HOOK_RETURN_TYPE(void)
+);
+
+RMNET_MODULE_HOOK(wlan_ingress_rx_handler,
+	RMNET_MODULE_HOOK_NUM(WLAN_INGRESS_RX_HANDLER),
+	RMNET_MODULE_HOOK_PROTOCOL(struct sk_buff **pskb),
+	RMNET_MODULE_HOOK_ARGS(pskb),
+	RMNET_MODULE_HOOK_RETURN_TYPE(rx_handler_result_t)
+);
+
 #endif

+ 2 - 0
core/rmnet_module.h

@@ -33,6 +33,8 @@ enum {
 	RMNET_MODULE_HOOK_APS_DATA_INACTIVE,
 	RMNET_MODULE_HOOK_APS_DATA_ACTIVE,
 	RMNET_MODULE_HOOK_APS_DATA_REPORT,
+	RMNET_MODULE_HOOK_PERF_INGRESS_RX_HANDLER,
+	RMNET_MODULE_HOOK_WLAN_INGRESS_RX_HANDLER,
 	__RMNET_MODULE_NUM_HOOKS,
 };