22 #include "ns3/simulator.h" 
   23 #include "ns3/packet.h" 
   25 #include "ns3/uinteger.h" 
   26 #include "ns3/double.h" 
   27 #include "ns3/string.h" 
   31 #include "ns3/packet-burst.h" 
   34 #include "ns3/trace-source-accessor.h" 
   48     .SetGroupName (
"Wimax")
 
   52     .AddAttribute (
"NoiseFigure",
 
   53                    "Loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.",
 
   56                    MakeDoubleChecker<double> ())
 
   58     .AddAttribute (
"TxPower",
 
   59                    "Transmission power (dB).",
 
   62                    MakeDoubleChecker<double> ())
 
   65                    "This is the ratio of CP time to useful time.",
 
   68                    MakeDoubleChecker<double> ())
 
   70     .AddAttribute (
"TxGain",
 
   71                    "Transmission gain (dB).",
 
   74                    MakeDoubleChecker<double> ())
 
   76     .AddAttribute (
"RxGain",
 
   77                    "Reception gain (dB).",
 
   80                    MakeDoubleChecker<double> ())
 
   82     .AddAttribute (
"Nfft",
 
   86                    MakeUintegerChecker<uint16_t> (256, 1024))
 
   88     .AddAttribute (
"TraceFilePath",
 
   89                    "Path to the directory containing SNR to block error rate files",
 
   95     .AddTraceSource (
"Rx", 
"Receive trace",
 
   97                      "ns3::PacketBurst::TracedCallback")
 
   98     .AddTraceSource (
"Tx", 
"Transmit trace",
 
  100                      "ns3::PacketBurst::TracedCallback")
 
  102     .AddTraceSource (
"PhyTxBegin",
 
  103                      "Trace source indicating a packet has begun transmitting over the channel medium",
 
  105                      "ns3::PacketBurst::TracedCallback")
 
  107     .AddTraceSource (
"PhyTxEnd",
 
  108                      "Trace source indicating a packet has been completely transmitted over the channel",
 
  110                      "ns3::PacketBurst::TracedCallback")
 
  112     .AddTraceSource (
"PhyTxDrop",
 
  113                      "Trace source indicating a packet has been dropped by the device during transmission",
 
  115                      "ns3::PacketBurst::TracedCallback")
 
  117     .AddTraceSource (
"PhyRxBegin",
 
  118                      "Trace source indicating a packet has begun being received from the channel medium by the device",
 
  120                      "ns3::PacketBurst::TracedCallback")
 
  122     .AddTraceSource (
"PhyRxEnd",
 
  123                      "Trace source indicating a packet has been completely received from the channel medium by the device",
 
  125                      "ns3::PacketBurst::TracedCallback")
 
  127     .AddTraceSource (
"PhyRxDrop",
 
  128                      "Trace source indicating a packet has been dropped by the device during reception",
 
  130                      "ns3::PacketBurst::TracedCallback");
 
  154   m_g = (double) 1 / 4;
 
  169   m_URNG = CreateObject<UniformRandomVariable> ();
 
  293   bool isLastFecBlock = 0;
 
  304       isLastFecBlock = 
true;
 
  308       isLastFecBlock = 
false;
 
  363   double SNR = rxPower - Nwb;
 
  366   double I1 = record->
GetI1 ();
 
  367   double I2 = record->
GetI2 ();
 
  373   if (rand < blockErrorRate)
 
  377   if (rand > blockErrorRate)
 
  382   if (blockErrorRate == 1.0)
 
  386   if (blockErrorRate == 0.0)
 
  392   NS_LOG_INFO (
"PHY: Receive rxPower=" << rxPower << 
", Nwb=" << Nwb << 
", SNR=" << SNR << 
", Modulation=" 
  393                                        << modulationType << 
", BlocErrorRate=" << blockErrorRate << 
", drop=" << (
int) drop);
 
  487   bvec buffer (burst->GetSize () * 8, 0);
 
  489   std::list<Ptr<Packet> > packets = burst->GetPackets ();
 
  495       uint8_t *pstart = (uint8_t*) std::malloc (packet->
GetSize ());
 
  496       std::memset (pstart, 0, packet->
GetSize ());
 
  501       for (uint32_t i = 0; i < packet->
GetSize (); i++)
 
  503           for (uint8_t l = 0; l < 8; l++)
 
  505               temp[l] = (bool)((((uint8_t) pstart[i]) >> (7 - l)) & 0x01);
 
  506               buffer.at (j * 8 + l) = temp[l];
 
  527   uint8_t init[buffer.size () / 8];
 
  528   uint8_t *pstart = init;
 
  532   for (uint32_t i = 0; i < buffer.size (); i += 8)
 
  536       for (
int l = 0; l < 8; l++)
 
  538           bool bin = buffer.at (i + l);
 
  539           temp += (uint8_t)(bin * std::pow (2.0, (7 - l)));
 
  542       *(pstart + j) = temp;
 
  545   uint16_t bufferSize = buffer.size () / 8;
 
  548   while (pos < bufferSize)
 
  552       uint8_t ht = (pstart[pos] >> 7) & 0x01;
 
  561           uint8_t Len_MSB = pstart[pos + 1] & 0x07;
 
  562           packetSize = (uint16_t)((uint16_t)(Len_MSB << 8) | (uint16_t)(pstart[pos + 2]));
 
  569       Ptr<Packet> p = Create<Packet> (&(pstart[pos]), packetSize);
 
  570       RecvBurst->AddPacket (p);
 
  586           fecBlock = 
bvec (buffer.begin () + i, buffer.end ());
 
  591           fecBlock = 
bvec (buffer.begin () + i, buffer.begin () + i + 
m_blockSize);
 
  608       buffer.insert (buffer.begin () + i, tmpRecFecBloc.begin (), tmpRecFecBloc.end ());
 
  629                                             uint8_t &bitsPerSymbol,
 
  630                                             double &fecCode)
 const 
  632   switch (modulationType)
 
  636       fecCode = (double) 1 / 2;
 
  640       fecCode = (double) 1 / 2;
 
  644       fecCode = (double) 3 / 4;
 
  648       fecCode = (double) 1 / 2;
 
  652       fecCode = (double) 3 / 4;
 
  656       fecCode = (double) 2 / 3;
 
  668   uint8_t bitsPerSymbol = 0;
 
  672   uint16_t bitsTransmittedPerSymbol = (uint16_t)(bitsPerSymbol * 
GetNrCarriers () * fecCode);
 
  675   return (uint32_t) symbolsPerSecond * bitsTransmittedPerSymbol;
 
  681   switch (modulationType)
 
  742   uint32_t blockSize = 0;
 
  743   switch (modulationType)
 
  770   return blockSize * 8; 
 
  777   uint32_t blockSize = 0;
 
  778   switch (modulationType)
 
  805   return blockSize * 8; 
 
  835   uint16_t duration = 0;
 
  887   switch (frameDurationCode)
 
  924   uint16_t nrBlocks = (burstSize * 8) / blockSize;
 
  926   if ((burstSize * 8) % blockSize > 0)
 
  947   Time psDuration = 
