From b454395a8da4013aff2ecd64cd7eafc01fc6a5a2 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Sun, 1 Jun 2008 12:12:18 +0000 Subject: [PATCH] * Performance optimizations * libs/core: Added bytecode stripping function to luci.util * libs/core: Added smart indexcache that automatically updates cached index-files on change * libs/web: Enabled template caching support * Core Translation part 4 --- .../i18n/{admin-core.en => admin-core.en.lua} | 28 +++++++++ i18n/english/luasrc/i18n/{cbi.en => cbi.en.lua} | 0 .../luasrc/i18n/{default.en => default.en.lua} | 14 ++++- libs/core/luasrc/fs.lua | 1 + libs/core/luasrc/util.lua | 72 ++++++++++++++++++++++ libs/web/luasrc/config.lua | 11 ++-- libs/web/luasrc/dispatcher.lua | 40 +++++++----- libs/web/luasrc/i18n.lua | 6 +- libs/web/luasrc/template.lua | 40 ++++++------ libs/web/root/etc/config/luci | 4 ++ .../admin-core/luasrc/controller/admin/wifi.lua | 9 ++- .../luasrc/model/cbi/admin_wifi/devices.lua | 26 ++++---- .../luasrc/model/cbi/admin_wifi/networks.lua | 30 ++++----- .../admin-core/luasrc/view/admin_wifi/index.htm | 6 +- 14 files changed, 204 insertions(+), 83 deletions(-) rename i18n/english/luasrc/i18n/{admin-core.en => admin-core.en.lua} (79%) rename i18n/english/luasrc/i18n/{cbi.en => cbi.en.lua} (100%) rename i18n/english/luasrc/i18n/{default.en => default.en.lua} (83%) diff --git a/i18n/english/luasrc/i18n/admin-core.en b/i18n/english/luasrc/i18n/admin-core.en.lua similarity index 79% rename from i18n/english/luasrc/i18n/admin-core.en rename to i18n/english/luasrc/i18n/admin-core.en.lua index 33301618a..1affe22f9 100644 --- a/i18n/english/luasrc/i18n/admin-core.en +++ b/i18n/english/luasrc/i18n/admin-core.en.lua @@ -102,3 +102,31 @@ a_srv_dropbear1 = "Dropbear offers SSH network shell access and an integrated SC a_srv_d_pwauth = "Password authentication" a_srv_d_pwauth1 = "Allow SSH password authentication" +a_w_wifi1 = [[On this pages you find confiugration options for WLAN based wireless networks.]] +a_w_wifi2 = [[You can easily integrate your 802.11a/b/g/n-devices into your physical network and use +the virtual adapter support to build wireless repeaters or offer several networks with one device.]] +a_w_wifi3 = [[There is support for Managed, Client, Ad-Hoc and WDS operating modes as well as +WPA and WPA2 encryption for secure communnication.]] + +a_w_devices1 = "Here you can configure installed wifi devices." +a_w_channel = "Channel" +a_w_txantenna = "Transmit Antenna" +a_w_rxantenna = "Receive Antenna" +a_w_distance1 = "Distance to furthest station (m)" +a_w_diversity = "Diversity" +a_w_countrycode = "Country Code" +a_w_connlimit = "Connection Limit" + +a_w_networks1 = [[You can run several wifi networks with one device. Be aware that there are certain +hardware and driverspecific restrictions. Normally you can operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode +network simultaneously.]] +a_w_netid = "Network Name (ESSID)" +a_w_network1 = "Add the Wifi network to physical network" +a_w_txpwr = "Transmit Power" +a_w_brcmburst = "Broadcom Frameburst" +a_w_athburst = "Atheros Frameburst" +a_w_radiussrv = "Radius-Server" +a_w_radiusport = "Radius-Port" +a_w_apisolation = "AP-Isolation" +a_w_apisolation1 = "Prevents Client to Client communication" +a_w_hideessid = "Hide ESSID" diff --git a/i18n/english/luasrc/i18n/cbi.en b/i18n/english/luasrc/i18n/cbi.en.lua similarity index 100% rename from i18n/english/luasrc/i18n/cbi.en rename to i18n/english/luasrc/i18n/cbi.en.lua diff --git a/i18n/english/luasrc/i18n/default.en b/i18n/english/luasrc/i18n/default.en.lua similarity index 83% rename from i18n/english/luasrc/i18n/default.en rename to i18n/english/luasrc/i18n/default.en.lua index 2b5cfaa87..46220ba40 100644 --- a/i18n/english/luasrc/i18n/default.en +++ b/i18n/english/luasrc/i18n/default.en.lua @@ -13,9 +13,12 @@ delete = "Delete" descr = "Description" design = "Design" device = "Device" +devices = "Devices" disable = "disable" +distance = "Distance" enable = "enable" +encryption = "Encryption" error = "Error" filesystem = "Filesystem" @@ -27,11 +30,17 @@ hostname = "Hostname" install = "Install" installed = "installed" + +key = "Key" + language = "Language" load = "Load" manpage = "see '%s' manpage" +mode = "Mode" +network = "Network" +networks = "Networks" notinstalled = "not installed" ok = "OK" @@ -53,8 +62,11 @@ statistics = "Statistics" syslog = "System Log" system = "System" +type = "Type" + unknownerror = "Unknown Error" version = "Version" -webui = "Web UI" \ No newline at end of file +webui = "Web UI" +wifi = "Wifi" \ No newline at end of file diff --git a/libs/core/luasrc/fs.lua b/libs/core/luasrc/fs.lua index 5c1f2a051..35b8289af 100644 --- a/libs/core/luasrc/fs.lua +++ b/libs/core/luasrc/fs.lua @@ -27,6 +27,7 @@ limitations under the License. module("luci.fs", package.seeall) require("posix") +posix.umask("rwx------") -- Glob glob = posix.glob diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 0559fff6f..0a30b163a 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -96,6 +96,13 @@ function contains(table, value) end +-- Dumps and strips a Lua-Function +function dump(f) + local d = string.dump(f) + return d and strip_bytecode(d) +end + + -- Dumps a table to stdout (useful for testing and debugging) function dumptable(t, i) i = i or 0 @@ -181,12 +188,77 @@ function split(str, pat, max, regex) return t end + +-- Bytecode stripping function by Peter Cawley from http://lua-users.org/lists/lua-l/2008-02/msg01158.html +function strip_bytecode(dump) + local version, format, endian, int, size, ins, num = dump:byte(5, 11) + local subint + if endian == 1 then + subint = function(dump, i, l) + local val = 0 + for n = l, 1, -1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + else + subint = function(dump, i, l) + local val = 0 + for n = 1, l, 1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + end + + local strip_function + strip_function = function(dump) + local count, offset = subint(dump, 1, size) + local stripped, dirty = string.rep("\0", size), offset + count + offset = offset + count + int * 2 + 4 + offset = offset + int + subint(dump, offset, int) * ins + count, offset = subint(dump, offset, int) + for n = 1, count do + local t + t, offset = subint(dump, offset, 1) + if t == 1 then + offset = offset + 1 + elseif t == 4 then + offset = offset + size + subint(dump, offset, size) + elseif t == 3 then + offset = offset + num + end + end + count, offset = subint(dump, offset, int) + stripped = stripped .. dump:sub(dirty, offset - 1) + for n = 1, count do + local proto, off = strip_function(dump:sub(offset, -1)) + stripped, offset = stripped .. proto, offset + off - 1 + end + offset = offset + subint(dump, offset, int) * int + int + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + int * 2 + end + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + end + stripped = stripped .. string.rep("\0", int * 3) + return stripped, offset + end + + return dump:sub(1,12) .. strip_function(dump:sub(13,-1)) +end + + -- Removes whitespace from beginning and end of a string function trim(str) local s = str:gsub("^%s*(.-)%s*$", "%1") return s end + -- Updates given table with new values function update(t, updates) for k, v in pairs(updates) do diff --git a/libs/web/luasrc/config.lua b/libs/web/luasrc/config.lua index 854b12814..4eb8e46e4 100644 --- a/libs/web/luasrc/config.lua +++ b/libs/web/luasrc/config.lua @@ -25,10 +25,9 @@ limitations under the License. ]]-- -module("luci.config", package.seeall) -require("luci.model.uci") -require("luci.util") -require("luci.sys") +local uci = require("luci.model.uci") +local util = require("luci.util") +module("luci.config") -- Warning! This is only for fallback and compatibility purporses! -- main = {} @@ -42,7 +41,7 @@ main.lang = "de" -- Now overwrite with UCI values -local ucidata = luci.model.uci.sections("luci") +local ucidata = uci.sections("luci") if ucidata then - luci.util.update(luci.config, ucidata) + util.update(_M, ucidata) end \ No newline at end of file diff --git a/libs/web/luasrc/dispatcher.lua b/libs/web/luasrc/dispatcher.lua index 8d1e493fb..c7e1ed6fe 100644 --- a/libs/web/luasrc/dispatcher.lua +++ b/libs/web/luasrc/dispatcher.lua @@ -177,7 +177,7 @@ end -- Calls the index function of all available controllers function createindex_plain(path, suffix) - local cachetime = nil + local cache = nil local controllers = luci.util.combine( luci.fs.glob(path .. "*" .. suffix) or {}, @@ -185,32 +185,38 @@ function createindex_plain(path, suffix) ) if indexcache then - cachetime = luci.fs.mtime(indexcache) + cache = luci.fs.mtime(indexcache) - if not cachetime then + if not cache then luci.fs.mkdir(indexcache) luci.fs.chmod(indexcache, "a=,u=rwx") + cache = luci.fs.mtime(indexcache) end end - if not cachetime then - for i,c in ipairs(controllers) do - c = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".") - stat, mod = pcall(require, c) + for i,c in ipairs(controllers) do + local module = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".") + local cachefile = indexcache .. "/" .. module + local stime + local ctime + + if cache then + stime = luci.fs.mtime(c) or 0 + ctime = luci.fs.mtime(cachefile) or 0 + end + + if not cache or stime > ctime then + stat, mod = pcall(require, module) if stat and mod and type(mod.index) == "function" then - index[c] = mod.index + index[module] = mod.index - if indexcache then - luci.fs.writefile(indexcache .. "/" .. c, string.dump(mod.index)) + if cache then + luci.fs.writefile(cachefile, luci.util.dump(mod.index)) end end - end - else - for i,c in ipairs(luci.fs.dir(indexcache)) do - if c:sub(1) ~= "." then - index[c] = loadfile(indexcache .. "/" .. c) - end + else + index[module] = loadfile(cachefile) end end end @@ -226,7 +232,7 @@ function createtree() -- Load default translation luci.i18n.loadc("default") - local scope = _G + local scope = luci.util.clone(_G) for k,v in pairs(_M) do if type(v) == "function" then scope[k] = v diff --git a/libs/web/luasrc/i18n.lua b/libs/web/luasrc/i18n.lua index 7ace708e9..546429933 100644 --- a/libs/web/luasrc/i18n.lua +++ b/libs/web/luasrc/i18n.lua @@ -39,7 +39,7 @@ end -- Loads a translation and copies its data into the global translation table function load(file, force) if force or not loaded[file] then - local f = loadfile(i18ndir .. file) + local f = loadfile(i18ndir..file..".lua") or loadfile(i18ndir..file) if f then setfenv(f, table) f() @@ -54,8 +54,8 @@ function load(file, force) end -- Same as load but autocompletes the filename with .LANG from config.lang -function loadc(file) - return load(file .. "." .. require("luci.config").main.lang) +function loadc(file, force) + return load(file .. "." .. require("luci.config").main.lang, force) end -- Returns the i18n-value defined by "key" or if there is no such: "default" diff --git a/libs/web/luasrc/template.lua b/libs/web/luasrc/template.lua index 369aa0a30..c672f16bf 100644 --- a/libs/web/luasrc/template.lua +++ b/libs/web/luasrc/template.lua @@ -30,22 +30,17 @@ require("luci.util") require("luci.fs") require("luci.http") -viewdir = luci.sys.libpath() .. "/view/" +luci.config.template = luci.config.template or {} + +viewdir = luci.config.template.viewdir or luci.sys.libpath() .. "/view" +compiledir = luci.config.template.compiledir or luci.sys.libpath() .. "/view" -- Compile modes: -- none: Never compile, only use precompiled data from files -- memory: Always compile, do not save compiled files, ignore precompiled -- file: Compile on demand, save compiled files, update precompiled -compiler_mode = "memory" - - --- This applies to compiler modes "always" and "smart" --- --- Produce compiled lua code rather than lua sourcecode --- WARNING: Increases template size heavily!!! --- This produces the same bytecode as luac but does not have a strip option -compiler_enable_bytecode = false +compiler_mode = luci.config.template.compiler_mode or "memory" -- Define the namespace for template modules @@ -107,12 +102,7 @@ function compile(template) template = template:gsub("<%%"..tostring(k).."%%>", re) end - if compiler_enable_bytecode then - tf = loadstring(template) - template = string.dump(tf) - end - - return template + return loadstring(template) end -- Oldstyle render shortcut @@ -156,8 +146,8 @@ function Template.__init__(self, name) end -- Compile and build - local sourcefile = viewdir .. name .. ".htm" - local compiledfile = viewdir .. name .. ".lua" + local sourcefile = viewdir .. "/" .. name .. ".htm" + local compiledfile = compiledir .. "/" .. name .. ".lua" local err if compiler_mode == "file" then @@ -171,9 +161,15 @@ function Template.__init__(self, name) source, err = luci.fs.readfile(sourcefile) if source then - local compiled = compile(source) - luci.fs.writefile(compiledfile, compiled) - self.template, err = loadstring(compiled) + local compiled, err = compile(source) + + local compiledfile_dir = luci.fs.dirname(compiledfile) + if not luci.fs.mtime(compiledfile_dir) then + luci.fs.mkdir(compiledfile_dir) + end + + luci.fs.writefile(compiledfile, luci.util.dump(compiled)) + self.template = compiled end else self.template, err = loadfile(compiledfile) @@ -186,7 +182,7 @@ function Template.__init__(self, name) local source source, err = luci.fs.readfile(sourcefile) if source then - self.template, err = loadstring(compile(source)) + self.template, err = compile(source) end end diff --git a/libs/web/root/etc/config/luci b/libs/web/root/etc/config/luci index 5fefe5b27..560cff450 100644 --- a/libs/web/root/etc/config/luci +++ b/libs/web/root/etc/config/luci @@ -34,6 +34,10 @@ config event uci_oncommit config internal languages option de "Deutsch" option en "English" + +config internal template + option compiler_mode file + option compiledir "/tmp/.lucitplcache" config internal themes option OpenWRT "/luci-static/openwrt.org" diff --git a/modules/admin-core/luasrc/controller/admin/wifi.lua b/modules/admin-core/luasrc/controller/admin/wifi.lua index 0da6b7983..84241b013 100644 --- a/modules/admin-core/luasrc/controller/admin/wifi.lua +++ b/modules/admin-core/luasrc/controller/admin/wifi.lua @@ -1,18 +1,21 @@ module("luci.controller.admin.wifi", package.seeall) function index() + luci.i18n.loadc("admin-core") + local i18n = luci.i18n.translate + local page = node("admin", "wifi") page.target = template("admin_wifi/index") - page.title = "Drahtlos" + page.title = i18n("wifi", "Drahtlos") page.order = 60 local page = node("admin", "wifi", "devices") page.target = cbi("admin_wifi/devices") - page.title = "Geräte" + page.title = i18n("devices", "Geräte") page.order = 10 local page = node("admin", "wifi", "networks") page.target = cbi("admin_wifi/networks") - page.title = "Netze" + page.title = i18n("networks", "Netze") page.order = 20 end \ No newline at end of file diff --git a/modules/admin-core/luasrc/model/cbi/admin_wifi/devices.lua b/modules/admin-core/luasrc/model/cbi/admin_wifi/devices.lua index 2931a6e55..eb126860d 100644 --- a/modules/admin-core/luasrc/model/cbi/admin_wifi/devices.lua +++ b/modules/admin-core/luasrc/model/cbi/admin_wifi/devices.lua @@ -1,15 +1,15 @@ -- ToDo: Translate, Add descriptions and help texts - -m = Map("wireless", "Geräte", [[An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden.]]) +m = Map("wireless", translate("devices", "Geräte"), translate("a_w_devices1", + "An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden.")) s = m:section(TypedSection, "wifi-device") --s.addremove = true -en = s:option(Flag, "disabled", "Aktivieren") +en = s:option(Flag, "disabled", translate("enable", "Aktivieren")) en.enabled = "0" en.disabled = "1" -t = s:option(ListValue, "type", "Typ") +t = s:option(ListValue, "type", translate("type", "Typ")) t:value("broadcom") t:value("atheros") t:value("mac80211") @@ -22,7 +22,7 @@ for driver in luci.sys.execl(c)[1]:gmatch("[^ ]+") do end ]]-- -mode = s:option(ListValue, "mode", "Modus") +mode = s:option(ListValue, "mode", translate("mode", "Modus")) mode:value("", "standard") mode:value("11b", "802.11b") mode:value("11g", "802.11g") @@ -30,22 +30,22 @@ mode:value("11a", "802.11a") mode:value("11bg", "802.11b+g") mode.rmempty = true -s:option(Value, "channel", "Funkkanal") +s:option(Value, "channel", translate("a_w_channel", "Funkkanal")) -s:option(Value, "txantenna", "Sendeantenne").rmempty = true +s:option(Value, "txantenna", translate("a_w_txantenna", "Sendeantenne")).rmempty = true -s:option(Value, "rxantenna", "Empfangsantenne").rmempty = true +s:option(Value, "rxantenna", translate("a_w_rxantenna", "Empfangsantenne")).rmempty = true -s:option(Value, "distance", "Distanz", - "Distanz zum am weitesten entfernten Funkpartner (m)").rmempty = true +s:option(Value, "distance", translate("distance", "Distanz"), + translate("a_w_distance1", "Distanz zum am weitesten entfernten Funkpartner (m)")).rmempty = true -s:option(Value, "diversity", "Diversität"):depends("type", "atheros") +s:option(Value, "diversity", translate("a_w_diversity", "Diversität")):depends("type", "atheros") -country = s:option(Value, "country", "Ländercode") +country = s:option(Value, "country", translate("a_w_countrycode", "Ländercode")) country.optional = true country:depends("type", "broadcom") -maxassoc = s:option(Value, "maxassoc", "Verbindungslimit") +maxassoc = s:option(Value, "maxassoc", translate("a_w_connlimit", "Verbindungslimit")) maxassoc:depends("type", "broadcom") maxassoc.optional = true diff --git a/modules/admin-core/luasrc/model/cbi/admin_wifi/networks.lua b/modules/admin-core/luasrc/model/cbi/admin_wifi/networks.lua index a5be6f502..afcca4c16 100644 --- a/modules/admin-core/luasrc/model/cbi/admin_wifi/networks.lua +++ b/modules/admin-core/luasrc/model/cbi/admin_wifi/networks.lua @@ -1,16 +1,16 @@ -- ToDo: Translate, Add descriptions and help texts -m = Map("wireless", "Netze", [[Pro WLAN-Gerät können mehrere Netze bereitgestellt werden. +m = Map("wireless", translate("networks", "Netze"), translate("a_w_networks1", [[Pro WLAN-Gerät können mehrere Netze bereitgestellt werden. Es sollte beachtet werden, dass es hardware- / treiberspezifische Einschränkungen gibt. So kann pro WLAN-Gerät in der Regel entweder 1 Ad-Hoc-Zugang ODER bis zu 3 Access-Point und 1 Client-Zugang -gleichzeitig erstellt werden.]]) +gleichzeitig erstellt werden.]])) s = m:section(TypedSection, "wifi-iface") s.addremove = true s.anonymous = true -s:option(Value, "ssid", "Netzkennung (ESSID)").maxlength = 32 +s:option(Value, "ssid", translate("a_w_netid", "Netzkennung (ESSID)")).maxlength = 32 -device = s:option(ListValue, "device", "Gerät") +device = s:option(ListValue, "device", translate("device", "Gerät")) local d = luci.model.uci.sections("wireless") if d then for k, v in pairs(d) do @@ -20,7 +20,7 @@ if d then end end -network = s:option(ListValue, "network", "Netzwerk", "WLAN-Netz zu Netzwerk hinzufügen") +network = s:option(ListValue, "network", translate("network", "Netzwerk"), translate("a_w_network1", "WLAN-Netz zu Netzwerk hinzufügen")) network:value("") for k, v in pairs(luci.model.uci.sections("network")) do if v[".type"] == "interface" and k ~= "loopback" then @@ -28,7 +28,7 @@ for k, v in pairs(luci.model.uci.sections("network")) do end end -mode = s:option(ListValue, "mode", "Modus") +mode = s:option(ListValue, "mode", translate("mode", "Modus")) mode:value("ap", "Access Point") mode:value("adhoc", "Ad-Hoc") mode:value("sta", "Client") @@ -36,13 +36,13 @@ mode:value("wds", "WDS") s:option(Value, "bssid", "BSSID").optional = true -s:option(Value, "txpower", "Sendeleistung", "dbm").rmempty = true +s:option(Value, "txpower", translate("a_w_txpwr", "Sendeleistung"), "dbm").rmempty = true -s:option(Flag, "frameburst", "Broadcom-Frameburst").optional = true -s:option(Flag, "bursting", "Atheros-Frameburst").optional = true +s:option(Flag, "frameburst", translate("a_w_brcmburst", "Broadcom-Frameburst")).optional = true +s:option(Flag, "bursting", translate("a_w_athburst", "Atheros-Frameburst")).optional = true -encr = s:option(ListValue, "encryption", "Verschlüsselung") +encr = s:option(ListValue, "encryption", translate("encryption", "Verschlüsselung")) encr:value("none", "keine") encr:value("wep", "WEP") encr:value("psk", "WPA-PSK") @@ -50,7 +50,7 @@ encr:value("wpa", "WPA-Radius") encr:value("psk2", "WPA2-PSK") encr:value("wpa2", "WPA2-Radius") -key = s:option(Value, "key", "Schlüssel") +key = s:option(Value, "key", translate("key", "Schlüssel")) key:depends("encryption", "wep") key:depends("encryption", "psk") key:depends("encryption", "wpa") @@ -58,19 +58,19 @@ key:depends("encryption", "psk2") key:depends("encryption", "wpa2") key.rmempty = true -server = s:option(Value, "server", "Radius-Server") +server = s:option(Value, "server", translate("a_w_radiussrv", "Radius-Server")) server:depends("encryption", "wpa") server:depends("encryption", "wpa2") server.rmempty = true -port = s:option(Value, "port", "Radius-Port") +port = s:option(Value, "port", translate("a_w_radiusport", "Radius-Port")) port:depends("encryption", "wpa") port:depends("encryption", "wpa2") port.rmempty = true -s:option(Flag, "isolate", "AP-Isolation", "Unterbindet Client-Client-Verkehr").optional = true +s:option(Flag, "isolate", translate("a_w_apisolation", "AP-Isolation"), translate("a_w_apisolation1", "Unterbindet Client-Client-Verkehr")).optional = true -s:option(Flag, "hidden", "ESSID verstecken").optional = true +s:option(Flag, "hidden", translate("a_w_hideessid", "ESSID verstecken")).optional = true diff --git a/modules/admin-core/luasrc/view/admin_wifi/index.htm b/modules/admin-core/luasrc/view/admin_wifi/index.htm index 6a6059835..8de3df90c 100644 --- a/modules/admin-core/luasrc/view/admin_wifi/index.htm +++ b/modules/admin-core/luasrc/view/admin_wifi/index.htm @@ -1,9 +1,9 @@ <%+header%>

<%:wifi Drahtlos%>

-

<%:wifi1 Hier finden sich Konfiugrationsmöglichkeiten für Drahtlos-Netzwerke nach dem WLAN-Standard.%>

-

<%:wifi2 802.11b/g/a/n-Geräte können so einfach in das bestehende physische Netzwerk integriert werden. +

<%:a_w_wifi1 Hier finden sich Konfiugrationsmöglichkeiten für Drahtlos-Netzwerke nach dem WLAN-Standard.%>

+

<%:a_w_wifi2 802.11b/g/a/n-Geräte können so einfach in das bestehende physische Netzwerk integriert werden. Die Unterstützung von virtuellen Adaptern ermöglicht auch den Einsatz als Wireless-Repeater oder von mehreren Netzwerken gleichzeitig auf einem Gerät.%>

-

<%:wifi3 Es werden Managed, Client, Ad-Hoc und WDS-Modus unterstützt sowie WPA und WPA2-Verschlüsselung zur gesicherten +

<%:a_w_wifi3 Es werden Managed, Client, Ad-Hoc und WDS-Modus unterstützt sowie WPA und WPA2-Verschlüsselung zur gesicherten Kommunikation.%>

<%+footer%> \ No newline at end of file -- 2.11.0