wifi-5624: Fix eth port VLAN Access in wifi6

Fix ethernet port vlan access mode in wifi6
Create a vlan bridge and attach wan vlan interface
and eth port in the vlan bridge.

Signed-off-by: Chaitanya Godavarthi <chaitanya.kiran@netexperience.com>
This commit is contained in:
Chaitanya Godavarthi
2021-11-07 21:10:37 -05:00
committed by Arif
parent da9e6919af
commit e8483f021b
4 changed files with 58 additions and 10 deletions

View File

@@ -1187,7 +1187,6 @@ void apc_init()
cloud_disconn_mon();
}
static void apply_config_handler(struct timeout *timeout)
{
radius_proxy_fixup();

View File

@@ -317,6 +317,15 @@ static void vlan_trunk_set(struct blob_buf *b, struct blob_buf *del,
}
}
static void reload_vlan_trunk(struct schema_Wifi_Inet_Config *iconf)
{
char buf[128] = {0};
snprintf(buf, sizeof(buf), "ACTION=ifup INTERFACE=%s /sbin/hotplug-call iface",iconf->if_name);
system(buf);
}
static int wifi_inet_conf_add(struct schema_Wifi_Inet_Config *iconf)
{
const char *lease_time = SCHEMA_FIND_KEY(iconf->dhcpd, "lease_time");
@@ -324,6 +333,7 @@ static int wifi_inet_conf_add(struct schema_Wifi_Inet_Config *iconf)
const char *dhcp_stop = SCHEMA_FIND_KEY(iconf->dhcpd, "stop");
int len = strlen(iconf->if_name);
int is_ipv6 = 0;
int reload_trunk = 0;
if (len && iconf->if_name[len - 1] == '6')
is_ipv6 = 1;
@@ -428,6 +438,7 @@ static int wifi_inet_conf_add(struct schema_Wifi_Inet_Config *iconf)
vlan_trunk_set(&b, &del, iconf);
blobmsg_add_string(&b, "ifname", iconf->parent_ifname);
blobmsg_add_bool(&b, "vlan_trunk", 1);
reload_trunk = 1;
}
blob_to_uci_section(uci, "network", iconf->if_name, "interface", b.head, &network_param, del.head);
@@ -445,6 +456,10 @@ static int wifi_inet_conf_add(struct schema_Wifi_Inet_Config *iconf)
uci_commit_all(uci);
/*workaround, trunk interface doesnt reload in reload_config */
if(reload_trunk)
reload_vlan_trunk(iconf);
return 0;
}

View File

@@ -304,15 +304,14 @@ static void update_eth_ports_states(struct schema_Wifi_Inet_State *state)
}
for (i = 0; i < MAX_ETH_PORTS && lanport[i].ifname != NULL; i++) {
if (strcmp(lanport[i].bridge, brname) == 0) {
STRSCPY(state->eth_ports_keys[cnt+i], lanport[i].ifname);
STRSCPY(state->eth_ports_keys[state->eth_ports_len], lanport[i].ifname);
memset(port_status, '\0', sizeof(port_status));
snprintf(port_status, sizeof(port_status), "%s lan %sMbps %s",
lanport[i].state, lanport[i].speed, lanport[i].duplex);
STRSCPY(state->eth_ports[cnt+i], port_status);
STRSCPY(state->eth_ports[state->eth_ports_len], port_status);
state->eth_ports_len++;
}
}
if (!strncmp(state->if_name, "eth", 3)) {

View File

@@ -14,19 +14,41 @@ json_select ..
ifname=$(uci get network.wan.ifname)
ifname=${ifname%% *}
}
if [ "$ACTION" = ifup -o "$ACTION" = ifupdate ]; then
trunk=$(uci get network.${INTERFACE}.vlan_trunk)
if [ "$trunk" = 1 ]; then
net=$(uci get network.${INTERFACE}.ifname)
allowed_vlans=$(uci get network.${INTERFACE}.allowed_vlans)
pvid=$(uci get network.${INTERFACE}.pvid)
brctl addif br-wan $net
[ -z "$allowed_vlans" ] || {
stale_allowed_vlans=`cat /etc/allowed_vlans_$INTERFACE`
for vid in $stale_allowed_vlans
do
echo "stale: $vid" >> /root/hello
brctl delif vlan-$vid $net.$vid
ip link set dev $net.$vid down
ip link del link $net name $net.$vid
bridge vlan del vid $vid dev $net
bridge vlan del vid $vid dev br-lan self
bridge vlan del vid $vid dev br-wan self
done
echo $allowed_vlans > /etc/allowed_vlans_$INTERFACE
echo $pvid > /etc/pvid_$INTERFACE
for vid in $allowed_vlans
do
ip link add link $ifname name $ifname.$vid type vlan id $vid
ip link set dev $ifname.$vid up
ip link add link $net name $net.$vid type vlan id $vid
ip link set dev $net.$vid up
brctl addbr vlan-$vid
brctl addif vlan-$vid $ifname.$vid
brctl addif vlan-$vid $net.$vid
ifconfig vlan-$vid up
bridge vlan add vid $vid dev br-lan self
bridge vlan add vid $vid dev br-wan self
bridge vlan add vid $vid dev $ifname
@@ -34,16 +56,25 @@ if [ "$ACTION" = ifup -o "$ACTION" = ifupdate ]; then
done
}
[ -z "$pvid" ] || {
bridge vlan add vid $pvid dev br-lan self
bridge vlan add vid $pvid dev br-wan self
bridge vlan add vid $pvid dev $ifname
bridge vlan add pvid $pvid vid $pvid dev $net untagged
echo $pvid > /etc/pvid_$INTERFACE
}
else
vid=$(uci get network.${INTERFACE}.vid)
net=$(uci get network.${INTERFACE}.ifname)
[ -z "$net" -o -z "$vid" -o "$vid" = 0 ] && exit 0
$oldvid=`cat /etc/vid_$INTERFACE`
echo $vid > /etc/vid_$INTERFACE
ip link add link $ifname name $ifname.$vid type vlan id $vid
ip link set dev $ifname.$vid up
brctl addbr vlan-$vid
brctl addif vlan-$vid $ifname.$vid
brctl delif br-wan $net
brctl delif br-lan $net
brctl delif vlan-$oldvid $net
brctl addif vlan-$vid $net
ifconfig vlan-$vid up
bridge vlan add vid $vid dev br-lan self
bridge vlan add vid $vid dev br-wan self
@@ -62,6 +93,9 @@ else
for vid in $allowed_vlans
do
bridge vlan del vid $vid dev $net
brctl delif vlan-$vid $net.$vid
ip link set dev $net.$vid down
ip link del link $net name $net.$vid
done
pvid=`cat /etc/pvid_$INTERFACE`
@@ -73,6 +107,7 @@ else
bridge vlan del pvid $vid vid $vid dev $net untagged
bridge vlan add pvid 1 vid 1 dev $net untagged
brctl delif vlan-$vid $net
fi
exit 0
fi