Seconds ((
double) 4 / samplingFrequency);
 
  952   double subcarrierSpacing = samplingFrequency / 
DoGetNfft ();
 
  953   double tb = (double) 1 / subcarrierSpacing; 
 
  984   if (channelBandwidth % 1750000 == 0)
 
  986       return (
double) 8 / 7;
 
  988   else if (channelBandwidth % 1500000 == 0)
 
  990       return (
double) 86 / 75;
 
  992   else if (channelBandwidth % 1250000 == 0)
 
  994       return (
double) 144 / 125;
 
  996   else if (channelBandwidth % 2750000 == 0)
 
  998       return (
double) 316 / 275;
 
 1000   else if (channelBandwidth % 2000000 == 0)
 
 1002       return (
double) 57 / 50;
 
 1006       NS_LOG_DEBUG (
"Oops may be wrong channel bandwidth for OFDM PHY!");
 
 1010   return (
double) 8 / 7;
 
void SetNoiseFigure(double nf)
set the noise figure of the device 
 
Ptr< const AttributeChecker > MakeStringChecker(void)
 
uint32_t GetCodedFecBlockSize(WimaxPhy::ModulationType modulationType) const 
 
void StartReceive(uint32_t burstSize, bool isFirstBlock, uint64_t frequency, WimaxPhy::ModulationType modulationType, uint8_t direction, double rxPower, Ptr< PacketBurst > burst)
start the reception of a fec block 
 
Simulation virtual time values and global simulation resolution. 
 
~SimpleOfdmWimaxPhy(void)
 
Callback< void, Ptr< const PacketBurst > > GetReceiveCallback(void) const 
 
Smart pointer class similar to boost::intrusive_ptr. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream. 
 
void SetSNRToBlockErrorRateTracesPath(char *tracesPath)
Set the path of the repository containing the traces. 
 
