24#include "ns3/application-packet-probe.h"
25#include "ns3/application.h"
26#include "ns3/boolean.h"
27#include "ns3/callback.h"
28#include "ns3/data-collection-object.h"
29#include "ns3/distribution-collector.h"
31#include "ns3/inet-socket-address.h"
34#include "ns3/mac48-address.h"
35#include "ns3/magister-gnuplot-aggregator.h"
36#include "ns3/multi-file-aggregator.h"
37#include "ns3/net-device.h"
38#include "ns3/node-container.h"
39#include "ns3/nstime.h"
41#include "ns3/satellite-helper.h"
42#include "ns3/satellite-id-mapper.h"
43#include "ns3/satellite-net-device.h"
44#include "ns3/satellite-orbiter-net-device.h"
45#include "ns3/satellite-phy.h"
46#include "ns3/satellite-topology.h"
47#include "ns3/scalar-collector.h"
48#include "ns3/singleton.h"
49#include "ns3/string.h"
50#include "ns3/traffic-time-tag.h"
51#include "ns3/unit-conversion-collector.h"
58NS_LOG_COMPONENT_DEFINE(
"SatStatsLinkModcodHelper");
69 NS_LOG_FUNCTION(
this << satHelper);
74 NS_LOG_FUNCTION(
this);
81 TypeId(
"ns3::SatStatsLinkModcodHelper")
83 .AddAttribute(
"AveragingMode",
84 "If true, all samples will be averaged before passed to aggregator. "
85 "Only affects histogram, PDF, and CDF output types.",
89 MakeBooleanChecker());
96 NS_LOG_FUNCTION(
this << averagingMode);
109 NS_LOG_FUNCTION(
this);
115 <<
" is not a valid output type for this statistics.");
125 "EnableContextPrinting",
133 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
136 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
140 &MultiFileAggregator::Write1d);
155 EnumValue(UnitConversionCollector::TRANSPARENT));
159 &MultiFileAggregator::Write2d);
174 "EnableContextPrinting",
178 Ptr<MultiFileAggregator> fileAggregator =
180 NS_ASSERT(fileAggregator !=
nullptr);
184 DistributionCollector::OutputType_t outputType =
185 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
188 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
192 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
199 MakeCallback(&MultiFileAggregator::Write2d, fileAggregator));
203 MakeCallback(&MultiFileAggregator::AddContextHeading, fileAggregator));
207 MakeCallback(&MultiFileAggregator::EnableContextWarning, fileAggregator));
212 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
215 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
217 Callback<void, double> callback =
223 it->second->TraceConnectWithoutContext(
"Output", callback);
237 DistributionCollector::OutputType_t outputType =
238 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
241 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
245 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
251 &MultiFileAggregator::Write2d);
254 &MultiFileAggregator::AddContextHeading);
257 &MultiFileAggregator::EnableContextWarning);
266 <<
" is not a valid output type for this statistics.");
276 Ptr<MagisterGnuplotAggregator> plotAggregator =
278 NS_ASSERT(plotAggregator !=
nullptr);
280 plotAggregator->SetLegend(
"Time (in seconds)",
"MODCOD ID");
281 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
286 EnumValue(UnitConversionCollector::TRANSPARENT));
292 const std::string context = it->second->GetName();
293 plotAggregator->Add2dDataset(context, context);
297 &MagisterGnuplotAggregator::Write2d);
312 Ptr<MagisterGnuplotAggregator> plotAggregator =
314 NS_ASSERT(plotAggregator !=
nullptr);
316 plotAggregator->SetLegend(
"MODCOD ID",
"Frequency");
317 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
323 DistributionCollector::OutputType_t outputType =
324 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
327 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
331 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
338 MakeCallback(&MagisterGnuplotAggregator::Write2d, plotAggregator));
344 EnumValue(ScalarCollector::INPUT_DATA_TYPE_DOUBLE));
347 EnumValue(ScalarCollector::OUTPUT_TYPE_AVERAGE_PER_SAMPLE));
349 Callback<void, double> callback =
355 it->second->TraceConnectWithoutContext(
"Output", callback);
366 Ptr<MagisterGnuplotAggregator> plotAggregator =
368 NS_ASSERT(plotAggregator !=
nullptr);
370 plotAggregator->SetLegend(
"MODCOD ID",
"Frequency");
371 plotAggregator->Set2dDatasetDefaultStyle(Gnuplot2dDataset::LINES);
375 DistributionCollector::OutputType_t outputType =
376 DistributionCollector::OUTPUT_TYPE_HISTOGRAM;
379 outputType = DistributionCollector::OUTPUT_TYPE_PROBABILITY;
383 outputType = DistributionCollector::OUTPUT_TYPE_CUMULATIVE;
391 const std::string context = it->second->GetName();
392 plotAggregator->Add2dDataset(context, context);
396 &MagisterGnuplotAggregator::Write2d);
403 NS_FATAL_ERROR(
"SatStatsLinkModcodHelper - Invalid output type");
422 if (from.IsInvalid())
424 NS_LOG_WARN(
this <<
" discarding a packet MODCOD ID " << modcod
425 <<
" from statistics collection because of" <<
" invalid sender address");
427 else if (Mac48Address::ConvertFrom(from).IsBroadcast())
437 std::map<const Address, uint32_t>::const_iterator it =
m_identifierMap.find(from);
445 NS_LOG_WARN(
this <<
" discarding a packet MODCOD ID " << modcod
446 <<
" from statistics collection because of"
447 <<
" unknown sender address " << from);
455 NS_LOG_FUNCTION(
this << probe << probe->GetName() << identifier);
465 &ScalarCollector::TraceSinkDouble);
473 &UnitConversionCollector::TraceSinkDouble);
487 &ScalarCollector::TraceSinkDouble);
494 &DistributionCollector::TraceSinkDouble);
500 <<
" is not a valid output type for this statistics.");
506 NS_LOG_INFO(
this <<
" created probe " << probe->GetName() <<
", connected to collector "
511 NS_LOG_WARN(
this <<
" unable to connect probe " << probe->GetName() <<
" to collector "
522 NS_ASSERT_MSG(collector !=
nullptr,
"Unable to find collector with identifier " << identifier);
528 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
529 NS_ASSERT(c !=
nullptr);
530 c->TraceSinkUinteger32(0.0, modcod);
536 Ptr<UnitConversionCollector> c = collector->GetObject<UnitConversionCollector>();
537 NS_ASSERT(c !=
nullptr);
538 c->TraceSinkUinteger32(0.0, modcod);
550 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
551 NS_ASSERT(c !=
nullptr);
552 c->TraceSinkUinteger32(0.0, modcod);
556 Ptr<DistributionCollector> c = collector->GetObject<DistributionCollector>();
557 NS_ASSERT(c !=
nullptr);
558 c->TraceSinkUinteger32(0.0, modcod);
564 <<
" is not a valid output type for this statistics.");
578 NS_LOG_FUNCTION(
this << satHelper);
583 NS_LOG_FUNCTION(
this);
597 NS_LOG_FUNCTION(
this);
599 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
600 Callback<void, uint32_t, const Address&> callback =
603 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
607 NS_ASSERT(satOrbiterDev !=
nullptr);
608 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
610 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
611 it2 != satOrbiterFeederPhys.end();
614 satPhy = it2->second;
615 NS_ASSERT(satPhy !=
nullptr);
616 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
619 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
621 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
622 <<
" device #" << satOrbiterDev->GetIfIndex());
625 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
629 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
630 <<
" at node ID " << (*it)->GetId() <<
" device #"
631 << satOrbiterDev->GetIfIndex());
634 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
635 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
636 it2 != satOrbiterUserPhys.end();
639 satPhy = it2->second;
640 NS_ASSERT(satPhy !=
nullptr);
641 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
645 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
647 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
653 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
654 NS_ASSERT(satDev !=
nullptr);
655 Ptr<SatPhy> satPhy = satDev->GetPhy();
656 NS_ASSERT(satPhy !=
nullptr);
658 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
663 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
664 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
668 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
670 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
671 NS_ASSERT(satDev !=
nullptr);
672 Ptr<SatPhy> satPhy = satDev->GetPhy();
673 NS_ASSERT(satPhy !=
nullptr);
675 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
688 NS_LOG_FUNCTION(
this << satHelper);
693 NS_LOG_FUNCTION(
this);
707 NS_LOG_FUNCTION(
this);
709 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
710 Callback<void, uint32_t, const Address&> callback =
713 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
717 NS_ASSERT(satOrbiterDev !=
nullptr);
718 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
720 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
721 it2 != satOrbiterFeederPhys.end();
724 satPhy = it2->second;
725 NS_ASSERT(satPhy !=
nullptr);
726 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
728 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
729 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
730 it2 != satOrbiterUserPhys.end();
733 satPhy = it2->second;
734 NS_ASSERT(satPhy !=
nullptr);
735 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
739 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
741 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
746 const int32_t utId =
GetUtId(*it);
747 NS_ASSERT_MSG(utId > 0,
"Node " << (*it)->GetId() <<
" is not a valid UT");
750 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
751 NS_ASSERT(satDev !=
nullptr);
752 Ptr<SatPhy> satPhy = satDev->GetPhy();
753 NS_ASSERT(satPhy !=
nullptr);
756 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
758 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
762 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
766 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatPhy"
767 <<
" at node ID " << (*it)->GetId() <<
" device #2");
773 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
774 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
778 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
780 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
781 NS_ASSERT(satDev !=
nullptr);
782 Ptr<SatPhy> satPhy = satDev->GetPhy();
783 NS_ASSERT(satPhy !=
nullptr);
785 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
798 NS_LOG_FUNCTION(
this << satHelper);
803 NS_LOG_FUNCTION(
this);
817 NS_LOG_FUNCTION(
this);
819 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
821 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
826 NS_ASSERT(satOrbiterDev !=
nullptr);
827 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
828 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
829 it2 != satOrbiterFeederPhys.end();
832 satPhy = it2->second;
833 NS_ASSERT(satPhy !=
nullptr);
834 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
836 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
837 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
838 it2 != satOrbiterUserPhys.end();
841 satPhy = it2->second;
842 NS_ASSERT(satPhy !=
nullptr);
843 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
847 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
848 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
855 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
856 NS_ASSERT(satDev !=
nullptr);
857 Ptr<SatPhy> satPhy = satDev->GetPhy();
858 NS_ASSERT(satPhy !=
nullptr);
859 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
864 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
865 Callback<void, uint32_t, const Address&> callback =
868 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
872 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
874 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
875 NS_ASSERT(satDev !=
nullptr);
876 Ptr<SatPhy> satPhy = satDev->GetPhy();
877 NS_ASSERT(satPhy !=
nullptr);
880 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
882 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
883 <<
" device #" << satDev->GetIfIndex());
886 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
890 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
891 <<
" at node ID " << (*it)->GetId() <<
" device #"
892 << satDev->GetIfIndex());
908 NS_LOG_FUNCTION(
this << satHelper);
913 NS_LOG_FUNCTION(
this);
927 NS_LOG_FUNCTION(
this);
929 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
930 Callback<void, uint32_t, const Address&> callback =
933 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
937 NS_ASSERT(satOrbiterDev !=
nullptr);
938 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
940 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
941 it2 != satOrbiterFeederPhys.end();
944 satPhy = it2->second;
945 NS_ASSERT(satPhy !=
nullptr);
946 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
948 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
949 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
950 it2 != satOrbiterUserPhys.end();
953 satPhy = it2->second;
954 NS_ASSERT(satPhy !=
nullptr);
955 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
958 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
960 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
961 <<
" device #" << satOrbiterDev->GetIfIndex());
965 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
966 <<
" at node ID " << (*it)->GetId() <<
" device #"
967 << satOrbiterDev->GetIfIndex());
972 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
973 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
980 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
981 NS_ASSERT(satDev !=
nullptr);
982 Ptr<SatPhy> satPhy = satDev->GetPhy();
983 NS_ASSERT(satPhy !=
nullptr);
984 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
989 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
991 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
995 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
997 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
998 NS_ASSERT(satDev !=
nullptr);
999 Ptr<SatPhy> satPhy = satDev->GetPhy();
1000 NS_ASSERT(satPhy !=
nullptr);
1002 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
SatNetDevice to be utilized in the UT and GW nodes.
SatOrbiterNetDevice to be utilized in geostationary satellite.
Produce forward feeder link modcod statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsFwdFeederLinkModcodHelper()
/ Destructor.
SatStatsFwdFeederLinkModcodHelper(Ptr< const SatHelper > satHelper)
Produce forward user link modcod statistics from a satellite module simulation.
virtual ~SatStatsFwdUserLinkModcodHelper()
/ Destructor.
SatStatsFwdUserLinkModcodHelper(Ptr< const SatHelper > satHelper)
static TypeId GetTypeId()
inherited from ObjectBase base class
static Ptr< NetDevice > GetSatSatOrbiterNetDevice(Ptr< Node > satNode)
static NetDeviceContainer GetGwSatNetDevice(Ptr< Node > gwNode)
virtual void SaveAddressAndIdentifier(Ptr< Node > utNode)
Save the address and the proper identifier from the given UT node.
static std::string GetOutputTypeName(OutputType_t outputType)
SatStatsHelper(Ptr< const SatHelper > satHelper)
Creates a new helper instance.
virtual std::string GetIdentifierHeading(std::string dataLabel) const
virtual std::string GetOutputPath() const
Ptr< DataCollectionObject > CreateAggregator(std::string aggregatorTypeId, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue())
Create the aggregator according to the output type.
virtual std::string GetOutputFileName() const
Compute the path and file name where statistics output should be written to.
uint32_t GetUtId(Ptr< Node > utNode) const
uint32_t CreateCollectorPerIdentifier(CollectorMap &collectorMap) const
Create one collector instance for each identifier in the simulation.
static Ptr< NetDevice > GetUtSatNetDevice(Ptr< Node > utNode)
OutputType_t GetOutputType() const
std::map< const Address, uint32_t > m_identifierMap
Map of address and the identifier associated with it.
std::string GetName() const
virtual std::string GetTimeHeading(std::string dataLabel) const
virtual std::string GetDistributionHeading(std::string dataLabel) const
Base class for MODCOD statistics helpers.
bool GetAveragingMode() const
void PassSampleToCollector(uint32_t modcod, uint32_t identifier)
Find a collector with the right identifier and pass a sample data to it.
virtual ~SatStatsLinkModcodHelper()
/ Destructor.
CollectorMap m_terminalCollectors
Maintains a list of collectors created by this helper.
bool m_averagingMode
AveragingMode attribute.
void DoInstall()
Install the probes, collectors, and aggregators necessary to produce the statistics output.
bool ConnectProbeToCollector(Ptr< Probe > probe, uint32_t identifier)
Connect the probe to the right collector.
void InstallProbes()
Set up several probes or other means of listeners and connect them to the collectors.
Ptr< DataCollectionObject > m_aggregator
The aggregator created by this helper.
void SetAveragingMode(bool averagingMode)
static TypeId GetTypeId()
inherited from ObjectBase base class
void RxLinkModcodCallback(uint32_t modcod, const Address &from)
Receive inputs from trace sources and determine the right collector to forward the inputs to.
Ptr< DistributionCollector > m_averagingCollector
The final collector utilized in averaged output (histogram, PDF, and CDF).
SatStatsLinkModcodHelper(Ptr< const SatHelper > satHelper)
virtual void DoInstallProbes()=0
Produce return feeder link modcod statistics from a satellite module simulation.
static TypeId GetTypeId()
inherited from ObjectBase base class
virtual ~SatStatsRtnFeederLinkModcodHelper()
/ Destructor.
SatStatsRtnFeederLinkModcodHelper(Ptr< const SatHelper > satHelper)
Produce return user link modcod statistics from a satellite module simulation.
virtual ~SatStatsRtnUserLinkModcodHelper()
/ Destructor.
static TypeId GetTypeId()
inherited from ObjectBase base class
SatStatsRtnUserLinkModcodHelper(Ptr< const SatHelper > satHelper)
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.