+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008-2009 Steven Barth <steven@midlink.org>
+Copyright 2008-2009 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+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%>
+
+<h2><a id="content" name="content"><%:a_s_iw_overview Wireless Overview%></a></h2>
+
+<div class="cbi-map">
+
+ <% for dev, state in utl.kspairs(devices) do %>
+ <!-- device <%=dev%> -->
+ <fieldset class="cbi-section">
+ <table class="cbi-section-table" style="margin:10px; empty-cells:hide">
+ <!-- physical device -->
+ <tr>
+ <td style="width:34px"><img src="<%=resource%>/icons/wifi<%=state.active and "" or "_disabled"%>.png" style="float:left; margin-right:10px" /></td>
+ <td colspan="2" style="text-align:left">
+ <big><strong><%=state.hwname%> (<%=dev%>)</strong></big><br />
+ <strong>Channel:</strong> <%=find_wifi_frequency(state)%> |
+ <strong>Bitrate:</strong> <%=state.active and (state.networks[1].info.bitrate / 1000) .. " Mb/s" or "n/a"%>
+ </td>
+ <td style="width:40px">
+ <a href="<%=luci.dispatcher.build_url("admin/network/wireless_join?device="..dev)%>"><img style="border:none" src="<%=resource%>/cbi/find.gif" alt="Find and join network" title="Find and join network" /></a>
+ <a href="#"><img style="border:none" src="<%=resource%>/cbi/add.gif" alt="Provide new network" title="Provide new network" /></a>
+ </td>
+ </tr>
+ <!-- /physical device -->
+
+ <!-- network list -->
+ <% if #state.networks > 0 then %>
+ <% for i, net in ipairs(state.networks) do %>
+ <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>">
+ <td></td>
+ <td class="cbi-value-field" style="width:16px; padding:3px">
+ <img src="<%=guess_wifi_signal(net.info)%>" title="Signal: <%=net.info.signal%> dBm / Noise: <%=net.info.noise%> dBm" /><br />
+ <small><%=percent_wifi_signal(net.info)%>%</small>
+ </td>
+ <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
+ <strong>SSID:</strong> <%=utl.pcdata(net.info.ssid)%> |
+ <strong>Mode:</strong> <%=net.info.mode%><br />
+ <strong>BSSID:</strong> <%=net.info.bssid%> |
+ <strong>Encryption:</strong> <%=net.info.enctype%>
+ </td>
+ <td class="cbi-value-field" style="width:40px">
+ <a href="<%=REQUEST_URI%>/<%=dev%>"><img style="border:none" src="<%=resource%>/cbi/edit.gif" alt="Edit this network" title="Edit this network" /></a>
+ <a href="#"><img style="border:none" src="<%=resource%>/cbi/remove.gif" alt="Delete this network" title="Delete this network" /></a>
+ </td>
+ </tr>
+ <% end %>
+ <% else %>
+ <tr class="cbi-section-table-row cbi-rowstyle-2">
+ <td></td>
+ <td colspan="3" class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px">
+ <em>(No network configured on this device)</em>
+ </td>
+ </tr>
+ <% end %>
+ <!-- /network list -->
+ </table>
+ </fieldset>
+ <!-- /device <%=dev%> -->
+ <% end %>
+
+
+
+
+ <h2><a id="content" name="content"><%:a_s_iw_overview2 Associated Stations%></a></h2>
+
+ <fieldset class="cbi-section">
+ <table class="cbi-section-table" style="margin:10px; width:50%">
+ <tr class="cbi-section-table-titles">
+ <th class="cbi-section-table-cell"></th>
+ <th class="cbi-section-table-cell">SSID</th>
+ <th class="cbi-section-table-cell">MAC</th>
+ <th class="cbi-section-table-cell">Address</th>
+ <th class="cbi-section-table-cell">Signal</th>
+ <th class="cbi-section-table-cell">Noise</th>
+ </tr>
+
+ <% 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 %>
+ <tr class="cbi-section-table-row cbi-rowstyle-<%=1 + (count % 2)%>">
+ <td class="cbi-value-field"><img src="<%=guess_wifi_signal(info)%>" title="Signal: <%=info.signal%> dBm / Noise: <%=info.noise%> dBm" /></td>
+ <td class="cbi-value-field"><%=net.info.ssid%></td>
+ <td class="cbi-value-field"><%=mac%></td>
+ <td class="cbi-value-field"><%=arpcache[mac] or "n/a"%></td>
+ <td class="cbi-value-field"><%=info.signal%> dBm</td>
+ <td class="cbi-value-field"><%=info.noise%> dBm</td>
+ </tr>
+ <% end %>
+ <% end %>
+ <% end %>
+ <% if count <= 0 then %>
+ <tr class="cbi-section-table-row cbi-rowstyle-2">
+ <td class="cbi-value-field" colspan="6">
+ <em>No information available</em>
+ </td>
+ </tr>
+ <% end %>
+ </table>
+ </fieldset>
+</div>
+
+<%+footer%>