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