source: libpacketdump/link_15.c @ 2b0eae9

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivendag_formatrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 2b0eae9 was 2b0eae9, checked in by Shane Alcock <salcock@…>, 5 years ago

Fix alignment issues when dumping a RadioTap? header with extended presence

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