]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: Parse some common WPS attributes
authorJouni Malinen <j@w1.fi>
Tue, 6 Apr 2010 15:03:57 +0000 (18:03 +0300)
committerJohannes Berg <johannes@sipsolutions.net>
Tue, 6 Apr 2010 15:05:53 +0000 (17:05 +0200)
Make iw scan result output a bit more readable for WPS APs by parsing
some of the commonly used attributes instead of showing them as unknown
TLVs with a hex dump.

scan.c

diff --git a/scan.c b/scan.c
index c0287c4020390c02aa6bf8cbe6dad468b58d9c25..09b10478839df7034310a8fed4f0756c41da4085 100644 (file)
--- a/scan.c
+++ b/scan.c
@@ -683,6 +683,26 @@ static void print_wifi_wmm(const uint8_t type, uint8_t len, const uint8_t *data)
        printf("\n");
 }
 
+static const char * wifi_wps_dev_passwd_id(uint16_t id)
+{
+       switch (id) {
+       case 0:
+               return "Default (PIN)";
+       case 1:
+               return "User-specified";
+       case 2:
+               return "Machine-specified";
+       case 3:
+               return "Rekey";
+       case 4:
+               return "PushButton";
+       case 5:
+               return "Registrar-specified";
+       default:
+               return "??";
+       }
+}
+
 static void print_wifi_wps(const uint8_t type, uint8_t len, const uint8_t *data)
 {
        bool first = true;
@@ -703,6 +723,19 @@ static void print_wifi_wps(const uint8_t type, uint8_t len, const uint8_t *data)
                        tab_on_first(&first);
                        printf("\t * Device name: %.*s\n", sublen, data + 4);
                        break;
+               case 0x1012: {
+                       uint16_t id;
+                       tab_on_first(&first);
+                       if (sublen != 2) {
+                               printf("\t * Device Password ID: (invalid "
+                                      "length %d)\n", sublen);
+                               break;
+                       }
+                       id = data[4] << 8 | data[5];
+                       printf("\t * Device Password ID: %u (%s)\n",
+                              id, wifi_wps_dev_passwd_id(id));
+                       break;
+               }
                case 0x1021:
                        tab_on_first(&first);
                        printf("\t * Manufacturer: %.*s\n", sublen, data + 4);
@@ -711,17 +744,69 @@ static void print_wifi_wps(const uint8_t type, uint8_t len, const uint8_t *data)
                        tab_on_first(&first);
                        printf("\t * Model: %.*s\n", sublen, data + 4);
                        break;
+               case 0x1024:
+                       tab_on_first(&first);
+                       printf("\t * Model Number: %.*s\n", sublen, data + 4);
+                       break;
+               case 0x103b: {
+                       __u8 val = data[4];
+                       tab_on_first(&first);
+                       printf("\t * Response Type: %d%s\n",
+                              val, val == 3 ? " (AP)" : "");
+                       break;
+               }
+               case 0x103c: {
+                       __u8 val = data[4];
+                       tab_on_first(&first);
+                       printf("\t * RF Bands: 0x%x\n", val);
+                       break;
+               }
+               case 0x1041: {
+                       __u8 val = data[4];
+                       tab_on_first(&first);
+                       printf("\t * Selected Registrar: 0x%x\n", val);
+                       break;
+               }
+               case 0x1042:
+                       tab_on_first(&first);
+                       printf("\t * Serial Number: %.*s\n", sublen, data + 4);
+                       break;
+               case 0x1044: {
+                       __u8 val = data[4];
+                       tab_on_first(&first);
+                       printf("\t * Wi-Fi Protected Setup State: %d%s%s\n",
+                              val,
+                              val == 1 ? " (Unconfigured)" : "",
+                              val == 2 ? " (Configured)" : "");
+                       break;
+               }
+               case 0x1054: {
+                       tab_on_first(&first);
+                       if (sublen != 8) {
+                               printf("\t * Primary Device Type: (invalid "
+                                      "length %d)\n", sublen);
+                               break;
+                       }
+                       printf("\t * Primary Device Type: "
+                              "%u-%02x%02x%02x%02x-%u\n",
+                              data[4] << 8 | data[5],
+                              data[6], data[7], data[8], data[9],
+                              data[10] << 8 | data[11]);
+                       break;
+               }
                case 0x1057: {
                        __u8 val = data[4];
                        tab_on_first(&first);
                        printf("\t * AP setup locked: 0x%.2x\n", val);
                        break;
                }
-               case 0x1008: {
+               case 0x1008:
+               case 0x1053: {
                        __u16 meth = (data[4] << 8) + data[5];
                        bool comma = false;
                        tab_on_first(&first);
-                       printf("\t * Config methods:");
+                       printf("\t * %sConfig methods:",
+                              subtype == 0x1053 ? "Selected Registrar ": "");
 #define T(bit, name) do {              \
        if (meth & (1<<bit)) {          \
                if (comma)              \