40 #include "../model/satellite-generic-stream-encapsulator-arq.h"
41 #include "../model/satellite-queue.h"
42 #include "../model/satellite-return-link-encapsulator-arq.h"
43 #include "../utils/satellite-env-variables.h"
45 #include "ns3/callback.h"
46 #include "ns3/config.h"
48 #include "ns3/packet.h"
50 #include "ns3/random-variable-stream.h"
51 #include "ns3/singleton.h"
73 void TransmitPdus(uint32_t numPackets);
78 void NotifyTxOpportunity();
84 void ReceivePdu(Ptr<Packet> p);
92 bool SendAck(Ptr<SatControlMessage> msg,
const Address& dest);
98 void ReceiveAck(Ptr<SatArqAckMessage> ack);
106 void Receive(Ptr<Packet> p, Mac48Address source, Mac48Address dest);
115 virtual void DoRun(
void);
119 Ptr<SatReturnLinkEncapsulatorArq>
m_rle;
175 : TestCase(
"Test RLE ARQ.")
208 m_source = Mac48Address::Allocate();
209 m_dest = Mac48Address::Allocate();
212 Config::SetDefault(
"ns3::SatQueue::MaxPackets", UintegerValue(1001));
213 Config::SetDefault(
"ns3::SatReturnLinkEncapsulatorArq::MaxNoOfRetransmissions",
215 Config::SetDefault(
"ns3::SatReturnLinkEncapsulatorArq::WindowSize", UintegerValue(50));
216 Config::SetDefault(
"ns3::SatReturnLinkEncapsulatorArq::RetransmissionTimer",
217 TimeValue(Seconds(0.6)));
218 Config::SetDefault(
"ns3::SatReturnLinkEncapsulatorArq::RxWaitingTime", TimeValue(Seconds(2.3)));
220 Ptr<SatQueue> queue = CreateObject<SatQueue>(
m_rcIndex);
223 m_rle->SetQueue(queue);
232 m_unif = CreateObject<UniformRandomVariable>();
239 Singleton<SatEnvVariables>::Get()->DoInitialize();
240 Singleton<SatEnvVariables>::Get()->SetOutputVariables(
"test-sat-arq",
"rtn",
true);
254 NS_TEST_ASSERT_MSG_LT(errorProb,
256 "HL packet error probability is higher than threshold!");
262 Simulator::Destroy();
264 Singleton<SatEnvVariables>::Get()->DoDispose();
271 for (uint32_t i = 0; i < numPackets; ++i)
273 uint32_t packetSize =
m_unif->GetInteger(3, 500);
274 Ptr<Packet> packet = Create<Packet>(packetSize);
287 uint32_t nextMinTxO(0);
288 uint32_t bytesLeft(1);
291 Ptr<Packet> p =
m_rle->NotifyTxOpportunity(bytes, bytesLeft, nextMinTxO);
299 if (m_packetErrorRatio < m_unif->GetValue(0.0, 1.0))
326 m_rle->ReceivePdu(p);
335 if (m_ackErrorRatio < m_unif->GetValue(0.0, 1.0))
337 Ptr<SatArqAckMessage> ack = DynamicCast<SatArqAckMessage>(msg);
352 m_rle->ReceiveAck(ack);
358 uint32_t rcvdPacketSize = p->GetSize();
398 bool SendAck(Ptr<SatControlMessage> msg,
const Address& dest);
412 void Receive(Ptr<Packet> p, Mac48Address source, Mac48Address dest);
421 virtual void DoRun(
void);
425 Ptr<SatGenericStreamEncapsulatorArq>
m_gse;
476 : TestCase(
"Test GSE ARQ.")
506 m_source = Mac48Address::Allocate();
507 m_dest = Mac48Address::Allocate();
510 Config::SetDefault(
"ns3::SatQueue::MaxPackets", UintegerValue(1001));
511 Config::SetDefault(
"ns3::SatGenericStreamEncapsulatorArq::MaxNoOfRetransmissions",
513 Config::SetDefault(
"ns3::SatGenericStreamEncapsulatorArq::WindowSize", UintegerValue(50));
514 Config::SetDefault(
"ns3::SatGenericStreamEncapsulatorArq::RetransmissionTimer",
515 TimeValue(Seconds(0.6)));
516 Config::SetDefault(
"ns3::SatGenericStreamEncapsulatorArq::RxWaitingTime",
517 TimeValue(Seconds(2.3)));
519 Ptr<SatQueue> queue = CreateObject<SatQueue>(
m_flowIndex);
520 m_gse = CreateObject<SatGenericStreamEncapsulatorArq>(
m_source,
525 m_gse->SetQueue(queue);
534 m_unif = CreateObject<UniformRandomVariable>();
541 Singleton<SatEnvVariables>::Get()->DoInitialize();
542 Singleton<SatEnvVariables>::Get()->SetOutputVariables(
"test-sat-arq",
"fwd",
true);
561 NS_TEST_ASSERT_MSG_LT(errorProb,
563 "HL packet error probability is higher than threshold!");
565 Simulator::Destroy();
567 Singleton<SatEnvVariables>::Get()->DoDispose();
574 for (uint32_t i = 0; i < numPackets; ++i)
576 uint32_t packetSize =
m_unif->GetInteger(3, 500);
577 Ptr<Packet> packet = Create<Packet>(packetSize);
590 uint32_t nextMinTxO(0);
594 uint32_t bytesLeft = 1;
596 std::vector<Ptr<Packet>> bbFrame;
598 while (bytesLeft > 0)
600 Ptr<Packet> p =
m_gse->NotifyTxOpportunity(frameBytes, bytesLeft, nextMinTxO);
603 bbFrame.push_back(p);
604 frameBytes -= p->GetSize();
614 if (!bbFrame.empty())
616 m_txs += bbFrame.size();
619 if (m_frameErrorRatio < m_unif->GetValue(0.0, 1.0))
621 for (std::vector<Ptr<Packet>>::iterator it = bbFrame.begin(); it != bbFrame.end(); ++it)
647 m_gse->ReceivePdu(p);
656 if (m_ackErrorRatio < m_unif->GetValue(0.0, 1.0))
658 Ptr<SatArqAckMessage> ack = DynamicCast<SatArqAckMessage>(msg);
673 m_gse->ReceiveAck(ack);
679 uint32_t rcvdPacketSize = p->GetSize();
697 : TestSuite(
"sat-arq-test", Type::UNIT)
std::vector< uint32_t > m_sentPacketSizes
virtual ~SatFwdArqTestCase()
void TransmitPdus(uint32_t numPackets)
Transmit/enque a number of packets to GSE/SatQueue.
void Initialize()
Initialize is called in DoRun method, since the test.py calls the test case constructors even if the ...
void NotifyTxOpportunity()
Notify Tx opportunity.
Ptr< UniformRandomVariable > m_unif
uint32_t m_numTxOpportunities
bool SendAck(Ptr< SatControlMessage > msg, const Address &dest)
Send ARQ ACK message to the sender (source)
std::vector< uint32_t > m_rcvdPacketSizes
Ptr< SatGenericStreamEncapsulatorArq > m_gse
void Receive(Ptr< Packet > p, Mac48Address source, Mac48Address dest)
Receive packet and check that it is of correct size.
void ReceiveAck(Ptr< SatArqAckMessage > ack)
Receive ARQ ACK message.
double m_errorProbabilityThreshold
void ReceivePdu(Ptr< Packet > p)
Receive packet.
double m_packetErrorRatio
void NotifyTxOpportunity()
Notify Tx opportunity.
double m_maxTimeSlotJitterInMs
uint32_t m_minTxOpportunity
void Receive(Ptr< Packet > p, Mac48Address source, Mac48Address dest)
Receive packet and check that it is of correct size.
double m_minTimeSlotJitterInMs
bool SendAck(Ptr< SatControlMessage > msg, const Address &dest)
Send ARQ ACK message to the sender (source)
uint32_t m_maxTxOpportunity
Ptr< SatReturnLinkEncapsulatorArq > m_rle
Ptr< UniformRandomVariable > m_unif
void TransmitPdus(uint32_t numPackets)
Transmit/enque a number of packets to RLE/SatQueue.
void ReceiveAck(Ptr< SatArqAckMessage > ack)
Receive ARQ ACK message.
void Initialize()
Initialize is called in DoRun method, since the test.py calls the test case constructors even if the ...
virtual ~SatRtnArqTestCase()
uint32_t m_numTxOpportunities
std::vector< uint32_t > m_sentPacketSizes
double m_errorProbabilityThreshold
void ReceivePdu(Ptr< Packet > p)
Receive packet.
std::vector< uint32_t > m_rcvdPacketSizes
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
static SatArqTestSuite satArqTestSuite