| 834 | } |
| 835 | |
| 836 | int waybar::modules::Network::handleScan(struct nl_msg* msg, void* data) { |
| 837 | auto net = static_cast<waybar::modules::Network*>(data); |
| 838 | auto gnlh = static_cast<genlmsghdr*>(nlmsg_data(nlmsg_hdr(msg))); |
| 839 | struct nlattr* tb[NL80211_ATTR_MAX + 1]; |
| 840 | struct nlattr* bss[NL80211_BSS_MAX + 1]; |
| 841 | struct nla_policy bss_policy[NL80211_BSS_MAX + 1]{}; |
| 842 | bss_policy[NL80211_BSS_TSF].type = NLA_U64; |
| 843 | bss_policy[NL80211_BSS_FREQUENCY].type = NLA_U32; |
| 844 | bss_policy[NL80211_BSS_BSSID].type = NLA_UNSPEC; |
| 845 | bss_policy[NL80211_BSS_BEACON_INTERVAL].type = NLA_U16; |
| 846 | bss_policy[NL80211_BSS_CAPABILITY].type = NLA_U16; |
| 847 | bss_policy[NL80211_BSS_INFORMATION_ELEMENTS].type = NLA_UNSPEC; |
| 848 | bss_policy[NL80211_BSS_SIGNAL_MBM].type = NLA_U32; |
| 849 | bss_policy[NL80211_BSS_SIGNAL_UNSPEC].type = NLA_U8; |
| 850 | bss_policy[NL80211_BSS_STATUS].type = NLA_U32; |
| 851 | |
| 852 | if (nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), |
| 853 | nullptr) < 0) { |
| 854 | return NL_SKIP; |
| 855 | } |
| 856 | if (tb[NL80211_ATTR_BSS] == nullptr) { |
| 857 | return NL_SKIP; |
| 858 | } |
| 859 | if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS], bss_policy) != 0) { |
| 860 | return NL_SKIP; |
| 861 | } |
| 862 | if (!net->associatedOrJoined(bss)) { |
| 863 | return NL_SKIP; |
| 864 | } |
| 865 | net->parseEssid(bss); |
| 866 | net->parseSignal(bss); |
| 867 | net->parseFreq(bss); |
| 868 | net->parseBssid(bss); |
| 869 | return NL_OK; |
| 870 | } |
| 871 | |
| 872 | void waybar::modules::Network::parseEssid(struct nlattr** bss) { |
| 873 | if (bss[NL80211_BSS_INFORMATION_ELEMENTS] != nullptr) { |
nothing calls this directly
no test coverage detected