+s = m:section(NamedSection, wnet.sid, "wifi-iface", translate("Interface Configuration"))
+ifsection = s
+s.addremove = false
+s.anonymous = true
+s.defaults.device = arg[1]
+
+s:tab("general", translate("General Setup"))
+s:tab("encryption", translate("Wireless Security"))
+s:tab("macfilter", translate("MAC-Filter"))
+s:tab("advanced", translate("Advanced Settings"))
+
+s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+
+mode = s:taboption("general", ListValue, "mode", translate("Mode"))
+mode.override_values = true
+mode:value("ap", translate("Access Point"))
+mode:value("sta", translate("Client"))
+mode:value("adhoc", translate("Ad-Hoc"))
+
+bssid = s:taboption("general", Value, "bssid", translate("<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"))
+
+network = s:taboption("general", Value, "network", translate("Network"),
+ translate("Choose the network you want to attach to this wireless interface. " ..
+ "Select <em>unspecified</em> to not attach any network or fill out the " ..
+ "<em>create</em> field to define a new network."))
+
+network.rmempty = true
+network.template = "cbi/network_netlist"
+network.widget = "radio"
+
+function network.write(self, section, value)
+ local i = nw:get_interface(section)
+ if i then
+ if value == '-' then
+ value = m:formvalue(self:cbid(section) .. ".newnet")
+ if value and #value > 0 then
+ local n = nw:add_network(value, {proto="none"})
+ if n then n:add_interface(i) end
+ else
+ local n = i:get_network()
+ if n then n:del_interface(i) end
+ end
+ else
+ local n = nw:get_network(value)
+ if n then
+ n:type("bridge")
+ n:add_interface(i)
+ end
+ end
+ end
+end
+
+-------------------- MAC80211 Interface ----------------------
+
+if hwtype == "mac80211" then
+ if fs.access("/usr/sbin/iw") then
+ mode:value("mesh", "802.11s")
+ end
+
+ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)"))
+ mode:value("monitor", translate("Monitor"))
+ bssid:depends({mode="adhoc"})
+
+ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold"))
+ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold"))
+
+ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")})
+ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")})
+
+ 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:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="ap-wds"})
+end
+
+
+
+-------------------- Madwifi Interface ----------------------
+
+if hwtype == "atheros" then
+ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)"))
+ mode:value("monitor", translate("Monitor"))
+ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")})
+ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")})
+ mode:value("wds", translate("Static WDS"))
+
+ 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
+
+ bssid:depends({mode="adhoc"})
+ bssid:depends({mode="ahdemo"})
+ bssid:depends({mode="wds"})
+
+ wdssep = s:taboption("advanced", Flag, "wdssep", translate("Separate WDS"))
+ wdssep:depends({mode="ap-wds"})
+
+ s:taboption("advanced", Flag, "doth", "802.11h")
+ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="adhoc"})
+ hidden:depends({mode="ap-wds"})
+ hidden:depends({mode="sta-wds"})
+ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"),
+ translate("Prevents client-to-client communication"))
+ isolate:depends({mode="ap"})
+ s:taboption("advanced", Flag, "bgscan", translate("Background Scan"))
+
+ mp = s:taboption("macfilter", ListValue, "macpolicy", translate("MAC-Address Filter"))
+ mp:value("", translate("disable"))
+ mp:value("deny", translate("Allow listed only"))
+ mp:value("allow", translate("Allow all except listed"))
+ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List"))
+ ml:depends({macpolicy="allow"})
+ ml:depends({macpolicy="deny"})
+
+ s:taboption("advanced", Value, "rate", translate("Transmission Rate"))
+ s:taboption("advanced", Value, "mcast_rate", translate("Multicast Rate"))
+ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold"))
+ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold"))
+ s:taboption("advanced", Value, "minrate", translate("Minimum Rate"))
+ s:taboption("advanced", Value, "maxrate", translate("Maximum Rate"))
+ s:taboption("advanced", Flag, "compression", translate("Compression"))
+
+ s:taboption("advanced", Flag, "bursting", translate("Frame Bursting"))
+ s:taboption("advanced", Flag, "turbo", translate("Turbo Mode"))
+ s:taboption("advanced", Flag, "ff", translate("Fast Frames"))
+
+ s:taboption("advanced", Flag, "wmm", translate("WMM Mode"))
+ s:taboption("advanced", Flag, "xr", translate("XR Support"))
+ s:taboption("advanced", Flag, "ar", translate("AR Support"))
+
+ local swm = s:taboption("advanced", Flag, "sw_merge", translate("Disable HW-Beacon timer"))
+ swm:depends({mode="adhoc"})
+
+ local nos = s:taboption("advanced", Flag, "nosbeacon", translate("Disable HW-Beacon timer"))
+ nos:depends({mode="sta"})
+ nos:depends({mode="sta-wds"})
+
+ local probereq = s:taboption("advanced", Flag, "probereq", translate("Do not send probe responses"))
+ probereq.enabled = "0"
+ probereq.disabled = "1"
+end
+
+
+-------------------- Broadcom Interface ----------------------
+
+if hwtype == "broadcom" then
+ mode:value("wds", translate("WDS"))
+ mode:value("monitor", translate("Monitor"))
+
+ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
+ hidden:depends({mode="ap"})
+ hidden:depends({mode="adhoc"})
+ hidden:depends({mode="wds"})
+
+ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"),
+ translate("Prevents client-to-client communication"))
+ isolate:depends({mode="ap"})