static char * format_channel(int ch)
{
- static char buf[8];
+ static char buf[16];
if (ch <= 0)
snprintf(buf, sizeof(buf), "unknown");
static char * format_frequency(int freq)
{
- static char buf[10];
+ static char buf[11];
if (freq <= 0)
snprintf(buf, sizeof(buf), "unknown");
static char * format_txpower(int pwr)
{
- static char buf[10];
+ static char buf[16];
if (pwr < 0)
snprintf(buf, sizeof(buf), "unknown");
static char * format_quality(int qual)
{
- static char buf[8];
+ static char buf[16];
if (qual < 0)
snprintf(buf, sizeof(buf), "unknown");
static char * format_quality_max(int qmax)
{
- static char buf[8];
+ static char buf[16];
if (qmax < 0)
snprintf(buf, sizeof(buf), "unknown");
if (ciphers & IWINFO_CIPHER_CCMP)
pos += sprintf(pos, "CCMP, ");
+ if (ciphers & IWINFO_CIPHER_CCMP256)
+ pos += sprintf(pos, "CCMP-256, ");
+
+ if (ciphers & IWINFO_CIPHER_GCMP)
+ pos += sprintf(pos, "GCMP, ");
+
+ if (ciphers & IWINFO_CIPHER_GCMP256)
+ pos += sprintf(pos, "GCMP-256, ");
+
if (ciphers & IWINFO_CIPHER_WRAP)
pos += sprintf(pos, "WRAP, ");
for (i = 0; i < 3; i++)
if (c->wpa_version & (1 << i))
+ {
if (i)
pos += sprintf(pos, "WPA%d/", i + 1);
else
pos += sprintf(pos, "WPA/");
+ }
pos--;
static char * format_hwmodes(int modes)
{
- static char buf[15];
+ static char buf[32] = "802.11";
- if (modes <= 0)
+ if (iwinfo_format_hwmodes(modes, buf + 6, sizeof(buf) - 6) < 1)
snprintf(buf, sizeof(buf), "unknown");
- else
- snprintf(buf, sizeof(buf), "802.11%s%s%s%s%s%s",
- (modes & IWINFO_80211_A) ? "a" : "",
- (modes & IWINFO_80211_B) ? "b" : "",
- (modes & IWINFO_80211_G) ? "g" : "",
- (modes & IWINFO_80211_N) ? "n" : "",
- (modes & IWINFO_80211_AC) ? "ac" : "",
- (modes & IWINFO_80211_AD) ? "ad" : "");
return buf;
}
l = sizeof(buf) - (p - buf);
}
}
+ else if (r->is_he)
+ {
+ p += snprintf(p, l, ", HE-MCS %d, %dMHz", r->mcs, r->mhz);
+ l = sizeof(buf) - (p - buf);
+
+ p += snprintf(p, l, ", HE-NSS %d", r->nss);
+ l = sizeof(buf) - (p - buf);
+
+ p += snprintf(p, l, ", HE-GI %d", r->he_gi);
+ l = sizeof(buf) - (p - buf);
+
+ p += snprintf(p, l, ", HE-DCM %d", r->he_dcm);
+ l = sizeof(buf) - (p - buf);
+ }
}
return buf;
}
-static const char* format_chan_width(uint16_t width)
+static const char* format_chan_width(bool vht, uint8_t width)
{
- switch (width) {
- case 20: return "20 MHz";
- case 2040: return "40 MHz and upper or 20 MHz with intolerant bit";
- case 40: return "40 MHz or lower";
- case 80: return "80 MHz";
- case 8080: return "80+80 MHz";
- case 160: return "160 MHz";
- }
+ if (!vht && width < ARRAY_SIZE(ht_chan_width))
+ switch (ht_chan_width[width]) {
+ case 20: return "20 MHz";
+ case 2040: return "40 MHz or higher";
+ }
+
+ if (vht && width < ARRAY_SIZE(vht_chan_width))
+ switch (vht_chan_width[width]) {
+ case 40: return "20 or 40 MHz";
+ case 80: return "80 MHz";
+ case 8080: return "80+80 MHz";
+ case 160: return "160 MHz";
+ }
return "unknown";
}
printf(" Secondary Channel Offset: %s\n",
ht_secondary_offset[e->ht_chan_info.secondary_chan_off]);
printf(" Channel Width: %s\n",
- format_chan_width(e->ht_chan_info.chan_width));
+ format_chan_width(false, e->ht_chan_info.chan_width));
if (e->vht_chan_info.center_chan_1) {
printf(" VHT Operation:\n");
- printf(" Channel Width: %s\n",
- format_chan_width(e->vht_chan_info.chan_width));
printf(" Center Frequency 1: %d\n",
e->vht_chan_info.center_chan_1);
printf(" Center Frequency 2: %d\n",
e->vht_chan_info.center_chan_2);
+ printf(" Channel Width: %s\n",
+ format_chan_width(true, e->vht_chan_info.chan_width));
}
printf("\n");
static void print_freqlist(const struct iwinfo_ops *iw, const char *ifname)
{
- int i, len, ch;
+ int i, len, freq;
char buf[IWINFO_BUFSIZE];
struct iwinfo_freqlist_entry *e;
return;
}
- if (iw->channel(ifname, &ch))
- ch = -1;
+ if (iw->frequency(ifname, &freq))
+ freq = -1;
for (i = 0; i < len; i += sizeof(struct iwinfo_freqlist_entry))
{
e = (struct iwinfo_freqlist_entry *) &buf[i];
printf("%s %s (Channel %s)%s\n",
- (ch == e->channel) ? "*" : " ",
+ (freq == e->mhz) ? "*" : " ",
format_frequency(e->mhz),
format_channel(e->channel),
e->restricted ? " [restricted]" : "");
}
+static void lookup_path(const struct iwinfo_ops *iw, const char *phy)
+{
+ const char *path;
+
+ if (!iw->phy_path || iw->phy_path(phy, &path) || !path)
+ return;
+
+ printf("%s\n", path);
+}
+
int main(int argc, char **argv)
{
int i, rv = 0;
}
else
{
+ if (!strcmp(argv[2], "path")) {
+ lookup_path(iw, argv[3]);
+ return 0;
+ }
switch (argv[2][0])
{
case 'p':