xref: /freebsd/contrib/tcpdump/print-lwapp.c (revision ee67461e56828dd1f8de165947ba83f6d9148a87)
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