31#include "ns3/mac48-address.h"
32#include "ns3/simulator.h"
39NS_LOG_COMPONENT_DEFINE(
"SatGenericStreamEncapsulatorArq");
58 NS_LOG_FUNCTION(
this);
67 Mac48Address decapAddress,
68 Mac48Address sourceE2EAddress,
69 Mac48Address destE2EAddress,
71 uint32_t additionalHeaderSize)
77 additionalHeaderSize),
89 NS_LOG_FUNCTION(
this << encapAddress << decapAddress << sourceE2EAddress << destE2EAddress
90 << flowId << additionalHeaderSize);
96 NS_LOG_FUNCTION(
this);
98 SatGenericStreamEncapsulator::NotifyConstructionCompleted();
106 NS_LOG_FUNCTION(
this);
114 TypeId(
"ns3::SatGenericStreamEncapsulatorArq")
116 .AddConstructor<SatGenericStreamEncapsulatorArq>()
118 "MaxNoOfRetransmissions",
119 "Maximum number of retransmissions for a single GSE PDU.",
122 MakeUintegerChecker<uint32_t>())
124 "RetransmissionTimer",
125 "Retransmission time value, i.e. how long to wait for ACK before retransmission.",
126 TimeValue(Seconds(0.6)),
131 "Window size for ARQ, i.e. how many simultaneous packets are allowed in the air.",
134 MakeUintegerChecker<uint32_t>())
135 .AddAttribute(
"ArqHeaderSize",
136 "ARQ header size in Bytes.",
139 MakeUintegerChecker<uint32_t>())
140 .AddAttribute(
"RxWaitingTime",
141 "Time to wait for a packet at the reception (GW) before moving onwards "
142 "with the packet reception.",
143 TimeValue(Seconds(1.8)),
152 NS_LOG_FUNCTION(
this);
156 std::map<uint8_t, Ptr<SatArqBufferContext>>::iterator it =
m_txedBuffer.begin();
159 it->second->DoDispose();
169 it->second->DoDispose();
176 std::map<uint32_t, Ptr<SatArqBufferContext>>::iterator it2 =
m_reorderingBuffer.begin();
179 it2->second->DoDispose();
191 uint32_t& nextMinTxO)
193 NS_LOG_FUNCTION(
this << bytes);
195 <<
" of " << bytes <<
" bytes");
208 Ptr<SatArqBufferContext> context =
m_retxBuffer.begin()->second;
211 if (context->m_pdu->GetSize() <= bytes)
217 context->m_retransmissionCount = context->m_retransmissionCount + 1;
222 std::map<uint8_t, Ptr<SatArqBufferContext>>::iterator it =
226 NS_FATAL_ERROR(
"Trying to add retransmission packet to txedBuffer even though it "
227 "already exists there!");
231 m_txedBuffer.insert(std::make_pair(context->m_seqNo, context));
240 context->m_waitingTimer = t;
242 NS_LOG_INFO(
"GW: << " <<
m_encapAddress <<
" sent a retransmission packet of size: "
243 << context->m_pdu->GetSize()
244 <<
" with seqNo: " << (uint32_t)(context->m_seqNo)
245 <<
" flowId: " << (uint32_t)(
m_flowId));
247 Ptr<Packet> copy = context->m_pdu->Copy();
252 NS_LOG_INFO(
"Retransmission PDU: " << context->m_pdu->GetUid()
253 <<
" size: " << context->m_pdu->GetSize()
254 <<
" does not fit into TxO: " << bytes);
271 packet->AddPacketTag(mTag);
275 if (!packet->PeekPacketTag(addressE2ETag))
279 packet->AddPacketTag(addressE2ETag);
285 packet->AddPacketTag(flowIdTag);
288 uint8_t seqNo =
m_seqNo->NextSequenceNumber();
293 packet->AddHeader(arqHeader);
296 Ptr<SatArqBufferContext> arqContext = CreateObject<SatArqBufferContext>();
297 arqContext->m_retransmissionCount = 0;
298 Ptr<Packet> copy = packet->Copy();
299 arqContext->m_pdu = copy;
300 arqContext->m_seqNo = seqNo;
305 arqContext->m_waitingTimer =
315 if (packet->GetSize() > bytes)
317 NS_FATAL_ERROR(
"Created packet of size: " << packet->GetSize()
318 <<
" is larger than the tx opportunity: "
322 NS_LOG_INFO(
"GW: << " <<
m_encapAddress <<
" sent a packet of size: "
323 << packet->GetSize() <<
" with seqNo: " << (uint32_t)(seqNo)
324 <<
" flowId: " << (uint32_t)(
m_flowId));
325 NS_LOG_INFO(
"Queue size after TxOpportunity: " <<
m_txQueue->GetNBytes());
328 else if (!
m_seqNo->SeqNoAvailable())
346 NS_LOG_FUNCTION(
this << (uint32_t)seqNo);
349 <<
" ARQ retransmission timer expired for: " << (uint32_t)(seqNo));
351 std::map<uint8_t, Ptr<SatArqBufferContext>>::iterator it =
m_txedBuffer.find(seqNo);
355 NS_ASSERT(seqNo == it->second->m_seqNo);
356 NS_ASSERT(it->second->m_pdu);
361 NS_LOG_INFO(
"Moving the ARQ context to retransmission buffer");
363 Ptr<SatArqBufferContext> context = it->second;
374 NS_LOG_INFO(
"For GW: " <<
m_encapAddress <<
" max retransmissions reached for "
375 << (uint32_t)(seqNo));
383 NS_LOG_INFO(
"Element not found anymore in the m_txedBuffer, thus ACK has been received "
391 NS_LOG_FUNCTION(
this << (uint32_t)sequenceNumber);
394 m_seqNo->Release(sequenceNumber);
397 std::map<uint8_t, Ptr<SatArqBufferContext>>::iterator it =
m_txedBuffer.find(sequenceNumber);
400 NS_LOG_INFO(
"Sequence no: " << (uint32_t)sequenceNumber <<
" clean up from txedBuffer!");
402 it->second->DoDispose();
411 NS_LOG_INFO(
"Sequence no: " << (uint32_t)sequenceNumber <<
" clean up from retxBuffer!");
413 it->second->DoDispose();
422 NS_LOG_FUNCTION(
this);
430 <<
" received ACK with SN: " << (uint32_t)(ack->GetSequenceNumber()));
433 CleanUp(ack->GetSequenceNumber());
439 NS_LOG_FUNCTION(
this << p->GetSize());
443 p->RemovePacketTag(statusTag);
447 p->RemovePacketTag(flowIdTag);
451 bool mSuccess = p->RemovePacketTag(mTag);
454 NS_FATAL_ERROR(
"MAC tag not found in the packet!");
458 NS_FATAL_ERROR(
"Packet was not intended for this receiver!");
462 p->RemoveHeader(arqHeader);
463 uint8_t seqNo = arqHeader.
GetSeqNo();
465 NS_LOG_INFO(
"GW: " <<
m_encapAddress <<
" received a packet with SeqNo: " << (uint32_t)(seqNo));
473 NS_LOG_INFO(
"8bit SN: " << (uint32_t)(seqNo) <<
" 32bit SN: " << sn);
479 std::map<uint32_t, Ptr<SatArqBufferContext>>::iterator it =
m_reorderingBuffer.find(sn);
485 <<
" created a new ARQ buffer entry for SeqNo: " << sn);
486 Ptr<SatArqBufferContext> arqContext = CreateObject<SatArqBufferContext>();
487 arqContext->m_pdu = p;
488 arqContext->m_rxStatus =
true;
489 arqContext->m_seqNo = sn;
490 arqContext->m_retransmissionCount = 0;
497 <<
" reset an existing ARQ entry for SeqNo: " << sn);
498 it->second->m_waitingTimer.Cancel();
499 it->second->m_pdu = p;
500 it->second->m_rxStatus =
true;
503 NS_LOG_INFO(
"Received a packet with SeqNo: " << sn
512 std::map<uint32_t, Ptr<SatArqBufferContext>>::iterator it2 =
515 NS_LOG_INFO(
"Finding context for " << i);
520 NS_LOG_INFO(
"Context NOT found for SeqNo: " << i);
522 Ptr<SatArqBufferContext> arqContext = CreateObject<SatArqBufferContext>();
523 arqContext->m_pdu =
nullptr;
524 arqContext->m_rxStatus =
false;
525 arqContext->m_seqNo = i;
526 arqContext->m_retransmissionCount = 0;
533 arqContext->m_waitingTimer = id;
545 NS_LOG_INFO(
"GW: " <<
m_encapAddress <<
" received a packet with SeqNo: " << sn
546 <<
" which is already received!");
553 NS_LOG_FUNCTION(
this << (uint32_t)seqNo);
555 uint32_t globalSeqNo(0);
561 NS_LOG_INFO(
"Input: " << (uint32_t)(seqNo) <<
" rounds: " << rounds <<
" rawSeqNo: " << rawSeqNo
566 if (seqNo >= rawSeqNo)
583 globalSeqNo = rounds * std::numeric_limits<uint8_t>::max() + seqNo;
591 NS_LOG_FUNCTION(
this);
594 std::map<uint32_t, Ptr<SatArqBufferContext>>::iterator it =
m_reorderingBuffer.begin();
597 <<
", status: " << it->second->m_rxStatus);
604 it->second->m_rxStatus ==
true)
607 <<
", status: " << it->second->m_rxStatus);
611 if (it->second->m_pdu)
617 it->second->DoDispose();
632 NS_LOG_FUNCTION(
this << (uint32_t)seqNo);
634 NS_LOG_INFO(
"For GW: " <<
m_encapAddress <<
" max waiting time reached for SeqNo: " << seqNo);
635 NS_LOG_INFO(
"Mark the PDU received and move forward!");
638 std::map<uint32_t, Ptr<SatArqBufferContext>>::iterator it =
m_reorderingBuffer.find(seqNo);
641 it->second->m_waitingTimer.Cancel();
642 it->second->m_rxStatus =
true;
646 NS_FATAL_ERROR(
"Rx waiting timer is not running anymore even though it expired!");
655 NS_LOG_FUNCTION(
this);
663 NS_LOG_FUNCTION(
this << (uint32_t)seqNo);
666 <<
" with flowId: " << (uint32_t)(
m_flowId)
667 <<
" with SN: " << (uint32_t)(seqNo));
677 Ptr<SatArqAckMessage> ack = CreateObject<SatArqAckMessage>();
678 ack->SetSequenceNumber(seqNo);
687 NS_FATAL_ERROR(
"Unable to send ACK, since the Ctrl callback is NULL!");
This class implements a tag that carries the satellite MAC of GW and UT.
void SetE2ESourceAddress(Mac48Address e2eSourceAddress)
Set E2E source MAC address.
void SetE2EDestAddress(Mac48Address e2eDestAddress)
Set E2E destination MAC address.
Mac48Address m_destE2EAddress
Mac48Address m_sourceE2EAddress
uint8_t m_flowId
Flow identifier.
Mac48Address m_encapAddress
Source and destination mac addresses.
Ptr< SatQueue > m_txQueue
Used queue in satellite encapsulator.
SendCtrlCallback m_ctrlCallback
Callback to send control messages.
Mac48Address m_decapAddress
SatEncapPduStatusTag is used temporarily to tag packets with the fragmentation status in the encapsul...
SatFlowIdTag implements a tag which carries the flow identifier of a packet.
void SetFlowId(uint8_t flowId)
Set flow id.
SatGenericStreamEncapsulatorArq class is inherited from the SatGenericStreamEncapsulator class,...
void ArqReTxTimerExpired(uint8_t seqNo)
ARQ Tx timer has expired.
Time m_rxWaitingTimer
Waiting time for waiting a certain SN to be received.
uint32_t m_maxNoOfRetransmissions
Maximum number of retransmissions.
SatGenericStreamEncapsulatorArq()
Default constructor, not used.
Time m_retransmissionTimer
Retransmission timer, i.e.
virtual void ReceivePdu(Ptr< Packet > p)
Receive a packet, thus decapsulate and defragment/deconcatenate if needed.
uint32_t m_arqWindowSize
ARQ window size, i.e.
uint32_t m_txedBufferSize
uint32_t m_nextExpectedSeqNo
Next expected sequence number at the packet reception.
virtual void NotifyConstructionCompleted() override
Notifier called once the ObjectBase is fully constructed.
virtual void ReceiveAck(Ptr< SatArqAckMessage > ack)
Receive a control message (ARQ ACK).
virtual ~SatGenericStreamEncapsulatorArq()
Destructor for SatGenericStreamEncapsulatorArq.
void RxWaitingTimerExpired(uint32_t sn)
Rx waiting timer for a PDU has expired.
std::map< uint32_t, Ptr< SatArqBufferContext > > m_reorderingBuffer
key = sequence number value = GSE packet
std::map< uint8_t, Ptr< SatArqBufferContext > > m_txedBuffer
Transmitted and retransmission context buffer.
void ReassembleAndReceive()
Reassemble and receive the received PDUs if possible.
uint32_t m_arqHeaderSize
ARQ header size in Bytes.
void CleanUp(uint8_t sequenceNumber)
Clean-up a certain sequence number.
uint32_t ConvertSeqNo(uint8_t seqNo) const
Convert the 8-bit sequence number value from ARQ header into 32-bit continuous sequence number stream...
void SendAck(uint8_t seqNo) const
Send ACK for a given sequence number.
virtual void DoDispose()
Dispose of this class instance.
virtual uint32_t GetTxBufferSizeInBytes() const
Get the buffered packets for this encapsulator.
std::map< uint8_t, Ptr< SatArqBufferContext > > m_retxBuffer
Ptr< SatArqSequenceNumber > m_seqNo
Sequence number handler.
uint32_t m_retxBufferSize
virtual Ptr< Packet > NotifyTxOpportunity(uint32_t bytes, uint32_t &bytesLeft, uint32_t &nextMinTxO)
Notify a Tx opportunity to this encapsulator.
static TypeId GetTypeId(void)
Get the type ID.
virtual void DoDispose()
Dispose of this class instance.
SatGenericStreamEncapsulator()
Default constructor, not used.
Ptr< Packet > GetNewGsePdu(uint32_t txOpportunityBytes, uint32_t maxGsePduSize, uint32_t additionalHeaderSize=0)
Get new packet performs the GSE fragmentation and encapsulation for a one single packet.
virtual void ProcessPdu(Ptr< Packet > p)
Process the reception of individual GSE PDUs.
virtual uint32_t GetMinTxOpportunityInBytes() const
Get minimum Tx opportunity in bytes, which takes the assumed header sizes into account.
This class implements a tag that carries the satellite MAC specific information, such as source and d...
void SetDestAddress(Mac48Address dest)
Set destination MAC address.
Mac48Address GetDestAddress(void) const
Get destination MAC address.
void SetSourceAddress(Mac48Address source)
Set source MAC address.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.