| import { request, 'const' as wlconst } from 'nl80211'; |
| |
| const x = ubus.call("network.wireless", "status"); |
| |
| if (!x) |
| return false; |
| |
| const iftypes = [ |
| "Unknown", |
| "Ad-Hoc", |
| "Client", |
| "Master", |
| "Master (VLAN)", |
| "WDS", |
| "Monitor", |
| "Mesh Point", |
| "P2P Client", |
| "P2P Go", |
| "P2P Device", |
| "OCB", |
| ]; |
| |
| let m_radio_info = gauge("wifi_radio_info"); |
| let m_network_info = gauge("wifi_network_info"); |
| let m_network_quality = gauge("wifi_network_quality"); |
| let m_network_bitrate = gauge("wifi_network_bitrate"); |
| let m_network_noise = gauge("wifi_network_noise_dbm"); |
| let m_network_signal = gauge("wifi_network_signal_dbm"); |
| let m_stations_total = counter("wifi_stations_total"); |
| let m_station_inactive = gauge("wifi_station_inactive_milliseconds"); |
| let m_station_rx_bytes = counter("wifi_station_receive_bytes_total"); |
| let m_station_tx_bytes = counter("wifi_station_transmit_bytes_total"); |
| let m_station_rx_packets = counter("wifi_station_receive_packets_total"); |
| let m_station_tx_packets = counter("wifi_station_transmit_packets_total"); |
| let m_station_signal = gauge("wifi_station_signal_dbm"); |
| let m_station_rx_bitrate = gauge("wifi_station_receive_kilobits_per_second"); |
| let m_station_tx_bitrate = gauge("wifi_station_transmit_kilobits_per_second"); |
| let m_station_exp_tp = gauge("wifi_station_expected_throughput_kilobits_per_second"); |
| |
| for (let radio in x) { |
| const rc = x[radio]["config"]; |
| |
| m_radio_info({ |
| radio, |
| htmode: rc["htmode"], |
| channel: rc["channel"], |
| country: rc["country"], |
| } ,1); |
| |
| for (let iface in x[radio]["interfaces"]) { |
| const ifname = iface["ifname"]; |
| const nc = iface["config"]; |
| const wif = request(wlconst.NL80211_CMD_GET_INTERFACE, 0, { dev: ifname }); |
| |
| if (!wif) |
| continue; |
| |
| m_network_info({ |
| radio, |
| ifname, |
| ssid: nc["ssid"] || nc["mesh_id"], |
| bssid: wif["mac"], |
| mode: iftypes[wif["iftype"]], |
| }, 1); |
| |
| const wsta = request(wlconst.NL80211_CMD_GET_STATION, wlconst.NLM_F_DUMP, { dev: ifname }); |
| let signal = 0; |
| let bitrate = 0; |
| const stations = length(wsta) || 0; |
| if (stations) { |
| for (let sta in wsta) { |
| signal += sta["sta_info"].signal; |
| bitrate += sta["sta_info"]["tx_bitrate"].bitrate32; |
| } |
| bitrate /= stations * 0.01; |
| signal /= stations; |
| } |
| |
| let labels = { radio, ifname }; |
| m_network_bitrate(labels, bitrate || NaN); |
| m_network_signal(labels, signal || NaN); |
| m_network_quality(labels, signal ? 100.0 / 70 * (signal + 110) : NaN); |
| |
| const wsur = request(wlconst.NL80211_CMD_GET_SURVEY, wlconst.NLM_F_DUMP, { dev: ifname }); |
| let noise = 0; |
| for (let i in wsur) { |
| if (i["survey_info"]["frequency"] != wif["wiphy_freq"]) |
| continue; |
| |
| noise = i["survey_info"]["noise"]; |
| break; |
| } |
| |
| m_network_noise(labels, noise || NaN); |
| |
| if (config["stations"] != "1") |
| continue; |
| |
| m_stations_total(labels, stations); |
| if (!stations) |
| continue; |
| |
| for (let sta in wsta) { |
| labels["mac"] = sta["mac"]; |
| const info = sta["sta_info"]; |
| |
| m_station_inactive(labels, info["inactive_time"]); |
| m_station_rx_bytes(labels, info["rx_bytes64"]); |
| m_station_tx_bytes(labels, info["tx_bytes64"]); |
| m_station_rx_packets(labels, info["rx_packets"]); |
| m_station_tx_packets(labels, info["tx_packets"]); |
| m_station_signal(labels, info["signal"]); |
| if (info["rx_bitrate"] && info["rx_bitrate"]["bitrate32"]) |
| m_station_rx_bitrate(labels, info["rx_bitrate"]["bitrate32"] * 100); |
| if (info["tx_bitrate"] && info["tx_bitrate"]["bitrate32"]) |
| m_station_tx_bitrate(labels, info["tx_bitrate"]["bitrate32"] * 100); |
| if (info["expected_throughput"]) |
| m_station_exp_tp(labels, info["expected_throughput"]); |
| } |
| } |
| } |