|
|
| 46 |
}; |
46 |
}; |
| 47 |
|
47 |
|
| 48 |
PcapWriter::PcapWriter () |
48 |
PcapWriter::PcapWriter () |
|
|
49 |
: m_captureSize(0) |
| 49 |
{ |
50 |
{ |
| 50 |
NS_LOG_FUNCTION (this); |
51 |
NS_LOG_FUNCTION (this); |
| 51 |
NS_LOG_LOGIC ("m_writer = 0"); |
52 |
NS_LOG_LOGIC ("m_writer = 0"); |
|
|
| 162 |
uint64_t us = current % 1000000; |
163 |
uint64_t us = current % 1000000; |
| 163 |
Write32 (s & 0xffffffff); |
164 |
Write32 (s & 0xffffffff); |
| 164 |
Write32 (us & 0xffffffff); |
165 |
Write32 (us & 0xffffffff); |
| 165 |
Write32 (packet->GetSize ()); |
166 |
uint32_t thisCaptureSize; |
| 166 |
Write32 (packet->GetSize ()); |
167 |
if (m_captureSize == 0) |
| 167 |
packet->CopyData (m_writer, packet->GetSize ()); |
168 |
{ |
|
|
169 |
thisCaptureSize = packet->GetSize (); |
| 170 |
} |
| 171 |
else |
| 172 |
{ |
| 173 |
thisCaptureSize = std::min (m_captureSize, packet->GetSize ()); |
| 174 |
} |
| 175 |
Write32 (thisCaptureSize); |
| 176 |
Write32 (packet->GetSize ()); // actual packet size |
| 177 |
packet->CopyData (m_writer, thisCaptureSize); |
| 168 |
} |
178 |
} |
| 169 |
} |
179 |
} |
| 170 |
|
180 |
|
|
|
| 203 |
// real devices (e.g. madwifi) handle this case, especially for TX |
213 |
// real devices (e.g. madwifi) handle this case, especially for TX |
| 204 |
// packets (radiotap specs says TSFT is not used for TX packets, |
214 |
// packets (radiotap specs says TSFT is not used for TX packets, |
| 205 |
// but madwifi actually uses it). |
215 |
// but madwifi actually uses it). |
| 206 |
uint64_t tsft = current; |
216 |
uint64_t tsft = current; |
|
|
217 |
|
| 218 |
|
| 219 |
uint32_t wifiMonitorHeaderSize; |
| 207 |
|
220 |
|
| 208 |
if (m_pcapMode == PCAP_80211_PRISM) |
221 |
if (m_pcapMode == PCAP_80211_PRISM) |
| 209 |
{ |
222 |
{ |
|
|
| 226 |
#define PRISM_ITEM_LENGTH 4 |
239 |
#define PRISM_ITEM_LENGTH 4 |
| 227 |
|
240 |
|
| 228 |
|
241 |
|
| 229 |
|
242 |
wifiMonitorHeaderSize = PRISM_MSG_LENGTH; |
| 230 |
uint32_t size = packet->GetSize () + PRISM_MSG_LENGTH; |
243 |
if (m_captureSize == 0) |
| 231 |
Write32 (size); // total packet size |
244 |
{ |
| 232 |
Write32 (size); // captured size |
245 |
Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size |
|
|
246 |
} |
| 247 |
else |
| 248 |
{ |
| 249 |
uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize); |
| 250 |
Write32 (thisCaptureSize); |
| 251 |
} |
| 252 |
Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size |
| 233 |
|
253 |
|
| 234 |
Write32(PRISM_MSG_CODE); |
254 |
Write32(PRISM_MSG_CODE); |
| 235 |
Write32(PRISM_MSG_LENGTH); |
255 |
Write32(PRISM_MSG_LENGTH); |
|
|
| 349 |
|
369 |
|
| 350 |
#define RADIOTAP_TX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS | RADIOTAP_RATE | RADIOTAP_CHANNEL) |
370 |
#define RADIOTAP_TX_PRESENT (RADIOTAP_TSFT | RADIOTAP_FLAGS | RADIOTAP_RATE | RADIOTAP_CHANNEL) |
| 351 |
#define RADIOTAP_TX_LENGTH (8+8+1+1+2+2) |
371 |
#define RADIOTAP_TX_LENGTH (8+8+1+1+2+2) |
| 352 |
|
372 |
|
| 353 |
uint32_t size; |
|
|
| 354 |
if (isTx) |
373 |
if (isTx) |
| 355 |
{ |
374 |
{ |
| 356 |
size = packet->GetSize () + RADIOTAP_TX_LENGTH; |
375 |
wifiMonitorHeaderSize = RADIOTAP_TX_LENGTH; |
| 357 |
} |
376 |
} |
| 358 |
else |
377 |
else |
| 359 |
{ |
378 |
{ |
| 360 |
size = packet->GetSize () + RADIOTAP_RX_LENGTH; |
379 |
wifiMonitorHeaderSize = RADIOTAP_RX_LENGTH; |
|
|
380 |
} |
| 381 |
|
| 382 |
if (m_captureSize == 0) |
| 383 |
{ |
| 384 |
Write32 (packet->GetSize () + wifiMonitorHeaderSize); // captured size == actual packet size |
| 361 |
} |
385 |
} |
| 362 |
Write32 (size); // total packet size |
386 |
else |
| 363 |
Write32 (size); // captured size |
387 |
{ |
|
|
388 |
uint32_t thisCaptureSize = std::min (m_captureSize, packet->GetSize () + wifiMonitorHeaderSize); |
| 389 |
Write32 (thisCaptureSize); |
| 390 |
} |
| 391 |
Write32 (packet->GetSize () + wifiMonitorHeaderSize); // actual packet size |
| 364 |
|
392 |
|
| 365 |
Write8(0); // radiotap version |
393 |
Write8(0); // radiotap version |
| 366 |
Write8(0); // padding |
394 |
Write8(0); // padding |
|
|
| 412 |
} |
440 |
} |
| 413 |
|
441 |
|
| 414 |
// finally, write rest of packet |
442 |
// finally, write rest of packet |
| 415 |
packet->CopyData (m_writer, packet->GetSize ()); |
443 |
if (m_captureSize == 0) |
|
|
444 |
{ |
| 445 |
packet->CopyData (m_writer, packet->GetSize ()); |
| 446 |
} |
| 447 |
else |
| 448 |
{ |
| 449 |
packet->CopyData (m_writer, m_captureSize - wifiMonitorHeaderSize); |
| 450 |
} |
| 451 |
|
| 416 |
} |
452 |
} |
| 417 |
|
453 |
|
| 418 |
|
454 |
|
| 419 |
|
455 |
void |
|
|
456 |
PcapWriter::SetCaptureSize (uint32_t size) |
| 457 |
{ |
| 458 |
m_captureSize = size; |
| 459 |
} |
| 420 |
|
460 |
|
| 421 |
int8_t |
461 |
int8_t |
| 422 |
PcapWriter::RoundToInt8 (double value) |
462 |
PcapWriter::RoundToInt8 (double value) |