int hostapd_ctrl_iface_sta_list(struct hostapd_data *hapd,char *buf, size_t buflen) { int len,res,ret; struct sta_info *sta = hapd->sta_list; len = 0; char *SSID = NULL; time_t now,online; struct hostap_sta_driver_data data; SSID = (char *)hapd->conf->ssid.ssid; ret = os_snprintf(buf+len,buflen-len,"\nSSID:%s " MACSTR "\n",SSID,MAC2STR(hapd->own_addr)); len += ret; ret = os_snprintf(buf+len,buflen-len,"======================================================================\n"); len += ret; ret = os_snprintf(buf+len,buflen-len,"STA_MAC IP OnlineTime RX TX \n"); len += ret; while(sta){ time(&now); online = now - sta->sta_add_time; if (hostapd_drv_read_sta_data(hapd, &data, sta->addr)) return -1; sta->last_rx_bytes = data.rx_bytes; sta->last_tx_bytes = data.tx_bytes; ret = os_snprintf(buf+len,buflen-len,MACSTR " %-17s %-10lu %-7lu %-7lu\n", MAC2STR(sta->addr),ipaddr_str(ntohl(sta->ipaddr)),online,sta->last_rx_bytes,sta->last_tx_bytes); len += ret; sta = sta->next; } ret = os_snprintf(buf+len,buflen-len,"======================================================================\n"); len += ret; return len; }
static int hostapd_get_sta_tx_rx(struct hostapd_data *hapd, struct sta_info *sta, char *buf, size_t buflen) { struct hostap_sta_driver_data data; int ret; if (hostapd_drv_read_sta_data(hapd, &data, sta->addr) < 0) return 0; ret = os_snprintf(buf, buflen, "rx_packets=%lu\ntx_packets=%lu\n" "rx_bytes=%lu\ntx_bytes=%lu\n", data.rx_packets, data.tx_packets, data.rx_bytes, data.tx_bytes); if (ret < 0 || (size_t) ret >= buflen) return 0; return ret; }
static int accounting_sta_update_stats(struct hostapd_data *hapd, struct sta_info *sta, struct hostap_sta_driver_data *data) { if (hostapd_drv_read_sta_data(hapd, data, sta->addr)) return -1; if (sta->last_rx_bytes > data->rx_bytes) sta->acct_input_gigawords++; if (sta->last_tx_bytes > data->tx_bytes) sta->acct_output_gigawords++; sta->last_rx_bytes = data->rx_bytes; sta->last_tx_bytes = data->tx_bytes; hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_RADIUS, HOSTAPD_LEVEL_DEBUG, "updated TX/RX stats: " "Acct-Input-Octets=%lu Acct-Input-Gigawords=%u " "Acct-Output-Octets=%lu Acct-Output-Gigawords=%u", sta->last_rx_bytes, sta->acct_input_gigawords, sta->last_tx_bytes, sta->acct_output_gigawords); return 0; }
static int hostapd_get_sta_tx_rx(struct hostapd_data *hapd, struct sta_info *sta, char *buf, size_t buflen) { struct hostap_sta_driver_data data; int ret; int len = 0; if (hostapd_drv_read_sta_data(hapd, &data, sta->addr) < 0) return 0; ret = os_snprintf(buf, buflen, "rx_packets=%lu\ntx_packets=%lu\n" "rx_bytes=%llu\ntx_bytes=%llu\ninactive_msec=%lu\n" "signal=%d\n", data.rx_packets, data.tx_packets, data.rx_bytes, data.tx_bytes, data.inactive_msec, data.signal); if (os_snprintf_error(buflen, ret)) return 0; len += ret; ret = os_snprintf(buf + len, buflen - len, "rx_rate_info=%lu", data.current_rx_rate); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; if (data.flags & STA_DRV_DATA_RX_MCS) { ret = os_snprintf(buf + len, buflen - len, " mcs %u", data.rx_mcs); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_RX_VHT_MCS) { ret = os_snprintf(buf + len, buflen - len, " vhtmcs %u", data.rx_vhtmcs); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_RX_VHT_NSS) { ret = os_snprintf(buf + len, buflen - len, " vhtnss %u", data.rx_vht_nss); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_RX_SHORT_GI) { ret = os_snprintf(buf + len, buflen - len, " shortGI"); if (!os_snprintf_error(buflen - len, ret)) len += ret; } ret = os_snprintf(buf + len, buflen - len, "\n"); if (!os_snprintf_error(buflen - len, ret)) len += ret; ret = os_snprintf(buf + len, buflen - len, "tx_rate_info=%lu", data.current_tx_rate); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; if (data.flags & STA_DRV_DATA_TX_MCS) { ret = os_snprintf(buf + len, buflen - len, " mcs %u", data.tx_mcs); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_TX_VHT_MCS) { ret = os_snprintf(buf + len, buflen - len, " vhtmcs %u", data.tx_vhtmcs); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_TX_VHT_NSS) { ret = os_snprintf(buf + len, buflen - len, " vhtnss %u", data.tx_vht_nss); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if (data.flags & STA_DRV_DATA_TX_SHORT_GI) { ret = os_snprintf(buf + len, buflen - len, " shortGI"); if (!os_snprintf_error(buflen - len, ret)) len += ret; } ret = os_snprintf(buf + len, buflen - len, "\n"); if (!os_snprintf_error(buflen - len, ret)) len += ret; if ((sta->flags & WLAN_STA_VHT) && sta->vht_capabilities) { ret = os_snprintf(buf + len, buflen - len, "rx_vht_mcs_map=%04x\n" "tx_vht_mcs_map=%04x\n", le_to_host16(sta->vht_capabilities-> vht_supported_mcs_set.rx_map), le_to_host16(sta->vht_capabilities-> vht_supported_mcs_set.tx_map)); if (!os_snprintf_error(buflen - len, ret)) len += ret; } if ((sta->flags & WLAN_STA_HT) && sta->ht_capabilities) { len = hostapd_write_ht_mcs_bitmask(buf, buflen, len, sta->ht_capabilities-> supported_mcs_set); } if (data.flags & STA_DRV_DATA_LAST_ACK_RSSI) { ret = os_snprintf(buf + len, buflen - len, "last_ack_signal=%d\n", data.last_ack_rssi); if (!os_snprintf_error(buflen - len, ret)) len += ret; } return len; }