iw: Print Interworking IE details in scan results.
PATCH v2 1/4 iw: Print Interworking IE details in scan results.
From: Ben Greear <[email protected]>
Output looks like:
802.11u Interworking: Network Options: 0xf1 Network Type: 1 (Private with Guest) Internet ASRA ESR UESA Venue Group: 2 (Business) Venue Type: 1 HESSID: 00:00:00:00:00:01
---
v2: Fix bracket whitespace as requested.
Fix typo in patch description.
:100644 100644 af21cbc... e8957d1... M scan.c
scan.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 66 insertions(+), 0 deletions(-)
scan.c +66 -0
@@ -614,6 +614,71 @@ static void print_ht_capa(const uint8_t type, uint8_t len, const uint8_t *data)print_ht_mcs (data +3 ); } +static const char *ntype_11u (uint8_t t) +{ +switch (t) { +case 0 :return "Private" ; +case 1 :return "Private with Guest" ; +case 2 :return "Chargeable Public" ; +case 3 :return "Free Public" ; +case 4 :return "Personal Device" ; +case 5 :return "Emergency Services Only" ; +case 14 :return "Test or Experimental" ; +case 15 :return "Wildcard" ; +default :return "Reserved" ; + } +} + +static const char *vgroup_11u (uint8_t t) +{ +switch (t) { +case 0 :return "Unspecified" ; +case 1 :return "Assembly" ; +case 2 :return "Business" ; +case 3 :return "Educational" ; +case 4 :return "Factory and Industrial" ; +case 5 :return "Institutional" ; +case 6 :return "Mercantile" ; +case 7 :return "Residential" ; +case 8 :return "Storage" ; +case 9 :return "Utility and Miscellaneous" ; +case 10 :return "Vehicular" ; +case 11 :return "Outdoor" ; +default :return "Reserved" ; + } +} + +static void print_interworking (const uint8_t type,uint8_t len,const uint8_t *data) +{ +/* See Section 7.3.2.92 in the 802.11u spec. */ +printf ("\n" ); +if (len >=1 ) { +uint8_t ano = data[0 ]; +printf ("\t\tNetwork Options: 0x%hx\n" , (unsigned short )(ano)); +printf ("\t\t\tNetwork Type: %i (%s)\n" , + (int )(ano &0xf ),ntype_11u (ano &0xf )); +if (ano & (1 <<4 )) +printf ("\t\t\tInternet\n" ); +if (ano & (1 <<5 )) +printf ("\t\t\tASRA\n" ); +if (ano & (1 <<6 )) +printf ("\t\t\tESR\n" ); +if (ano & (1 <<7 )) +printf ("\t\t\tUESA\n" ); + } +if ((len ==3 ) || (len ==9 )) { +printf ("\t\tVenue Group: %i (%s)\n" , + (int )(data[1 ]),vgroup_11u (data[1 ])); +printf ("\t\tVenue Type: %i\n" , (int )(data[2 ])); + } +if (len ==9 ) +printf ("\t\tHESSID: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n" , + data[3 ], data[4 ], data[5 ], data[6 ], data[7 ], data[8 ]); +else if (len ==7 ) +printf ("\t\tHESSID: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n" , + data[1 ], data[2 ], data[3 ], data[4 ], data[5 ], data[6 ]); +} +static const char *ht_secondary_offset[4 ] = {"no secondary" ,"above" ,
@@ -891,6 +956,7 @@ static const struct ie_print ieprinters[] = { [113] = { "MESH Configuration", print_mesh_conf, 7, 7, BIT(PRINT_SCAN), }, [114] = { "MESH ID", print_ssid, 0, 32, BIT(PRINT_SCAN) | BIT(PRINT_LINK), }, [127] = { "Extended capabilities", print_capabilities, 0, 255, BIT(PRINT_SCAN), }, + [107] = { "802.11u Interworking", print_interworking, 0, 255, BIT(PRINT_SCAN), }, };static void print_wifi_wpa (const uint8_t type,uint8_t len,const uint8_t *data)
Signature · 1 line
1.7.3.4
PATCH v2 2/4 iw: Print 802.11u Advertisement IE info in scan results.
From: Ben Greear <[email protected]>
Sample output looks like:
802.11u Advertisement: Query Response Info: 0x7f Query Response Length Limit: 127 ANQP
---
:100644 100644 e8957d1... 53cef39... M scan.c
scan.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-)
scan.c +33 -0
@@ -679,6 +679,38 @@ static void print_interworking(const uint8_t type, uint8_t len, const uint8_t *d data[1], data[2], data[3], data[4], data[5], data[6]); } +static void print_11u_advert (const uint8_t type,uint8_t len,const uint8_t *data) +{ +/* See Section 7.3.2.93 in the 802.11u spec. */ +/* TODO: This code below does not decode private protocol IDs */ +int idx =0 ; +printf ("\n" ); +while (idx < (len -1 )) { +uint8_t qri = data[idx]; +uint8_t proto_id = data[idx +1 ]; +printf ("\t\tQuery Response Info: 0x%hx\n" , (unsigned short )(qri)); +printf ("\t\t\tQuery Response Length Limit: %i\n" , + (qri &0x7f )); +if (qri & (1 <<7 )) +printf ("\t\t\tPAME-BI\n" ); +switch (proto_id) { +case 0 : +printf ("\t\t\tANQP\n" );break ; +case 1 : +printf ("\t\t\tMIH Information Service\n" );break ; +case 2 : +printf ("\t\t\tMIH Command and Event Services Capability Discovery\n" );break ; +case 3 : +printf ("\t\t\tEmergency Alert System (EAS)\n" );break ; +case 221 : +printf ("\t\t\tVendor Specific\n" );break ; +default : +printf ("\t\t\tReserved: %i\n" , proto_id);break ; + } + idx +=2 ; + } +} +static const char *ht_secondary_offset[4 ] = {"no secondary" ,"above" ,
@@ -957,6 +989,7 @@ static const struct ie_print ieprinters[] = { [114] = { "MESH ID", print_ssid, 0, 32, BIT(PRINT_SCAN) | BIT(PRINT_LINK), }, [127] = { "Extended capabilities", print_capabilities, 0, 255, BIT(PRINT_SCAN), }, [107] = { "802.11u Interworking", print_interworking, 0, 255, BIT(PRINT_SCAN), }, + [108] = { "802.11u Advertisement", print_11u_advert, 0, 255, BIT(PRINT_SCAN), }, };static void print_wifi_wpa (const uint8_t type,uint8_t len,const uint8_t *data)
Signature · 1 line
1.7.3.4
PATCH v2 3/4 iw: Print 802.11u roaming consortium IE in scan results.
In reply to [email protected]From: Ben Greear <[email protected]>
Example output:
802.11u Roaming Consortium: ANQP OIs: 0 OI 1: 01010101
---
:100644 100644 53cef39... 14a4272... M scan.c
scan.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-)
scan.c +53 -0
@@ -711,6 +711,58 @@ static void print_11u_advert(const uint8_t type, uint8_t len, const uint8_t *dat } } +static void print_11u_rcon (const uint8_t type,uint8_t len,const uint8_t *data) +{ +/* See Section 7.3.2.96 in the 802.11u spec. */ +int idx =0 ; +int ln0 = data[1 ] &0xf ; +int ln1 = ((data[1 ] &0xf0 ) >>4 ); +int ln2 =0 ; +printf ("\n" ); + +if (ln1) { + ln2 = len -2 - ln0 - ln1; + } +printf ("\t\tANQP OIs: %i\n" , data[0 ]); + +if (ln0 >0 ) { +printf ("\t\tOI 1: " ); +if (2 + ln0 > len) { +printf ("Invalid IE length.\n" ); + } +else { +for (idx =0 ; idx < ln0; idx++) { +printf ("%02hx" , data[2 + idx]); + } +printf ("\n" ); + } + } +if (ln1 >0 ) { +printf ("\t\tOI 2: " ); +if (2 + ln0 + ln1 > len) { +printf ("Invalid IE length.\n" ); + } +else { +for (idx =0 ; idx < ln1; idx++) { +printf ("%02hx" , data[2 + ln0 + idx]); + } +printf ("\n" ); + } + } +if (ln2 >0 ) { +printf ("\t\tOI 3: " ); +if (2 + ln0 + ln1 + ln2 > len) { +printf ("Invalid IE length.\n" ); + } +else { +for (idx =0 ; idx < ln2; idx++) { +printf ("%02hx" , data[2 + ln0 + ln1 + idx]); + } +printf ("\n" ); + } + } +} +static const char *ht_secondary_offset[4 ] = {"no secondary" ,"above" ,
@@ -990,6 +1042,7 @@ static const struct ie_print ieprinters[] = { [127] = { "Extended capabilities", print_capabilities, 0, 255, BIT(PRINT_SCAN), }, [107] = { "802.11u Interworking", print_interworking, 0, 255, BIT(PRINT_SCAN), }, [108] = { "802.11u Advertisement", print_11u_advert, 0, 255, BIT(PRINT_SCAN), }, + [111] = { "802.11u Roaming Consortium", print_11u_rcon, 0, 255, BIT(PRINT_SCAN), }, };static void print_wifi_wpa (const uint8_t type,uint8_t len,const uint8_t *data)
Signature · 1 line
1.7.3.4
PATCH v2 4/4 iw: Print out HotSpot2 IE information.
In reply to [email protected]From: Ben Greear <[email protected]>
Example:
HotSpot 2.0 Indication: DGAF: 0
---
:100644 100644 14a4272... 2686ff3... M scan.c
scan.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
scan.c +13 -0
@@ -1390,8 +1390,21 @@ static inline void print_p2p(const uint8_t type, uint8_t len, const uint8_t *dat } } +static inline void print_hs20_ind (const uint8_t type,uint8_t len,const uint8_t *data) +{ +/* I can't find the spec for this...just going off what wireshark uses. */ +printf ("\n" ); +if (len >0 ) { +printf ("\t\tDGAF: %i\n" , (int )(data[0 ] &0x1 )); + } +else { +printf ("\t\tUnexpected length: %i\n" , len); + } +} +static const struct ie_print wfa_printers[] = { [9 ] = {"P2P" , print_p2p,2 ,255 ,BIT (PRINT_SCAN ), }, + [16 ] = {"HotSpot 2.0 Indication" , print_hs20_ind,1 ,255 ,BIT (PRINT_SCAN ), }, }; static void print_vendor(unsigned char len, unsigned char *data,
Signature · 1 line
1.7.3.4
Johannes Berg
AppliedApplied all, thanks
(with some minor code-style improvements)
johannes