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]));
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
double GetRxGain(void) const
Get receive gain.
WimaxPhy::PhyType GetPhyType(void) const
returns the type this physical layer
Ptr< const AttributeChecker > MakeStringChecker(void)
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)
uint16_t m_blockSize
block size
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 the RngStream.
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.
Callback< void, Ptr< const PacketBurst > > GetReceiveCallback(void) const
uint32_t m_paddingBits
padding bits
uint32_t GetFecBlockSize(WimaxPhy::ModulationType type) const
Get FEC block size.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void EndReceiveFecBlock(uint32_t burstSize, WimaxPhy::ModulationType modulationType, uint8_t direction, uint8_t drop, Ptr< PacketBurst > burst)
End receive FEC block.
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
Hold variables of type string.
void Send(Ptr< PacketBurst > burst, WimaxPhy::ModulationType modulationType, uint8_t direction)
Sends a burst on the channel.
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.
Ptr< PacketBurst > GetBurst() const
TracedCallback< Ptr< const PacketBurst > > m_traceRx
trace receive callback
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
data rate
SimpleOfdmWimaxPhy class.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
SimpleOfdmWimaxChannel class.
uint16_t GetNrBlocks(uint32_t burstSize, WimaxPhy::ModulationType modulationType) const
Get number of blocks.
void InitSimpleOfdmWimaxPhy(void)
Initialize simple OFDM WIMAX Phy.
uint16_t DoGetNfft(void) const
Get NFFT.
EventId GetChnlSrchTimeoutEvent(void) const
Get channel search timeout event.
#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
a list of received FEC blocks until they are combined to recreate the full burst buffer ...
double GetTxGain(void) const
Get transmit gain.
SNRToBlockErrorRateManager * m_snrToBlockErrorRateManager
SNR to block error rate manager.
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.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
uint16_t m_fecBlockSize
in bits, size of FEC block transmitted after PHY operations
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...
uint32_t CalculateDataRate(WimaxPhy::ModulationType modulationType) const
Calculate data rate.
void NotifyTxBegin(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxBegin trace.
void EndSend(void)
End send.
void SetScanningCallback(void) const
calls the scanning call back function
Time DoGetTransmissionTime(uint32_t size, WimaxPhy::ModulationType modulationType) const
Get transmission time.
void SetTraceFilePath(std::string path)
Set trace file path.
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.
uint32_t GetBandwidth(void) const
void SetPsDuration(Time psDuration)
set the physical slot duration
void DoSetNfft(uint16_t nfft)
Set NFFT.
void SetBandwidth(uint32_t BW)
Set the bandwidth.
uint64_t GetTxFrequency(void) const
Get the transmission frequency.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
bvec RecreateBuffer()
Recreate buffer.
uint16_t DoGetRtg(void) const
Get RTG.
This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a mapping between ...
void CreateFecBlocks(const bvec &buffer, WimaxPhy::ModulationType modulationType)
Create FEC blocks.
void EndSendFecBlock(WimaxPhy::ModulationType modulationType, uint8_t direction)
End send FEC block.
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 ...
Ptr< UniformRandomVariable > m_URNG
Provides uniform random variables.
double m_noiseFigure
noise figure
bvec ConvertBurstToBits(Ptr< const PacketBurst > burst)
Convert burst to bits.
void DoSetDataRates(void)
Set data rates.
Time m_blockTime
block time
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
uint16_t m_nrRecivedFecBlocks
number received FEC blocks
uint32_t m_nrFecBlocksSent
counting the number of FEC blocks sent (within a burst)
The SendParams class defines the parameters with which Send() function of a particular PHY is called...
void GetModulationFecParams(WimaxPhy::ModulationType modulationType, uint8_t &bitsPerSymbol, double &fecCode) const
Get moduleation FEC parameters.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Hold an unsigned integer type.
double GetNoiseFigure(void) const
uint32_t m_dataRateQpsk12
data rate
void EndReceive(Ptr< const PacketBurst > burst)
End receive.
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
bool IsDuplex(void) const
Check if configured in duplex mode.
Ptr< WimaxChannel > GetChannel(void) const
void DoSetGValue(double g)
Set G value.
void SetTraceFilePath(char *traceFilePath)
Set the path of the repository containing the traces.
uint8_t DoGetFrameDurationCode(void) const
Get frame duration code.
void SetRxGain(double rxgain)
Set receive gsain.
Time DoGetFrameDuration(uint8_t frameDurationCode) const
Get frame duration.
uint32_t m_dataRateQpsk34
data rate
Ptr< PacketBurst > m_currentBurst
current burst
void LoadTraces(void)
Loads the traces form the repository specified in the constructor or set by SetTraceFilePath function...
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.
uint64_t DoGetNrBytes(uint32_t symbols, WimaxPhy::ModulationType modulationType) const
Get number of bytes.
void StartSendDummyFecBlock(bool isFirstBlock, WimaxPhy::ModulationType modulationType, uint8_t direction)
Start end dummy FEC block.
uint64_t GetScanningFrequency(void) const
Get the scanning frequency.
std::string GetTraceFilePath(void) const
Get trace file path.
static TypeId GetTypeId(void)
Get the type ID.
void SetChannelBandwidth(uint32_t channelBandwidth)
Set the channel bandwidth.
Time GetFrameDuration(void) const
Get the frame duration.
double DoGetSamplingFrequency(void) const
Get sampling frequency.
void DoDispose(void)
Destructor implementation.
uint32_t m_currentBurstSize
current burst size
uint32_t DoGetDataRate(WimaxPhy::ModulationType modulationType) const
Get data rate.
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
Time GetSymbolDuration(void) const
Get the OFDM symbol duration.
uint8_t GetDirection() const
void SetTxGain(double txgain)
Set transmit gain.
void NotifyTxEnd(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxEnd trace.
uint32_t m_dataRateQam64_34
data rate
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.
void SetTxPower(double txPower)
set the transmission power
ModulationType
ModulationType enumeration.
TracedCallback< Ptr< PacketBurst > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium. ...
uint32_t GetChannelBandwidth(void) const
Get the channel bandwidth.
void SetSymbolDuration(Time symbolDuration)
set the OFDM symbol duration
double m_txPower
transmit power
uint16_t GetPsPerSymbol(void) const
Get the number of physical slots per symbol.
uint32_t m_dataRateBpsk12
data rate
PhyType
PhyType enumeration.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
std::vector< bool > bvec
boolean vector typedef
uint16_t m_nbErroneousBlock
erroneous blocks
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Ptr< PacketBurst > ConvertBitsToBurst(bvec buffer)
Convert bits to burst.
Time Seconds(double value)
Construct a Time in the indicated unit.
uint16_t m_nrBlocks
number of blocks
uint32_t GetCodedFecBlockSize(WimaxPhy::ModulationType modulationType) const
Get coded FEC block size.
uint64_t DoGetNrSymbols(uint32_t size, WimaxPhy::ModulationType modulationType) const
Get number of symbols.
Time GetBlockTransmissionTime(WimaxPhy::ModulationType modulationType) const
Get block transmission time.
void SetState(PhyState state)
set the state of the device
uint32_t m_dataRateQam16_34
data rate
void SetBlockParameters(uint32_t burstSize, WimaxPhy::ModulationType modulationType)
Set block parameters.
uint64_t GetRxFrequency(void) const
Get the reception frequency.
void SetNrCarriers(uint8_t nrCarriers)
Set the number of carriers in the physical frame.
double DoGetGValue(void) const
Get G value.
uint16_t DoGetTtg(void) const
Get TTG.
static const uint32_t packetSize
This class handles the SNR to BlcER traces.
void DoSetPhyParameters(void)
Set Phy parameters.
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
data rate
void SetPsPerFrame(uint16_t psPerFrame)
set the number of physical slots per frame
PhyState GetState(void) const
Get the state of the device.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
uint16_t m_nrRemainingBlocksToSend
number of remaining blocks to send
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint8_t GetModulationType() const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
double m_rxGain
receive gain
uint8_t GetNrCarriers(void) const
Get the number of carriers in the physical frame.
void ReLoadTraces(void)
Reloads the trace.
double m_txGain
transmit gain
double GetTxPower(void) const
double DoGetSamplingFactor(void) const
Get sampling factor.
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
trace transmit callback
std::list< bvec > * m_fecBlocks
the FEC blocks