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