mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 01:22:25 +00:00
qca-ssdk: fix UE Roaming between vlans
Fixes: WIFI-11886 Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
97
feeds/ipq807x/qca-ssdk/patches/300-fdb.patch
Normal file
97
feeds/ipq807x/qca-ssdk/patches/300-fdb.patch
Normal file
@@ -0,0 +1,97 @@
|
||||
Index: qca-ssdk/src/init/ssdk_init.c
|
||||
===================================================================
|
||||
--- qca-ssdk.orig/src/init/ssdk_init.c
|
||||
+++ qca-ssdk/src/init/ssdk_init.c
|
||||
@@ -137,6 +137,10 @@
|
||||
#include "ssdk_scomphy.h"
|
||||
#endif
|
||||
|
||||
+#include <linux/debugfs.h>
|
||||
+#include "fal/fal_fdb.h"
|
||||
+#include "ref/ref_vsi.h"
|
||||
+
|
||||
#ifdef IN_RFS
|
||||
struct rfs_device rfs_dev;
|
||||
struct notifier_block ssdk_inet_notifier;
|
||||
@@ -2005,10 +2009,81 @@ void ssdk_ess_reset(void)
|
||||
|
||||
char ssdk_driver_name[] = "ess_ssdk";
|
||||
|
||||
+static ssize_t ssdk_flush_mac_write(struct file *f, const char *buffer,
|
||||
+ size_t len, loff_t *offset)
|
||||
+{
|
||||
+ fal_fdb_entry_t entry;
|
||||
+ char data[18];
|
||||
+ ssize_t ret;
|
||||
+ char mac[6];
|
||||
+
|
||||
+ ret = simple_write_to_buffer(data, sizeof(data), offset, buffer, len);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ data[17] = 0;
|
||||
+
|
||||
+ if (sscanf(data, "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx",
|
||||
+ &mac[0], &mac[1], &mac[2], &mac[3],
|
||||
+ &mac[4], &mac[5]) != 6) {
|
||||
+ printk("failed to parse mac\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ {
|
||||
+ fal_fdb_op_t fdb_op;
|
||||
+ fal_fdb_entry_t fdb_entry;
|
||||
+ sw_error_t ret;
|
||||
+
|
||||
+ memset(&fdb_op, 0, sizeof(fdb_op));
|
||||
+ memset(&fdb_entry, 0, sizeof(fdb_entry));
|
||||
+
|
||||
+ ret = fal_fdb_entry_extend_getfirst(0, &fdb_op, &fdb_entry);
|
||||
+ while (ret == SW_OK) {
|
||||
+ printk("%s:%s[%d]%d %2x:%2x:%2x:%2x:%2x:%2x | %2x:%2x:%2x:%2x:%2x:%2x\n", __FILE__, __func__, __LINE__,
|
||||
+ fdb_entry.fid, fdb_entry.addr.uc[0], fdb_entry.addr.uc[1], fdb_entry.addr.uc[2], fdb_entry.addr.uc[3], fdb_entry.addr.uc[4], fdb_entry.addr.uc[5],
|
||||
+ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||
+ if (!memcmp(mac, &fdb_entry.addr, 6)) {
|
||||
+ memset(&entry, 0, sizeof(entry));
|
||||
+ memcpy(&entry.addr, mac, ETH_ALEN);
|
||||
+ entry.fid = fdb_entry.fid;
|
||||
+
|
||||
+ if (SW_OK != fal_fdb_entry_del_bymac(0, &entry))
|
||||
+ printk("failed to delete FDB entry\n");
|
||||
+ else
|
||||
+ printk("deleted %s/%d\n", data, entry.fid);
|
||||
+ }
|
||||
+
|
||||
+ ret = fal_fdb_entry_extend_getnext(0, &fdb_op, &fdb_entry);
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
+ return len;
|
||||
+}
|
||||
+
|
||||
+const struct file_operations ssdk_flush_mac_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .write = ssdk_flush_mac_write,
|
||||
+};
|
||||
+
|
||||
+static int debugfs_fdb_init(void)
|
||||
+{
|
||||
+ void *ret;
|
||||
+
|
||||
+ ret = debugfs_create_file("ssdk_flush_mac", 0644, NULL, NULL,
|
||||
+ &ssdk_flush_mac_fops);
|
||||
+ if (!ret)
|
||||
+ pr_warn("Failed to create ssdk_flush_mac in debugfs");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ssdk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
+ debugfs_fdb_init();
|
||||
+
|
||||
np = of_node_get(pdev->dev.of_node);
|
||||
if (of_device_is_compatible(np, "qcom,ess-instance"))
|
||||
return of_platform_populate(np, NULL, NULL, &pdev->dev);
|
||||
@@ -72,6 +72,8 @@ function event(object, verb, payload) {
|
||||
|
||||
let handlers = {
|
||||
'sta-authorized': function(notify, hapd) {
|
||||
/* force FDB flush on QCA Wifi-6 silicon */
|
||||
system(`echo ${notify.data.address} > /sys/kernel/debug/ssdk_flush_mac`);
|
||||
event('client', 'join', {
|
||||
client: notify.data.address,
|
||||
ssid: hapd.ssid,
|
||||
|
||||
Reference in New Issue
Block a user