source: libpacketdump/link_15.c @ bd119b3

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since bd119b3 was 8b49230, checked in by Shane Alcock <salcock@…>, 8 years ago

Fixed problems with decoding RadioTap? headers with libpacketdump on big endian
hosts

  • Moved byteswapX functions to a separate source file so that libpacketdump can also link against them.
  • bswap_* macros have been moved into lt_bswap.h so they can be used without having to include the entire libtrace_int.h header
  • Fixed endianness issues with the "fields" inside the RadioTap? header.
  • Property mode set to 100644
File size: 5.2 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 "lt_bswap.h"
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
18DLLEXPORT void decode(int link_type UNUSED,const char *packet,unsigned 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        uint32_t rtap_pres;
26        uint16_t rtap_real_len; /* to make sure length in header matches fields present */
27        rtap = (libtrace_radiotap_t *)packet;
28       
29        printf(" Radiotap:");
30
31        if (len < 8) {
32                printf(" [|Truncated (%u bytes)]\n", len);
33                return;
34        }
35       
36        rtap_real_len = sizeof(struct libtrace_radiotap_t);
37        rtap_len = bswap_le_to_host16(rtap->it_len);
38        rtap_pres = bswap_le_to_host32(rtap->it_present);
39
40        printf(" version: %u, length: %u, fields: %#08x\n", rtap->it_version,
41                        rtap_len, rtap_pres);
42       
43        /* Check for extended bitmasks */
44        ptr = (uint32_t *) &(rtap->it_present);
45       
46        if ( (rtap_pres) & (1 << TRACE_RADIOTAP_EXT) ) 
47                printf("  extended fields:");
48       
49        while( (rtap_pres) & (1 << TRACE_RADIOTAP_EXT) ) {
50                rtap_real_len += sizeof (uint32_t);
51                ptr++;
52                printf(" %#08x", bswap_le_to_host32(*ptr));     
53        }
54
55
56        /* make p point to the first data field */
57        s = p = (uint8_t *) ++ptr;
58
59        if (rtap_pres & (1 << TRACE_RADIOTAP_TSFT)) {
60                printf(" Radiotap: TSFT = %" PRIu64 " microseconds\n", bswap_le_to_host64(*((uint64_t *)p)));
61                p += sizeof (uint64_t);
62                rtap_real_len += sizeof (uint64_t);
63        }
64
65        if (rtap_pres & (1 << TRACE_RADIOTAP_FLAGS)) {
66                printf(" Radiotap: Flags = 0x%02x\n", *p);
67                p += sizeof (uint8_t);
68                rtap_real_len += sizeof(uint8_t);
69        }
70
71       
72        if (rtap_pres & (1 << TRACE_RADIOTAP_RATE)) {
73                printf(" Radiotap: Rate = %u kbps\n", (*p) * 500);
74                p +=  sizeof (uint8_t);
75                rtap_real_len += sizeof(uint8_t);
76        }
77       
78        if (rtap_pres & (1 << TRACE_RADIOTAP_CHANNEL)) {
79                ALIGN_NATURAL_16(p,s,rtap_real_len);
80                printf(" Radiotap: Freq = %u MHz, ChanFlags: 0x%04x\n", bswap_le_to_host16(*((uint16_t *)p)), 
81                                *(((uint16_t *)p) + 1));
82                p += sizeof (uint32_t);
83                rtap_real_len += sizeof(uint32_t);
84        }
85                                                                                       
86        if (rtap_pres & (1 << TRACE_RADIOTAP_FHSS)) {
87                ALIGN_NATURAL_16(p,s, rtap_real_len);
88                printf(" Radiotap: FHSS HopSet = %u , HopPattern: %u\n", *p, *(p+1)); 
89                p += sizeof (uint16_t);
90                rtap_real_len += sizeof(uint16_t);
91        }
92
93
94        if (rtap_pres & (1 << TRACE_RADIOTAP_DBM_ANTSIGNAL)) {
95                printf(" Radiotap: Signal = %i dBm\n", (int8_t) *p) ;
96                p += sizeof (uint8_t);
97                rtap_real_len += sizeof(uint8_t);
98        }
99
100
101        if (rtap_pres & (1 << TRACE_RADIOTAP_DBM_ANTNOISE)) {
102                printf(" Radiotap: Noise = %i dBm\n", (int8_t) *p); 
103                p += sizeof (uint8_t);
104                rtap_real_len += sizeof(uint8_t);
105        }
106
107
108        if (rtap_pres & (1 << TRACE_RADIOTAP_LOCK_QUALITY)) {
109                ALIGN_NATURAL_16(p,s, rtap_real_len);
110                printf(" Radiotap: Barker Code Lock Quality = %u\n", bswap_le_to_host16(*((uint16_t *)p))); 
111                p += sizeof (uint16_t);
112                rtap_real_len += sizeof(uint16_t);
113        }
114
115
116        if (rtap_pres & (1 << TRACE_RADIOTAP_TX_ATTENUATION)) {
117                ALIGN_NATURAL_16(p,s, rtap_real_len);
118                printf(" Radiotap: TX Attenuation = %u\n", bswap_le_to_host16(*((uint16_t *)p))); 
119                p += sizeof (uint16_t);
120                rtap_real_len += sizeof(uint16_t);
121        }
122
123        if (rtap_pres & (1 << TRACE_RADIOTAP_DB_TX_ATTENUATION)) {
124                ALIGN_NATURAL_16(p,s,rtap_real_len);
125                printf(" Radiotap: TX Attenuation = %u dB\n", bswap_le_to_host16(*((uint16_t *)p))); 
126                p += sizeof (uint16_t);
127                rtap_real_len += sizeof(uint16_t);
128        }
129
130        if (rtap_pres & (1 << TRACE_RADIOTAP_DBM_TX_POWER)) {
131                printf(" Radiotap: TX Power = %i dBm\n", *p); 
132                p += sizeof (uint8_t);
133                rtap_real_len += sizeof(uint8_t);
134        }
135
136        if (rtap_pres & (1 << TRACE_RADIOTAP_ANTENNA)) {
137                printf(" Radiotap: Antenna = %u\n", *p); 
138                p += sizeof (uint8_t);
139                rtap_real_len += sizeof(uint8_t);
140        }
141
142        if (rtap_pres & (1 << TRACE_RADIOTAP_DB_ANTSIGNAL)) {
143                printf(" Radiotap: Signal = %u dB\n", *p); 
144                p += sizeof (uint8_t);
145                rtap_real_len += sizeof(uint8_t);
146        }
147
148        if (rtap_pres & (1 << TRACE_RADIOTAP_DB_ANTNOISE)) {
149                printf(" Radiotap: Noise = %u dB\n", *p); 
150                p += sizeof (uint8_t);
151                rtap_real_len += sizeof(uint8_t);
152        }
153
154        if (rtap_pres & (1 << TRACE_RADIOTAP_RX_FLAGS)) {
155                ALIGN_NATURAL_16(p,s,rtap_real_len);
156                printf(" Radiotap: RX Flags = 0x%04x\n", *((uint16_t *)p));
157                p += sizeof (uint16_t);
158                rtap_real_len += sizeof(uint16_t);
159        }
160
161        if (rtap_pres & (1 << TRACE_RADIOTAP_TX_FLAGS)) {
162                ALIGN_NATURAL_16(p,s,rtap_real_len);
163                printf(" Radiotap: TX Flags = 0x%04x\n", *((uint16_t *)p));
164                p += sizeof (uint16_t);
165                rtap_real_len += sizeof(uint16_t);
166        }
167
168        if (rtap_pres & (1 << TRACE_RADIOTAP_RTS_RETRIES)) {
169                printf(" Radiotap: RTS Retries = %u\n", *p);
170                p += sizeof (uint8_t);
171                rtap_real_len += sizeof(uint8_t);
172        }
173
174        if (rtap_pres & (1 << TRACE_RADIOTAP_DATA_RETRIES)) {
175                printf(" Radiotap: Data Retries = %u\n", *p);
176                p += sizeof (uint8_t);
177                rtap_real_len += sizeof(uint8_t);
178        }
179
180        if (rtap_real_len != rtap_len) 
181                printf(" Radiotap: WARNING: Header contains un-decoded fields.\n");
182
183        if (len > rtap_len) 
184                decode_next(packet + rtap_len, len - rtap_len, "link", TRACE_TYPE_80211);
185               
186        return;
187
188}
Note: See TracBrowser for help on using the repository browser.