Loading...
Searching...
No Matches
satellite-orbiter-user-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
26#include "satellite-channel.h"
27#include "satellite-mac-tag.h"
28#include "satellite-mac.h"
29#include "satellite-phy-rx.h"
30#include "satellite-phy-tx.h"
32#include "satellite-time-tag.h"
33#include "satellite-topology.h"
35#include "satellite-utils.h"
36
37#include "ns3/double.h"
38#include "ns3/enum.h"
39#include "ns3/log.h"
40#include "ns3/pointer.h"
41#include "ns3/simulator.h"
42#include "ns3/singleton.h"
43#include "ns3/uinteger.h"
44
45#include <limits>
46#include <queue>
47#include <tuple>
48
49NS_LOG_COMPONENT_DEFINE("SatOrbiterUserPhy");
50
51namespace ns3
52{
53
54NS_OBJECT_ENSURE_REGISTERED(SatOrbiterUserPhy);
55
56TypeId
58{
59 static TypeId tid =
60 TypeId("ns3::SatOrbiterUserPhy")
61 .SetParent<SatPhy>()
62 .AddConstructor<SatOrbiterUserPhy>()
63 .AddAttribute("PhyRx",
64 "The PhyRx layer attached to this phy.",
65 PointerValue(),
66 MakePointerAccessor(&SatPhy::GetPhyRx, &SatPhy::SetPhyRx),
67 MakePointerChecker<SatPhyRx>())
68 .AddAttribute("PhyTx",
69 "The PhyTx layer attached to this phy.",
70 PointerValue(),
71 MakePointerAccessor(&SatPhy::GetPhyTx, &SatPhy::SetPhyTx),
72 MakePointerChecker<SatPhyTx>())
73 .AddAttribute("RxTemperatureDbk",
74 "RX noise temperature in orbiter User in dBK.",
75 DoubleValue(28.4),
76 MakeDoubleAccessor(&SatPhy::GetRxNoiseTemperatureDbk,
78 MakeDoubleChecker<double>())
79 .AddAttribute(
80 "RxMaxAntennaGainDb",
81 "Maximum RX antenna gain in Db",
82 DoubleValue(54.00),
84 MakeDoubleChecker<double_t>())
85 .AddAttribute(
86 "TxMaxAntennaGainDb",
87 "Maximum TX gain in dB",
88 DoubleValue(54.00),
90 MakeDoubleChecker<double_t>())
91 .AddAttribute("TxMaxPowerDbw",
92 "Maximum TX power in dB",
93 DoubleValue(15.00),
95 MakeDoubleChecker<double>())
96 .AddAttribute(
97 "TxOutputLossDb",
98 "TX Output loss in dB",
99 DoubleValue(2.85),
101 MakeDoubleChecker<double>())
102 .AddAttribute(
103 "TxPointingLossDb",
104 "TX Pointing loss in dB",
105 DoubleValue(0.00),
107 MakeDoubleChecker<double>())
108 .AddAttribute("TxOboLossDb",
109 "TX OBO loss in dB",
110 DoubleValue(0.00),
111 MakeDoubleAccessor(&SatPhy::GetTxOboLossDb, &SatPhy::SetTxOboLossDb),
112 MakeDoubleChecker<double>())
113 .AddAttribute(
114 "TxAntennaLossDb",
115 "TX Antenna loss in dB",
116 DoubleValue(1.00),
118 MakeDoubleChecker<double>())
119 .AddAttribute(
120 "RxAntennaLossDb",
121 "RX Antenna loss in dB",
122 DoubleValue(1.00),
124 MakeDoubleChecker<double>())
125 .AddAttribute("DefaultFadingValue",
126 "Default value for fading",
127 DoubleValue(1.00),
129 MakeDoubleChecker<double_t>())
130 .AddAttribute("OtherSysIfCOverIDb",
131 "Other system interference, C over I in dB.",
132 DoubleValue(27.5),
134 MakeDoubleChecker<double>())
135 .AddAttribute("AciIfCOverIDb",
136 "Adjacent channel interference, C over I in dB.",
137 DoubleValue(17.0),
139 MakeDoubleChecker<double>())
140 .AddAttribute("QueueSize",
141 "Maximum size of FIFO m_queue in bytes.",
142 UintegerValue(100000),
143 MakeUintegerAccessor(&SatOrbiterUserPhy::m_queueSizeMax),
144 MakeUintegerChecker<uint32_t>())
145 .AddTraceSource("QueueSizeBytes",
146 "Send number of bytes in FIFO return feeder queue",
147 MakeTraceSourceAccessor(&SatOrbiterUserPhy::m_queueSizeBytesTrace),
148 "ns3::SatStatsRtnFeederQueueHelper::QueueSizeCallback")
149 .AddTraceSource("QueueSizePackets",
150 "Send number of packets in FIFO return feeder queue",
151 MakeTraceSourceAccessor(&SatOrbiterUserPhy::m_queueSizePacketsTrace),
152 "ns3::SatStatsRtnFeederQueueHelper::QueueSizeCallback");
153 return tid;
154}
155
163{
164 NS_LOG_FUNCTION(this);
165 NS_FATAL_ERROR("SatOrbiterUserPhy default constructor is not allowed to use");
166}
167
169 Ptr<SatLinkResults> linkResults,
170 SatPhyRxCarrierConf::RxCarrierCreateParams_s parameters,
171 Ptr<SatSuperframeConf> superFrameConf)
172 : SatPhy(params),
173 m_linkResults(linkResults),
174 m_parameters(parameters),
175 m_superFrameConf(superFrameConf),
178{
179 NS_LOG_FUNCTION(this << linkResults << superFrameConf);
180
181 m_forwardLinkRegenerationMode = Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode();
182 m_returnLinkRegenerationMode = Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode();
183 m_isSending = false;
186
188 {
189 m_queue = std::queue<std::tuple<Ptr<SatSignalParameters>, uint32_t, uint32_t>>();
190 }
191
193 {
194 SatPhy::GetPhyTx()->SetAttribute("TxMode", EnumValue(SatPhyTx::TRANSPARENT));
195 }
196 else
197 {
198 SatPhy::GetPhyTx()->SetAttribute("TxMode", EnumValue(SatPhyTx::NORMAL));
199 }
200}
201
202void
204{
205 NS_LOG_FUNCTION(this);
206
208
211
213 m_parameters.m_aciIfWrtNoiseFactor = 0.0;
214 m_parameters.m_extNoiseDensityWhz = 0.0;
216 {
218 }
219 else
220 {
222 }
223 m_parameters.m_linkRegenerationMode = m_returnLinkRegenerationMode;
225
226 Ptr<SatPhyRxCarrierConf> carrierConf = CreateObject<SatPhyRxCarrierConf>(m_parameters);
227
228 if (m_linkResults)
229 {
230 carrierConf->SetLinkResults(m_linkResults);
231 }
232
233 carrierConf->SetAdditionalInterferenceCb(
235
237}
238
240{
241 NS_LOG_FUNCTION(this);
242}
243
244void
246{
247 NS_LOG_FUNCTION(this);
248 Object::DoDispose();
249}
250
251void
253{
254 NS_LOG_FUNCTION(this);
255 Object::DoInitialize();
256}
257
258void
259SatOrbiterUserPhy::SendPduWithParams(Ptr<SatSignalParameters> txParams)
260{
261 NS_LOG_FUNCTION(this << txParams);
262 NS_LOG_INFO(this << " sending a packet with carrierId: " << txParams->m_carrierId
263 << " duration: " << txParams->m_duration);
264
266 {
267 SetTimeTag(txParams->m_packetsInBurst);
268 }
269
270 // copy as sender own PhyTx object (at satellite) to ensure right distance calculation
271 // and antenna gain getting at receiver (UT or GW)
272 // copy on tx power too.
273
274 txParams->m_phyTx = m_phyTx;
275 txParams->m_txPower_W = m_eirpWoGainW;
276
278
280 {
281 uint32_t nbBytes = 0;
282 for (Ptr<Packet> pkt : txParams->m_packetsInBurst)
283 {
284 nbBytes += pkt->GetSize();
285 }
286 uint32_t nbPackets = txParams->m_packetsInBurst.size();
287 if (m_queueSizeBytes + nbBytes < m_queueSizeMax)
288 {
290 m_queue.push(std::make_tuple(txParams, nbBytes, nbPackets));
291 m_queueSizeBytes += nbBytes;
292 m_queueSizePackets += nbPackets;
293
295 GetE2EDestinationAddress(txParams->m_packetsInBurst));
297 GetE2EDestinationAddress(txParams->m_packetsInBurst));
298
299 if (m_isSending == false)
300 {
302 }
303 }
304 else
305 {
306 event = SatEnums::PACKET_DROP;
307 NS_LOG_INFO("Packet dropped because REGENERATION_PHY queue is full");
308 }
309 }
310 else
311 {
312 event = SatEnums::PACKET_SENT;
313 m_phyTx->StartTx(txParams);
314 }
315
316 // Add packet trace entry:
317 m_packetTrace(Simulator::Now(),
318 event,
319 m_nodeInfo->GetNodeType(),
320 m_nodeInfo->GetNodeId(),
321 m_nodeInfo->GetMacAddress(),
324 SatUtils::GetPacketInfo(txParams->m_packetsInBurst));
325}
326
327void
329{
330 if (m_queue.empty())
331 {
332 NS_FATAL_ERROR("Trying to deque an empty queue");
333 }
334
335 m_isSending = true;
336 std::tuple<Ptr<SatSignalParameters>, uint32_t, uint32_t> element = m_queue.front();
337 m_queue.pop();
338
339 Ptr<SatSignalParameters> txParams = std::get<0>(element);
340 m_queueSizeBytes -= std::get<1>(element);
341 m_queueSizePackets -= std::get<2>(element);
342
345 GetE2EDestinationAddress(txParams->m_packetsInBurst));
346
347 // Add sent packet trace entry:
348 m_packetTrace(Simulator::Now(),
350 m_nodeInfo->GetNodeType(),
351 m_nodeInfo->GetNodeId(),
352 m_nodeInfo->GetMacAddress(),
355 SatUtils::GetPacketInfo(txParams->m_packetsInBurst));
356
357 Simulator::Schedule(txParams->m_duration + NanoSeconds(1), &SatOrbiterUserPhy::EndTx, this);
358
359 m_phyTx->StartTx(txParams);
360}
361
362void
364{
365 m_isSending = false;
366 if (!m_queue.empty())
367 {
368 this->SendFromQueue();
369 }
370}
371
372void
374{
375 NS_LOG_FUNCTION(this);
376
378 {
379 SatSignalParameters::PacketsInBurst_t::iterator it1;
380 for (it1 = packets.begin(); it1 != packets.end(); ++it1)
381 {
382 Address addr; // invalid address.
383 bool isTaggedWithAddress = false;
384 ByteTagIterator it2 = (*it1)->GetByteTagIterator();
385
386 while (!isTaggedWithAddress && it2.HasNext())
387 {
388 ByteTagIterator::Item item = it2.Next();
389
390 if (item.GetTypeId() == SatAddressTag::GetTypeId())
391 {
392 NS_LOG_DEBUG(this << " contains a SatAddressTag tag:" << " start="
393 << item.GetStart() << " end=" << item.GetEnd());
394 SatAddressTag addrTag;
395 item.GetTag(addrTag);
396 addr = addrTag.GetSourceAddress();
397 isTaggedWithAddress = true; // this will exit the while loop.
398 }
399 }
400
401 m_rxTrace(*it1, addr);
402
403 SatPhyLinkTimeTag linkTimeTag;
404 if ((*it1)->RemovePacketTag(linkTimeTag))
405 {
406 NS_LOG_DEBUG(this << " contains a SatPhyLinkTimeTag tag");
407 Time delay = Simulator::Now() - linkTimeTag.GetSenderLinkTimestamp();
408 m_rxLinkDelayTrace(delay, addr);
409 if (m_lastLinkDelay.IsZero() == false)
410 {
411 Time jitter = Abs(delay - m_lastLinkDelay);
412 m_rxLinkJitterTrace(jitter, addr);
413 }
414 m_lastLinkDelay = delay;
415 }
416
417 } // end of `for (it1 = rxParams->m_packetsInBurst)`
418
419 } // end of `if (m_isStatisticsTagsEnabled)`
420}
421
422void
423SatOrbiterUserPhy::Receive(Ptr<SatSignalParameters> rxParams, bool phyError)
424{
425 NS_LOG_FUNCTION(this << rxParams);
426
428
429 // Add packet trace entry:
430 m_packetTrace(Simulator::Now(),
431 event,
432 m_nodeInfo->GetNodeType(),
433 m_nodeInfo->GetNodeId(),
434 m_nodeInfo->GetMacAddress(),
437 SatUtils::GetPacketInfo(rxParams->m_packetsInBurst));
438
439 if (phyError)
440 {
441 // If there was a PHY error, the packet is dropped here.
442 NS_LOG_INFO(this << " dropped " << rxParams->m_packetsInBurst.size()
443 << " packets because of PHY error.");
444 }
445 else
446 {
448 {
450 break;
453 if (rxParams->m_txInfo.waveformId == 2)
454 {
455 SatSignalParameters::PacketsInBurst_t::iterator it;
456 for (it = rxParams->m_packetsInBurst.begin();
457 it != rxParams->m_packetsInBurst.end();
458 it++)
459 {
460 SatUplinkInfoTag satUplinkInfoTag;
461 (*it)->RemovePacketTag(satUplinkInfoTag);
462 satUplinkInfoTag.SetIsControl(true);
463 (*it)->AddPacketTag(satUplinkInfoTag);
464 }
465 }
466 // No break here: need to add additional fields SatUplinkInfoTag
467 }
469 if (rxParams->m_txInfo.waveformId == 2)
470 {
471 // Send CMT (empty, just to simulate load) message to GW
472 Ptr<SatCmtMessage> cmtMessage = CreateObject<SatCmtMessage>();
473 m_txCtrlFeederCallback(cmtMessage,
474 GetE2EDestinationAddress(rxParams->m_packetsInBurst),
475 rxParams->Copy());
476 }
477
478 rxParams->m_txInfo.packetType = SatEnums::PACKET_TYPE_DEDICATED_ACCESS;
479
480 SatSignalParameters::PacketsInBurst_t::iterator it;
481 for (it = rxParams->m_packetsInBurst.begin(); it != rxParams->m_packetsInBurst.end();
482 it++)
483 {
484 SatUplinkInfoTag satUplinkInfoTag;
485 (*it)->RemovePacketTag(satUplinkInfoTag);
486 satUplinkInfoTag.SetSatId(rxParams->m_satId);
487 satUplinkInfoTag.SetBeamId(rxParams->m_beamId);
488 satUplinkInfoTag.SetSatelliteReceptionTime(Simulator::Now() - rxParams->m_duration);
489 (*it)->AddPacketTag(satUplinkInfoTag);
490 }
491
492 RxTraces(rxParams->m_packetsInBurst);
493
494 ModcodTrace(rxParams);
495
496 break;
497 }
498 default:
499 NS_FATAL_ERROR("Unknown regeneration mode");
500 }
501
502 m_rxCallback(rxParams->m_packetsInBurst, rxParams);
503 }
504}
505
506double
508{
509 NS_LOG_FUNCTION(this);
510
511 return 1 / ((1 / m_aciInterferenceCOverI) + (1 / m_otherSysInterferenceCOverI));
512}
513
519
525
526Address
528{
529 SatSignalParameters::PacketsInBurst_t::iterator it1;
530 for (it1 = packets.begin(); it1 != packets.end(); ++it1)
531 {
532 Address addr; // invalid address.
533 SatAddressE2ETag satAddressE2ETag;
534 if ((*it1)->PeekPacketTag(satAddressE2ETag))
535 {
536 return satAddressE2ETag.GetE2EDestAddress();
537 }
538 }
539 return Mac48Address();
540}
541
542void
547
548} // 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.
The SatOrbiterUserPhy models the user link physical layer of the satellite node.
TracedCallback< uint32_t, const Address & > m_queueSizePacketsTrace
Traced callback to monitor RTN feeder queue size in packets.
void SetSendControlMsgToFeederCallback(SendControlMsgToFeederCallback cb)
Set SendControlMsgToFeederCallback.
SatOrbiterUserPhy::SendControlMsgToFeederCallback m_txCtrlFeederCallback
Callback to send ctrl packet on orbiter feeder.
double m_otherSysInterferenceCOverI
Other system interference in linear.
uint32_t m_queueSizeBytes
Size of FIFO queue in bytes.
Ptr< SatSuperframeConf > m_superFrameConf
Super frame cofiguration.
virtual void SendPduWithParams(Ptr< SatSignalParameters > rxParams)
Send Pdu to the PHY tx module (for satellite switch packet forwarding).
virtual void DoInitialize(void)
Initialization of SatPhy.
uint32_t m_queueSizeMax
Maximum size of FIFO m_queue in bytes.
Address GetE2EDestinationAddress(SatPhy::PacketContainer_t packets)
Get destination address of packets.
virtual void DoDispose(void)
Dispose of this class instance.
virtual void NotifyConstructionCompleted() override
Notifier called once the ObjectBase is fully constructed.
virtual double GetAdditionalInterference()
Get additional interference, used to compute final SINR at RX.
Callback< bool, Ptr< SatControlMessage >, const Address &, Ptr< SatSignalParameters > > SendControlMsgToFeederCallback
SatOrbiterUserPhy(void)
Default constructor.
SatEnums::RegenerationMode_t m_forwardLinkRegenerationMode
Regeneration mode on forward link.
virtual void RxTraces(SatPhy::PacketContainer_t packets)
Invoke the Rx trace source for each received packet.
bool m_isSending
Indicates if a packet is already being sent.
double m_otherSysInterferenceCOverIDb
Configured other system interference in dB.
double m_aciInterferenceCOverIDb
Configured Adjacent Channel Interference (ACI) in dB.
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 SatEnums::SatLinkDir_t GetSatLinkRxDir()
Get the link RX direction.
static TypeId GetTypeId(void)
inherited from Object
Ptr< SatLinkResults > m_linkResults
Link results used for this physical layer.
SatEnums::RegenerationMode_t m_returnLinkRegenerationMode
Regeneration mode on return link.
virtual SatEnums::SatLinkDir_t GetSatLinkTxDir()
Get the link TX direction.
TracedCallback< uint32_t, const Address & > m_queueSizeBytesTrace
Traced callback to monitor RTN feeder queue size in bytes.
void SendFromQueue()
Send a packet from the queue.
virtual ~SatOrbiterUserPhy()
Destructor for SatOrbiterUserPhy.
virtual void Receive(Ptr< SatSignalParameters > rxParams, bool phyError)
Receives packets from lower layer.
SatPhyRxCarrierConf::RxCarrierCreateParams_s m_parameters
RX carrier configuration parameters.
void EndTx()
Notify a packet has finished being sent.
uint32_t m_queueSizePackets
Size of FIFO queue in packets.
double m_aciInterferenceCOverI
Adjacent Channel Interference (ACI) in linear.
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.
virtual void NotifyConstructionCompleted() override
Notifier called once the ObjectBase is fully constructed.
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.
SatPhy(void)
Default constructor.
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.
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 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.