Browse Source

Merge branch 'announce-separate-frequencies' of https://github.com/FreifunkBremen/gluon

Matthias Schiffer 8 years ago
parent
commit
d97586dd89

+ 43 - 8
package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/statistics.d/clients

@@ -1,20 +1,55 @@
-local list = io.lines("/sys/kernel/debug/batman_adv/bat0/transtable_local")
+local iwinfo = require 'iwinfo'
+
+local counts = { total = 0
+               , wifi = 0
+               , wifi24 = 0
+               , wifi5 = 0
+               }
 
-local count = 0
-local wifi = 0
+local list = io.lines("/sys/kernel/debug/batman_adv/bat0/transtable_local")
+local clients = {}
 for line in list do
   local mac, _, flags, lastseen = line:match("^ %* ([0-9a-f:]+) *(.- )%[(.-)%] +(%d+%.%d+)")
   if mac then
     if not flags:match('P') then
-      count = count + 1
+      counts.total = counts.total + 1
+      clients[mac:lower()] = true
 
       if flags:match('W') then
-        wifi = wifi +1
+        counts.wifi = counts.wifi +1
       end
     end
   end
 end
 
-return { total = count
-       , wifi  = wifi
-       }
+function count_iface_stations(iface)
+  local wifitype = iwinfo.type(iface)
+  if wifitype == nil then
+    return
+  end
+
+  local freq = iwinfo[wifitype].frequency(iface)
+  local key
+  if freq >= 2400 and freq < 2500 then
+    key = "wifi24"
+  elseif freq >= 5000 and freq < 6000 then
+    key = "wifi5"
+  else
+    return
+  end
+
+  for k, v in pairs(iwinfo[wifitype].assoclist(iface)) do
+    if clients[k:lower()] then
+      counts[key] = counts[key] + 1
+    end
+  end
+end
+
+local ifaces = {}
+uci:foreach("wireless", "wifi-iface", function(s)
+  if s.network == "client" and s.mode == "ap" then
+    count_iface_stations(s.ifname)
+  end
+end)
+
+return counts