static char * format_frequency(int freq)
{
- static char buf[10];
+ static char buf[11];
if (freq <= 0)
snprintf(buf, sizeof(buf), "unknown");
if (ciphers & IWINFO_CIPHER_CCMP)
pos += sprintf(pos, "CCMP, ");
+ if (ciphers & IWINFO_CIPHER_GCMP)
+ pos += sprintf(pos, "GCMP, ");
+
if (ciphers & IWINFO_CIPHER_WRAP)
pos += sprintf(pos, "WRAP, ");
static char * format_encryption(struct iwinfo_crypto_entry *c)
{
static char buf[512];
+ char *pos = buf;
+ int i, n;
if (!c)
{
/* WPA */
else if (c->wpa_version)
{
- switch (c->wpa_version) {
- case 4:
- snprintf(buf, sizeof(buf), "WPA3 %s (%s)",
- format_enc_suites(c->auth_suites),
- format_enc_ciphers(c->pair_ciphers | c->group_ciphers));
- break;
+ for (i = 0, n = 0; i < 3; i++)
+ if (c->wpa_version & (1 << i))
+ n++;
- case 3:
- snprintf(buf, sizeof(buf), "mixed WPA/WPA2 %s (%s)",
- format_enc_suites(c->auth_suites),
- format_enc_ciphers(c->pair_ciphers | c->group_ciphers));
- break;
+ if (n > 1)
+ pos += sprintf(pos, "mixed ");
- case 2:
- snprintf(buf, sizeof(buf), "WPA2 %s (%s)",
- format_enc_suites(c->auth_suites),
- format_enc_ciphers(c->pair_ciphers | c->group_ciphers));
- break;
+ 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/");
- case 1:
- snprintf(buf, sizeof(buf), "WPA %s (%s)",
- format_enc_suites(c->auth_suites),
- format_enc_ciphers(c->pair_ciphers | c->group_ciphers));
- break;
- }
+ pos--;
+
+ sprintf(pos, " %s (%s)",
+ format_enc_suites(c->auth_suites),
+ format_enc_ciphers(c->pair_ciphers | c->group_ciphers));
}
else
{
return buf;
}
+static const char* format_chan_width(uint16_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";
+ }
+
+ return "unknown";
+}
+
static const char * print_type(const struct iwinfo_ops *iw, const char *ifname)
{
return format_channel(ch);
}
+static char * print_center_chan1(const struct iwinfo_ops *iw, const char *ifname)
+{
+ int ch;
+ if (iw->center_chan1(ifname, &ch))
+ ch = -1;
+
+ return format_channel(ch);
+}
+
+static char * print_center_chan2(const struct iwinfo_ops *iw, const char *ifname)
+{
+ int ch;
+ if (iw->center_chan2(ifname, &ch))
+ ch = -1;
+
+ return format_channel(ch);
+}
+
static char * print_frequency(const struct iwinfo_ops *iw, const char *ifname)
{
int freq;
print_mode(iw, ifname),
print_channel(iw, ifname),
print_frequency(iw, ifname));
+ if (iw->center_chan1 != NULL) {
+ printf(" Center Channel 1: %s",
+ print_center_chan1(iw, ifname));
+ printf(" 2: %s\n", print_center_chan2(iw, ifname));
+ }
printf(" Tx-Power: %s Link Quality: %s/%s\n",
print_txpower(iw, ifname),
print_quality(iw, ifname),
format_signal(e->signal - 0x100),
format_quality(e->quality),
format_quality_max(e->quality_max));
- printf(" Encryption: %s\n\n",
+ printf(" Encryption: %s\n",
format_encryption(&e->crypto));
+ printf(" HT Operation:\n");
+ printf(" Primary Channel: %d\n",
+ e->ht_chan_info.primary_chan);
+ 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));
+
+ 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("\n");
}
}