satellite-orbiter-feeder-phy.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013 Magister Solutions Ltd.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Sami Rantanen <sami.rantanen@magister.fi>
19  * Bastien Tauran <bastien.tauran@viveris.fr>
20  */
21 
23 
24 #include "satellite-address-tag.h"
26 #include "satellite-channel.h"
27 #include "satellite-mac.h"
28 #include "satellite-phy-rx.h"
29 #include "satellite-phy-tx.h"
31 #include "satellite-time-tag.h"
32 #include "satellite-topology.h"
34 #include "satellite-utils.h"
35 
36 #include <ns3/double.h>
37 #include <ns3/enum.h>
38 #include <ns3/log.h>
39 #include <ns3/pointer.h>
40 #include <ns3/simulator.h>
41 #include <ns3/singleton.h>
42 #include <ns3/uinteger.h>
43 
44 #include <limits>
45 #include <queue>
46 #include <tuple>
47 
48 NS_LOG_COMPONENT_DEFINE("SatOrbiterFeederPhy");
49 
50 namespace ns3
51 {
52 
53 NS_OBJECT_ENSURE_REGISTERED(SatOrbiterFeederPhy);
54 
55 TypeId
57 {
58  static TypeId tid =
59  TypeId("ns3::SatOrbiterFeederPhy")
60  .SetParent<SatPhy>()
61  .AddConstructor<SatOrbiterFeederPhy>()
62  .AddAttribute("PhyRx",
63  "The PhyRx layer attached to this phy.",
64  PointerValue(),
65  MakePointerAccessor(&SatPhy::GetPhyRx, &SatPhy::SetPhyRx),
66  MakePointerChecker<SatPhyRx>())
67  .AddAttribute("PhyTx",
68  "The PhyTx layer attached to this phy.",
69  PointerValue(),
70  MakePointerAccessor(&SatPhy::GetPhyTx, &SatPhy::SetPhyTx),
71  MakePointerChecker<SatPhyTx>())
72  .AddAttribute("RxTemperatureDbk",
73  "RX noise temperature in orbiter Feeder in dBK.",
74  DoubleValue(28.4),
75  MakeDoubleAccessor(&SatPhy::GetRxNoiseTemperatureDbk,
77  MakeDoubleChecker<double>())
78  .AddAttribute(
79  "RxMaxAntennaGainDb",
80  "Maximum RX gain in dB",
81  DoubleValue(54.00),
83  MakeDoubleChecker<double_t>())
84  .AddAttribute(
85  "TxMaxAntennaGainDb",
86  "Maximum TX gain in dB",
87  DoubleValue(54.00),
89  MakeDoubleChecker<double_t>())
90  .AddAttribute("TxMaxPowerDbw",
91  "Maximum TX power in dB",
92  DoubleValue(-4.38),
94  MakeDoubleChecker<double>())
95  .AddAttribute(
96  "TxOutputLossDb",
97  "TX Output loss in dB",
98  DoubleValue(1.75),
100  MakeDoubleChecker<double>())
101  .AddAttribute(
102  "TxPointingLossDb",
103  "TX Pointing loss in dB",
104  DoubleValue(0.00),
106  MakeDoubleChecker<double>())
107  .AddAttribute("TxOboLossDb",
108  "TX OBO loss in dB",
109  DoubleValue(4.00),
110  MakeDoubleAccessor(&SatPhy::GetTxOboLossDb, &SatPhy::SetTxOboLossDb),
111  MakeDoubleChecker<double>())
112  .AddAttribute(
113  "TxAntennaLossDb",
114  "TX Antenna loss in dB",
115  DoubleValue(1.00),
117  MakeDoubleChecker<double>())
118  .AddAttribute(
119  "RxAntennaLossDb",
120  "RX Antenna loss in dB",
121  DoubleValue(1.00),
123  MakeDoubleChecker<double>())
124  .AddAttribute("DefaultFadingValue",
125  "Default value for fading",
126  DoubleValue(1.00),
127  MakeDoubleAccessor(&SatPhy::GetDefaultFading, &SatPhy::SetDefaultFading),
128  MakeDoubleChecker<double_t>())
129  .AddAttribute("ExtNoisePowerDensityDbwhz",
130  "Other system interference, C over I in dB.",
131  DoubleValue(-207.0),
133  MakeDoubleChecker<double>())
134  .AddAttribute("ImIfCOverIDb",
135  "Adjacent channel interference, C over I in dB.",
136  DoubleValue(27.0),
138  MakeDoubleChecker<double>())
139  .AddAttribute("FixedAmplificationGainDb",
140  "Fixed amplification gain used in RTN link at the satellite.",
141  DoubleValue(82.0),
143  MakeDoubleChecker<double>())
144  .AddAttribute("QueueSize",
145  "Maximum size of FIFO m_queue in bytes.",
146  UintegerValue(100000),
147  MakeUintegerAccessor(&SatOrbiterFeederPhy::m_queueSizeMax),
148  MakeUintegerChecker<uint32_t>())
149  .AddTraceSource("QueueSizeBytes",
150  "Send number of bytes in FIFO return feeder queue",
151  MakeTraceSourceAccessor(&SatOrbiterFeederPhy::m_queueSizeBytesTrace),
152  "ns3::SatStatsRtnFeederQueueHelper::QueueSizeCallback")
153  .AddTraceSource("QueueSizePackets",
154  "Send number of packets in FIFO return feeder queue",
155  MakeTraceSourceAccessor(&SatOrbiterFeederPhy::m_queueSizePacketsTrace),
156  "ns3::SatStatsRtnFeederQueueHelper::QueueSizeCallback");
157  return tid;
158 }
159 
160 TypeId
162 {
163  NS_LOG_FUNCTION(this);
164 
165  return GetTypeId();
166 }
167 
169  : m_extNoisePowerDensityDbwHz(-207.0),
170  m_imInterferenceCOverIDb(27.0),
171  m_imInterferenceCOverI(SatUtils::DbToLinear(m_imInterferenceCOverIDb)),
172  m_fixedAmplificationGainDb(82.0),
173  m_queueSizeBytes(0),
174  m_queueSizePackets(0)
175 {
176  NS_LOG_FUNCTION(this);
177  NS_FATAL_ERROR("SatOrbiterFeederPhy default constructor is not allowed to use");
178 }
179 
181  Ptr<SatLinkResults> linkResults,
182  SatPhyRxCarrierConf::RxCarrierCreateParams_s parameters,
183  Ptr<SatSuperframeConf> superFrameConf)
184  : SatPhy(params)
185 {
186  NS_LOG_FUNCTION(this);
187 
188  m_forwardLinkRegenerationMode = Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode();
189  m_returnLinkRegenerationMode = Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode();
190  m_isSending = false;
191  m_queueSizeBytes = 0;
192  m_queueSizePackets = 0;
193 
195  {
196  m_queue = std::queue<std::tuple<Ptr<SatSignalParameters>, uint32_t, uint32_t>>();
197  }
198 
200  {
201  SatPhy::GetPhyTx()->SetAttribute("TxMode", EnumValue(SatPhyTx::TRANSPARENT));
202  }
203  else
204  {
205  SatPhy::GetPhyTx()->SetAttribute("TxMode", EnumValue(SatPhyTx::NORMAL));
206  }
207 
208  ObjectBase::ConstructSelf(AttributeConstructionList());
209 
211 
212  // Configure the SatPhyRxCarrier instances
213  // Note, that in satellite, there is no need for error modeling.
214 
215  parameters.m_rxTemperatureK = SatUtils::DbToLinear(SatPhy::GetRxNoiseTemperatureDbk());
216  parameters.m_extNoiseDensityWhz = SatUtils::DbToLinear(m_extNoisePowerDensityDbwHz);
217  parameters.m_aciIfWrtNoiseFactor = 0.0;
219  {
220  parameters.m_rxMode = SatPhyRxCarrierConf::TRANSPARENT;
221  }
222  else
223  {
224  parameters.m_rxMode = SatPhyRxCarrierConf::NORMAL;
225  }
226  parameters.m_linkRegenerationMode = m_forwardLinkRegenerationMode;
227  parameters.m_chType = SatEnums::FORWARD_FEEDER_CH;
228 
229  Ptr<SatPhyRxCarrierConf> carrierConf = CreateObject<SatPhyRxCarrierConf>(parameters);
230 
231  if (linkResults)
232  {
233  carrierConf->SetLinkResults(linkResults);
234  }
235 
236  carrierConf->SetAdditionalInterferenceCb(
238 
239  SatPhy::ConfigureRxCarriers(carrierConf, superFrameConf);
240 }
241 
243 {
244  NS_LOG_FUNCTION(this);
245 }
246 
247 void
249 {
250  NS_LOG_FUNCTION(this);
251  Object::DoDispose();
252 }
253 
254 void
256 {
257  NS_LOG_FUNCTION(this);
258  Object::DoInitialize();
259 }
260 
261 void
262 SatOrbiterFeederPhy::SendPduWithParams(Ptr<SatSignalParameters> txParams)
263 {
264  NS_LOG_FUNCTION(this << txParams);
265  NS_LOG_INFO(this << " sending a packet with carrierId: " << txParams->m_carrierId
266  << " duration: " << txParams->m_duration);
267 
269  {
270  SetTimeTag(txParams->m_packetsInBurst);
271  }
272 
273  // copy as sender own PhyTx object (at satellite) to ensure right distance calculation
274  // and antenna gain getting at receiver (UT or GW)
275  // copy on tx power too.
276 
277  txParams->m_phyTx = m_phyTx;
278 
288  {
289  txParams->m_txPower_W =
290  txParams->m_rxPower_W * SatUtils::DbToLinear(m_fixedAmplificationGainDb);
291  }
292  else
293  {
294  txParams->m_txPower_W = m_eirpWoGainW;
295  }
296 
297  NS_LOG_INFO("Amplified Tx power: " << SatUtils::LinearToDb(txParams->m_txPower_W));
298  NS_LOG_INFO("Statically configured tx power: " << SatUtils::LinearToDb(m_eirpWoGainW));
299 
301 
303  {
304  uint32_t nbBytes = 0;
305  for (Ptr<Packet> pkt : txParams->m_packetsInBurst)
306  {
307  nbBytes += pkt->GetSize();
308  }
309  uint32_t nbPackets = txParams->m_packetsInBurst.size();
310  if (m_queueSizeBytes + nbBytes < m_queueSizeMax)
311  {
312  event = SatEnums::PACKET_ENQUE;
313  m_queue.push(std::make_tuple(txParams, nbBytes, nbPackets));
314  m_queueSizeBytes += nbBytes;
315  m_queueSizePackets += nbPackets;
316 
318  GetE2ESourceAddress(txParams->m_packetsInBurst));
320  GetE2ESourceAddress(txParams->m_packetsInBurst));
321 
322  if (m_isSending == false)
323  {
324  SendFromQueue();
325  }
326  }
327  else
328  {
329  event = SatEnums::PACKET_DROP;
330  NS_LOG_INFO("Packet dropped because REGENERATION_PHY queue is full");
331  }
332  }
333  else
334  {
335  event = SatEnums::PACKET_SENT;
336  m_phyTx->StartTx(txParams);
337  }
338 
339  // Add packet trace entry:
340  m_packetTrace(Simulator::Now(),
341  event,
342  m_nodeInfo->GetNodeType(),
343  m_nodeInfo->GetNodeId(),
344  m_nodeInfo->GetMacAddress(),
347  SatUtils::GetPacketInfo(txParams->m_packetsInBurst));
348 }
349 
350 void
352 {
353  if (m_queue.empty())
354  {
355  NS_FATAL_ERROR("Trying to deque an empty queue");
356  }
357  m_isSending = true;
358  std::tuple<Ptr<SatSignalParameters>, uint32_t, uint32_t> element = m_queue.front();
359  m_queue.pop();
360 
361  Ptr<SatSignalParameters> txParams = std::get<0>(element);
362  m_queueSizeBytes -= std::get<1>(element);
363  m_queueSizePackets -= std::get<2>(element);
364 
365  m_queueSizeBytesTrace(m_queueSizeBytes, GetE2ESourceAddress(txParams->m_packetsInBurst));
366  m_queueSizePacketsTrace(m_queueSizePackets, GetE2ESourceAddress(txParams->m_packetsInBurst));
367 
368  // Add sent packet trace entry:
369  m_packetTrace(Simulator::Now(),
371  m_nodeInfo->GetNodeType(),
372  m_nodeInfo->GetNodeId(),
373  m_nodeInfo->GetMacAddress(),
376  SatUtils::GetPacketInfo(txParams->m_packetsInBurst));
377 
378  Simulator::Schedule(txParams->m_duration + NanoSeconds(1), &SatOrbiterFeederPhy::EndTx, this);
379 
380  m_phyTx->StartTx(txParams);
381 }
382 
383 void
385 {
386  m_isSending = false;
387  if (!m_queue.empty())
388  {
389  this->SendFromQueue();
390  }
391 }
392 
393 void
395 {
396  NS_LOG_FUNCTION(this);
397 
399  {
400  SatSignalParameters::PacketsInBurst_t::iterator it1;
401  for (it1 = packets.begin(); it1 != packets.end(); ++it1)
402  {
403  Address addr; // invalid address.
404 
405  SatAddressE2ETag addressE2ETag;
406  if ((*it1)->PeekPacketTag(addressE2ETag))
407  {
408  NS_LOG_DEBUG(this << " contains a SatMac tag");
409  addr = addressE2ETag.GetE2EDestAddress();
410  }
411 
412  m_rxTrace(*it1, addr);
413 
414  SatPhyLinkTimeTag linkTimeTag;
415  if ((*it1)->RemovePacketTag(linkTimeTag))
416  {
417  NS_LOG_DEBUG(this << " contains a SatPhyLinkTimeTag tag");
418  Time delay = Simulator::Now() - linkTimeTag.GetSenderLinkTimestamp();
419  m_rxLinkDelayTrace(delay, addr);
420  if (m_lastLinkDelay.IsZero() == false)
421  {
422  Time jitter = Abs(delay - m_lastLinkDelay);
423  m_rxLinkJitterTrace(jitter, addr);
424  }
425  m_lastLinkDelay = delay;
426  }
427 
428  } // end of `for (it1 = rxParams->m_packetsInBurst)`
429 
430  } // end of `if (m_isStatisticsTagsEnabled)`
431 }
432 
433 void
434 SatOrbiterFeederPhy::Receive(Ptr<SatSignalParameters> rxParams, bool phyError)
435 {
436  NS_LOG_FUNCTION(this << rxParams);
437 
439 
440  // Add packet trace entry:
441  m_packetTrace(Simulator::Now(),
442  event,
443  m_nodeInfo->GetNodeType(),
444  m_nodeInfo->GetNodeId(),
445  m_nodeInfo->GetMacAddress(),
448  SatUtils::GetPacketInfo(rxParams->m_packetsInBurst));
449 
450  if (phyError)
451  {
452  // If there was a PHY error, the packet is dropped here.
453  NS_LOG_INFO(this << " dropped " << rxParams->m_packetsInBurst.size()
454  << " packets because of PHY error.");
455  }
456  else
457  {
459  {
461  break;
464  rxParams->m_txInfo.packetType = SatEnums::PACKET_TYPE_DEDICATED_ACCESS;
465 
466  SatSignalParameters::PacketsInBurst_t::iterator it;
467  for (it = rxParams->m_packetsInBurst.begin(); it != rxParams->m_packetsInBurst.end();
468  it++)
469  {
470  SatUplinkInfoTag satUplinkInfoTag;
471  (*it)->RemovePacketTag(satUplinkInfoTag);
472  satUplinkInfoTag.SetSatId(rxParams->m_satId);
473  satUplinkInfoTag.SetBeamId(rxParams->m_beamId);
474  (*it)->AddPacketTag(satUplinkInfoTag);
475  }
476 
477  RxTraces(rxParams->m_packetsInBurst);
478 
479  ModcodTrace(rxParams);
480 
481  break;
482  }
483  default:
484  NS_FATAL_ERROR("Unknown regeneration mode");
485  }
486 
487  m_rxCallback(rxParams->m_packetsInBurst, rxParams);
488  }
489 }
490 
491 double
493 {
494  NS_LOG_FUNCTION(this);
495 
496  return m_imInterferenceCOverI;
497 }
498 
501 {
502  return SatEnums::LD_RETURN;
503 }
504 
507 {
508  return SatEnums::LD_FORWARD;
509 }
510 
511 Address
513 {
514  SatSignalParameters::PacketsInBurst_t::iterator it1;
515  for (it1 = packets.begin(); it1 != packets.end(); ++it1)
516  {
517  Address addr; // invalid address.
518  ByteTagIterator it2 = (*it1)->GetByteTagIterator();
519 
520  while (it2.HasNext())
521  {
522  ByteTagIterator::Item item = it2.Next();
523 
524  if (item.GetTypeId() == SatAddressTag::GetTypeId())
525  {
526  SatAddressTag addrTag;
527  item.GetTag(addrTag);
528  return addrTag.GetSourceAddress();
529  }
530  }
531  }
532  return Mac48Address();
533 }
534 
535 } // namespace ns3
This class implements a tag that carries the satellite MAC of GW and UT.
Mac48Address GetE2EDestAddress(void) const
Get E2E destination MAC address.
This class implements a tag that carries the MAC address of the sender of the packet.
static TypeId GetTypeId()
Inherited from ObjectBase base class.
Address GetSourceAddress() const
Get the source address.
SatLinkDir_t
Link direction used for packet tracing.
SatPacketEvent_t
Packet event used for packet tracing.
virtual void DoInitialize(void)
Initialization of SatPhy.
virtual double GetAdditionalInterference()
Get additional interference, used to compute final SINR at RX.
std::queue< std::tuple< Ptr< SatSignalParameters >, uint32_t, uint32_t > > m_queue
Simple FIFO queue to avoid collisions on TX in case of REGENERATION_PHY.
virtual ~SatOrbiterFeederPhy()
Destructor for SatOrbiterFeederPhy.
virtual void RxTraces(SatPhy::PacketContainer_t packets)
Invoke the Rx trace source for each received packet.
virtual SatEnums::SatLinkDir_t GetSatLinkTxDir()
Get the link TX direction.
double m_extNoisePowerDensityDbwHz
Configured external noise power.
static TypeId GetTypeId(void)
inherited from Object
double m_fixedAmplificationGainDb
Fixed amplification gain used in RTN link at the satellite.
virtual SatEnums::SatLinkDir_t GetSatLinkRxDir()
Get the link RX direction.
double m_imInterferenceCOverI
Intermodulation interference in linear.
TracedCallback< uint32_t, const Address & > m_queueSizeBytesTrace
Traced callback to monitor RTN feeder queue size in bytes.
TracedCallback< uint32_t, const Address & > m_queueSizePacketsTrace
Traced callback to monitor RTN feeder queue size in packets.
Address GetE2ESourceAddress(SatPhy::PacketContainer_t packets)
Get source address of packets.
bool m_isSending
Indicates if a packet is already being sent.
void SendFromQueue()
Send a packet from the queue.
virtual void Receive(Ptr< SatSignalParameters > rxParams, bool phyError)
Receives packets from lower layer.
uint32_t m_queueSizeBytes
Size of FIFO queue in bytes.
virtual void SendPduWithParams(Ptr< SatSignalParameters > rxParams)
Send Pdu to the PHY tx module (for satellite switch packet forwarding)
SatEnums::RegenerationMode_t m_forwardLinkRegenerationMode
Regeneration mode on forward link.
double m_imInterferenceCOverIDb
Configured Intermodulation interference in dB.
uint32_t m_queueSizePackets
Size of FIFO queue in packets.
uint32_t m_queueSizeMax
Maximum size of FIFO m_queue in bytes.
virtual void DoDispose(void)
Dispose of this class instance.
SatEnums::RegenerationMode_t m_returnLinkRegenerationMode
Regeneration mode on return link.
SatOrbiterFeederPhy(void)
Default constructor.
void EndTx()
Notify a packet has finished being sent.
The SatPhy models the basic physical layer of the satellite system.
Definition: satellite-phy.h:62
void SetTxPointingLossDb(double lossDb)
Set the pointing loss of the transmitter in dB.
TracedCallback< Time, SatEnums::SatPacketEvent_t, SatEnums::SatNodeType_t, uint32_t, Mac48Address, SatEnums::SatLogLevel_t, SatEnums::SatLinkDir_t, std::string > m_packetTrace
Trace callback used for packet tracing:
void SetTimeTag(SatPhy::PacketContainer_t packets)
Set SatPhyTimeTag of packets.
void SetRxAntennaGainDb(double gainDb)
Set the maximum antenna gain of the receiver in dB.
void ConfigureRxCarriers(Ptr< SatPhyRxCarrierConf > carrierConf, Ptr< SatSuperframeConf > superFrameConf)
Configure Rx carriers.
virtual Ptr< SatPhyTx > GetPhyTx() const
Get the SatPhyTx pointer.
void SetTxOboLossDb(double lossDb)
Set the OBO loss of the transmitter in dB.
TracedCallback< const Time &, const Address & > m_rxLinkDelayTrace
Traced callback for all received packets, including link delay information and the address of the sen...
void SetDefaultFading(double fading)
Set the default fading of the PHY.
double GetTxOutputLossDb() const
Get the output loss of the transmitter in dB.
double GetTxAntennaGainDb() const
Get the maximum antenna gain of the transmitter in dB.
virtual Ptr< SatPhyRx > GetPhyRx() const
Get the SatPhyRx pointer.
void SetTxOutputLossDb(double lossDb)
Set the output loss of the transmitter in dB.
double GetTxPointingLossDb() const
Get the pointing loss of the transmitter in dB.
Ptr< SatNodeInfo > m_nodeInfo
Node info containing node related information, such as node type, node id and MAC address (of the Sat...
double GetDefaultFading() const
Get the default fading of the PHY.
double GetTxMaxPowerDbw() const
Get the maximum transmit power of the transmitter in dB.
double GetTxOboLossDb() const
Get the OBO loss of the transmitter in dB.
void SetTxMaxPowerDbw(double powerDb)
Set the maximum transmit power of the transmitter in dB.
TracedCallback< Ptr< const Packet >, const Address & > m_rxTrace
Traced callback for all received packets, including the address of the senders.
double GetRxAntennaGainDb() const
Get the maximum antenna gain of the receiver in dB.
double m_eirpWoGainW
Calculated EIRP without gain in W.
virtual void SetPhyTx(Ptr< SatPhyTx > phyTx)
Set the SatPhyTx module.
void SetRxAntennaLossDb(double lossDb)
Set the antenna loss of the receiver in dB.
void SetRxNoiseTemperatureDbk(double temperatureDbk)
Set the noise temperature of the receiver in dbK.
double GetRxNoiseTemperatureDbk() const
Get the noise temperature of the receiver in dbK.
double GetRxAntennaLossDb() const
Get the antenna loss of the receiver in dB.
Ptr< SatPhyTx > m_phyTx
Pointer to internal SatPhyTx instance.
void ModcodTrace(Ptr< SatSignalParameters > rxParams)
Invoke the RxLinkModcod trace source for each received packet.
void SetTxAntennaGainDb(double gainDb)
Set the maximum antenna gain of the transmitter in dB.
bool m_isStatisticsTagsEnabled
EnableStatisticsTags attribute.
Time m_lastLinkDelay
Last delay measurement for link.
SatSignalParameters::PacketsInBurst_t PacketContainer_t
Define PacketContainer in SatPhy.
Definition: satellite-phy.h:79
void SetTxAntennaLossDb(double lossDb)
Set the antenna loss of the transmitter in dB.
virtual void SetPhyRx(Ptr< SatPhyRx > phyRx)
Set the SatPhyRx module.
SatPhy::ReceiveCallback m_rxCallback
The upper layer package receive callback.
TracedCallback< const Time &, const Address & > m_rxLinkJitterTrace
Traced callback for all received packets, including link jitter information and the address of the se...
double GetTxAntennaLossDb() const
Get the antenna loss of the transmitter in dB.
SatUtils class is for general conversions used in satellite module.
static T DbToLinear(T db)
Converts decibels to linear.
static T LinearToDb(T linear)
Converts linear to decibels.
static std::string GetPacketInfo(const Ptr< const Packet > p)
Get packet information in std::string for printing purposes.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
Creation parameters for base PHY object.