xref: /freebsd/contrib/tcpdump/print-lwapp.c (revision 3c602fabf9b894ff79f08a80cbb7ad3b1eb84e62)
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  * Support for the Light Weight Access Point Protocol as per draft-ohara-capwap-lwapp-04
16a5779b6eSRui Paulo  *
17a5779b6eSRui Paulo  * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
18a5779b6eSRui Paulo  */
19a5779b6eSRui Paulo 
20*3c602fabSXin LI #define NETDISSECT_REWORKED
21a5779b6eSRui Paulo #ifdef HAVE_CONFIG_H
22a5779b6eSRui Paulo #include "config.h"
23a5779b6eSRui Paulo #endif
24a5779b6eSRui Paulo 
25a5779b6eSRui Paulo #include <tcpdump-stdinc.h>
26a5779b6eSRui Paulo 
27a5779b6eSRui Paulo #include "interface.h"
28a5779b6eSRui Paulo #include "extract.h"
29a5779b6eSRui Paulo #include "addrtoname.h"
30a5779b6eSRui Paulo 
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*3c602fabSXin LI     uint8_t  version;
45*3c602fabSXin LI     uint8_t  frag_id;
46*3c602fabSXin LI     uint8_t  length[2];
47*3c602fabSXin LI     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*3c602fabSXin LI     uint8_t  msg_type;
65*3c602fabSXin LI     uint8_t  seq_num;
66*3c602fabSXin LI     uint8_t  len[2];
67*3c602fabSXin LI     uint8_t  session_id[4];
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*3c602fabSXin LI     uint8_t type;
160*3c602fabSXin LI     uint8_t length[2];
161a5779b6eSRui Paulo };
162a5779b6eSRui Paulo 
163a5779b6eSRui Paulo void
164*3c602fabSXin LI lwapp_control_print(netdissect_options *ndo,
165*3c602fabSXin LI                     const u_char *pptr, u_int len, int has_ap_ident) {
166a5779b6eSRui Paulo 
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;
170d09a7e67SXin LI     int  tlen;
171a5779b6eSRui Paulo     int  msg_tlen;
172a5779b6eSRui Paulo 
173a5779b6eSRui Paulo     tptr=pptr;
174a5779b6eSRui Paulo 
175a5779b6eSRui Paulo     if (has_ap_ident) {
176a5779b6eSRui Paulo         /* check if enough bytes for AP identity */
177*3c602fabSXin LI         ND_TCHECK2(*tptr, 6);
178a5779b6eSRui Paulo         lwapp_trans_header = (const struct lwapp_transport_header *)(pptr+6);
179a5779b6eSRui Paulo     } else {
180a5779b6eSRui Paulo         lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
181a5779b6eSRui Paulo     }
182*3c602fabSXin LI     ND_TCHECK(*lwapp_trans_header);
183a5779b6eSRui Paulo 
184a5779b6eSRui Paulo     /*
185a5779b6eSRui Paulo      * Sanity checking of the header.
186a5779b6eSRui Paulo      */
187a5779b6eSRui Paulo     if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
188*3c602fabSXin LI 	ND_PRINT((ndo, "LWAPP version %u packet not supported",
189*3c602fabSXin LI                LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
190a5779b6eSRui Paulo 	return;
191a5779b6eSRui Paulo     }
192a5779b6eSRui Paulo 
193a5779b6eSRui Paulo     /* non-verbose */
194*3c602fabSXin LI     if (ndo->ndo_vflag < 1) {
195*3c602fabSXin LI         ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
196a5779b6eSRui Paulo                LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
197a5779b6eSRui Paulo                LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
198a5779b6eSRui Paulo                bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
199*3c602fabSXin LI                len));
200a5779b6eSRui Paulo         return;
201a5779b6eSRui Paulo     }
202a5779b6eSRui Paulo 
203a5779b6eSRui Paulo     /* ok they seem to want to know everything - lets fully decode it */
204a5779b6eSRui Paulo     tlen=EXTRACT_16BITS(lwapp_trans_header->length);
205a5779b6eSRui Paulo 
206*3c602fabSXin LI     ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u",
207a5779b6eSRui Paulo            LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
208a5779b6eSRui Paulo            LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
209a5779b6eSRui Paulo            LWAPP_EXTRACT_RID(lwapp_trans_header->version),
210a5779b6eSRui Paulo            bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
211a5779b6eSRui Paulo 	   lwapp_trans_header->frag_id,
212*3c602fabSXin LI 	   tlen));
213a5779b6eSRui Paulo 
214a5779b6eSRui Paulo     if (has_ap_ident) {
215*3c602fabSXin LI         ND_PRINT((ndo, "\n\tAP identity: %s", etheraddr_string(ndo, tptr)));
216a5779b6eSRui Paulo         tptr+=sizeof(const struct lwapp_transport_header)+6;
217a5779b6eSRui Paulo     } else {
218a5779b6eSRui Paulo         tptr+=sizeof(const struct lwapp_transport_header);
219a5779b6eSRui Paulo     }
220a5779b6eSRui Paulo 
221a5779b6eSRui Paulo     while(tlen>0) {
222a5779b6eSRui Paulo 
223a5779b6eSRui Paulo         /* did we capture enough for fully decoding the object header ? */
224*3c602fabSXin LI         ND_TCHECK2(*tptr, sizeof(struct lwapp_control_header));
225a5779b6eSRui Paulo 
226a5779b6eSRui Paulo         lwapp_control_header = (const struct lwapp_control_header *)tptr;
227a5779b6eSRui Paulo 	msg_tlen = EXTRACT_16BITS(lwapp_control_header->len);
228a5779b6eSRui Paulo 
229a5779b6eSRui Paulo 	/* print message header */
230*3c602fabSXin LI         ND_PRINT((ndo, "\n\t  Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x",
231a5779b6eSRui Paulo                tok2str(lwapp_msg_type_values,"Unknown",lwapp_control_header->msg_type),
232a5779b6eSRui Paulo                lwapp_control_header->msg_type,
233a5779b6eSRui Paulo                lwapp_control_header->seq_num,
234a5779b6eSRui Paulo                msg_tlen,
235*3c602fabSXin LI                EXTRACT_32BITS(lwapp_control_header->session_id)));
236a5779b6eSRui Paulo 
237a5779b6eSRui Paulo         /* did we capture enough for fully decoding the message */
238*3c602fabSXin LI         ND_TCHECK2(*tptr, msg_tlen);
239a5779b6eSRui Paulo 
240a5779b6eSRui Paulo 	/* XXX - Decode sub messages for each message */
241a5779b6eSRui Paulo         switch(lwapp_control_header->msg_type) {
242a5779b6eSRui Paulo         case LWAPP_MSGTYPE_DISCOVERY_REQUEST:
243a5779b6eSRui Paulo         case LWAPP_MSGTYPE_DISCOVERY_RESPONSE:
244a5779b6eSRui Paulo         case LWAPP_MSGTYPE_JOIN_REQUEST:
245a5779b6eSRui Paulo         case LWAPP_MSGTYPE_JOIN_RESPONSE:
246a5779b6eSRui Paulo         case LWAPP_MSGTYPE_JOIN_ACK:
247a5779b6eSRui Paulo         case LWAPP_MSGTYPE_JOIN_CONFIRM:
248a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CONFIGURE_REQUEST:
249a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CONFIGURE_RESPONSE:
250a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CONF_UPDATE_REQUEST:
251a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE:
252a5779b6eSRui Paulo         case LWAPP_MSGTYPE_WTP_EVENT_REQUEST:
253a5779b6eSRui Paulo         case LWAPP_MSGTYPE_WTP_EVENT_RESPONSE:
254a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST:
255a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE:
256a5779b6eSRui Paulo         case LWAPP_MSGTYPE_ECHO_REQUEST:
257a5779b6eSRui Paulo         case LWAPP_MSGTYPE_ECHO_RESPONSE:
258a5779b6eSRui Paulo         case LWAPP_MSGTYPE_IMAGE_DATA_REQUEST:
259a5779b6eSRui Paulo         case LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE:
260a5779b6eSRui Paulo         case LWAPP_MSGTYPE_RESET_REQUEST:
261a5779b6eSRui Paulo         case LWAPP_MSGTYPE_RESET_RESPONSE:
262a5779b6eSRui Paulo         case LWAPP_MSGTYPE_KEY_UPDATE_REQUEST:
263a5779b6eSRui Paulo         case LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE:
264a5779b6eSRui Paulo         case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST:
265a5779b6eSRui Paulo         case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE:
266a5779b6eSRui Paulo         case LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST:
267a5779b6eSRui Paulo         case LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE:
268a5779b6eSRui Paulo         case LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION:
269a5779b6eSRui Paulo         case LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST:
270a5779b6eSRui Paulo         case LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE:
271a5779b6eSRui Paulo         case LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST:
272a5779b6eSRui Paulo         case LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE:
273a5779b6eSRui Paulo         default:
274a5779b6eSRui Paulo             break;
275a5779b6eSRui Paulo         }
276a5779b6eSRui Paulo 
277a5779b6eSRui Paulo         tptr += sizeof(struct lwapp_control_header) + msg_tlen;
278a5779b6eSRui Paulo         tlen -= sizeof(struct lwapp_control_header) + msg_tlen;
279a5779b6eSRui Paulo     }
280a5779b6eSRui Paulo     return;
281a5779b6eSRui Paulo 
282a5779b6eSRui Paulo  trunc:
283*3c602fabSXin LI     ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
284a5779b6eSRui Paulo }
285a5779b6eSRui Paulo 
286a5779b6eSRui Paulo void
287*3c602fabSXin LI lwapp_data_print(netdissect_options *ndo,
288*3c602fabSXin LI                  const u_char *pptr, u_int len) {
289a5779b6eSRui Paulo 
290a5779b6eSRui Paulo     const struct lwapp_transport_header *lwapp_trans_header;
291a5779b6eSRui Paulo     const u_char *tptr;
292a5779b6eSRui Paulo     int tlen;
293a5779b6eSRui Paulo 
294a5779b6eSRui Paulo     tptr=pptr;
295a5779b6eSRui Paulo 
296a5779b6eSRui Paulo     /* check if enough bytes for AP identity */
297*3c602fabSXin LI     ND_TCHECK2(*tptr, 6);
298a5779b6eSRui Paulo     lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
299*3c602fabSXin LI     ND_TCHECK(*lwapp_trans_header);
300a5779b6eSRui Paulo 
301a5779b6eSRui Paulo     /*
302a5779b6eSRui Paulo      * Sanity checking of the header.
303a5779b6eSRui Paulo      */
304a5779b6eSRui Paulo     if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
305*3c602fabSXin LI         ND_PRINT((ndo, "LWAPP version %u packet not supported",
306*3c602fabSXin LI                LWAPP_EXTRACT_VERSION(lwapp_trans_header->version)));
307a5779b6eSRui Paulo         return;
308a5779b6eSRui Paulo     }
309a5779b6eSRui Paulo 
310a5779b6eSRui Paulo     /* non-verbose */
311*3c602fabSXin LI     if (ndo->ndo_vflag < 1) {
312*3c602fabSXin LI         ND_PRINT((ndo, "LWAPPv%u, %s frame, Flags [%s], length %u",
313a5779b6eSRui Paulo                LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
314a5779b6eSRui Paulo                LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
315a5779b6eSRui Paulo                bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
316*3c602fabSXin LI                len));
317a5779b6eSRui Paulo         return;
318a5779b6eSRui Paulo     }
319a5779b6eSRui Paulo 
320a5779b6eSRui Paulo     /* ok they seem to want to know everything - lets fully decode it */
321a5779b6eSRui Paulo     tlen=EXTRACT_16BITS(lwapp_trans_header->length);
322a5779b6eSRui Paulo 
323*3c602fabSXin LI     ND_PRINT((ndo, "LWAPPv%u, %s frame, Radio-id  %u, Flags [%s], Frag-id  %u, length %u",
324a5779b6eSRui Paulo            LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
325a5779b6eSRui Paulo            LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
326a5779b6eSRui Paulo            LWAPP_EXTRACT_RID(lwapp_trans_header->version),
327a5779b6eSRui Paulo            bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
328a5779b6eSRui Paulo            lwapp_trans_header->frag_id,
329*3c602fabSXin LI            tlen));
330a5779b6eSRui Paulo 
331a5779b6eSRui Paulo     tptr+=sizeof(const struct lwapp_transport_header);
332a5779b6eSRui Paulo     tlen-=sizeof(const struct lwapp_transport_header);
333a5779b6eSRui Paulo 
334a5779b6eSRui Paulo     /* FIX - An IEEE 802.11 frame follows - hexdump for now */
335*3c602fabSXin LI     print_unknown_data(ndo, tptr, "\n\t", tlen);
336a5779b6eSRui Paulo 
337a5779b6eSRui Paulo     return;
338a5779b6eSRui Paulo 
339a5779b6eSRui Paulo  trunc:
340*3c602fabSXin LI     ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
341a5779b6eSRui Paulo }
342a5779b6eSRui Paulo 
343a5779b6eSRui Paulo /*
344a5779b6eSRui Paulo  * Local Variables:
345a5779b6eSRui Paulo  * c-style: whitesmith
346a5779b6eSRui Paulo  * c-basic-offset: 8
347a5779b6eSRui Paulo  * End:
348a5779b6eSRui Paulo  */
349