20 #include "block-ack-cache.h"
21 #include "ctrl-headers.h"
22 #include "wifi-mac-header.h"
23 #include "qos-utils.h"
26 #define WINSIZE_ASSERT NS_ASSERT ((m_winEnd - m_winStart + 4096) % 4096 == m_winSize - 1)
33 BlockAckCache::Init (uint16_t winStart, uint16_t winSize)
36 m_winStart = winStart;
37 m_winSize = winSize <= 64 ? winSize : 64;
38 m_winEnd = (m_winStart + m_winSize - 1) % 4096;
39 memset (m_bitmap, 0,
sizeof (m_bitmap));
43 BlockAckCache::UpdateWithMpdu (
const WifiMacHeader *hdr)
46 uint16_t seqNumber = hdr->GetSequenceNumber ();
49 if (!IsInWindow (seqNumber))
51 uint16_t delta = (seqNumber - m_winEnd + 4096) % 4096;
54 ResetPortionOfBitmap ((m_winEnd + 1) % 4096, ((seqNumber - 1) + 4096) % 4096);
56 m_winStart = (m_winStart + delta) % 4096;
61 m_bitmap[seqNumber] |= (0x0001 << hdr->GetFragmentNumber ());
66 BlockAckCache::UpdateWithBlockAckReq (uint16_t startingSeq)
71 if (IsInWindow (startingSeq))
73 if (startingSeq != m_winStart)
75 m_winStart = startingSeq;
76 uint16_t newWinEnd = (m_winStart + m_winSize - 1) % 4096;
77 ResetPortionOfBitmap ((m_winEnd + 1) % 4096, newWinEnd);
85 m_winStart = startingSeq;
86 m_winEnd = (m_winStart + m_winSize - 1) % 4096;
87 ResetPortionOfBitmap (m_winStart, m_winEnd);
95 BlockAckCache::ResetPortionOfBitmap (uint16_t start, uint16_t end)
99 for (; i != end; i = (i + 1) % 4096)
107 BlockAckCache::IsInWindow (uint16_t seq)
110 return ((seq - m_winStart + 4096) % 4096) < m_winSize;
114 BlockAckCache::FillBlockAckBitmap (CtrlBAckResponseHeader *blockAckHeader)
117 if (blockAckHeader->IsBasic ())
119 NS_FATAL_ERROR (
"Basic block ack is only partially implemented.");
121 else if (blockAckHeader->IsCompressed ())
123 uint32_t i = blockAckHeader->GetStartingSequence ();
124 uint32_t end = (i + m_winSize - 1) % 4096;
125 for (; i != end; i = (i + 1) % 4096)
127 if (m_bitmap[i] == 1)
129 blockAckHeader->SetReceivedPacket (i);
132 if (m_bitmap[i] == 1)
134 blockAckHeader->SetReceivedPacket (i);
137 else if (blockAckHeader->IsMultiTid ())
#define NS_LOG_FUNCTION(parameters)
#define NS_LOG_COMPONENT_DEFINE(name)
bool QosUtilsIsOldPacket(uint16_t startingSeq, uint16_t seqNumber)
#define NS_FATAL_ERROR(msg)
fatal error handling