Skip to content

Commit 59e502b

Browse files
fix(ieee80211): record frames at Block Ack window start
Accept WinStartR in the receiver Block Ack bookkeeping and add focused Basic and Compressed Block Ack coverage for the boundary.
1 parent 928c236 commit 59e502b

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

src/inet/linklayer/ieee80211/mac/blockack/BlockAckRecord.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ void BlockAckRecord::dataFrameReceived(const Ptr<const Ieee80211DataHeader>& hea
2424
SequenceNumberCyclic sequenceNumber = header->getSequenceNumber();
2525
FragmentNumber fragmentNumber = header->getFragmentNumber();
2626
// IEEE Std 802.11-2024, 10.25.6.3(b), case 3: an old related MPDU
27-
// does not change the Block Ack record.
28-
if (!(startingSequenceNumber <= sequenceNumber && sequenceNumber < startingSequenceNumber + 2048))
27+
// does not change the Block Ack record. The cyclic comparison below already
28+
// restricts the accepted range to [WinStartR, WinStartR + 2047].
29+
if (!(startingSequenceNumber <= sequenceNumber))
2930
return;
3031
// Cases 1 and 2: record an in-window MPDU, or advance WinStartR
3132
// before recording an MPDU beyond WinEndR (also see 10.25.6.4(c)).
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
%description:
2+
Validate that a Block Ack record accepts the MPDU at WinStartR and reports Basic fragment and Compressed state.
3+
IEEE Std 802.11-2024, 10.25.6.3(b), case 1.
4+
5+
%includes:
6+
#include "inet/linklayer/ieee80211/mac/blockack/BlockAckRecord.h"
7+
8+
%global:
9+
using namespace inet;
10+
using namespace inet::ieee80211;
11+
12+
static Ptr<Ieee80211DataHeader> makeReceivedQosHeader(SequenceNumber sequenceNumber)
13+
{
14+
auto header = makeShared<Ieee80211DataHeader>();
15+
header->setType(ST_DATA_WITH_QOS);
16+
header->setTid(5);
17+
header->setSequenceNumber(SequenceNumberCyclic(sequenceNumber));
18+
header->setFragmentNumber(0);
19+
return header;
20+
}
21+
22+
%activity:
23+
{
24+
BlockAckRecord record(MacAddress("11:22:33:44:55:66"), 5, SequenceNumberCyclic(101));
25+
record.dataFrameReceived(makeReceivedQosHeader(101), 64);
26+
record.dataFrameReceived(makeReceivedQosHeader(103), 64);
27+
ASSERT(record.getAckState(SequenceNumberCyclic(101), 0));
28+
ASSERT(!record.getAckState(SequenceNumberCyclic(102), 0));
29+
ASSERT(record.getAckState(SequenceNumberCyclic(103), 0));
30+
ASSERT(record.getCompressedAckState(SequenceNumberCyclic(101)));
31+
ASSERT(!record.getCompressedAckState(SequenceNumberCyclic(102)));
32+
ASSERT(record.getCompressedAckState(SequenceNumberCyclic(103)));
33+
EV << "IEEE Std 802.11-2024 10.25.6.3(b) WinStartR boundary is recorded in Basic and Compressed Block Ack state.\n";
34+
}
35+
36+
EV << ".\n";
37+
38+
%contains: stdout
39+
IEEE Std 802.11-2024 10.25.6.3(b) WinStartR boundary is recorded in Basic and Compressed Block Ack state.
40+
.

0 commit comments

Comments
 (0)