1a5779b6eSRui Paulo /* 2a5779b6eSRui Paulo * Copyright (c) 1998-2007 The TCPDUMP project 3a5779b6eSRui Paulo * 4a5779b6eSRui Paulo * Redistribution and use in source and binary forms, with or without 5a5779b6eSRui Paulo * modification, are permitted provided that: (1) source code 6a5779b6eSRui Paulo * distributions retain the above copyright notice and this paragraph 7a5779b6eSRui Paulo * in its entirety, and (2) distributions including binary code include 8a5779b6eSRui Paulo * the above copyright notice and this paragraph in its entirety in 9a5779b6eSRui Paulo * the documentation or other materials provided with the distribution. 10a5779b6eSRui Paulo * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 11a5779b6eSRui Paulo * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 12a5779b6eSRui Paulo * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 13a5779b6eSRui Paulo * FOR A PARTICULAR PURPOSE. 14a5779b6eSRui Paulo * 15a5779b6eSRui Paulo * Original code by Carles Kishimoto <carles.kishimoto@gmail.com> 16a5779b6eSRui Paulo */ 17a5779b6eSRui Paulo 183340d773SGleb Smirnoff /* \summary: Light Weight Access Point Protocol (LWAPP) printer */ 193340d773SGleb Smirnoff 203340d773SGleb Smirnoff /* specification: RFC 5412 */ 213340d773SGleb Smirnoff 22a5779b6eSRui Paulo #ifdef HAVE_CONFIG_H 23*ee67461eSJoseph Mingrone #include <config.h> 24a5779b6eSRui Paulo #endif 25a5779b6eSRui Paulo 26*ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 27a5779b6eSRui Paulo 283340d773SGleb Smirnoff #include "netdissect.h" 29a5779b6eSRui Paulo #include "extract.h" 30a5779b6eSRui Paulo #include "addrtoname.h" 31a5779b6eSRui Paulo 32*ee67461eSJoseph Mingrone 33a5779b6eSRui Paulo /* 34a5779b6eSRui Paulo * LWAPP transport (common) header 35a5779b6eSRui Paulo * 0 1 2 3 36a5779b6eSRui Paulo * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 37a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38a5779b6eSRui Paulo * |VER| RID |C|F|L| Frag ID | Length | 39a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40a5779b6eSRui Paulo * | Status/WLANs | Payload... | 41a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 42a5779b6eSRui Paulo * 43a5779b6eSRui Paulo */ 44a5779b6eSRui Paulo 45a5779b6eSRui Paulo struct lwapp_transport_header { 46*ee67461eSJoseph Mingrone nd_uint8_t version; 47*ee67461eSJoseph Mingrone nd_uint8_t frag_id; 48*ee67461eSJoseph Mingrone nd_uint16_t length; 49*ee67461eSJoseph Mingrone nd_uint16_t status; 50a5779b6eSRui Paulo }; 51a5779b6eSRui Paulo 52a5779b6eSRui Paulo /* 53a5779b6eSRui Paulo * LWAPP control header 54a5779b6eSRui Paulo * 0 1 2 3 55a5779b6eSRui Paulo * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 56a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 57a5779b6eSRui Paulo * | Message Type | Seq Num | Msg Element Length | 58a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59a5779b6eSRui Paulo * | Session ID | 60a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61a5779b6eSRui Paulo * | Msg Element [0..N] | 62a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 63a5779b6eSRui Paulo */ 64a5779b6eSRui Paulo 65a5779b6eSRui Paulo struct lwapp_control_header { 66*ee67461eSJoseph Mingrone nd_uint8_t msg_type; 67*ee67461eSJoseph Mingrone nd_uint8_t seq_num; 68*ee67461eSJoseph Mingrone nd_uint16_t len; 69*ee67461eSJoseph Mingrone nd_uint32_t session_id; 70a5779b6eSRui Paulo }; 71a5779b6eSRui Paulo 72a5779b6eSRui Paulo #define LWAPP_VERSION 0 73a5779b6eSRui Paulo #define LWAPP_EXTRACT_VERSION(x) (((x)&0xC0)>>6) 74a5779b6eSRui Paulo #define LWAPP_EXTRACT_RID(x) (((x)&0x38)>>3) 75a5779b6eSRui Paulo #define LWAPP_EXTRACT_CONTROL_BIT(x) (((x)&0x04)>>2) 76a5779b6eSRui Paulo 77a5779b6eSRui Paulo static const struct tok lwapp_header_bits_values[] = { 78a5779b6eSRui Paulo { 0x01, "Last Fragment Bit"}, 79a5779b6eSRui Paulo { 0x02, "Fragment Bit"}, 80a5779b6eSRui Paulo { 0x04, "Control Bit"}, 81a5779b6eSRui Paulo { 0, NULL} 82a5779b6eSRui Paulo }; 83a5779b6eSRui Paulo 84a5779b6eSRui Paulo #define LWAPP_MSGTYPE_DISCOVERY_REQUEST 1 85a5779b6eSRui Paulo #define LWAPP_MSGTYPE_DISCOVERY_RESPONSE 2 86a5779b6eSRui Paulo #define LWAPP_MSGTYPE_JOIN_REQUEST 3 87a5779b6eSRui Paulo #define LWAPP_MSGTYPE_JOIN_RESPONSE 4 88a5779b6eSRui Paulo #define LWAPP_MSGTYPE_JOIN_ACK 5 89a5779b6eSRui Paulo #define LWAPP_MSGTYPE_JOIN_CONFIRM 6 90a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CONFIGURE_REQUEST 10 91a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CONFIGURE_RESPONSE 11 92a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CONF_UPDATE_REQUEST 12 93a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE 13 94a5779b6eSRui Paulo #define LWAPP_MSGTYPE_WTP_EVENT_REQUEST 14 95a5779b6eSRui Paulo #define LWAPP_MSGTYPE_WTP_EVENT_RESPONSE 15 96a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST 16 97a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE 17 98a5779b6eSRui Paulo #define LWAPP_MSGTYPE_ECHO_REQUEST 22 99a5779b6eSRui Paulo #define LWAPP_MSGTYPE_ECHO_RESPONSE 23 100a5779b6eSRui Paulo #define LWAPP_MSGTYPE_IMAGE_DATA_REQUEST 24 101a5779b6eSRui Paulo #define LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE 25 102a5779b6eSRui Paulo #define LWAPP_MSGTYPE_RESET_REQUEST 26 103a5779b6eSRui Paulo #define LWAPP_MSGTYPE_RESET_RESPONSE 27 104a5779b6eSRui Paulo #define LWAPP_MSGTYPE_KEY_UPDATE_REQUEST 30 105a5779b6eSRui Paulo #define LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE 31 106a5779b6eSRui Paulo #define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST 32 107a5779b6eSRui Paulo #define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE 33 108a5779b6eSRui Paulo #define LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST 34 109a5779b6eSRui Paulo #define LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE 35 110a5779b6eSRui Paulo #define LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION 36 111a5779b6eSRui Paulo #define LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST 37 112a5779b6eSRui Paulo #define LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE 38 113a5779b6eSRui Paulo #define LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST 39 114a5779b6eSRui Paulo #define LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE 40 115a5779b6eSRui Paulo 116a5779b6eSRui Paulo static const struct tok lwapp_msg_type_values[] = { 117a5779b6eSRui Paulo { LWAPP_MSGTYPE_DISCOVERY_REQUEST, "Discovery req"}, 118a5779b6eSRui Paulo { LWAPP_MSGTYPE_DISCOVERY_RESPONSE, "Discovery resp"}, 119a5779b6eSRui Paulo { LWAPP_MSGTYPE_JOIN_REQUEST, "Join req"}, 120a5779b6eSRui Paulo { LWAPP_MSGTYPE_JOIN_RESPONSE, "Join resp"}, 121a5779b6eSRui Paulo { LWAPP_MSGTYPE_JOIN_ACK, "Join ack"}, 122a5779b6eSRui Paulo { LWAPP_MSGTYPE_JOIN_CONFIRM, "Join confirm"}, 123a5779b6eSRui Paulo { LWAPP_MSGTYPE_CONFIGURE_REQUEST, "Configure req"}, 124a5779b6eSRui Paulo { LWAPP_MSGTYPE_CONFIGURE_RESPONSE, "Configure resp"}, 125a5779b6eSRui Paulo { LWAPP_MSGTYPE_CONF_UPDATE_REQUEST, "Update req"}, 126a5779b6eSRui Paulo { LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE, "Update resp"}, 127a5779b6eSRui Paulo { LWAPP_MSGTYPE_WTP_EVENT_REQUEST, "WTP event req"}, 128a5779b6eSRui Paulo { LWAPP_MSGTYPE_WTP_EVENT_RESPONSE, "WTP event resp"}, 129a5779b6eSRui Paulo { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST, "Change state event req"}, 130a5779b6eSRui Paulo { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE, "Change state event resp"}, 131a5779b6eSRui Paulo { LWAPP_MSGTYPE_ECHO_REQUEST, "Echo req"}, 132a5779b6eSRui Paulo { LWAPP_MSGTYPE_ECHO_RESPONSE, "Echo resp"}, 133a5779b6eSRui Paulo { LWAPP_MSGTYPE_IMAGE_DATA_REQUEST, "Image data req"}, 134a5779b6eSRui Paulo { LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE, "Image data resp"}, 135a5779b6eSRui Paulo { LWAPP_MSGTYPE_RESET_REQUEST, "Channel status req"}, 136a5779b6eSRui Paulo { LWAPP_MSGTYPE_RESET_RESPONSE, "Channel status resp"}, 137a5779b6eSRui Paulo { LWAPP_MSGTYPE_KEY_UPDATE_REQUEST, "Key update req"}, 138a5779b6eSRui Paulo { LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE, "Key update resp"}, 139a5779b6eSRui Paulo { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST, "Primary discovery req"}, 140a5779b6eSRui Paulo { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE, "Primary discovery resp"}, 141a5779b6eSRui Paulo { LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST, "Data transfer req"}, 142a5779b6eSRui Paulo { LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE, "Data transfer resp"}, 143a5779b6eSRui Paulo { LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION, "Clear config ind"}, 144a5779b6eSRui Paulo { LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST, "Wlan config req"}, 145a5779b6eSRui Paulo { LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE, "Wlan config resp"}, 146a5779b6eSRui Paulo { LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST, "Mobile config req"}, 147a5779b6eSRui Paulo { LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE, "Mobile config resp"}, 148a5779b6eSRui Paulo { 0, NULL} 149a5779b6eSRui Paulo }; 150a5779b6eSRui Paulo 151a5779b6eSRui Paulo /* 152a5779b6eSRui Paulo * LWAPP message elements 153a5779b6eSRui Paulo * 154a5779b6eSRui Paulo * 0 1 2 3 155a5779b6eSRui Paulo * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 156a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 157a5779b6eSRui Paulo * | Type | Length | Value ... | 158a5779b6eSRui Paulo * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 159a5779b6eSRui Paulo */ 160a5779b6eSRui Paulo struct lwapp_message_header { 161*ee67461eSJoseph Mingrone nd_uint8_t type; 162*ee67461eSJoseph Mingrone nd_uint16_t length; 163a5779b6eSRui Paulo }; 164a5779b6eSRui Paulo 165a5779b6eSRui Paulo void 1663c602fabSXin LI lwapp_control_print(netdissect_options *ndo, 1678bdc5a62SPatrick Kelsey const u_char *pptr, u_int len, int has_ap_ident) 1688bdc5a62SPatrick Kelsey { 169a5779b6eSRui Paulo const struct lwapp_transport_header *lwapp_trans_header; 170a5779b6eSRui Paulo const struct lwapp_control_header *lwapp_control_header; 171a5779b6eSRui Paulo const u_char *tptr; 172*ee67461eSJoseph Mingrone uint8_t version; 173*ee67461eSJoseph Mingrone u_int tlen; 174*ee67461eSJoseph Mingrone u_int msg_type, msg_tlen; 175a5779b6eSRui Paulo 176*ee67461eSJoseph Mingrone ndo->ndo_protocol = "lwapp_control"; 177a5779b6eSRui Paulo tptr=pptr; 178a5779b6eSRui Paulo 179a5779b6eSRui Paulo if (has_ap_ident) { 180a5779b6eSRui Paulo /* check if enough bytes for AP identity */ 181*ee67461eSJoseph Mingrone ND_TCHECK_6(tptr); 182a5779b6eSRui Paulo lwapp_trans_header = (const struct lwapp_transport_header *)(pptr+6); 183a5779b6eSRui Paulo } else { 184a5779b6eSRui Paulo lwapp_trans_header = (const struct lwapp_transport_header *)pptr; 185a5779b6eSRui Paulo } 186*ee67461eSJoseph Mingrone ND_TCHECK_SIZE(lwapp_trans_header); 187*ee67461eSJoseph Mingrone version = GET_U_1(lwapp_trans_header->version); 188a5779b6eSRui Paulo 189a5779b6eSRui Paulo /* 190a5779b6eSRui Paulo * Sanity checking of the header. 191a5779b6eSRui Paulo */ 192*ee67461eSJoseph Mingrone if (LWAPP_EXTRACT_VERSION(version) != LWAPP_VERSION) { 193*ee67461eSJoseph Mingrone ND_PRINT("LWAPP version %u packet not supported", 194*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version)); 195a5779b6eSRui Paulo return; 196a5779b6eSRui Paulo } 197a5779b6eSRui Paulo 198a5779b6eSRui Paulo /* non-verbose */ 1993c602fabSXin LI if (ndo->ndo_vflag < 1) { 200*ee67461eSJoseph Mingrone ND_PRINT("LWAPPv%u, %s frame, Flags [%s], length %u", 201*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version), 202*ee67461eSJoseph Mingrone LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data", 203*ee67461eSJoseph Mingrone bittok2str(lwapp_header_bits_values,"none",version&0x07), 204*ee67461eSJoseph Mingrone len); 205a5779b6eSRui Paulo return; 206a5779b6eSRui Paulo } 207a5779b6eSRui Paulo 208a5779b6eSRui Paulo /* ok they seem to want to know everything - lets fully decode it */ 209*ee67461eSJoseph Mingrone tlen=GET_BE_U_2(lwapp_trans_header->length); 210a5779b6eSRui Paulo 211*ee67461eSJoseph Mingrone ND_PRINT("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", 212*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version), 213*ee67461eSJoseph Mingrone LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data", 214*ee67461eSJoseph Mingrone LWAPP_EXTRACT_RID(version), 215*ee67461eSJoseph Mingrone bittok2str(lwapp_header_bits_values,"none",version&0x07), 216*ee67461eSJoseph Mingrone GET_U_1(lwapp_trans_header->frag_id), 217*ee67461eSJoseph Mingrone tlen); 218a5779b6eSRui Paulo 219a5779b6eSRui Paulo if (has_ap_ident) { 220*ee67461eSJoseph Mingrone ND_PRINT("\n\tAP identity: %s", GET_ETHERADDR_STRING(tptr)); 221*ee67461eSJoseph Mingrone tptr+=sizeof(struct lwapp_transport_header)+6; 222a5779b6eSRui Paulo } else { 223*ee67461eSJoseph Mingrone tptr+=sizeof(struct lwapp_transport_header); 224a5779b6eSRui Paulo } 225a5779b6eSRui Paulo 226*ee67461eSJoseph Mingrone while(tlen!=0) { 227a5779b6eSRui Paulo 228a5779b6eSRui Paulo /* did we capture enough for fully decoding the object header ? */ 229*ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, sizeof(struct lwapp_control_header)); 230*ee67461eSJoseph Mingrone if (tlen < sizeof(struct lwapp_control_header)) { 231*ee67461eSJoseph Mingrone ND_PRINT("\n\t Msg goes past end of PDU"); 232*ee67461eSJoseph Mingrone break; 233*ee67461eSJoseph Mingrone } 234a5779b6eSRui Paulo 235a5779b6eSRui Paulo lwapp_control_header = (const struct lwapp_control_header *)tptr; 236*ee67461eSJoseph Mingrone msg_tlen = GET_BE_U_2(lwapp_control_header->len); 237*ee67461eSJoseph Mingrone if (tlen < sizeof(struct lwapp_control_header) + msg_tlen) { 238*ee67461eSJoseph Mingrone ND_PRINT("\n\t Msg goes past end of PDU"); 239*ee67461eSJoseph Mingrone break; 240*ee67461eSJoseph Mingrone } 241a5779b6eSRui Paulo 242a5779b6eSRui Paulo /* print message header */ 243*ee67461eSJoseph Mingrone msg_type = GET_U_1(lwapp_control_header->msg_type); 244*ee67461eSJoseph Mingrone ND_PRINT("\n\t Msg type: %s (%u), Seqnum: %u, Msg len: %u, Session: 0x%08x", 245*ee67461eSJoseph Mingrone tok2str(lwapp_msg_type_values,"Unknown",msg_type), 246*ee67461eSJoseph Mingrone msg_type, 247*ee67461eSJoseph Mingrone GET_U_1(lwapp_control_header->seq_num), 248a5779b6eSRui Paulo msg_tlen, 249*ee67461eSJoseph Mingrone GET_BE_U_4(lwapp_control_header->session_id)); 250a5779b6eSRui Paulo 251a5779b6eSRui Paulo /* did we capture enough for fully decoding the message */ 252*ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, msg_tlen); 253a5779b6eSRui Paulo 254a5779b6eSRui Paulo /* XXX - Decode sub messages for each message */ 255*ee67461eSJoseph Mingrone switch(msg_type) { 256a5779b6eSRui Paulo case LWAPP_MSGTYPE_DISCOVERY_REQUEST: 257a5779b6eSRui Paulo case LWAPP_MSGTYPE_DISCOVERY_RESPONSE: 258a5779b6eSRui Paulo case LWAPP_MSGTYPE_JOIN_REQUEST: 259a5779b6eSRui Paulo case LWAPP_MSGTYPE_JOIN_RESPONSE: 260a5779b6eSRui Paulo case LWAPP_MSGTYPE_JOIN_ACK: 261a5779b6eSRui Paulo case LWAPP_MSGTYPE_JOIN_CONFIRM: 262a5779b6eSRui Paulo case LWAPP_MSGTYPE_CONFIGURE_REQUEST: 263a5779b6eSRui Paulo case LWAPP_MSGTYPE_CONFIGURE_RESPONSE: 264a5779b6eSRui Paulo case LWAPP_MSGTYPE_CONF_UPDATE_REQUEST: 265a5779b6eSRui Paulo case LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE: 266a5779b6eSRui Paulo case LWAPP_MSGTYPE_WTP_EVENT_REQUEST: 267a5779b6eSRui Paulo case LWAPP_MSGTYPE_WTP_EVENT_RESPONSE: 268a5779b6eSRui Paulo case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST: 269a5779b6eSRui Paulo case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE: 270a5779b6eSRui Paulo case LWAPP_MSGTYPE_ECHO_REQUEST: 271a5779b6eSRui Paulo case LWAPP_MSGTYPE_ECHO_RESPONSE: 272a5779b6eSRui Paulo case LWAPP_MSGTYPE_IMAGE_DATA_REQUEST: 273a5779b6eSRui Paulo case LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE: 274a5779b6eSRui Paulo case LWAPP_MSGTYPE_RESET_REQUEST: 275a5779b6eSRui Paulo case LWAPP_MSGTYPE_RESET_RESPONSE: 276a5779b6eSRui Paulo case LWAPP_MSGTYPE_KEY_UPDATE_REQUEST: 277a5779b6eSRui Paulo case LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE: 278a5779b6eSRui Paulo case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST: 279a5779b6eSRui Paulo case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE: 280a5779b6eSRui Paulo case LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST: 281a5779b6eSRui Paulo case LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE: 282a5779b6eSRui Paulo case LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION: 283a5779b6eSRui Paulo case LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST: 284a5779b6eSRui Paulo case LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE: 285a5779b6eSRui Paulo case LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST: 286a5779b6eSRui Paulo case LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE: 287a5779b6eSRui Paulo default: 288a5779b6eSRui Paulo break; 289a5779b6eSRui Paulo } 290a5779b6eSRui Paulo 291a5779b6eSRui Paulo tptr += sizeof(struct lwapp_control_header) + msg_tlen; 292a5779b6eSRui Paulo tlen -= sizeof(struct lwapp_control_header) + msg_tlen; 293a5779b6eSRui Paulo } 294a5779b6eSRui Paulo return; 295a5779b6eSRui Paulo 296a5779b6eSRui Paulo trunc: 297*ee67461eSJoseph Mingrone nd_print_trunc(ndo); 298a5779b6eSRui Paulo } 299a5779b6eSRui Paulo 300a5779b6eSRui Paulo void 3013c602fabSXin LI lwapp_data_print(netdissect_options *ndo, 3028bdc5a62SPatrick Kelsey const u_char *pptr, u_int len) 3038bdc5a62SPatrick Kelsey { 304a5779b6eSRui Paulo const struct lwapp_transport_header *lwapp_trans_header; 305a5779b6eSRui Paulo const u_char *tptr; 306*ee67461eSJoseph Mingrone u_int tlen; 307*ee67461eSJoseph Mingrone u_int version; 308a5779b6eSRui Paulo 309*ee67461eSJoseph Mingrone ndo->ndo_protocol = "lwapp_data"; 310a5779b6eSRui Paulo tptr=pptr; 311a5779b6eSRui Paulo 312a5779b6eSRui Paulo /* check if enough bytes for AP identity */ 313*ee67461eSJoseph Mingrone ND_TCHECK_6(tptr); 314a5779b6eSRui Paulo lwapp_trans_header = (const struct lwapp_transport_header *)pptr; 315*ee67461eSJoseph Mingrone ND_TCHECK_SIZE(lwapp_trans_header); 316*ee67461eSJoseph Mingrone version = GET_U_1(lwapp_trans_header->version); 317a5779b6eSRui Paulo 318a5779b6eSRui Paulo /* 319a5779b6eSRui Paulo * Sanity checking of the header. 320a5779b6eSRui Paulo */ 321*ee67461eSJoseph Mingrone if (LWAPP_EXTRACT_VERSION(version) != LWAPP_VERSION) { 322*ee67461eSJoseph Mingrone ND_PRINT("LWAPP version %u packet not supported", 323*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version)); 324a5779b6eSRui Paulo return; 325a5779b6eSRui Paulo } 326a5779b6eSRui Paulo 327a5779b6eSRui Paulo /* non-verbose */ 3283c602fabSXin LI if (ndo->ndo_vflag < 1) { 329*ee67461eSJoseph Mingrone ND_PRINT("LWAPPv%u, %s frame, Flags [%s], length %u", 330*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version), 331*ee67461eSJoseph Mingrone LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data", 332*ee67461eSJoseph Mingrone bittok2str(lwapp_header_bits_values,"none",version&0x07), 333*ee67461eSJoseph Mingrone len); 334a5779b6eSRui Paulo return; 335a5779b6eSRui Paulo } 336a5779b6eSRui Paulo 337a5779b6eSRui Paulo /* ok they seem to want to know everything - lets fully decode it */ 338*ee67461eSJoseph Mingrone tlen=GET_BE_U_2(lwapp_trans_header->length); 339*ee67461eSJoseph Mingrone if (tlen < sizeof(struct lwapp_transport_header)) { 340*ee67461eSJoseph Mingrone ND_PRINT("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], length %u < transport header length", 341*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version), 342*ee67461eSJoseph Mingrone LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data", 343*ee67461eSJoseph Mingrone LWAPP_EXTRACT_RID(version), 344*ee67461eSJoseph Mingrone bittok2str(lwapp_header_bits_values,"none",version&0x07), 345*ee67461eSJoseph Mingrone tlen); 346*ee67461eSJoseph Mingrone return; 347*ee67461eSJoseph Mingrone } 348a5779b6eSRui Paulo 349*ee67461eSJoseph Mingrone ND_PRINT("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u", 350*ee67461eSJoseph Mingrone LWAPP_EXTRACT_VERSION(version), 351*ee67461eSJoseph Mingrone LWAPP_EXTRACT_CONTROL_BIT(version) ? "Control" : "Data", 352*ee67461eSJoseph Mingrone LWAPP_EXTRACT_RID(version), 353*ee67461eSJoseph Mingrone bittok2str(lwapp_header_bits_values,"none",version&0x07), 354*ee67461eSJoseph Mingrone GET_U_1(lwapp_trans_header->frag_id), 355*ee67461eSJoseph Mingrone tlen); 356a5779b6eSRui Paulo 357*ee67461eSJoseph Mingrone tptr+=sizeof(struct lwapp_transport_header); 358*ee67461eSJoseph Mingrone tlen-=sizeof(struct lwapp_transport_header); 359a5779b6eSRui Paulo 360a5779b6eSRui Paulo /* FIX - An IEEE 802.11 frame follows - hexdump for now */ 3613c602fabSXin LI print_unknown_data(ndo, tptr, "\n\t", tlen); 362a5779b6eSRui Paulo 363a5779b6eSRui Paulo return; 364a5779b6eSRui Paulo 365a5779b6eSRui Paulo trunc: 366*ee67461eSJoseph Mingrone nd_print_trunc(ndo); 367a5779b6eSRui Paulo } 368