mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-30 18:07:52 +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
	 John Crispin
					John Crispin