static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd, struct sta_info *sta, char *buf, size_t buflen) { int len, res, ret, i; if (!sta) return 0; len = 0; ret = os_snprintf(buf + len, buflen - len, MACSTR "\nflags=", MAC2STR(sta->addr)); if (ret < 0 || (size_t) ret >= buflen - len) return len; len += ret; ret = ap_sta_flags_txt(sta->flags, buf + len, buflen - len); if (ret < 0) return len; len += ret; ret = os_snprintf(buf + len, buflen - len, "\naid=%d\ncapability=0x%x\n" "listen_interval=%d\nsupported_rates=", sta->aid, sta->capability, sta->listen_interval); if (ret < 0 || (size_t) ret >= buflen - len) return len; len += ret; for (i = 0; i < sta->supported_rates_len; i++) { ret = os_snprintf(buf + len, buflen - len, "%02x%s", sta->supported_rates[i], i + 1 < sta->supported_rates_len ? " " : ""); if (ret < 0 || (size_t) ret >= buflen - len) return len; len += ret; } ret = os_snprintf(buf + len, buflen - len, "\ntimeout_next=%s\n", timeout_next_str(sta->timeout_next)); if (ret < 0 || (size_t) ret >= buflen - len) return len; len += ret; res = ieee802_11_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; res = wpa_get_mib_sta(sta->wpa_sm, buf + len, buflen - len); if (res >= 0) len += res; res = ieee802_1x_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; res = hostapd_wps_get_mib_sta(hapd, sta->addr, buf + len, buflen - len); if (res >= 0) len += res; res = hostapd_p2p_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; len += hostapd_get_sta_tx_rx(hapd, sta, buf + len, buflen - len); len += hostapd_get_sta_conn_time(sta, buf + len, buflen - len); return len; }
static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd, struct sta_info *sta, char *buf, size_t buflen) { int len, res, ret, i; const char *keyid; if (!sta) return 0; len = 0; ret = os_snprintf(buf + len, buflen - len, MACSTR "\nflags=", MAC2STR(sta->addr)); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; ret = ap_sta_flags_txt(sta->flags, buf + len, buflen - len); if (ret < 0) return len; len += ret; ret = os_snprintf(buf + len, buflen - len, "\naid=%d\ncapability=0x%x\n" "listen_interval=%d\nsupported_rates=", sta->aid, sta->capability, sta->listen_interval); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; for (i = 0; i < sta->supported_rates_len; i++) { ret = os_snprintf(buf + len, buflen - len, "%02x%s", sta->supported_rates[i], i + 1 < sta->supported_rates_len ? " " : ""); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; } ret = os_snprintf(buf + len, buflen - len, "\ntimeout_next=%s\n", timeout_next_str(sta->timeout_next)); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; res = ieee802_11_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; res = wpa_get_mib_sta(sta->wpa_sm, buf + len, buflen - len); if (res >= 0) len += res; res = ieee802_1x_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; res = hostapd_wps_get_mib_sta(hapd, sta->addr, buf + len, buflen - len); if (res >= 0) len += res; res = hostapd_p2p_get_mib_sta(hapd, sta, buf + len, buflen - len); if (res >= 0) len += res; len += hostapd_get_sta_tx_rx(hapd, sta, buf + len, buflen - len); len += hostapd_get_sta_conn_time(sta, buf + len, buflen - len); #ifdef CONFIG_SAE if (sta->sae && sta->sae->state == SAE_ACCEPTED) { res = os_snprintf(buf + len, buflen - len, "sae_group=%d\n", sta->sae->group); if (!os_snprintf_error(buflen - len, res)) len += res; } #endif /* CONFIG_SAE */ if (sta->vlan_id > 0) { res = os_snprintf(buf + len, buflen - len, "vlan_id=%d\n", sta->vlan_id); if (!os_snprintf_error(buflen - len, res)) len += res; } res = mbo_ap_get_info(sta, buf + len, buflen - len); if (res >= 0) len += res; if (sta->supp_op_classes && buflen - len > (unsigned) (17 + 2 * sta->supp_op_classes[0])) { len += os_snprintf(buf + len, buflen - len, "supp_op_classes="); len += wpa_snprintf_hex(buf + len, buflen - len, sta->supp_op_classes + 1, sta->supp_op_classes[0]); len += os_snprintf(buf + len, buflen - len, "\n"); } if (sta->power_capab) { ret = os_snprintf(buf + len, buflen - len, "min_txpower=%d\n" "max_txpower=%d\n", sta->min_tx_power, sta->max_tx_power); if (!os_snprintf_error(buflen - len, ret)) len += ret; } #ifdef CONFIG_IEEE80211AC if ((sta->flags & WLAN_STA_VHT) && sta->vht_capabilities) { res = os_snprintf(buf + len, buflen - len, "vht_caps_info=0x%08x\n", le_to_host32(sta->vht_capabilities-> vht_capabilities_info)); if (!os_snprintf_error(buflen - len, res)) len += res; } #endif /* CONFIG_IEEE80211AC */ #ifdef CONFIG_IEEE80211N if ((sta->flags & WLAN_STA_HT) && sta->ht_capabilities) { res = os_snprintf(buf + len, buflen - len, "ht_caps_info=0x%04x\n", le_to_host16(sta->ht_capabilities-> ht_capabilities_info)); if (!os_snprintf_error(buflen - len, res)) len += res; } #endif /* CONFIG_IEEE80211N */ if (sta->ext_capability && buflen - len > (unsigned) (11 + 2 * sta->ext_capability[0])) { len += os_snprintf(buf + len, buflen - len, "ext_capab="); len += wpa_snprintf_hex(buf + len, buflen - len, sta->ext_capability + 1, sta->ext_capability[0]); len += os_snprintf(buf + len, buflen - len, "\n"); } if (sta->flags & WLAN_STA_WDS && sta->ifname_wds) { ret = os_snprintf(buf + len, buflen - len, "wds_sta_ifname=%s\n", sta->ifname_wds); if (!os_snprintf_error(buflen - len, ret)) len += ret; } keyid = ap_sta_wpa_get_keyid(hapd, sta); if (keyid) { ret = os_snprintf(buf + len, buflen - len, "keyid=%s\n", keyid); if (!os_snprintf_error(buflen - len, ret)) len += ret; } return len; }