|
|
| 169 |
} |
169 |
} |
| 170 |
|
170 |
|
| 171 |
|
171 |
|
| 172 |
void PcapWriter::WriteWifiMonitorPacket(Ptr<const Packet> packet, uint16_t channelFreqMhz, |
172 |
void PcapWriter::WriteWifiMonitorPacket(Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, |
| 173 |
uint32_t rate, bool isShortPreamble, bool isTx, |
173 |
uint32_t rate, bool isShortPreamble, bool isTx, |
| 174 |
double signalDbm, double noiseDbm) |
174 |
double signalDbm, double noiseDbm) |
| 175 |
{ |
175 |
{ |
|
|
| 251 |
|
251 |
|
| 252 |
Write32(PRISM_DID_CHANNEL); |
252 |
Write32(PRISM_DID_CHANNEL); |
| 253 |
Write16(PRISM_STATUS_PRESENT); |
253 |
Write16(PRISM_STATUS_PRESENT); |
| 254 |
Write16(PRISM_ITEM_LENGTH); |
254 |
Write16(PRISM_ITEM_LENGTH); |
| 255 |
// convert from frequency to channel number. This conversion is |
255 |
Write32((uint32_t) channelNumber); |
| 256 |
// correct only for IEEE 802.11b/g channels 1-13. |
|
|
| 257 |
Write32((2437 - 2407) / 5); |
| 258 |
|
256 |
|
| 259 |
Write32(PRISM_DID_RSSI); |
257 |
Write32(PRISM_DID_RSSI); |
| 260 |
Write16(PRISM_STATUS_PRESENT); |
258 |
Write16(PRISM_STATUS_PRESENT); |
|
|
| 335 |
#define RADIOTAP_FLAG_DATAPAD 0x20 |
333 |
#define RADIOTAP_FLAG_DATAPAD 0x20 |
| 336 |
#define RADIOTAP_FLAG_BADFCS 0x40 |
334 |
#define RADIOTAP_FLAG_BADFCS 0x40 |
| 337 |
|
335 |
|
| 338 |
#define RADIOTAP_CHANNEL_TURBO 0x0010 |
336 |
#define RADIOTAP_CHANNEL_TURBO 0x0010 |
| 339 |
#define RADIOTAP_CHANNEL_CCK 0x0020 |
337 |
#define RADIOTAP_CHANNEL_CCK 0x0020 |
| 340 |
#define RADIOTAP_CHANNEL_OFDM 0x0040 |
338 |
#define RADIOTAP_CHANNEL_OFDM 0x0040 |
| 341 |
#define RADIOTAP_CHANNEL_2GHZ 0x0080 |
339 |
#define RADIOTAP_CHANNEL_2GHZ 0x0080 |
| 342 |
#define RADIOTAP_CHANNEL_5GHZ 0x0100 |
340 |
#define RADIOTAP_CHANNEL_5GHZ 0x0100 |
| 343 |
#define RADIOTAP_CHANNEL_PASSIVE 0x0200 |
341 |
#define RADIOTAP_CHANNEL_PASSIVE 0x0200 |
| 344 |
#define RADIOTAP_CHANNEL_DYN 0x0400 |
342 |
#define RADIOTAP_CHANNEL_DYN_CCK_OFDM 0x0400 |
| 345 |
#define RADIOTAP_CHANNEL_GFSK 0x0800 |
343 |
#define RADIOTAP_CHANNEL_GFSK 0x0800 |
|
|
344 |
#define RADIOTAP_CHANNEL_GSM 0x1000 |
| 345 |
#define RADIOTAP_CHANNEL_STATIC_TURBO 0x2000 |
| 346 |
#define RADIOTAP_CHANNEL_HALF_RATE 0x4000 |
| 347 |
#define RADIOTAP_CHANNEL_QUARTER_RATE 0x8000 |
| 346 |
|
348 |
|
| 347 |
#define RADIOTAP_RX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS | RADIOTAP_RATE | RADIOTAP_CHANNEL | RADIOTAP_DBM_ANTSIGNAL | RADIOTAP_DBM_ANTNOISE) |
349 |
#define RADIOTAP_RX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS | RADIOTAP_RATE | RADIOTAP_CHANNEL | RADIOTAP_DBM_ANTSIGNAL | RADIOTAP_DBM_ANTNOISE) |
| 348 |
#define RADIOTAP_RX_LENGTH (8+8+1+1+2+2+1+1) |
350 |
#define RADIOTAP_RX_LENGTH (8+8+1+1+2+2+1+1) |
|
|
| 388 |
|
390 |
|
| 389 |
Write8(rate); |
391 |
Write8(rate); |
| 390 |
|
392 |
|
| 391 |
Write16((uint16_t) 2437); |
393 |
Write16(channelFreqMhz); |
| 392 |
|
394 |
|
| 393 |
// we might want to make this setting depend on the WifiMode and |
395 |
uint16_t channelFlags; |
| 394 |
// on the ChannelFrequency at some time in the future. But for now |
396 |
if (channelFreqMhz < 2500) |
| 395 |
// I think a fixed setting is more than enough for most purposes. |
397 |
{ |
| 396 |
Write16(RADIOTAP_CHANNEL_OFDM | RADIOTAP_CHANNEL_2GHZ); |
398 |
// TODO: when 802.11g WifiModes will be implemented |
|
|
399 |
// we will need to check dinamically whether channelFlags |
| 400 |
// needs to be set to RADIOTAP_CHANNEL_CCK, |
| 401 |
// RADIOTAP_CHANNEL_DYN or RADIOTAP_CHANNEL_OFDM. |
| 402 |
channelFlags = RADIOTAP_CHANNEL_2GHZ | RADIOTAP_CHANNEL_CCK; |
| 403 |
} |
| 404 |
else |
| 405 |
{ |
| 406 |
// TODO: we should handle correctly the case of half rate |
| 407 |
// (10 MHz channel) and quarter rate (5 Mhz channel). |
| 408 |
channelFlags = RADIOTAP_CHANNEL_5GHZ | RADIOTAP_CHANNEL_OFDM; |
| 409 |
} |
| 410 |
Write16(channelFlags); |
| 397 |
|
411 |
|
| 398 |
if (!isTx) |
412 |
if (!isTx) |
| 399 |
{ |
413 |
{ |