|
A Discrete-Event Network Simulator
|
API
|
Go to the documentation of this file.
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 EndSend(void)
End send.
Ptr< PacketBurst > ConvertBitsToBurst(bvec buffer)
Convert bits to burst.
a unique identifier for an interface.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint8_t GetModulationType() const
void SetScanningCallback(void) const
calls the scanning call back function
WimaxPhy::PhyType GetPhyType(void) const
returns the type this physical layer
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
SNRToBlockErrorRateManager * m_snrToBlockErrorRateManager
SNR to block error rate manager.
void SetBandwidth(uint32_t BW)
Set the bandwidth.
void SetChannelBandwidth(uint32_t channelBandwidth)
Set the channel bandwidth.
uint16_t m_blockSize
block size
void EndReceiveFecBlock(uint32_t burstSize, WimaxPhy::ModulationType modulationType, uint8_t direction, uint8_t drop, Ptr< PacketBurst > burst)
End receive FEC block.
void SetSNRToBlockErrorRateTracesPath(char *tracesPath)
Set the path of the repository containing the traces.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
double GetNoiseFigure(void) const
Ptr< UniformRandomVariable > m_URNG
Provides uniform random variables.
Time GetSymbolDuration(void) const
Get the OFDM symbol duration.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
TracedCallback< Ptr< const PacketBurst > > m_traceRx
trace receive callback
uint16_t GetPsPerSymbol(void) const
Get the number of physical slots per symbol.
Time DoGetTransmissionTime(uint32_t size, WimaxPhy::ModulationType modulationType) const
Get transmission time.
TracedCallback< Ptr< PacketBurst > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
Time m_blockTime
block time
std::string GetTraceFilePath(void)
@ FRAME_DURATION_12_POINT_5_MS
@ MODULATION_TYPE_QPSK_12
void DoSetNfft(uint16_t nfft)
Set NFFT.
double GetTxGain(void) const
Get transmit gain.
void InitSimpleOfdmWimaxPhy(void)
Initialize simple OFDM WIMAX Phy.
uint32_t m_dataRateQpsk12
data rate
void SetTraceFilePath(std::string path)
Set trace file path.
PhyState GetState(void) const
Get the state of the device.
double DoGetSamplingFactor(void) const
Get sampling factor.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
TracedCallback< Ptr< const PacketBurst > > m_traceTx
trace transmit callback
void SetPsDuration(Time psDuration)
set the physical slot duration
uint32_t GetBandwidth(void) const
void SetTraceFilePath(char *traceFilePath)
Set the path of the repository containing the traces.
uint16_t m_fecBlockSize
in bits, size of FEC block transmitted after PHY operations
void SetPsPerSymbol(uint16_t psPerSymbol)
set the number of physical slots per symbol
Callback< void, Ptr< const PacketBurst > > GetReceiveCallback(void) const
@ MODULATION_TYPE_BPSK_12
uint8_t DoGetFrameDurationCode(void) const
Get frame duration code.
Ptr< WimaxChannel > GetChannel(void) const
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
void SetState(PhyState state)
set the state of the device
uint32_t m_dataRateQpsk34
data rate
U * PeekPointer(const Ptr< U > &p)
TypeId SetParent(TypeId tid)
Set the parent TypeId.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
void NotifyRxEnd(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxEnd trace.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
@ MODULATION_TYPE_QAM64_23
uint16_t DoGetRtg(void) const
Get RTG.
void SetNrCarriers(uint8_t nrCarriers)
Set the number of carriers in the physical frame.
std::string GetTraceFilePath(void) const
Get trace file path.
This class represents a record (handled by SnrToBlockErrorRate manager) that keeps a mapping between ...
void StartSendDummyFecBlock(bool isFirstBlock, WimaxPhy::ModulationType modulationType, uint8_t direction)
Start end dummy FEC block.
This class handles the SNR to BlcER traces.
uint16_t m_nrRecivedFecBlocks
number received FEC blocks
double DoGetSamplingFrequency(void) const
Get sampling frequency.
uint32_t m_dataRateQam64_23
data rate
uint8_t GetDirection() const
bool IsDuplex(void) const
Check if configured in duplex mode.
Smart pointer class similar to boost::intrusive_ptr.
@ MODULATION_TYPE_QAM16_34
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
SimpleOfdmWimaxPhy class.
SNRToBlockErrorRateRecord * GetSNRToBlockErrorRateRecord(double SNR, uint8_t modulation)
returns a record of type SNRToBlockErrorRateRecord corresponding to a given modulation and SNR value
void EndReceive(Ptr< const PacketBurst > burst)
End receive.
Ptr< PacketBurst > GetBurst() const
ModulationType
ModulationType enumeration.
@ MODULATION_TYPE_QPSK_34
void NotifyRxDrop(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxDrop trace.
uint64_t DoGetNrSymbols(uint32_t size, WimaxPhy::ModulationType modulationType) const
Get number of symbols.
void NotifyTxEnd(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxEnd trace.
std::vector< bool > bvec
boolean vector typedef
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint32_t GetCodedFecBlockSize(WimaxPhy::ModulationType modulationType) const
Get coded FEC block size.
EventId GetChnlSrchTimeoutEvent(void) const
Get channel search timeout event.
void CreateFecBlocks(const bvec &buffer, WimaxPhy::ModulationType modulationType)
Create FEC blocks.
uint32_t CalculateDataRate(WimaxPhy::ModulationType modulationType) const
Calculate data rate.
void SetSymbolsPerFrame(uint32_t symbolsPerFrame)
set the number of symbols per frame
void NotifyRxBegin(Ptr< PacketBurst > burst)
Public method used to fire a PhyRxBegin trace.
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...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
SimpleOfdmWimaxChannel class.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void DoSetDataRates(void)
Set data rates.
void SetBlockParameters(uint32_t burstSize, WimaxPhy::ModulationType modulationType)
Set block parameters.
void DoAttach(Ptr< WimaxChannel > channel)
Attach the physical layer to a channel.
uint16_t DoGetNfft(void) const
Get NFFT.
Ptr< PacketBurst > m_currentBurst
current burst
@ MODULATION_TYPE_QAM16_12
void GetModulationFecParams(WimaxPhy::ModulationType modulationType, uint8_t &bitsPerSymbol, double &fecCode) const
Get moduleation FEC parameters.
uint64_t DoGetNrBytes(uint32_t symbols, WimaxPhy::ModulationType modulationType) const
Get number of bytes.
Simulation virtual time values and global simulation resolution.
void NotifyTxDrop(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxDrop trace.
uint32_t m_dataRateQam64_34
data rate
uint32_t m_dataRateQam16_12
data rate
PhyType
PhyType enumeration.
TracedCallback< Ptr< PacketBurst > > m_phyTxBeginTrace
The trace source fired when a packet begins the transmission process on the medium.
double m_noiseFigure
noise figure
void DoDispose(void)
Destructor implementation.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
uint32_t m_nrFecBlocksSent
counting the number of FEC blocks sent (within a burst)
TracedCallback< Ptr< PacketBurst > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium.
virtual void DoDispose(void)
Destructor implementation.
void DoSetGValue(double g)
Set G value.
double DoGetGValue(void) const
Get G value.
void ReLoadTraces(void)
Reloads the trace.
void SetTxGain(double txgain)
Set transmit gain.
Hold variables of type string.
@ MODULATION_TYPE_QAM64_34
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
uint32_t GetChannelBandwidth(void) const
Get the channel bandwidth.
void ActivateLoss(bool loss)
if called with true it will enable the loss model
uint16_t m_nrRemainingBlocksToSend
number of remaining blocks to send
bvec ConvertBurstToBits(Ptr< const PacketBurst > burst)
Convert burst to bits.
static const uint32_t packetSize
void ActivateLoss(bool loss)
If activate loss is called with false, all the returned BlcER will be 0 (no losses)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
void SetSymbolDuration(Time symbolDuration)
set the OFDM symbol duration
static TypeId GetTypeId(void)
Get the type ID.
double m_txGain
transmit gain
Time Seconds(double value)
Construct a Time in the indicated unit.
uint16_t m_nbErroneousBlock
erroneous blocks
double GetTxPower(void) const
uint16_t m_nrBlocks
number of blocks
void SetTxPower(double txPower)
set the transmission power
double m_txPower
transmit power
uint64_t GetRxFrequency(void) const
Get the reception frequency.
std::list< bvec > * m_fecBlocks
the FEC blocks
void Send(Ptr< PacketBurst > burst, WimaxPhy::ModulationType modulationType, uint8_t direction)
Sends a burst on the channel.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
uint32_t m_dataRateBpsk12
data rate
uint32_t m_dataRateQam16_34
data rate
Time GetFrameDuration(void) const
Get the frame duration.
TracedCallback< Ptr< PacketBurst > > m_phyRxEndTrace
The trace source fired when a packet ends the reception process from the medium.
uint16_t GetNrBlocks(uint32_t burstSize, WimaxPhy::ModulationType modulationType) const
Get number of blocks.
Ptr< const AttributeChecker > MakeStringChecker(void)
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
TracedCallback< Ptr< PacketBurst > > m_phyRxBeginTrace
The trace source fired when a packet begins the reception process from the medium.
uint32_t m_paddingBits
padding bits
Hold an unsigned integer type.
void SetPsPerFrame(uint16_t psPerFrame)
set the number of physical slots per frame
The SendParams class defines the parameters with which Send() function of a particular PHY is called.
uint32_t m_currentBurstSize
current burst size
uint32_t GetFecBlockSize(WimaxPhy::ModulationType type) const
Get FEC block size.
void SetRxGain(double rxgain)
Set receive gsain.
uint32_t DoGetDataRate(WimaxPhy::ModulationType modulationType) const
Get data rate.
std::list< bvec > * m_receivedFecBlocks
a list of received FEC blocks until they are combined to recreate the full burst buffer
uint64_t GetScanningFrequency(void) const
Get the scanning frequency.
Time DoGetFrameDuration(uint8_t frameDurationCode) const
Get frame duration.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SetNoiseFigure(double nf)
set the noise figure of the device
uint8_t GetNrCarriers(void) const
Get the number of carriers in the physical frame.
uint16_t DoGetTtg(void) const
Get TTG.
@ FRAME_DURATION_2_POINT_5_MS
void LoadTraces(void)
Loads the traces form the repository specified in the constructor or set by SetTraceFilePath function...
void NotifyTxBegin(Ptr< PacketBurst > burst)
Public method used to fire a PhyTxBegin trace.
TracedCallback< Ptr< PacketBurst > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it.
void DoSetPhyParameters(void)
Set Phy parameters.
Time GetBlockTransmissionTime(WimaxPhy::ModulationType modulationType) const
Get block transmission time.
~SimpleOfdmWimaxPhy(void)
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
bvec RecreateBuffer()
Recreate buffer.
double GetRxGain(void) const
Get receive gain.
double m_rxGain
receive gain
void EndSendFecBlock(WimaxPhy::ModulationType modulationType, uint8_t direction)
End send FEC block.
void SetSimplex(uint64_t frequency)
configure the physical layer in simplex mode
uint64_t GetTxFrequency(void) const
Get the transmission frequency.
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