TracedCallback< Ptr< PacketBurst > > m_phyRxEndTrace
The trace source fired when a packet ends the reception process from the medium. 
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
void EndReceiveFecBlock(uint32_t burstSize, WimaxPhy::ModulationType modulationType, uint8_t direction, uint8_t drop, Ptr< PacketBurst > burst)
 
Hold variables of type string. 
 
void Send(Ptr< PacketBurst > burst, WimaxPhy::ModulationType modulationType, uint8_t direction)
Sends a burst on the channel. 
 
double DoGetSamplingFrequency(void) const 
 
void NotifyRxDrop(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxDrop trace. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
void NotifyRxBegin(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxBegin trace. 
 
TracedCallback< Ptr< const PacketBurst > > m_traceRx
 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
 
uint32_t m_dataRateQam64_23
 
bool IsDuplex(void) const 
 
void InitSimpleOfdmWimaxPhy(void)
 
uint32_t GetChannelBandwidth(void) const 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
U * PeekPointer(const Ptr< U > &p)
 
std::string GetTraceFilePath(void)
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
std::list< bvec > * m_receivedFecBlocks
 
uint32_t GetSize(void) const 
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
 
SNRToBlockErrorRateManager * m_snrToBlockErrorRateManager
 
void SetSimplex(uint64_t frequency)
configure the physical layer in simplex mode 
 
void NotifyTxDrop(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxDrop trace. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
Time DoGetTransmissionTime(uint32_t size, WimaxPhy::ModulationType modulationType) const 
 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
 
uint64_t GetRxFrequency(void) const 
 
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
 
uint8_t DoGetFrameDurationCode(void) const 
 
Time GetSymbolDuration(void) const 
 
void NotifyTxBegin(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxBegin trace. 
 
uint32_t DoGetDataRate(WimaxPhy::ModulationType modulationType) const 
 
void SetTraceFilePath(std::string path)
 
double DoGetSamplingFactor(void) const 
 
void SetSymbolsPerFrame(uint32_t symbolsPerFrame)
set the number of symbols per frame 
 
TracedCallback< Ptr< PacketBurst > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it. 
 
double DoGetGValue(void) const 
 
void SetPsDuration(Time psDuration)
set the physical slot duration in seconds 
 
Time GetFrameDuration(void) const 
 
void SetBandwidth(uint32_t BW)
Set the bandwidth. 
 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
 
This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a mapping between ...
 
void CreateFecBlocks(const bvec &buffer, WimaxPhy::ModulationType modulationType)
 
void EndSendFecBlock(WimaxPhy::ModulationType modulationType, uint8_t direction)
 
TracedCallback< Ptr< PacketBurst > > m_phyTxBeginTrace
The trace source fired when a packet begins the transmission process on the medium. 
 
SNRToBlockErrorRateRecord * GetSNRToBlockErrorRateRecord(double SNR, uint8_t modulation)
returns a record of type SNRToBlockErrorRateRecord corresponding to a given modulation and SNR value ...
 
double GetTxGain(void) const 
 
Ptr< UniformRandomVariable > m_URNG
Provides uniform random variables. 
 
double GetSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
bvec ConvertBurstToBits(Ptr< const PacketBurst > burst)
 
void DoSetDataRates(void)
 
double GetRxGain(void) const 
 
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay. 
 
uint16_t m_nrRecivedFecBlocks
 
uint32_t m_nrFecBlocksSent
 
uint16_t DoGetTtg(void) const 
 
The SendParams class defines the parameters with which Send() function of a particular PHY is called...
 
Time GetBlockTransmissionTime(WimaxPhy::ModulationType modulationType) const 
 
Time DoGetFrameDuration(uint8_t frameDurationCode) const 
 
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit. 
 
void SetScanningCallback(void) const 
calls the scanning call back function 
 
Hold an unsigned integer type. 
 
void Send(Time BlockTime, uint32_t burstSize, Ptr< WimaxPhy > phy, bool isFirstBlock, bool isLastBlock, uint64_t frequency, WimaxPhy::ModulationType modulationType, uint8_t direction, double txPowerDbm, Ptr< PacketBurst > burst)
Sends a dummy fec block to all connected physical devices. 
 
uint32_t m_dataRateQpsk12
 
void EndReceive(Ptr< const PacketBurst > burst)
 
uint16_t DoGetNfft(void) const 
 
void ActivateLoss(bool loss)
If activate loss is called with false, all the returned BlcER will be 0 (no losses) ...
 
void SetPsPerSymbol(uint16_t psPerSymbol)
set the number of physical slots per symbol 
 
void SetTraceFilePath(char *traceFilePath)
Set the path of the repository containing the traces. 
 
Ptr< WimaxChannel > GetChannel(void) const 
 
void SetRxGain(double rxgain)
 
uint32_t m_dataRateQpsk34
 
uint8_t GetNrCarriers(void) const 
 
Ptr< PacketBurst > m_currentBurst
 
void LoadTraces(void)
Loads the traces form the repository specified in the constructor or setted by SetTraceFilePath funct...
 
void NotifyRxEnd(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxEnd trace. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
void StartSendDummyFecBlock(bool isFirstBlock, WimaxPhy::ModulationType modulationType, uint8_t direction)
 
static TypeId GetTypeId(void)
 
void SetChannelBandwidth(uint32_t channelBandwidth)
Set the channel bandwidth. 
 
double GetTxPower(void) const 
 
uint8_t GetDirection() const 
 
void DoDispose(void)
Destructor implementation. 
 
double GetNoiseFigure(void) const 
 
uint16_t DoGetRtg(void) const 
 
uint32_t m_currentBurstSize
 
uint16_t GetPsPerSymbol(void) const 
 
void DoAttach(Ptr< WimaxChannel > channel)
Attach the physical layer to a channel. 
 
void ActivateLoss(bool loss)
if called with true it will enable the loss model 
 
uint64_t DoGetNrBytes(uint32_t symbols, WimaxPhy::ModulationType modulationType) const 
 
uint64_t DoGetNrSymbols(uint32_t size, WimaxPhy::ModulationType modulationType) const 
 
void SetTxGain(double txgain)
 
void NotifyTxEnd(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxEnd trace. 
 
uint32_t CalculateDataRate(WimaxPhy::ModulationType modulationType) const 
 
uint32_t m_dataRateQam64_34
 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
 
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
TracedCallback< Ptr< PacketBurst > > m_phyRxBeginTrace
The trace source fired when a packet begins the reception process from the medium. 
 
std::string GetTraceFilePath(void) const 
 
void SetTxPower(double txPower)
set the transmission power 
 
TracedCallback< Ptr< PacketBurst > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium. ...
 
void SetSymbolDuration(Time symbolDuration)
set the OFMD symbol duration in second 
 
uint32_t m_dataRateBpsk12
 
uint16_t GetNrBlocks(uint32_t burstSize, WimaxPhy::ModulationType modulationType) const 
 
uint32_t GetBandwidth(void) const 
 
uint16_t m_nbErroneousBlock
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
Ptr< PacketBurst > ConvertBitsToBurst(bvec buffer)
 
Time Seconds(double value)
Construct a Time in the indicated unit. 
 
void SetState(PhyState state)
set the state of the device 
 
uint8_t GetModulationType() const 
 
uint32_t m_dataRateQam16_34
 
void SetBlockParameters(uint32_t burstSize, WimaxPhy::ModulationType modulationType)
 
WimaxPhy::PhyType GetPhyType(void) const 
returns the type this physical layer 
 
void SetNrCarriers(uint8_t nrCarriers)
Set the number of carriers in the physical frame. 
 
uint32_t CopyData(uint8_t *buffer, uint32_t size) const 
Copy the packet contents to a byte buffer. 
 
void GetModulationFecParams(WimaxPhy::ModulationType modulationType, uint8_t &bitsPerSymbol, double &fecCode) const 
 
Ptr< PacketBurst > GetBurst() const 
 
uint32_t GetFecBlockSize(WimaxPhy::ModulationType type) const 
 
static const uint32_t packetSize
 
uint64_t GetTxFrequency(void) const 
 
This class handles the SNR to BlcER traces. 
 
void DoSetPhyParameters(void)
 
EventId GetChnlSrchTimeoutEvent(void) const 
 
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
uint32_t m_dataRateQam16_12
 
void SetPsPerFrame(uint16_t psPerFrame)
set the number of physical slot per frame 
 
This class can be used to hold variables of floating point type such as 'double' or 'float'...
 
uint16_t m_nrRemainingBlocksToSend
 
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
a unique identifier for an interface. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
void ReLoadTraces(void)
Reloads the trace. 
 
PhyState GetState(void) const 
 
uint64_t GetScanningFrequency(void) const 
 
TracedCallback< Ptr< PacketBurst > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received. 
 
TracedCallback< Ptr< const PacketBurst > > m_traceTx
 
std::list< bvec > * m_fecBlocks