Files
openwrt-R7800-nss/package/qca-nss/qca-nss-ecm/patches/210-ECM-to-wlan-driver-callback-signature-changes.patch
Lucas Asvio e38c766dc7 package: add qca-nss support for k6.x
Before I can get to work a feed repository that work i have included
qca-nss source needed on this commit

Source author: SqTER-PL <r.napierala@asta-net.pl>
2025-08-04 18:52:30 +02:00

336 lines
13 KiB
Diff

From 12cdc396ed57835c2056f9d524e3661745ac7d57 Mon Sep 17 00:00:00 2001
From: Parikshit Gune <quic_pgune@quicinc.com>
Date: Fri, 28 Jul 2023 11:04:45 +0530
Subject: [PATCH] [qca-nss-ecm] ECM to wlan driver callback signature changes.
1. Signature change to pack the information into structures instead of
individual fields for EMESH, SCS, MSCS wlan callbacks.
2. Add src and dest net devices in the EMESH param sync callback.
Change-Id: Iafbde3f0bbe073a8720ab86371c344d4941158ec
Signed-off-by: Parikshit Gune <quic_pgune@quicinc.com>
---
ecm_classifier_emesh.c | 70 ++++++++++++++++++++----
ecm_classifier_mscs.c | 11 +++-
ecm_wifi_plugins/ecm_wifi_plugin_emesh.c | 23 +++++++-
ecm_wifi_plugins/ecm_wifi_plugin_mscs.c | 33 ++++++++++-
exports/ecm_classifier_emesh_public.h | 21 +++++--
exports/ecm_classifier_mscs_public.h | 26 ++++++++-
6 files changed, 161 insertions(+), 23 deletions(-)
--- a/ecm_classifier_emesh.c
+++ b/ecm_classifier_emesh.c
@@ -1747,7 +1747,10 @@ void ecm_classifier_emesh_sawf_params_sy
void ecm_classifier_emesh_sawf_update_latency_param_on_conn_decel(struct ecm_classifier_instance *aci, struct ecm_classifier_rule_sync *sync)
{
struct ecm_classifier_emesh_sawf_instance *cemi;
+ struct ecm_classifer_emesh_sawf_mesh_latency_params mesh_params = {0};
struct ecm_db_connection_instance *ci;
+ struct net_device *src_dev = NULL;
+ struct net_device *dest_dev = NULL;
uint8_t peer_mac[ETH_ALEN];
cemi = (struct ecm_classifier_emesh_sawf_instance *)aci;
@@ -1775,21 +1778,40 @@ void ecm_classifier_emesh_sawf_update_la
return;
}
+ ecm_db_netdevs_get_and_hold(ci, ECM_TRACKER_SENDER_TYPE_SRC, &src_dev, &dest_dev);
+
/*
* Get mac address for destination node
*/
ecm_db_connection_node_address_get(ci, ECM_DB_OBJ_DIR_TO, peer_mac);
- ecm_emesh.update_peer_mesh_latency_params(peer_mac,
- cemi->service_interval_dl, cemi->burst_size_dl, cemi->service_interval_ul, cemi->burst_size_ul,
- cemi->pcp[ECM_CONN_DIR_FLOW], ECM_CLASSIFIER_EMESH_SUB_LATENCY_PARAMS);
+
+ mesh_params.peer_mac = peer_mac;
+ mesh_params.dst_dev = dest_dev;
+ mesh_params.src_dev = src_dev;
+ mesh_params.service_interval_dl = cemi->service_interval_dl;
+ mesh_params.service_interval_ul = cemi->service_interval_ul;
+ mesh_params.burst_size_dl = cemi->burst_size_dl;
+ mesh_params.burst_size_ul = cemi->burst_size_ul;
+ mesh_params.priority = cemi->pcp[ECM_CONN_DIR_FLOW];
+ mesh_params.accel_or_decel = ECM_CLASSIFIER_EMESH_SUB_LATENCY_PARAMS;
+
+ ecm_emesh.update_peer_mesh_latency_params(&mesh_params);
/*
* Get mac address for source node
*/
ecm_db_connection_node_address_get(ci, ECM_DB_OBJ_DIR_FROM, peer_mac);
- ecm_emesh.update_peer_mesh_latency_params(peer_mac,
- cemi->service_interval_dl, cemi->burst_size_dl, cemi->service_interval_ul, cemi->burst_size_ul,
- cemi->pcp[ECM_CONN_DIR_FLOW], ECM_CLASSIFIER_EMESH_SUB_LATENCY_PARAMS);
+
+ mesh_params.peer_mac = peer_mac;
+ mesh_params.dst_dev = src_dev;
+ mesh_params.src_dev = dest_dev;
+ ecm_emesh.update_peer_mesh_latency_params(&mesh_params);
+
+ if (src_dev)
+ dev_put(src_dev);
+
+ if (dest_dev)
+ dev_put(dest_dev);
ecm_db_connection_deref(ci);
}
@@ -1895,6 +1917,8 @@ static void ecm_classifier_emesh_sawf_up
uint8_t service_interval_ul;
uint32_t burst_size_ul;
struct sk_buff *skb;
+ struct net_device *src_dev, *dest_dev = NULL;
+ struct ecm_classifer_emesh_sawf_mesh_latency_params mesh_params = {0};
uint8_t dmac[ETH_ALEN];
uint8_t smac[ETH_ALEN];
@@ -1933,6 +1957,8 @@ static void ecm_classifier_emesh_sawf_up
return;
}
+ ecm_db_netdevs_get_and_hold(ci, ECM_TRACKER_SENDER_TYPE_SRC, &src_dev, &dest_dev);
+
/*
* Invoke SPM rule lookup API to update skb priority
* When latency config is enabled, fetch latency parameter
@@ -1966,9 +1992,16 @@ static void ecm_classifier_emesh_sawf_up
/*
* Send destination mac address of this connection
*/
- ecm_emesh.update_peer_mesh_latency_params(dmac,
- service_interval_dl, burst_size_dl, service_interval_ul, burst_size_ul,
- skb->priority, ECM_CLASSIFIER_EMESH_ADD_LATENCY_PARAMS);
+ mesh_params.dst_dev = dest_dev;
+ mesh_params.src_dev = src_dev;
+ mesh_params.peer_mac = dmac;
+ mesh_params.service_interval_dl = service_interval_dl;
+ mesh_params.service_interval_ul = service_interval_ul;
+ mesh_params.burst_size_dl = burst_size_dl;
+ mesh_params.burst_size_ul = burst_size_ul;
+ mesh_params.priority = skb->priority;
+ mesh_params.accel_or_decel = ECM_CLASSIFIER_EMESH_ADD_LATENCY_PARAMS;
+ ecm_emesh.update_peer_mesh_latency_params(&mesh_params);
}
/*
@@ -1981,11 +2014,24 @@ static void ecm_classifier_emesh_sawf_up
/*
* Send source mac address of this connection
*/
- ecm_emesh.update_peer_mesh_latency_params(smac,
- service_interval_dl, burst_size_dl, service_interval_ul, burst_size_ul,
- skb->priority, ECM_CLASSIFIER_EMESH_ADD_LATENCY_PARAMS);
+ mesh_params.peer_mac = smac;
+ mesh_params.dst_dev = src_dev;
+ mesh_params.src_dev = dest_dev;
+ mesh_params.service_interval_dl = service_interval_dl;
+ mesh_params.service_interval_ul = service_interval_ul;
+ mesh_params.burst_size_dl = burst_size_dl;
+ mesh_params.burst_size_ul = burst_size_ul;
+ mesh_params.priority = skb->priority;
+ mesh_params.accel_or_decel = ECM_CLASSIFIER_EMESH_ADD_LATENCY_PARAMS;
+ ecm_emesh.update_peer_mesh_latency_params(&mesh_params);
}
+ if (src_dev)
+ dev_put(src_dev);
+
+ if (dest_dev)
+ dev_put(dest_dev);
+
ecm_db_connection_deref(ci);
}
--- a/ecm_classifier_mscs.c
+++ b/ecm_classifier_mscs.c
@@ -425,6 +425,8 @@ static void ecm_classifier_mscs_process(
#ifdef ECM_CLASSIFIER_MSCS_SCS_ENABLE
struct sp_rule_input_params flow_input_params;
struct sp_rule_output_params flow_output_params;
+ struct ecm_classifier_mscs_get_priority_info get_priority_info = {0};
+ struct ecm_classifier_mscs_rule_match_info rule_match_info = {0};
ecm_classifier_mscs_scs_priority_callback_t scs_cb = NULL;
#endif
#ifdef ECM_MULTICAST_ENABLE
@@ -545,7 +547,9 @@ static void ecm_classifier_mscs_process(
goto check_mscs_classifier;
}
- result = scs_cb(flow_output_params.rule_id, dmac);
+ rule_match_info.rule_id = flow_output_params.rule_id;
+ rule_match_info.dst_mac = dmac;
+ result = scs_cb(&rule_match_info);
}
}
@@ -617,7 +621,10 @@ static void ecm_classifier_mscs_process(
/*
* Invoke callback registered to classifier for peer look up
*/
- result = cb(smac, dmac, skb);
+ get_priority_info.src_mac = smac;
+ get_priority_info.dst_mac = dmac;
+ get_priority_info.skb = skb;
+ result = cb(&get_priority_info);
if (result == ECM_CLASSIFIER_MSCS_RESULT_UPDATE_PRIORITY) {
cmscsi->mscs_priority_update = true;
--- a/ecm_wifi_plugins/ecm_wifi_plugin_emesh.c
+++ b/ecm_wifi_plugins/ecm_wifi_plugin_emesh.c
@@ -26,6 +26,27 @@
#include "ecm_wifi_plugin.h"
/*
+ * ecm_wifi_plugin_emesh_sawf_update_peer_mesh_params()
+ * Update mesh latency params.
+ */
+static inline void ecm_wifi_plugin_emesh_sawf_update_peer_mesh_params(struct ecm_classifer_emesh_sawf_mesh_latency_params *mesh_params)
+{
+ struct qca_mesh_latency_update_peer_param wlan_mesh_params = {0};
+
+ wlan_mesh_params.dest_mac = mesh_params->peer_mac;
+ wlan_mesh_params.src_dev = mesh_params->src_dev;
+ wlan_mesh_params.dst_dev = mesh_params->dst_dev;
+ wlan_mesh_params.service_interval_dl = mesh_params->service_interval_dl;
+ wlan_mesh_params.service_interval_ul = mesh_params->service_interval_ul;
+ wlan_mesh_params.burst_size_dl = mesh_params->burst_size_dl;
+ wlan_mesh_params.burst_size_ul = mesh_params->burst_size_ul;
+ wlan_mesh_params.priority = mesh_params->priority;
+ wlan_mesh_params.add_or_sub = mesh_params->accel_or_decel;
+
+ qca_mesh_latency_update_peer_parameter_v2(&wlan_mesh_params);
+}
+
+/*
* ecm_wifi_plugin_emesh_sawf_conn_sync()
* Connection sync callback for EMESH-SAWF classifier.
*/
@@ -69,7 +90,7 @@ static inline uint32_t ecm_wifi_plugin_e
* Register EMESH client callback with ECM EMSH classifier to update peer mesh latency parameters.
*/
static struct ecm_classifier_emesh_sawf_callbacks ecm_wifi_plugin_emesh = {
- .update_peer_mesh_latency_params = qca_mesh_latency_update_peer_parameter,
+ .update_peer_mesh_latency_params = ecm_wifi_plugin_emesh_sawf_update_peer_mesh_params,
.update_service_id_get_msduq = ecm_wifi_plugin_emesh_sawf_get_mark_data,
.sawf_conn_sync = ecm_wifi_plugin_emesh_sawf_conn_sync,
};
--- a/ecm_wifi_plugins/ecm_wifi_plugin_mscs.c
+++ b/ecm_wifi_plugins/ecm_wifi_plugin_mscs.c
@@ -26,13 +26,42 @@
#include "ecm_wifi_plugin.h"
/*
+ * ecm_wifi_plugin_get_peer_priority()
+ * Get peer priority callback into wlan driver.
+ */
+static inline int ecm_wifi_plugin_get_peer_priority(struct ecm_classifier_mscs_get_priority_info *get_priority_info)
+{
+ struct qca_mscs_get_priority_param wlan_get_priority_param = {0};
+
+ wlan_get_priority_param.dst_mac = get_priority_info->dst_mac;
+ wlan_get_priority_param.src_mac = get_priority_info->src_mac;
+ wlan_get_priority_param.skb = get_priority_info->skb;
+
+ return qca_mscs_peer_lookup_n_get_priority_v2(&wlan_get_priority_param);
+}
+
+/*
+ * ecm_wifi_plugin_update_skb_priority()
+ * Update skb priority callback into wlan driver.
+ */
+static inline bool ecm_wifi_plugin_update_skb_priority(struct ecm_classifier_mscs_rule_match_info *match_info)
+{
+ struct qca_scs_peer_lookup_n_rule_match rule_match_param = {0};
+
+ rule_match_param.dst_mac_addr = match_info->dst_mac;
+ rule_match_param.rule_id = match_info->rule_id;
+
+ return qca_scs_peer_lookup_n_rule_match_v2(&rule_match_param);
+}
+
+/*
* ecm_wifi_plugin
* Register MSCS client callback with ECM MSCS classifier to support MSCS wifi peer lookup.
*/
static struct ecm_classifier_mscs_callbacks ecm_wifi_plugin_mscs = {
- .get_peer_priority = qca_mscs_peer_lookup_n_get_priority,
+ .get_peer_priority = ecm_wifi_plugin_get_peer_priority,
#ifdef ECM_CLASSIFIER_MSCS_SCS_ENABLE
- .update_skb_priority = qca_scs_peer_lookup_n_rule_match,
+ .update_skb_priority = ecm_wifi_plugin_update_skb_priority,
#endif
};
--- a/exports/ecm_classifier_emesh_public.h
+++ b/exports/ecm_classifier_emesh_public.h
@@ -80,12 +80,25 @@ struct ecm_classifier_emesh_sawf_flow_in
};
/**
+ * Structure collecting mesh latency params to send it to wlan driver
+ * via registered callback.
+ */
+struct ecm_classifer_emesh_sawf_mesh_latency_params {
+ struct net_device *dst_dev; /**< Destination net dev. */
+ struct net_device *src_dev; /**< Source net dev. */
+ uint8_t *peer_mac; /**< Peer MAC. */
+ uint32_t service_interval_dl; /**< Service interval DL. */
+ uint32_t burst_size_dl; /**< Burst size DL. */
+ uint32_t service_interval_ul; /**< Service interval UL. */
+ uint32_t burst_size_ul; /**< Burst size UL. */
+ uint16_t priority; /**< Priority. */
+ uint8_t accel_or_decel; /**< Time of the callback. */
+};
+
+/**
* Mesh latency configuration update callback function to which MSCS client will register.
*/
-typedef int (*ecm_classifier_emesh_callback_t)(uint8_t dest_mac[],
- uint32_t service_interval_dl, uint32_t burst_size_dl,
- uint32_t service_interval_ul, uint32_t burst_size_ul,
- uint16_t priority, uint8_t add_or_sub);
+typedef void (*ecm_classifier_emesh_callback_t)(struct ecm_classifer_emesh_sawf_mesh_latency_params *mesh_params);
/**
* MSDUQ callback to which emesh-sawf will register.
--- a/exports/ecm_classifier_mscs_public.h
+++ b/exports/ecm_classifier_mscs_public.h
@@ -43,10 +43,32 @@ enum ecm_classifier_mscs_results {
typedef enum /** @cond */ ecm_classifier_mscs_results /** @endcond */ ecm_classifier_mscs_result_t;
/**
+ * Structure containing params to get MSCS priority.
+ */
+struct ecm_classifier_mscs_get_priority_info {
+ struct net_device *dst_dev; /**< Destination net dev. */
+ struct net_device *src_dev; /**< Source net dev. */
+ uint8_t *src_mac; /**< Source MAC address. */
+ uint8_t *dst_mac; /**< Destination MAC address. */
+ struct sk_buff *skb; /**< SKB pointer. */
+};
+
+/**
+ * Structure containing params for SCS rule match info.
+ */
+struct ecm_classifier_mscs_rule_match_info {
+ struct net_device *dst_dev; /**< Destination net dev. */
+ struct net_device *src_dev; /**< Source net dev. */
+ uint8_t *src_mac; /**< Source MAC. */
+ uint8_t *dst_mac; /**< Destination MAC. */
+ uint32_t rule_id; /**< Rule ID. */
+};
+
+/**
* Callback to which MSCS clients will register.
*/
-typedef int (*ecm_classifier_mscs_process_callback_t)(uint8_t src_mac[], uint8_t dst_mac[], struct sk_buff* skb);
-typedef bool (*ecm_classifier_mscs_scs_priority_callback_t)(uint32_t rule_id, uint8_t *dst_mac_addr);
+typedef int (*ecm_classifier_mscs_process_callback_t)(struct ecm_classifier_mscs_get_priority_info *priority_info);
+typedef bool (*ecm_classifier_mscs_scs_priority_callback_t)(struct ecm_classifier_mscs_rule_match_info *rule_match_info);
/**
* Data structure for MSCS classifier callbacks.