mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
ucentral-event: Fix Modifying VLAN-ID Under LAN Port
This commit is an improvement over previous
commit 3598a243b3 which added a
fix for traffic disruption when vlan id of the lan port is
changed on devices with internal switches such as fap655,
CIG_WF186w,EAP-104.
This commit reconfigures the vlans for the mpsk clients on the
switch using the ucentral-event subsystem by tracking the
netifd_add events.
Fixes: WIFI-13797
Signed-off-by: joydeepbenison <joydeep.ghosh@benisontech.com>
This commit is contained in:
committed by
John Crispin
parent
45eb5c9a6b
commit
c51a24db43
@@ -26,6 +26,7 @@ let hapd_subscriber;
|
|||||||
let dhcp_subscriber;
|
let dhcp_subscriber;
|
||||||
let dhcp_relay_subscriber;
|
let dhcp_relay_subscriber;
|
||||||
let log_subscriber;
|
let log_subscriber;
|
||||||
|
let netifd_subscriber;
|
||||||
let ratelimit = false;
|
let ratelimit = false;
|
||||||
let config;
|
let config;
|
||||||
let wan_ports;
|
let wan_ports;
|
||||||
@@ -82,6 +83,18 @@ function eth_get_bridge_vlan_id(ifname) {
|
|||||||
return vlan_id;
|
return vlan_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function configure_switch_vlan(vlan_id){
|
||||||
|
let cmd = 'swconfig dev ' + config.config.swconfig + ' vlan ' + vlan_id + ' set ports \"' + join(' ', config.config.swconfig_ports) + '\"';
|
||||||
|
system(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_bridge_interfaces(bridge){
|
||||||
|
let path = '/sys/class/net/'+bridge+'/brif';
|
||||||
|
let dir = fs.lsdir(path);
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
function event(object, verb, payload) {
|
function event(object, verb, payload) {
|
||||||
let type = object;
|
let type = object;
|
||||||
if (verb)
|
if (verb)
|
||||||
@@ -382,6 +395,46 @@ function log_subscriber_remove_cb(remove) {
|
|||||||
printf('dhcp remove: %.J\n', remove);
|
printf('dhcp remove: %.J\n', remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function netifd_add_handler(notify){
|
||||||
|
/*Listen to change in vlan id of upstream interfaces */
|
||||||
|
if(!wildcard(notify.data.name,"up*"))
|
||||||
|
return 0;
|
||||||
|
/*get all the interfaces from up bridge*/
|
||||||
|
let bridge_interfaces= get_bridge_interfaces("up");
|
||||||
|
|
||||||
|
if (!bridge_interfaces) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (let entry in bridge_interfaces) {
|
||||||
|
/*filter only for wlan mpsk interfaces*/
|
||||||
|
if(wildcard(entry,"wlan*-v*")){
|
||||||
|
let wlan_vlan_string=split(entry,"-v");
|
||||||
|
let wlan_vlan_id=wlan_vlan_string[1];
|
||||||
|
/*reconfigure the switch for vlan id
|
||||||
|
of mpsk clients */
|
||||||
|
configure_switch_vlan(wlan_vlan_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function netifd_subscriber_notify_cb(notify) {
|
||||||
|
if (notify.type != 'add'){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(notify.data.name){
|
||||||
|
netifd_add_handler(notify);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function netifd_subscriber_remove_cb(remove) {
|
||||||
|
printf('remove: %.J\n', remove);
|
||||||
|
}
|
||||||
|
|
||||||
function send_pending_events() {
|
function send_pending_events() {
|
||||||
for (let payload in pending_events)
|
for (let payload in pending_events)
|
||||||
ubus.call('ucentral', 'event', payload);
|
ubus.call('ucentral', 'event', payload);
|
||||||
@@ -416,6 +469,9 @@ function unsub_object(add, id, path) {
|
|||||||
} else
|
} else
|
||||||
ucentral_running = false;
|
ucentral_running = false;
|
||||||
break;
|
break;
|
||||||
|
case 'network.device':
|
||||||
|
netifd_subscriber.subscribe(path);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (object[0] == 'hostapd' && object[1]) {
|
if (object[0] == 'hostapd' && object[1]) {
|
||||||
if (add)
|
if (add)
|
||||||
@@ -509,6 +565,8 @@ hapd_subscriber = ubus.subscriber(hapd_subscriber_notify_cb, hapd_subscriber_rem
|
|||||||
dhcp_subscriber = ubus.subscriber(dhcp_subscriber_notify_cb, dhcp_subscriber_remove_cb);
|
dhcp_subscriber = ubus.subscriber(dhcp_subscriber_notify_cb, dhcp_subscriber_remove_cb);
|
||||||
log_subscriber = ubus.subscriber(log_subscriber_notify_cb, log_subscriber_remove_cb);
|
log_subscriber = ubus.subscriber(log_subscriber_notify_cb, log_subscriber_remove_cb);
|
||||||
dhcp_relay_subscriber = ubus.subscriber(dhcp_relay_subscriber_notify_cb, dhcp_relay_subscriber_remove_cb);
|
dhcp_relay_subscriber = ubus.subscriber(dhcp_relay_subscriber_notify_cb, dhcp_relay_subscriber_remove_cb);
|
||||||
|
netifd_subscriber= ubus.subscriber(netifd_subscriber_notify_cb, netifd_subscriber_remove_cb);
|
||||||
|
|
||||||
|
|
||||||
let list = ubus.list();
|
let list = ubus.list();
|
||||||
for (let k, path in list)
|
for (let k, path in list)
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
From da1d005199f6485c37aed3ae15faf1b9ab79d88d Mon Sep 17 00:00:00 2001
|
|
||||||
From: joydeepbenison <joydeep.ghosh@benisontech.com>
|
|
||||||
Date: Mon, 27 May 2024 13:34:25 +0530
|
|
||||||
Subject: [PATCH] WIFI-13428 Fix:Traffic Disruption for MPSK clients for
|
|
||||||
yuncore_fap655
|
|
||||||
|
|
||||||
Fix Traffic Disruption for MPSK clients for yuncore_fap655 when
|
|
||||||
vlan-id of the lan port is modified.Any change in swconfig resets the
|
|
||||||
internal switch of FAP655 due to which all the dynamically added vlans
|
|
||||||
for MPSK clients are lost. Configure the Dynamic Vlans for MPSK Clients
|
|
||||||
again after switch reset.
|
|
||||||
|
|
||||||
Signed-off-by: joydeepbenison <joydeep.ghosh@benisontech.com>
|
|
||||||
---
|
|
||||||
.../files/etc/hotplug.d/net/50-switch-dvlan | 43 +++++++++++++++++++
|
|
||||||
.../files/lib/functions/dyn_vlan_switch.sh | 33 ++++++++++++++
|
|
||||||
2 files changed, 76 insertions(+)
|
|
||||||
create mode 100644 package/base-files/files/etc/hotplug.d/net/50-switch-dvlan
|
|
||||||
create mode 100644 package/base-files/files/lib/functions/dyn_vlan_switch.sh
|
|
||||||
|
|
||||||
diff --git a/package/base-files/files/etc/hotplug.d/net/50-switch-dvlan b/package/base-files/files/etc/hotplug.d/net/50-switch-dvlan
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..f24329cfe6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/package/base-files/files/etc/hotplug.d/net/50-switch-dvlan
|
|
||||||
@@ -0,0 +1,43 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+
|
|
||||||
+. /lib/functions.sh
|
|
||||||
+. /lib/functions/dyn_vlan_switch.sh
|
|
||||||
+
|
|
||||||
+debug() {
|
|
||||||
+ logger -t HOTPLUG-DVLAN "$*"
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+if [ "${INTERFACE:0:2}" != "up" ]; then
|
|
||||||
+ exit 0
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
+case "$(board_name)" in
|
|
||||||
+ "yuncore,fap655")
|
|
||||||
+ switch_dev="switch1"
|
|
||||||
+ switch_wan_port=5t
|
|
||||||
+ switch_cpu_port=6t
|
|
||||||
+ ;;
|
|
||||||
+ "cig,wf186w")
|
|
||||||
+ switch_dev="switch0"
|
|
||||||
+ switch_wan_port=4t
|
|
||||||
+ switch_cpu_port=6t
|
|
||||||
+ ;;
|
|
||||||
+ "edgecore,eap104")
|
|
||||||
+ switch_dev="switch1"
|
|
||||||
+ switch_wan_port=
|
|
||||||
+ switch_cpu_port=6t
|
|
||||||
+ ;;
|
|
||||||
+ *)
|
|
||||||
+ exit 0
|
|
||||||
+esac
|
|
||||||
+
|
|
||||||
+VSTR="$(echo $INTERFACE | egrep -o 'v([0-9]+)$')"
|
|
||||||
+[ -z "$VSTR" ] && exit 0
|
|
||||||
+VID="${VSTR:1}"
|
|
||||||
+[ $VID -lt 1 -o $VID -gt 4096 ] && exit 0
|
|
||||||
+
|
|
||||||
+if [ "$ACTION" = "add" ]; then
|
|
||||||
+ debug "$INTERFACE added on bridge ${INTERFACE:0:2}, configuring $switch_dev for dynamic vlans"
|
|
||||||
+ configure_bridge_dyn_vlans ${INTERFACE:0:2} $switch_dev $switch_wan_port $switch_cpu_port
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
diff --git a/package/base-files/files/lib/functions/dyn_vlan_switch.sh b/package/base-files/files/lib/functions/dyn_vlan_switch.sh
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..5901a1537d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/package/base-files/files/lib/functions/dyn_vlan_switch.sh
|
|
||||||
@@ -0,0 +1,33 @@
|
|
||||||
+
|
|
||||||
+configure_switch_dynamic_vlan(){
|
|
||||||
+vid=$1
|
|
||||||
+switch_dev=$2
|
|
||||||
+switch_wan_port=$3
|
|
||||||
+switch_cpu_port=$4
|
|
||||||
+debug "configured switch $switch_dev ports $switch_wan_port $switch_cpu_port for dynamic vlans $vid"
|
|
||||||
+swconfig dev ${switch_dev} vlan $vid set ports "${switch_wan_port} ${switch_cpu_port}"
|
|
||||||
+
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+configure_bridge_dyn_vlans () {
|
|
||||||
+interfaces=$(ls /sys/class/net/$1/brif)
|
|
||||||
+
|
|
||||||
+switch_dev=$2
|
|
||||||
+switch_wan_port=$3
|
|
||||||
+switch_cpu_port=$4
|
|
||||||
+
|
|
||||||
+# Convert the string into an array
|
|
||||||
+IFS=' ' set -- $interfaces
|
|
||||||
+
|
|
||||||
+# Loop through the array and print each element
|
|
||||||
+for interface in "$@"; do
|
|
||||||
+ case "$interface" in
|
|
||||||
+ wlan*-v*)
|
|
||||||
+ # Use parameter expansion to extract the part after "wlan*-v"
|
|
||||||
+ dyn_vlan_id="${interface#*wlan*-v}"
|
|
||||||
+ configure_switch_dynamic_vlan $dyn_vlan_id $switch_dev $switch_wan_port $switch_cpu_port ;;
|
|
||||||
+ esac
|
|
||||||
+done
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user