int madwifi_get_quality(const char *ifname, int *buf) { unsigned int mode, len, quality, quality_count; uint8_t tmp[24*1024]; uint8_t *cp; struct iwreq wrq; struct ieee80211req_sta_info *si; if( madwifi_wrq(&wrq, ifname, SIOCGIWMODE, NULL, 0) >= 0 ) { mode = wrq.u.mode; /* Calculate signal average from associated stations in ad-hoc mode */ if( mode == 1 ) { quality = quality_count = 0; if( (len = get80211priv(ifname, IEEE80211_IOCTL_STA_INFO, tmp, 24*1024)) > 0 ) { cp = tmp; do { si = (struct ieee80211req_sta_info *) cp; if( si->isi_rssi > 0 ) { quality_count++; quality += si->isi_rssi; } cp += si->isi_len; len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info)); } *buf = (quality == 0 || quality_count == 0) ? 0 : (quality / quality_count); return 0; } /* Return whatever wext tells us ... */ return wext_get_quality(ifname, buf); } return -1; }
int wl_get_quality(const char *ifname, int *buf) { return wext_get_quality(ifname, buf); }