luci-0.9: merge r5782
[project/luci.git] / modules / admin-full / luasrc / model / cbi / admin_network / wifi.lua
index 3499227..02bfa12 100644 (file)
@@ -11,7 +11,10 @@ You may obtain a copy of the License at
 
 $Id$
 ]]--
-require("luci.tools.webadmin")
+
+local wa = require "luci.tools.webadmin"
+local fs = require "nixio.fs"
+
 arg[1] = arg[1] or ""
 
 m = Map("wireless", translate("networks"), translate("a_w_networks1"))
@@ -49,6 +52,31 @@ end
 
 if hwtype == "mac80211" then
        s:option(Value, "txpower", translate("a_w_txpwr"), "dBm").rmempty = true
+
+       mode = s:option(ListValue, "hwmode", translate("mode"))
+       mode:value("", translate("auto"))
+       mode:value("11b", "802.11b")
+       mode:value("11g", "802.11g")
+       mode:value("11a", "802.11a")
+       mode:value("11ng", "802.11g+n")
+       mode:value("11na", "802.11a+n")
+
+       htmode = s:option(ListValue, "htmode", translate("wifi_htmode", "HT mode"))
+       htmode:depends("hwmode", "11na")
+       htmode:depends("hwmode", "11ng")
+       htmode:value("HT20", "20MHz")
+       htmode:value("HT40-", translate("wifi_ht40m", "40MHz - 2nd channel below"))
+       htmode:value("HT40+", translate("wifi_ht40p", "40MHz - 2nd channel above"))
+       
+       --htcapab = s:option(DynamicList, "ht_capab", translate("wifi_htcapab", "HT capabilities"))
+       --htcapab:depends("hwmode", "11na")
+       --htcapab:depends("hwmode", "11ng")
+
+       s:option(Value, "country", translate("wifi_country", "Country Code"),
+               translate("wifi_country_iso3166", "Use ISO/IEC 3166 alpha2 country codes.")).optional = true
+
+       s:option(Value, "distance", translate("wifi_distance", "Distance Optimization"),
+               translate("wifi_distance_desc", "Distance to farthest network member in meters.")).optional = true
 end
 
 
