<%# LuCI - Lua Configuration Interface Copyright 2008-2009 Steven Barth Copyright 2008-2009 Jo-Philipp Wich Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 $Id$ -%> <%- local sys = require "luci.sys" local utl = require "luci.util" local uci = require "luci.model.uci".cursor_state() function guess_wifi_hw(ifname) local name, idx = ifname:match("^([a-z]+)(%d+)") idx = tonumber(idx) -- wl.o if name == "wl" then local name = "Broadcom 802.11 Wireless Controller" local nm = 0 local fd = nixio.open("/proc/bus/pci/devices", "r") if fd then local ln for ln in fd:linesource() do if ln:match("wl$") then if nm == idx then local version = ln:match("^%S+%s+%S%S%S%S([0-9a-f]+)") name = string.format( "Broadcom BCM%04x 802.11 Wireless Controller", tonumber(version, 16) ) break else nm = nm + 1 end end end fd:close() end return name -- madwifi elseif name == "ath" or name == "wifi" then return "Atheros 802.11 Wireless Controller" -- ralink elseif name == "ra" then return "RaLink 802.11 Wireless Controller" -- prism? elseif name == "eth" then return "Prism 802.11 Wireless Controller" -- dunno yet else return "Unkown 802.11 Wireless Controller" end end function guess_wifi_signal(info) local snr = -1 * ((info.noise or 0) - (info.signal or 0)) local scale = math.floor(snr / 5) local icon if not info.bssid or info.bssid == "00:00:00:00:00:00" then icon = resource .. "/icons/signal-none.png" elseif scale < 1 then icon = resource .. "/icons/signal-0.png" elseif scale < 2 then icon = resource .. "/icons/signal-0-25.png" elseif scale < 3 then icon = resource .. "/icons/signal-25-50.png" elseif scale < 4 then icon = resource .. "/icons/signal-50-75.png" else icon = resource .. "/icons/signal-75-100.png" end return icon end function percent_wifi_signal(info) local qc = info.quality or 0 local qm = info.quality_max or 0 if info.bssid and qc > 0 and qm > 0 then return math.floor((100 / qm) * qc) else return 0 end end function find_wifi_devices() local devs = { } uci:foreach("wireless", "wifi-device", function(s) local dev = s['.name'] local act = 0 devs[dev] = { active = 0, networks = { } } uci:foreach("wireless", "wifi-iface", function(s) if s.device == dev then if s.up == "1" then act = act + 1 end devs[dev].networks[#devs[dev].networks+1] = { active = (s.up == "1"), ifname = s.ifname, info = sys.wifi.getiwinfo(s.ifname or s.device) } end end) devs[dev].hwname = guess_wifi_hw(dev) devs[dev].active = (act > 0) end) return devs end function find_wifi_frequency(state) if state.active then return string.format("%d (%.03f GHz)", state.networks[1].info.channel, state.networks[1].info.frequency / 1000); else return "n/a" end end local devices = find_wifi_devices() local arpcache = { } sys.net.arptable(function(e) arpcache[e["HW address"]] = e["IP address"] end) -%> <%+header%>

<%:a_s_iw_overview Wireless Overview%>

<% for dev, state in utl.kspairs(devices) do %>
<% if #state.networks > 0 then %> <% for i, net in ipairs(state.networks) do %> <% end %> <% else %> <% end %>
.png" style="float:left; margin-right:10px" /> <%=state.hwname%> (<%=dev%>)
Channel: <%=find_wifi_frequency(state)%> | Bitrate: <%=state.active and (state.networks[1].info.bitrate / 1000) .. " Mb/s" or "n/a"%>
Find and join network Provide new network

<%=percent_wifi_signal(net.info)%>%
SSID: <%=utl.pcdata(net.info.ssid)%> | Mode: <%=net.info.mode%>
BSSID: <%=net.info.bssid%> | Encryption: <%=net.info.enctype%>
Edit this network Delete this network
(No network configured on this device)
<% end %>

<%:a_s_iw_overview2 Associated Stations%>

<% local count = -1 %> <% for dev, state in utl.kspairs(devices) do %> <% for _, net in ipairs(state.networks) do %> <% for mac, info in utl.kspairs(net.info.assoclist) do info.bssid = mac; count = count + 1 %> <% end %> <% end %> <% end %> <% if count <= 0 then %> <% end %>
SSID MAC Address Signal Noise
<%=net.info.ssid%> <%=mac%> <%=arpcache[mac] or "n/a"%> <%=info.signal%> dBm <%=info.noise%> dBm
No information available
<%+footer%>