summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@users.noreply.github.com>2015-09-16 14:06:48 +0200
committerMichael Stapelberg <stapelberg@users.noreply.github.com>2015-09-16 14:06:48 +0200
commitfb57fca5c26e1513288cb591fa726e7d8a2603ea (patch)
tree47a58799bf3bcc44cc2b1a38172e80c3272f3237 /src
parent43fc5791f51ba93ef98a2c0ae89724f3711e3c64 (diff)
parent85618dc8e83f2f6da0953bf22a00108f46572bc0 (diff)
Merge pull request #59 from bsdjhb/freebsd_wifi
Fix various issues with wireless information under FreeBSD:
Diffstat (limited to 'src')
-rw-r--r--src/print_wireless_info.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/print_wireless_info.c b/src/print_wireless_info.c
index 83c717e..99b07f8 100644
--- a/src/print_wireless_info.c
+++ b/src/print_wireless_info.c
@@ -197,10 +197,14 @@ static int get_wireless_info(const char *interface, wireless_info_t *info) {
return 1;
#endif
#if defined(__FreeBSD__) || defined(__DragonFly__)
- int s, len, inwid;
- uint8_t buf[24 * 1024], *cp;
+ int s, inwid;
+ union {
+ struct ieee80211req_sta_req req;
+ uint8_t buf[24 * 1024];
+ } u;
struct ieee80211req na;
- char network_id[IEEE80211_NWID_LEN + 1];
+ char bssid[IEEE80211_ADDR_LEN];
+ size_t len;
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
return (0);
@@ -228,31 +232,38 @@ static int get_wireless_info(const char *interface, wireless_info_t *info) {
memset(&na, 0, sizeof(na));
strlcpy(na.i_name, interface, sizeof(na.i_name));
- na.i_type = IEEE80211_IOC_SCAN_RESULTS;
- na.i_data = buf;
- na.i_len = sizeof(buf);
+ na.i_type = IEEE80211_IOC_BSSID;
+ na.i_data = bssid;
+ na.i_len = sizeof(bssid);
+
+ if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) {
+ close(s);
+ return (0);
+ }
+
+ memcpy(u.req.is_u.macaddr, bssid, sizeof(bssid));
+ memset(&na, 0, sizeof(na));
+ strlcpy(na.i_name, interface, sizeof(na.i_name));
+ na.i_type = IEEE80211_IOC_STA_INFO;
+ na.i_data = &u;
+ na.i_len = sizeof(u);
if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) {
- printf("fail\n");
close(s);
return (0);
}
close(s);
- len = na.i_len;
- cp = buf;
- struct ieee80211req_scan_result *sr;
- uint8_t *vp;
- sr = (struct ieee80211req_scan_result *)cp;
- vp = (u_int8_t *)(sr + 1);
- strlcpy(network_id, (const char *)vp, sr->isr_ssid_len + 1);
- if (!strcmp(network_id, &info->essid[0])) {
- info->signal_level = sr->isr_rssi;
+ if (na.i_len >= sizeof(u.req)) {
+ /*
+ * Just use the first BSSID returned even if there are
+ * multiple APs sharing the same BSSID.
+ */
+ info->signal_level = u.req.info[0].isi_rssi / 2 +
+ u.req.info[0].isi_noise;
info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL;
- info->noise_level = sr->isr_noise;
+ info->noise_level = u.req.info[0].isi_noise;
info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE;
- info->quality = sr->isr_intval;
- info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY;
}
return 1;