@@ -143,7 +171,7 @@ network = s:option(Value, "network", translate("network"), translate("a_w_networ
 network.rmempty = true
 network:value("")
 network.combobox_manual = translate("a_w_netmanual")
-luci.tools.webadmin.cbi_add_networks(network)
+wa.cbi_add_networks(network)
 
 function network.write(self, section, value)
        if not m.uci:get("network", value) then
@@ -173,14 +201,47 @@ bssid = s:option(Value, "bssid", translate("wifi_bssid"))
 -------------------- MAC80211 Interface ----------------------
 
 if hwtype == "mac80211" then
-       if luci.fs.mtime("/usr/sbin/iw") then
+       if fs.access("/usr/sbin/iw") then
                mode:value("mesh", "802.11s")
        end
 
-       mode:value("ahdemo", translate("a_w_ahdemo"))
        mode:value("monitor", translate("a_w_monitor"))
        bssid:depends({mode="adhoc"})
 
+       mode:value("ap-wds", "%s (WDS)" % translate("a_w_ap"))
+       mode:value("sta-wds", "%s (WDS)" % translate("a_w_client"))             
+
+       function mode.write(self, section, value)
+               if value == "ap-wds" then
+                       ListValue.write(self, section, "ap")
+                       m.uci:set("wireless", section, "wds", 1)
+               elseif value == "sta-wds" then
+                       ListValue.write(self, section, "sta")
+                       m.uci:set("wireless", section, "wds", 1)
+               else
+                       ListValue.write(self, section, value)
+                       m.uci:delete("wireless", section, "wds")
+               end
+       end
+
+       function mode.cfgvalue(self, section)
+               local mode = ListValue.cfgvalue(self, section)
+               local wds  = m.uci:get("wireless", section, "wds") == "1"
+
+               if mode == "ap" and wds then
+                       return "ap-wds"
+               elseif mode == "sta" and wds then
+                       return "sta-wds"
+               else
+                       return mode
+               end
+       end
+               
+       hidden = s:option(Flag, "hidden", translate("wifi_hidden"))
+       hidden:depends({mode="ap"})
+       hidden:depends({mode="ap-wds"})
+       hidden.optional = true
+
        s:option(Value, "frag", translate("wifi_frag")).optional = true
        s:option(Value, "rts", translate("wifi_rts")).optional = true
 end
@@ -196,20 +257,48 @@ if hwtype == "atheros" then
        bssid:depends({mode="adhoc"})
        bssid:depends({mode="ahdemo"})
 
-       wds = s:option(Flag, "wds", translate("a_w_wds"))
-       wds:depends({mode="ap"})
-       wds:depends({mode="sta"})
-       wds.rmempty = true
+       mode:value("ap-wds", "%s (WDS)" % translate("a_w_ap"))
+       mode:value("sta-wds", "%s (WDS)" % translate("a_w_client"))             
+
+       function mode.write(self, section, value)
+               if value == "ap-wds" then
+                       ListValue.write(self, section, "ap")
+                       m.uci:set("wireless", section, "wds", 1)
+               elseif value == "sta-wds" then
+                       ListValue.write(self, section, "sta")
+                       m.uci:set("wireless", section, "wds", 1)
+               else
+                       ListValue.write(self, section, value)
+                       m.uci:delete("wireless", section, "wds")
+               end
+       end
+
+       function mode.cfgvalue(self, section)
+               local mode = ListValue.cfgvalue(self, section)
+               local wds  = m.uci:get("wireless", section, "wds") == "1"
+
+               if mode == "ap" and wds then
+                       return "ap-wds"
+               elseif mode == "sta" and wds then
+                       return "sta-wds"
+               else
+                       return mode
+               end
+       end
+
        wdssep = s:option(Flag, "wdssep", translate("wifi_wdssep"))
-       wdssep:depends({mode="ap", wds="1"})
+       wdssep:depends({mode="ap-wds"})
        wdssep.optional = true
 
        s:option(Flag, "doth", "802.11h").optional = true
+
        hidden = s:option(Flag, "hidden", translate("wifi_hidden"))
        hidden:depends({mode="ap"})
        hidden:depends({mode="adhoc"})
        hidden:depends({mode="wds"})
+       hidden:depends({mode="ap-wds"})
        hidden.optional = true
+
        isolate = s:option(Flag, "isolate", translate("wifi_isolate"),
         translate("wifi_isolate_desc"))
        isolate:depends({mode="ap"})
@@ -219,8 +308,8 @@ if hwtype == "atheros" then
        mp = s:option(ListValue, "macpolicy", translate("wifi_macpolicy"))
        mp.optional = true
        mp:value("")
-       mp:value("deny", translate("wifi_whitelist"))
-       mp:value("allow", translate("wifi_blacklist"))
+       mp:value("allow", translate("wifi_whitelist"))
+       mp:value("deny", translate("wifi_blacklist"))
        ml = s:option(DynamicList, "maclist", translate("wifi_maclist"))
        ml:depends({macpolicy="allow"})
        ml:depends({macpolicy="deny"})
@@ -295,8 +384,8 @@ if hwtype == "prism2" then
        mp = s:option(ListValue, "macpolicy", translate("wifi_macpolicy"))
        mp.optional = true
        mp:value("")
-       mp:value("deny", translate("wifi_whitelist"))
-       mp:value("allow", translate("wifi_blacklist"))
+       mp:value("allow", translate("wifi_whitelist"))
+       mp:value("deny", translate("wifi_blacklist"))
        ml = s:option(DynamicList, "maclist", translate("wifi_maclist"))
        ml:depends({macpolicy="allow"})
        ml:depends({macpolicy="deny"})
@@ -315,6 +404,8 @@ encr:depends({mode="ap"})
 encr:depends({mode="sta"})
 encr:depends({mode="adhoc"})
 encr:depends({mode="ahdemo"})
+encr:depends({mode="ap-wds"})
+encr:depends({mode="sta-wds"})
 encr:depends({mode="wds"})
 encr:depends({mode="mesh"})
 
@@ -322,26 +413,26 @@ encr:value("none", "No Encryption")
 encr:value("wep", "WEP")
 
 if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
-       local supplicant = luci.fs.mtime("/usr/sbin/wpa_supplicant")
-       local hostapd = luci.fs.mtime("/usr/sbin/hostapd")
+       local supplicant = fs.access("/usr/sbin/wpa_supplicant")
+       local hostapd = fs.access("/usr/sbin/hostapd")
 
        if hostapd and supplicant then
                encr:value("psk", "WPA-PSK")
                encr:value("psk2", "WPA2-PSK")
-               encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode")
+               encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode")
                encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="sta"})
                encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="sta"})
        elseif hostapd and not supplicant then
                encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
                encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
-               encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
+               encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"}, {mode="ahdemo"})
                encr:value("wpa", "WPA-EAP", {mode="ap"})
                encr:value("wpa2", "WPA2-EAP", {mode="ap"})
                encr.description = translate("wifi_wpareq")
        elseif not hostapd and supplicant then
                encr:value("psk", "WPA-PSK", {mode="sta"})
                encr:value("psk2", "WPA2-PSK", {mode="sta"})
-               encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"})
+               encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"})
                encr:value("wpa", "WPA-EAP", {mode="sta"})
                encr:value("wpa2", "WPA2-EAP", {mode="sta"})
                encr.description = translate("wifi_wpareq")
@@ -373,7 +464,7 @@ key:depends("encryption", "wep")
 key:depends("encryption", "psk")
 key:depends("encryption", "psk2")
 key:depends("encryption", "psk+psk2")
-key:depends("encryption", "mixed")
+key:depends("encryption", "psk-mixed")
 key:depends({mode="ap", encryption="wpa"})
 key:depends({mode="ap", encryption="wpa2"})
 key.rmempty = true