153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 1998-2007 The TCPDUMP project
353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Redistribution and use in source and binary forms, with or without
553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * modification, are permitted provided that: (1) source code
653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * distributions retain the above copyright notice and this paragraph
753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * in its entirety, and (2) distributions including binary code include
853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the above copyright notice and this paragraph in its entirety in
953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the documentation or other materials provided with the distribution.
1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FOR A PARTICULAR PURPOSE.
1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Support for the Light Weight Access Point Protocol as per draft-ohara-capwap-lwapp-04
1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef lint
2153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char rcsid[] _U_ =
2253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"@(#) $Header: /tcpdump/master/tcpdump/print-lwapp.c,v 1.1 2007-07-24 16:07:30 hannes Exp $";
2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CONFIG_H
2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "config.h"
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <tcpdump-stdinc.h>
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdio.h>
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <stdlib.h>
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <string.h>
3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "interface.h"
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "extract.h"
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "addrtoname.h"
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LWAPP transport (common) header
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall *      0                   1                   2                   3
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     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
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *    |VER| RID |C|F|L|    Frag ID    |            Length             |
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *    |          Status/WLANs         |   Payload...  |
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct lwapp_transport_header {
5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  version;
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  frag_id;
5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  length[2];
5553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int16_t status;
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LWAPP control header
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *      0                   1                   2                   3
6153f17a9db278d33517d9888dd77848f554522a38JP Abgrall *      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
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     |  Message Type |    Seq Num    |      Msg Element Length       |
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     |                           Session ID                          |
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     |      Msg Element [0..N]       |
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct lwapp_control_header {
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  msg_type;
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  seq_num;
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  len[2];
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t  session_id[4];
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_VERSION 0
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LWAPP_EXTRACT_VERSION(x) (((x)&0xC0)>>6)
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LWAPP_EXTRACT_RID(x) (((x)&0x38)>>3)
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_EXTRACT_CONTROL_BIT(x) (((x)&0x04)>>2)
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lwapp_header_bits_values[] = {
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0x01, "Last Fragment Bit"},
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0x02, "Fragment Bit"},
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0x04, "Control Bit"},
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LWAPP_MSGTYPE_DISCOVERY_REQUEST			1
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LWAPP_MSGTYPE_DISCOVERY_RESPONSE		2
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define	LWAPP_MSGTYPE_JOIN_REQUEST			3
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_JOIN_RESPONSE			4
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_JOIN_ACK				5
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_JOIN_CONFIRM			6
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CONFIGURE_REQUEST			10
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CONFIGURE_RESPONSE		11
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CONF_UPDATE_REQUEST		12
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE		13
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_WTP_EVENT_REQUEST			14
10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_WTP_EVENT_RESPONSE		15
10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST	16
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE	17
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_ECHO_REQUEST			22
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_ECHO_RESPONSE			23
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_IMAGE_DATA_REQUEST		24
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE		25
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_RESET_REQUEST			26
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_RESET_RESPONSE			27
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_KEY_UPDATE_REQUEST		30
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE		31
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST		32
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE	33
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST		34
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE		35
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION		36
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST		37
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE		38
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST		39
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE		40
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok lwapp_msg_type_values[] = {
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_DISCOVERY_REQUEST, "Discovery req"},
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_DISCOVERY_RESPONSE, "Discovery resp"},
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_JOIN_REQUEST, "Join req"},
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_JOIN_RESPONSE, "Join resp"},
12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_JOIN_ACK, "Join ack"},
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_JOIN_CONFIRM, "Join confirm"},
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CONFIGURE_REQUEST, "Configure req"},
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CONFIGURE_RESPONSE, "Configure resp"},
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CONF_UPDATE_REQUEST, "Update req"},
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE, "Update resp"},
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_WTP_EVENT_REQUEST, "WTP event req"},
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_WTP_EVENT_RESPONSE, "WTP event resp"},
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST, "Change state event req"},
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE, "Change state event resp"},
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_ECHO_REQUEST, "Echo req"},
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_ECHO_RESPONSE, "Echo resp"},
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_IMAGE_DATA_REQUEST, "Image data req"},
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE, "Image data resp"},
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_RESET_REQUEST, "Channel status req"},
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_RESET_RESPONSE, "Channel status resp"},
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_KEY_UPDATE_REQUEST, "Key update req"},
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE, "Key update resp"},
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST, "Primary discovery req"},
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE, "Primary discovery resp"},
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST, "Data transfer req"},
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE, "Data transfer resp"},
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION, "Clear config ind"},
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST, "Wlan config req"},
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE, "Wlan config resp"},
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST, "Mobile config req"},
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE, "Mobile config resp"},
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL}
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * LWAPP message elements
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0                   1                   2                   3
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 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
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * |      Type     |             Length            |   Value ...   |
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct lwapp_message_header {
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t type;
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int8_t length[2];
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
17253f17a9db278d33517d9888dd77848f554522a38JP Abgralllwapp_control_print(const u_char *pptr, u_int len, int has_ap_ident) {
17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const struct lwapp_transport_header *lwapp_trans_header;
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const struct lwapp_control_header *lwapp_control_header;
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const u_char *tptr;
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int  tlen;
17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int  msg_tlen;
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr=pptr;
18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (has_ap_ident) {
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* check if enough bytes for AP identity */
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!TTEST2(*tptr, 6))
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            goto trunc;
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        lwapp_trans_header = (const struct lwapp_transport_header *)(pptr+6);
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    } else {
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    TCHECK(*lwapp_trans_header);
19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /*
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall     * Sanity checking of the header.
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall     */
19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printf("LWAPP version %u packet not supported",
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version));
19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* non-verbose */
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (vflag < 1) {
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("LWAPPv%u, %s frame, Flags [%s], length %u",
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               len);
20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return;
20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* ok they seem to want to know everything - lets fully decode it */
21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen=EXTRACT_16BITS(lwapp_trans_header->length);
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("LWAPPv%u, %s frame, Radio-id %u, Flags [%s], Frag-id %u, length %u",
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_RID(lwapp_trans_header->version),
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall           bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	   lwapp_trans_header->frag_id,
22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	   tlen);
22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (has_ap_ident) {
22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\tAP identity: %s",
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               etheraddr_string(tptr));
22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr+=sizeof(const struct lwapp_transport_header)+6;
22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    } else {
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr+=sizeof(const struct lwapp_transport_header);
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    while(tlen>0) {
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* did we capture enough for fully decoding the object header ? */
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!TTEST2(*tptr, sizeof(struct lwapp_control_header)))
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            goto trunc;
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        lwapp_control_header = (const struct lwapp_control_header *)tptr;
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	msg_tlen = EXTRACT_16BITS(lwapp_control_header->len);
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* print message header */
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("\n\t  Msg type: %s (%u), Seqnum: %u, Msg len: %d, Session: 0x%08x",
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall               tok2str(lwapp_msg_type_values,"Unknown",lwapp_control_header->msg_type),
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall               lwapp_control_header->msg_type,
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall               lwapp_control_header->seq_num,
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               msg_tlen,
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               EXTRACT_32BITS(lwapp_control_header->session_id));
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* did we capture enough for fully decoding the message */
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!TTEST2(*tptr, msg_tlen))
24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            goto trunc;
25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* XXX - Decode sub messages for each message */
25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        switch(lwapp_control_header->msg_type) {
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_DISCOVERY_REQUEST:
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_DISCOVERY_RESPONSE:
25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_JOIN_REQUEST:
25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_JOIN_RESPONSE:
25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_JOIN_ACK:
25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_JOIN_CONFIRM:
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CONFIGURE_REQUEST:
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CONFIGURE_RESPONSE:
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CONF_UPDATE_REQUEST:
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CONF_UPDATE_RESPONSE:
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_WTP_EVENT_REQUEST:
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_WTP_EVENT_RESPONSE:
26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_REQUEST:
26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CHANGE_STATE_EVENT_RESPONSE:
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_ECHO_REQUEST:
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_ECHO_RESPONSE:
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_IMAGE_DATA_REQUEST:
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_IMAGE_DATA_RESPONSE:
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_RESET_REQUEST:
27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_RESET_RESPONSE:
27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_KEY_UPDATE_REQUEST:
27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_KEY_UPDATE_RESPONSE:
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_REQUEST:
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_PRIMARY_DISCOVERY_RESPONSE:
27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_DATA_TRANSFER_REQUEST:
27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_DATA_TRANSFER_RESPONSE:
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_CLEAR_CONFIG_INDICATION:
28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_WLAN_CONFIG_REQUEST:
28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_WLAN_CONFIG_RESPONSE:
28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_MOBILE_CONFIG_REQUEST:
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case LWAPP_MSGTYPE_MOBILE_CONFIG_RESPONSE:
28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        default:
28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            break;
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tptr += sizeof(struct lwapp_control_header) + msg_tlen;
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tlen -= sizeof(struct lwapp_control_header) + msg_tlen;
29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return;
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall trunc:
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t\t packet exceeded snapshot");
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
29853f17a9db278d33517d9888dd77848f554522a38JP Abgralllwapp_data_print(const u_char *pptr, u_int len) {
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const struct lwapp_transport_header *lwapp_trans_header;
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    const u_char *tptr;
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    int tlen;
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr=pptr;
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* check if enough bytes for AP identity */
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (!TTEST2(*tptr, 6))
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        goto trunc;
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    lwapp_trans_header = (const struct lwapp_transport_header *)pptr;
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    TCHECK(*lwapp_trans_header);
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /*
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall     * Sanity checking of the header.
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall     */
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (LWAPP_EXTRACT_VERSION(lwapp_trans_header->version) != LWAPP_VERSION) {
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("LWAPP version %u packet not supported",
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version));
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return;
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* non-verbose */
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (vflag < 1) {
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        printf("LWAPPv%u, %s frame, Flags [%s], length %u",
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall               LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               len);
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return;
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* ok they seem to want to know everything - lets fully decode it */
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen=EXTRACT_16BITS(lwapp_trans_header->length);
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("LWAPPv%u, %s frame, Radio-id  %u, Flags [%s], Frag-id  %u, length %u",
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_VERSION(lwapp_trans_header->version),
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_CONTROL_BIT(lwapp_trans_header->version) ? "Control" : "Data",
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall           LWAPP_EXTRACT_RID(lwapp_trans_header->version),
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall           bittok2str(lwapp_header_bits_values,"none",(lwapp_trans_header->version)&0x07),
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall           lwapp_trans_header->frag_id,
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall           tlen);
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tptr+=sizeof(const struct lwapp_transport_header);
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    tlen-=sizeof(const struct lwapp_transport_header);
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    /* FIX - An IEEE 802.11 frame follows - hexdump for now */
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    print_unknown_data(tptr, "\n\t", tlen);
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return;
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall trunc:
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    printf("\n\t\t packet exceeded snapshot");
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Local Variables:
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-style: whitesmith
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-basic-offset: 8
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * End:
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
360