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>
40 #include <ns3/probe.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>
58 NS_LOG_COMPONENT_DEFINE(
"SatStatsLinkModcodHelper");
63 NS_OBJECT_ENSURE_REGISTERED(SatStatsLinkModcodHelper);
67 m_averagingMode(false)
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"
426 <<
" invalid sender address");
428 else if (Mac48Address::ConvertFrom(from).IsBroadcast())
438 std::map<const Address, uint32_t>::const_iterator it =
m_identifierMap.find(from);
446 NS_LOG_WARN(
this <<
" discarding a packet MODCOD ID " << modcod
447 <<
" from statistics collection because of"
448 <<
" unknown sender address " << from);
456 NS_LOG_FUNCTION(
this << probe << probe->GetName() << identifier);
466 &ScalarCollector::TraceSinkDouble);
474 &UnitConversionCollector::TraceSinkDouble);
488 &ScalarCollector::TraceSinkDouble);
495 &DistributionCollector::TraceSinkDouble);
501 <<
" is not a valid output type for this statistics.");
507 NS_LOG_INFO(
this <<
" created probe " << probe->GetName() <<
", connected to collector "
512 NS_LOG_WARN(
this <<
" unable to connect probe " << probe->GetName() <<
" to collector "
523 NS_ASSERT_MSG(collector !=
nullptr,
"Unable to find collector with identifier " << identifier);
529 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
530 NS_ASSERT(c !=
nullptr);
531 c->TraceSinkUinteger32(0.0, modcod);
537 Ptr<UnitConversionCollector> c = collector->GetObject<UnitConversionCollector>();
538 NS_ASSERT(c !=
nullptr);
539 c->TraceSinkUinteger32(0.0, modcod);
551 Ptr<ScalarCollector> c = collector->GetObject<ScalarCollector>();
552 NS_ASSERT(c !=
nullptr);
553 c->TraceSinkUinteger32(0.0, modcod);
557 Ptr<DistributionCollector> c = collector->GetObject<DistributionCollector>();
558 NS_ASSERT(c !=
nullptr);
559 c->TraceSinkUinteger32(0.0, modcod);
565 <<
" is not a valid output type for this statistics.");
579 NS_LOG_FUNCTION(
this << satHelper);
584 NS_LOG_FUNCTION(
this);
598 NS_LOG_FUNCTION(
this);
600 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
601 Callback<void, uint32_t, const Address&> callback =
604 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
608 NS_ASSERT(satOrbiterDev !=
nullptr);
609 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
611 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
612 it2 != satOrbiterFeederPhys.end();
615 satPhy = it2->second;
616 NS_ASSERT(satPhy !=
nullptr);
617 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
620 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
622 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
623 <<
" device #" << satOrbiterDev->GetIfIndex());
626 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
630 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
631 <<
" at node ID " << (*it)->GetId() <<
" device #"
632 << satOrbiterDev->GetIfIndex());
635 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
636 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
637 it2 != satOrbiterUserPhys.end();
640 satPhy = it2->second;
641 NS_ASSERT(satPhy !=
nullptr);
642 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
646 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
648 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
654 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
655 NS_ASSERT(satDev !=
nullptr);
656 Ptr<SatPhy> satPhy = satDev->GetPhy();
657 NS_ASSERT(satPhy !=
nullptr);
659 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
664 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
665 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
669 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
671 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
672 NS_ASSERT(satDev !=
nullptr);
673 Ptr<SatPhy> satPhy = satDev->GetPhy();
674 NS_ASSERT(satPhy !=
nullptr);
676 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
689 NS_LOG_FUNCTION(
this << satHelper);
694 NS_LOG_FUNCTION(
this);
708 NS_LOG_FUNCTION(
this);
710 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
711 Callback<void, uint32_t, const Address&> callback =
714 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
718 NS_ASSERT(satOrbiterDev !=
nullptr);
719 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
721 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
722 it2 != satOrbiterFeederPhys.end();
725 satPhy = it2->second;
726 NS_ASSERT(satPhy !=
nullptr);
727 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
729 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
730 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
731 it2 != satOrbiterUserPhys.end();
734 satPhy = it2->second;
735 NS_ASSERT(satPhy !=
nullptr);
736 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
740 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
742 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
747 const int32_t utId =
GetUtId(*it);
748 NS_ASSERT_MSG(utId > 0,
"Node " << (*it)->GetId() <<
" is not a valid UT");
751 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
752 NS_ASSERT(satDev !=
nullptr);
753 Ptr<SatPhy> satPhy = satDev->GetPhy();
754 NS_ASSERT(satPhy !=
nullptr);
757 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
759 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
763 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
767 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatPhy"
768 <<
" at node ID " << (*it)->GetId() <<
" device #2");
774 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
775 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
779 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
781 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
782 NS_ASSERT(satDev !=
nullptr);
783 Ptr<SatPhy> satPhy = satDev->GetPhy();
784 NS_ASSERT(satPhy !=
nullptr);
786 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
799 NS_LOG_FUNCTION(
this << satHelper);
804 NS_LOG_FUNCTION(
this);
818 NS_LOG_FUNCTION(
this);
820 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
822 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
827 NS_ASSERT(satOrbiterDev !=
nullptr);
828 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
829 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
830 it2 != satOrbiterFeederPhys.end();
833 satPhy = it2->second;
834 NS_ASSERT(satPhy !=
nullptr);
835 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
837 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
838 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
839 it2 != satOrbiterUserPhys.end();
842 satPhy = it2->second;
843 NS_ASSERT(satPhy !=
nullptr);
844 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
848 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
849 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
856 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
857 NS_ASSERT(satDev !=
nullptr);
858 Ptr<SatPhy> satPhy = satDev->GetPhy();
859 NS_ASSERT(satPhy !=
nullptr);
860 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
865 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
866 Callback<void, uint32_t, const Address&> callback =
869 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
873 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
875 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
876 NS_ASSERT(satDev !=
nullptr);
877 Ptr<SatPhy> satPhy = satDev->GetPhy();
878 NS_ASSERT(satPhy !=
nullptr);
881 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
883 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
884 <<
" device #" << satDev->GetIfIndex());
887 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
891 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
892 <<
" at node ID " << (*it)->GetId() <<
" device #"
893 << satDev->GetIfIndex());
909 NS_LOG_FUNCTION(
this << satHelper);
914 NS_LOG_FUNCTION(
this);
928 NS_LOG_FUNCTION(
this);
930 NodeContainer sats = Singleton<SatTopology>::Get()->GetOrbiterNodes();
931 Callback<void, uint32_t, const Address&> callback =
934 for (NodeContainer::Iterator it = sats.Begin(); it != sats.End(); ++it)
938 NS_ASSERT(satOrbiterDev !=
nullptr);
939 std::map<uint32_t, Ptr<SatPhy>> satOrbiterFeederPhys = satOrbiterDev->GetFeederPhy();
941 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterFeederPhys.begin();
942 it2 != satOrbiterFeederPhys.end();
945 satPhy = it2->second;
946 NS_ASSERT(satPhy !=
nullptr);
947 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
949 std::map<uint32_t, Ptr<SatPhy>> satOrbiterUserPhys = satOrbiterDev->GetUserPhy();
950 for (std::map<uint32_t, Ptr<SatPhy>>::iterator it2 = satOrbiterUserPhys.begin();
951 it2 != satOrbiterUserPhys.end();
954 satPhy = it2->second;
955 NS_ASSERT(satPhy !=
nullptr);
956 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
959 if (satPhy->TraceConnectWithoutContext(
"RxLinkModcod", callback))
961 NS_LOG_INFO(
this <<
" successfully connected with node ID " << (*it)->GetId()
962 <<
" device #" << satOrbiterDev->GetIfIndex());
966 NS_FATAL_ERROR(
"Error connecting to RxLinkModcod trace source of SatNetDevice"
967 <<
" at node ID " << (*it)->GetId() <<
" device #"
968 << satOrbiterDev->GetIfIndex());
973 NodeContainer uts = Singleton<SatTopology>::Get()->GetUtNodes();
974 for (NodeContainer::Iterator it = uts.Begin(); it != uts.End(); ++it)
981 Ptr<SatNetDevice> satDev = dev->GetObject<
SatNetDevice>();
982 NS_ASSERT(satDev !=
nullptr);
983 Ptr<SatPhy> satPhy = satDev->GetPhy();
984 NS_ASSERT(satPhy !=
nullptr);
985 satPhy->SetAttribute(
"EnableStatisticsTags", BooleanValue(
true));
990 NodeContainer gws = Singleton<SatTopology>::Get()->GetGwNodes();
992 for (NodeContainer::Iterator it = gws.Begin(); it != gws.End(); ++it)
996 for (NetDeviceContainer::Iterator itDev = devs.Begin(); itDev != devs.End(); ++itDev)
998 Ptr<SatNetDevice> satDev = (*itDev)->GetObject<
SatNetDevice>();
999 NS_ASSERT(satDev !=
nullptr);
1000 Ptr<SatPhy> satPhy = satDev->GetPhy();
1001 NS_ASSERT(satPhy !=
nullptr);
1003 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
Parent abstract class of all satellite statistics helpers.
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)
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.