source: libpacketdump/link_15.c @ dc6dc11

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

Fix a bug in the previous commit

  • Property mode set to 100644
File size: 5.6 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,unsigned len)
19{
20        uint8_t has_fcs = 0;
21        uint32_t *ptr; 
22        uint8_t *p; /* Our current field "cursor" */
23        uint8_t *s; /* Start of data fields, for alignment */
24        struct libtrace_radiotap_t *rtap;
25        uint16_t rtap_len;
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
39        printf(" version: %u, length: %u, fields: %#08x\n", rtap->it_version,
40                        rtap_len, rtap->it_present);
41       
42        /* Check for extended bitmasks */
43        ptr = (uint32_t *) &(rtap->it_present);
44       
45        if ( (*ptr) & (1 << TRACE_RADIOTAP_EXT) ) 
46                printf("  extended fields:");
47       
48        while( (*ptr) & (1 << TRACE_RADIOTAP_EXT) ) {
49                rtap_real_len += sizeof (uint32_t);
50                printf(" %#08x", *(++ptr));     
51        }
52
53
54        /* make p point to the first data field */
55        s = p = (uint8_t *) ++ptr;
56
57        if (rtap->it_present & (1 << TRACE_RADIOTAP_TSFT)) {
58                printf(" Radiotap: TSFT = %llu microseconds\n", bswap_le_to_host64(*((uint64_t *)p)));
59                p += sizeof (uint64_t);
60                rtap_real_len += sizeof (uint64_t);
61        }
62
63        if (rtap->it_present & (1 << TRACE_RADIOTAP_FLAGS)) {
64                printf(" Radiotap: Flags = 0x%02x\n", *p);
65                has_fcs = *p & 0x10; /* Determine if the packet has an FCS attached */
66                p += sizeof (uint8_t);
67                rtap_real_len += sizeof(uint8_t);
68               
69        }
70
71       
72        if (rtap->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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->it_present & (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                unsigned pktlen = len - rtap_len;
185                if (has_fcs && pktlen >= 4) pktlen -= 4;
186                decode_next(packet + rtap_len, pktlen, "link", TRACE_TYPE_80211);
187                if (has_fcs && pktlen >= 4) {
188                        uint32_t *fcs;
189                        fcs = packet + rtap_len + pktlen - 4;
190                        printf(" 802.11MAC: FCS = 0x%4x\n", *fcs);
191                }
192        }
193               
194               
195        return;
196
197}
Note: See TracBrowser for help on using the repository browser.