--- a/src/wave/helper/wave-helper.cc Wed Jul 08 00:09:46 2015 +0200
+++ b/src/wave/helper/wave-helper.cc Wed Jul 08 23:44:17 2015 +0200
@@ -24,6 +24,7 @@
#include "ns3/config.h"
#include "ns3/names.h"
#include "ns3/abort.h"
+#include "ns3/ampdu-subframe-header.h"
#include "ns3/wave-net-device.h"
#include "ns3/minstrel-wifi-manager.h"
#include "ns3/radiotap-header.h"
@@ -92,8 +93,9 @@
uint16_t channelFreqMhz,
uint16_t channelNumber,
uint32_t rate,
- bool isShortPreamble,
- WifiTxVector txvector)
+ WifiPreamble preamble,
+ WifiTxVector txvector,
+ struct mpduInfo aMpdu)
{
uint32_t dlt = file->GetDataLinkType ();
@@ -114,29 +116,29 @@
uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
header.SetTsft (Simulator::Now ().GetMicroSeconds ());
- // Our capture includes the FCS, so we set the flag to say so.
+ //Our capture includes the FCS, so we set the flag to say so.
frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
- if (isShortPreamble)
+ if (preamble == WIFI_PREAMBLE_SHORT)
{
frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
}
-
+
if (txvector.IsShortGuardInterval ())
{
frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_GUARD;
}
-
+
header.SetFrameFlags (frameFlags);
header.SetRate (rate);
uint16_t channelFlags = 0;
switch (rate)
{
- case 2: // 1Mbps
- case 4: // 2Mbps
- case 10: // 5Mbps
- case 22: // 11Mbps
+ case 2: //1Mbps
+ case 4: //2Mbps
+ case 10: //5Mbps
+ case 22: //11Mbps
channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
break;
@@ -156,6 +158,71 @@
header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
+ if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+ {
+ uint8_t mcsRate = 0;
+ uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+ uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+ mcsRate = rate - 128;
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+ if (txvector.GetMode ().GetBandwidth () == 40000000)
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+ if (txvector.IsShortGuardInterval ())
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+ if (preamble == WIFI_PREAMBLE_HT_GF)
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+ if (txvector.GetNess () & 0x01) //bit 1
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+ }
+ if (txvector.GetNess () & 0x02) //bit 2
+ {
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+ if (txvector.IsStbc ())
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+ }
+
+ header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+ }
+
+ if (txvector.IsAggregation ())
+ {
+ uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+ if (aMpdu.packetType == 2)
+ {
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+ }
+ /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+ AmpduSubframeHeader hdr;
+ uint32_t extractedLength;
+ p->RemoveHeader (hdr);
+ extractedLength = hdr.GetLength ();
+ p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+ header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+ }
p->AddHeader (header);
file->Write (Simulator::Now (), p);
@@ -173,10 +240,10 @@
uint16_t channelFreqMhz,
uint16_t channelNumber,
uint32_t rate,
- bool isShortPreamble,
+ WifiPreamble preamble,
WifiTxVector txvector,
- double signalDbm,
- double noiseDbm)
+ struct mpduInfo aMpdu,
+ struct snrDbm snr)
{
uint32_t dlt = file->GetDataLinkType ();
@@ -197,10 +264,10 @@
uint8_t frameFlags = RadiotapHeader::FRAME_FLAG_NONE;
header.SetTsft (Simulator::Now ().GetMicroSeconds ());
- // Our capture includes the FCS, so we set the flag to say so.
+ //Our capture includes the FCS, so we set the flag to say so.
frameFlags |= RadiotapHeader::FRAME_FLAG_FCS_INCLUDED;
- if (isShortPreamble)
+ if (preamble == WIFI_PREAMBLE_SHORT)
{
frameFlags |= RadiotapHeader::FRAME_FLAG_SHORT_PREAMBLE;
}
@@ -216,10 +283,10 @@
uint16_t channelFlags = 0;
switch (rate)
{
- case 2: // 1Mbps
- case 4: // 2Mbps
- case 10: // 5Mbps
- case 22: // 11Mbps
+ case 2: //1Mbps
+ case 4: //2Mbps
+ case 10: //5Mbps
+ case 22: //11Mbps
channelFlags |= RadiotapHeader::CHANNEL_FLAG_CCK;
break;
@@ -239,8 +306,74 @@
header.SetChannelFrequencyAndFlags (channelFreqMhz, channelFlags);
- header.SetAntennaSignalPower (signalDbm);
- header.SetAntennaNoisePower (noiseDbm);
+ header.SetAntennaSignalPower (snr.signal);
+ header.SetAntennaNoisePower (snr.noise);
+
+ if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF || preamble == WIFI_PREAMBLE_NONE)
+ {
+ uint8_t mcsRate = 0;
+ uint8_t mcsKnown = RadiotapHeader::MCS_KNOWN_NONE;
+ uint8_t mcsFlags = RadiotapHeader::MCS_FLAGS_NONE;
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_INDEX;
+ mcsRate = rate - 128;
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_BANDWIDTH;
+ if (txvector.GetMode ().GetBandwidth () == 40000000)
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_BANDWIDTH_40;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_GUARD_INTERVAL;
+ if (txvector.IsShortGuardInterval ())
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_GUARD_INTERVAL;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_HT_FORMAT;
+ if (preamble == WIFI_PREAMBLE_HT_GF)
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_HT_GREENFIELD;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS;
+ if (txvector.GetNess () & 0x01) //bit 1
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_NESS_BIT_0;
+ }
+ if (txvector.GetNess () & 0x02) //bit 2
+ {
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_NESS_BIT_1;
+ }
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_FEC_TYPE; //only BCC is currently supported
+
+ mcsKnown |= RadiotapHeader::MCS_KNOWN_STBC;
+ if (txvector.IsStbc ())
+ {
+ mcsFlags |= RadiotapHeader::MCS_FLAGS_STBC_STREAMS;
+ }
+
+ header.SetMcsFields (mcsKnown, mcsFlags, mcsRate);
+ }
+
+ if (txvector.IsAggregation ())
+ {
+ uint16_t ampduStatusFlags = 0;
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
+ if (aMpdu.packetType == 2)
+ {
+ ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
+ }
+ /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
+ AmpduSubframeHeader hdr;
+ uint32_t extractedLength;
+ p->RemoveHeader (hdr);
+ extractedLength = hdr.GetLength ();
+ p = p->CreateFragment (0, static_cast<uint32_t> (extractedLength));
+ header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+ }
p->AddHeader (header);
file->Write (Simulator::Now (), p);