source: libpacketdump/link_15.c @ 1515e07

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 1515e07 was 1515e07, checked in by Scott Raynel <smr26@…>, 14 years ago

Reformat output of radiotap libpacketdump decoder to be consistent with other decoders

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * libpacketdump decoder for Radiotap
3 */
4#include <sys/types.h>
5#include <netinet/in.h>
6#include <stdio.h>
7#include <inttypes.h>
8#include <dlfcn.h>
9#include "libtrace.h"
10#include "libpacketdump.h"
11#include "libtrace_int.h" /* bswaps */
12
13#define ALIGN_NATURAL_32(_p,_s,_c) \
14        while ( (_p - _s) % sizeof(uint32_t)) {_p++; _c++;}
15#define ALIGN_NATURAL_16(_p,_s,_c) \
16        while ( (_p - _s) % sizeof(uint16_t)) {_p++; _c++;}
17
18void decode(int link_type,char *packet,int len)
19{
20        uint32_t *ptr; 
21        uint8_t *p; /* Our current field "cursor" */
22        uint8_t *s; /* Start of data fields, for alignment */
23        struct libtrace_radiotap_t *rtap;
24        uint16_t rtap_len;
25        uint16_t rtap_real_len; /* to make sure length in header matches fields present */
26        rtap = (libtrace_radiotap_t *)packet;
27       
28        printf(" Radiotap:");
29
30        if (len < 8) {
31                printf(" [|Truncated (%u bytes)]\n", len);
32                return;
33        }
34       
35        rtap_real_len = sizeof(struct libtrace_radiotap_t);
36        rtap_len = bswap_le_to_host16(rtap->it_len);
37
38        printf(" version: %u, length: %u, fields: %#08x\n", rtap->it_version,
39                        rtap_len, rtap->it_present);
40       
41        /* Check for extended bitmasks */
42        ptr = (uint32_t *) &(rtap->it_present);
43       
44        if ( (*ptr) & (1 << TRACE_RADIOTAP_EXT) ) 
45                printf("  extended fields:");
46       
47        while( (*ptr) & (1 << TRACE_RADIOTAP_EXT) ) {
48                rtap_real_len += sizeof (uint32_t);
49                printf(" %#08x", *(++ptr));     
50        }
51
52
53        /* make p point to the first data field */
54        s = p = (uint8_t *) ++ptr;
55
56        if (rtap->it_present & (1 << TRACE_RADIOTAP_TSFT)) {
57                printf(" Radiotap: TSFT = %llu microseconds\n", bswap_le_to_host64(*((uint64_t *)p)));
58                p += sizeof (uint64_t);
59                rtap_real_len += sizeof (uint64_t);
60        }
61
62        if (rtap->it_present & (1 << TRACE_RADIOTAP_FLAGS)) {
63                printf(" Radiotap: Flags = %#04x\n", *p);
64                p += sizeof (uint8_t);
65                rtap_real_len += sizeof(uint8_t);
66        }
67
68       
69        if (rtap->it_present & (1 << TRACE_RADIOTAP_RATE)) {
70                printf(" Radiotap: Rate = %u kbps\n", (*p) * 500);
71                p +=  sizeof (uint8_t);
72                rtap_real_len += sizeof(uint8_t);
73        }
74       
75        if (rtap->it_present & (1 << TRACE_RADIOTAP_CHANNEL)) {
76                ALIGN_NATURAL_16(p,s,rtap_real_len);
77                printf(" Radiotap: Freq = %u MHz, ChanFlags: %#06x\n", bswap_le_to_host16(*((uint16_t *)p)), 
78                                *(((uint16_t *)p) + 1));
79                p += sizeof (uint32_t);
80                rtap_real_len += sizeof(uint32_t);
81        }
82                                                                                       
83        if (rtap->it_present & (1 << TRACE_RADIOTAP_FHSS)) {
84                ALIGN_NATURAL_16(p,s, rtap_real_len);
85                printf(" Radiotap: FHSS HopSet = %u , HopPattern: %u\n", *p, *(p+1)); 
86                p += sizeof (uint16_t);
87                rtap_real_len += sizeof(uint16_t);
88        }
89
90
91        if (rtap->it_present & (1 << TRACE_RADIOTAP_DBM_ANTSIGNAL)) {
92                printf(" Radiotap: Signal = %i dBm\n", (int8_t) *p) ;
93                p += sizeof (uint8_t);
94                rtap_real_len += sizeof(uint8_t);
95        }
96
97
98        if (rtap->it_present & (1 << TRACE_RADIOTAP_DBM_ANTNOISE)) {
99                printf(" Radiotap: Noise = %i dBm\n", (int8_t) *p); 
100                p += sizeof (uint8_t);
101                rtap_real_len += sizeof(uint8_t);
102        }
103
104
105        if (rtap->it_present & (1 << TRACE_RADIOTAP_LOCK_QUALITY)) {
106                ALIGN_NATURAL_16(p,s, rtap_real_len);
107                printf(" Radiotap: Barker Code Lock Quality = %u\n", bswap_le_to_host16(*((uint16_t *)p))); 
108                p += sizeof (uint16_t);
109                rtap_real_len += sizeof(uint16_t);
110        }
111
112
113        if (rtap->it_present & (1 << TRACE_RADIOTAP_TX_ATTENUATION)) {
114                ALIGN_NATURAL_16(p,s, rtap_real_len);
115                printf(" Radiotap: TX Attenuation = %u\n", bswap_le_to_host16(*((uint16_t *)p))); 
116                p += sizeof (uint16_t);
117                rtap_real_len += sizeof(uint16_t);
118        }
119
120        if (rtap->it_present & (1 << TRACE_RADIOTAP_DB_TX_ATTENUATION)) {
121                ALIGN_NATURAL_16(p,s,rtap_real_len);
122                printf(" Radiotap: TX Attenuation = %u dB\n", bswap_le_to_host16(*((uint16_t *)p))); 
123                p += sizeof (uint16_t);
124                rtap_real_len += sizeof(uint16_t);
125        }
126
127        if (rtap->it_present & (1 << TRACE_RADIOTAP_DBM_TX_POWER)) {
128                printf(" Radiotap: TX Power = %i dBm\n", *p); 
129                p += sizeof (uint8_t);
130                rtap_real_len += sizeof(uint8_t);
131        }
132
133        if (rtap->it_present & (1 << TRACE_RADIOTAP_ANTENNA)) {
134                printf(" Radiotap: Antenna = %u\n", *p); 
135                p += sizeof (uint8_t);
136                rtap_real_len += sizeof(uint8_t);
137        }
138
139        if (rtap->it_present & (1 << TRACE_RADIOTAP_DB_ANTSIGNAL)) {
140                printf(" Radiotap: Signal = %u dB\n", *p); 
141                p += sizeof (uint8_t);
142                rtap_real_len += sizeof(uint8_t);
143        }
144
145        if (rtap->it_present & (1 << TRACE_RADIOTAP_DB_ANTNOISE)) {
146                printf(" Radiotap: Noise = %u dB\n", *p); 
147                p += sizeof (uint8_t);
148                rtap_real_len += sizeof(uint8_t);
149        }
150
151        if (rtap->it_present & (1 << TRACE_RADIOTAP_FCS)) {
152                ALIGN_NATURAL_32(p,s,rtap_real_len);
153                printf(" Radiotap: Frame Check Sequence = %#10x\n", bswap_le_to_host32(*((uint32_t *)p))); 
154                p += sizeof (uint32_t);
155                rtap_real_len += sizeof(uint32_t);
156        }
157
158        if (rtap_real_len != rtap_len) 
159                printf(" Radiotap: WARNING: Header length does not match fields present (%u)\n", rtap_real_len);
160
161        if (len > rtap_len) 
162                decode_next(packet + rtap_len, len - rtap_len, "link", TRACE_TYPE_80211);
163               
164        return;
165
166}
Note: See TracBrowser for help on using the repository browser.