libiwinfo: show noise and snr in assoclist
[project/luci.git] / contrib / package / iwinfo / src / iwinfo.lua
1 #!/usr/bin/lua
2
3 require "iwinfo"
4
5 function printf(fmt, ...)
6 print(string.format(fmt, ...))
7 end
8
9 function s(x)
10 if x == nil then
11 return "?"
12 else
13 return tostring(x)
14 end
15 end
16
17 function n(x)
18 if x == nil then
19 return 0
20 else
21 return tonumber(x)
22 end
23 end
24
25 function print_info(api, dev)
26 local iw = iwinfo[api]
27 local enc = iw.encryption(dev)
28
29 local function hwmode()
30 local m = iw.hwmodelist(dev)
31 if m then
32 local s = "802.11"
33 if m.a then s = s.."a" end
34 if m.b then s = s.."b" end
35 if m.g then s = s.."g" end
36 if m.n then s = s.."n" end
37 return s
38 else
39 return "?"
40 end
41 end
42
43 printf("%-9s ESSID: \"%s\"",
44 dev, s(iw.ssid(dev)))
45
46 printf(" Access Point: %s",
47 s(iw.bssid(dev)))
48
49 printf(" Type: %s HW Mode(s): %s",
50 api, hwmode())
51
52 printf(" Mode: %s Channel: %d (%.3f GHz)",
53 s(iw.mode(dev)), n(iw.channel(dev)), n(iw.frequency(dev)) / 1000)
54
55 printf(" Tx-Power: %s dBm Link Quality: %s/%s",
56 s(iw.txpower(dev)), s(iw.quality(dev)), s(iw.quality_max(dev)))
57
58 printf(" Signal: %s dBm Noise: %s dBm",
59 s(iw.signal(dev)), s(iw.noise(dev)))
60
61 printf(" Bit Rate: %.1f MBit/s",
62 n(iw.bitrate(dev)) / 1000)
63
64 printf(" Encryption: %s",
65 s(enc and enc.description or "None"))
66
67 printf(" Supports VAPs: %s",
68 iw.mbssid_support(dev) and "yes" or "no")
69
70 print("")
71 end
72
73 function print_scan(api, dev)
74 local iw = iwinfo[api]
75 local sr = iw.scanlist(dev)
76 local si, se
77
78 if sr and #sr > 0 then
79 for si, se in ipairs(sr) do
80 printf("Cell %02d - Address: %s", si, se.bssid)
81 printf(" ESSID: \"%s\"",
82 s(se.ssid))
83
84 printf(" Mode: %s Channel: %d",
85 s(se.mode), n(se.channel))
86
87 printf(" Signal: %s dBm Quality: %d/%d",
88 s(se.signal), n(se.quality), n(se.quality_max))
89
90 printf(" Encryption: %s",
91 s(se.encryption.description or "None"))
92
93 print("")
94 end
95 else
96 print("No scan results or scanning not possible")
97 print("")
98 end
99 end
100
101 function print_txpwrlist(api, dev)
102 local iw = iwinfo[api]
103 local pl = iw.txpwrlist(dev)
104 local cp = n(iw.txpower(dev))
105 local pe
106
107 if pl and #pl > 0 then
108 for _, pe in ipairs(pl) do
109 printf("%s%3d dBm (%4d mW)",
110 (cp == pe.dbm) and "*" or " ",
111 n(pe.dbm), n(pe.mw))
112 end
113 else
114 print("No TX power information available")
115 end
116
117 print("")
118 end
119
120 function print_freqlist(api, dev)
121 local iw = iwinfo[api]
122 local fl = iw.freqlist(dev)
123 local cc = n(iw.channel(dev))
124 local fe
125
126 if fl and #fl > 0 then
127 for _, fe in ipairs(fl) do
128 printf("%s %.3f GHz (Channel %d)%s",
129 (cc == fe.channel) and "*" or " ",
130 n(fe.mhz) / 1000, n(fe.channel),
131 fe.restricted and " [restricted]" or "")
132 end
133 else
134 print("No frequency information available")
135 end
136
137 print("")
138 end
139
140 function print_assoclist(api, dev)
141 local iw = iwinfo[api]
142 local al = iw.assoclist(dev)
143 local ns = iw.noise(dev)
144 local ai, ae
145
146 if al and next(al) then
147 for ai, ae in pairs(al) do
148 printf("%s %s dBm / %d dBm (SNR %d)",
149 ai, s(ae.signal), ns, n(ae.signal) - ns)
150 end
151 else
152 print("No client connected or no information available")
153 end
154
155 print("")
156 end
157
158 function print_countrylist(api, dev)
159 local iw = iwinfo[api]
160 local cl = iw.countrylist(dev)
161 local cc = iw.country(dev)
162 local ce
163
164 if cl and #cl > 0 then
165 for _, ce in ipairs(cl) do
166 printf("%s %4s %s",
167 (cc == ce.alpha2) and "*" or " ",
168 ce.ccode, ce.name)
169 end
170 else
171 print("No country code information available")
172 end
173
174 print("")
175 end
176
177
178 if #arg ~= 2 then
179 print("Usage:")
180 print(" iwinfo <device> info")
181 print(" iwinfo <device> scan")
182 print(" iwinfo <device> txpowerlist")
183 print(" iwinfo <device> freqlist")
184 print(" iwinfo <device> assoclist")
185 print(" iwinfo <device> countrylist")
186 os.exit(1)
187 end
188
189 local dev = arg[1]
190 local api = iwinfo.type(dev)
191 if not api then
192 print("No such wireless device: " .. dev)
193 os.exit(1)
194 end
195
196
197 if arg[2]:match("^i") then
198 print_info(api, dev)
199
200 elseif arg[2]:match("^s") then
201 print_scan(api, dev)
202
203 elseif arg[2]:match("^t") then
204 print_txpwrlist(api, dev)
205
206 elseif arg[2]:match("^f") then
207 print_freqlist(api, dev)
208
209 elseif arg[2]:match("^a") then
210 print_assoclist(api, dev)
211
212 elseif arg[2]:match("^c") then
213 print_countrylist(api, dev)
214
215 else
216 print("Unknown command: " .. arg[2])
217 end