This patch adds support for 2 new uci sections.

config wifi-vlan
        # iface is optional. if it is not defined the vlan will apply
        # to all interfaces
        option iface    default_radio0
        option name     guest
        option vid      100
        option network  guest

config wifi-station
        # iface is optional. if it is not defined the station will apply
        # to all interfaces
        option iface    default_radio0
        # mac is optional. if it is not defined it will be a catch all
        # for any sta using this key
        option mac      '00:11:22:33:44:55'
        # vid is optional. if it is not defined, the sta will be part of
        # the primary iface.
        option vid      100
        option key      testtest

With this patch applied it is possible to use multiple PSKs and VIDs on a
single BSS.

Signed-off-by: John Crispin <j...@phrozen.org>
---
 .../files/lib/netifd/wireless/mac80211.sh     |  8 +++-
 .../network/services/hostapd/files/hostapd.sh | 37 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh 
b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
index 7ca138c68c..19d05cb6dc 100644
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -506,7 +506,7 @@ mac80211_iw_interface_add() {
 mac80211_prepare_vif() {
        json_select config
 
-       json_get_vars ifname mode ssid wds powersave macaddr enable
+       json_get_vars ifname mode ssid wds powersave macaddr enable 
wpa_psk_file vlan_file
 
        [ -n "$ifname" ] || ifname="wlan${phy#phy}${if_idx:+-$if_idx}"
        if_idx=$((${if_idx:-0} + 1))
@@ -524,6 +524,12 @@ mac80211_prepare_vif() {
        json_add_object data
        json_add_string ifname "$ifname"
        json_close_object
+
+       [ "$mode" == "ap" ] && {
+               [ -z "$wpa_psk_file" ] && hostapd_set_psk "$ifname"
+               [ -z "$vlan_file" ] && hostapd_set_vlan "$ifname"
+       }
+
        json_select config
 
        # It is far easier to delete and create the desired interface
diff --git a/package/network/services/hostapd/files/hostapd.sh 
b/package/network/services/hostapd/files/hostapd.sh
index 637f298ad9..a3554b6451 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -262,6 +262,39 @@ hostapd_common_add_bss_config() {
        config_add_string 'owe_transition_bssid:macaddr' 
'owe_transition_ssid:string'
 }
 
+hostapd_set_vlan_file() {
+       local ifname="$1"
+       local vlan="$2"
+       json_get_vars name vid
+       echo "${vid} ${ifname}-${name}" >> /var/run/hostapd-${ifname}.vlan
+       wireless_add_vlan "${vlan}" "${ifname}-${name}"
+}
+
+hostapd_set_vlan() {
+       local ifname="$1"
+
+       rm /var/run/hostapd-${ifname}.vlan
+       for_each_vlan hostapd_set_vlan_file ${ifname}
+}
+
+hostapd_set_psk_file() {
+       local ifname="$1"
+       local vlan="$2"
+       local vlan_id=""
+
+       json_get_vars mac vid key
+       set_default isolate "00:00:00:00:00:00"
+       [ -n "$vid" ] && vlan_id="vlanid=$vid "
+       echo "${vlan_id} ${mac} ${key}" >> /var/run/hostapd-${ifname}.psk
+}
+
+hostapd_set_psk() {
+       local ifname="$1"
+
+       rm /var/run/hostapd-${ifname}.psk
+       for_each_station hostapd_set_psk_file ${ifname}
+}
+
 hostapd_set_bss_options() {
        local var="$1"
        local phy="$2"
@@ -377,12 +410,15 @@ hostapd_set_bss_options() {
                        else
                                append bss_conf "wpa_passphrase=$key" "$N"
                        fi
+                       [ -z "$wpa_psk_file" ] && set_default wpa_psk_file 
/var/run/hostapd-$ifname.psk
                        [ -n "$wpa_psk_file" ] && {
                                [ -e "$wpa_psk_file" ] || touch "$wpa_psk_file"
                                append bss_conf "wpa_psk_file=$wpa_psk_file" 
"$N"
                        }
                        [ "$eapol_version" -ge "1" -a "$eapol_version" -le "2" 
] && append bss_conf "eapol_version=$eapol_version" "$N"
 
+                       set_default dynamic_vlan 0
+                       vlan_possible=1
                        wps_possible=1
                ;;
                eap|eap192|eap-eap192)
@@ -639,6 +675,7 @@ hostapd_set_bss_options() {
        [ -n "$vlan_possible" -a -n "$dynamic_vlan" ] && {
                json_get_vars vlan_naming vlan_tagged_interface vlan_bridge 
vlan_file
                set_default vlan_naming 1
+               [ -z "$vlan_file" ] && set_default vlan_file 
/var/run/hostapd-$ifname.vlan
                append bss_conf "dynamic_vlan=$dynamic_vlan" "$N"
                append bss_conf "vlan_naming=$vlan_naming" "$N"
                [ -n "$vlan_bridge" ] && \
-- 
2.20.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to