Skip to content

IEEE 802.11: transmit HT aggregates with selective retry and recovery - #1364

Draft
mgonzalezlopezudc wants to merge 24 commits into
inet-framework:masterfrom
mgonzalezlopezudc:work/ieee80211-ampdu-implicit-blockack-a1-a7
Draft

mgonzalezlopezudc wants to merge 24 commits into
inet-framework:masterfrom
mgonzalezlopezudc:work/ieee80211-ampdu-implicit-blockack-a1-a7

Conversation

@mgonzalezlopezudc

@mgonzalezlopezudc mgonzalezlopezudc commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

The MAC can prepare aggregate members and receive aggregates, but it cannot submit a complete originator exchange. This PR adds production HT A-MPDU transmission with implicit Compressed Block Ack and selective retry.

Hypothetical example: a recipient acknowledges MPDUs 40 and 42 but omits MPDU 41. The originator completes 40 and 42. It retains 41 with its original deadline for retry. A later aggregate can combine that retry with new members when the transmit window permits them.

sequenceDiagram
    participant O as Originator
    participant R as Recipient
    O->>R: A-MPDU with MPDUs 40, 41, 42
    Note over R: Accept 40 and 42. Reject 41.
    R-->>O: After SIFS, Compressed Block Ack for 40 and 42
    Note over O: Complete 40 and 42. Retain 41 with its deadline.
    O->>R: Later aggregate with retry 41 and new MPDU 43
Loading

This diagram describes the hypothetical exchange. It is not a captured trace.

HCF checks the complete exchange cost before admission. At actual DATA submission, it checks the agreement, deadlines, mode, and cost again. Tx finalizes each member before aggregate construction. Cancellation before commitment preserves queued sources. Failed RTS causes no DATA attempt or member retry charge.

An absent or invalid implicit response requires one explicit BAR probe before further DATA for that agreement. Probe submission consumes the requirement. Probe failure permits DATA retry without another DATA outcome. A valid response with a zero bitmap permits DATA retry directly. This probe is an INET recovery policy.

This PR depends on the HT aggregate reception branch. Users select HtMpduAggregationPolicy explicitly. Transmission requires HT mixed format, 20 MHz, long GI, fixed DATA rates, peer HT receive capabilities, and an accepted immediate Compressed agreement. The default MPDU policy leaves aggregation disabled.

The changes cover Tx submission and callbacks, HCF admission, frame sequences, acknowledgment policy, response validation, retry, and agreement probe state. The AP example and user, migration, and release documents describe configuration and extension changes.

Module fixtures check admission, cancellation, submission, response windows, selective retry, and probe recovery. N_AmpduImplicitBa.test uses real association and application traffic through an AP. Its normal and partial-loss cases each require sixty deliveries. The partial-loss case also requires an aggregate member with Retry set.

The AP example retains its original files. Fresh debug smoke tests run General, ZeroTxop, and Dimensional at the example commit. Each configuration completes its configured 1.5 seconds with run zero and seed zero. These smoke tests establish successful completion, not throughput or complete protocol correctness.

The exact final fixture compiles on tested sender parent 8ac59b0107. The current parent, 1fdaa6333b, has the same complete tree. Both parent cases deliver sixty payloads but miss the required aggregate event. The protocol tester reports a runtime FAIL before the post-run checker reports an error. The new sender passes that same fixture. This comparison establishes the missing aggregate exchange, not an application delivery failure.

N_Ampdu.test also checks production aggregation and implicit responses. Fresh execution of its exact final fixture on the immediate parent remains unverified.

Adaptive aggregate rates, HT40 transmit aggregation, VHT aggregates, nested A-MSDUs, Multi-TID Block Ack, and correlated FEC errors remain outside this profile. Positive RIFS and MAC stop/start recovery remain unverified. These tests establish no throughput result or complete amendment conformance.

Stored fingerprints and statistical baselines remain unchanged. The existing sender commit retains the previously approved HT expected-failure removal. Some inherited behavior commits lack separate protocol reviewer documents.

This cumulative draft targets upstream master. Its own stage contains 5 commits. The stage comparison excludes prerequisite commits. Earlier commits remain visible until their prerequisite PRs merge.

If those merges change commit IDs, the dependent branches need a rebase.

Review the PRs in this order: #1363, preparation, reception, #1364.

Merge the reception PR first. That PR depends on the preparation PR, which depends on PR #1363.

Commits in this stage

Commit Contribution and test role
1fdaa6333b Exposes address and FCS finalization per member. Ordinary transmission completion and Compressed exchange fixtures serve as controls.
f6605c321a Connects submission, admission, cancellation, response validation, retry, and probe recovery. Five sender module fixtures and end-to-end protocol cases check the exchange.
94fd3d2175 Adds the AP example with scalar, dimensional, and zero-TXOP configurations.
a81ffed601 Documents sender configuration, interfaces, recovery, and release effects. It restores the complete original documentation.
5c0505f3ef Retains the original execution record and historical evidence limits. It changes no runtime behavior.
Prerequisite commits in review order
Commit Contribution and test role
37e9b9a798 Defines the PHY and MAC plan boundaries. It changes no runtime behavior.
b6e769ebfd Corrects the typed VHT header. The identity fixture checks the selected header.
320a64461f Finds bounded members after delimiter damage. The deaggregation fixture checks recovered members.
a64a3b75af Retains HT-SIG fields in bytes. The wire fixture checks the representation.
4d9ddb1fe6 Samples DATA errors without loss of typed chunk boundaries. Direct unit fixtures check corruption.
eb7e4157e3 Preserves cached partial reception outcomes. Physical reception fixtures check the PHY path.
4eeab252e8 Adds seeded PHY error checks through module fixtures.
614f94a640 Checks ordinary PHY behavior against the parent.
c136f222f3 Records PHY scope and limitations. It changes no runtime behavior.
35e43f487b Permits sequence arithmetic across zero. Ieee80211SequenceNumberCyclic_1.test checks that operation.
d8c9914942 Retains peer receiver spacing in each direction. Encoding, capability, association, and initialization fixtures check those limits.
739127da1e Builds aggregates within spacing, length, and duration limits. Construction and capability fixtures check bytes and exchanged limits.
a08d7df969 Rejects failed containers before standalone MAC access. Ieee80211AmpduRxBoundary_1.test supplies malformed containers.
2ab47c31fa Prepares reversible previews and commits validated batches. Ieee80211AmpduPreparation_1.test checks ownership, refusal, deadlines, and sequence wrap.
c94778c89c Documents preparation interfaces and receiver limits. It states that local aggregate transmission remains unavailable.
c0fda558b6 Retains original chunk errors through conversion. Ieee80211MpduDeaggregation_1.test checks the original error flags.
6c6cc1809b Extracts response construction and rate helpers. Ordinary Compressed exchange and response unit fixtures serve as controls.
3c2a0edc5a Connects member validation, receipt, reorder evidence, and the SIFS response. Physical boundary, reorder, input, and protocol fixtures check reception.
015be5c071 Documents receiver and response interfaces. It distinguishes recipient support from local aggregate transmission.

Fresh verification

The PR head is 5c0505f3ef. Tests and compilation ran at eb0aeac079. The PR head has the same complete tree. A message correction changes the commit IDs. Verification uses OMNeT++ 6.4.0aipre2, Clang, and the retained workspace. Fixture definitions supply configurations and seeds. Counts below identify fixtures, not simulation repetitions.

Check Observed result
Focused unit selection 11 PASS.
Focused module selection 20 PASS.
Focused protocol selection 5 PASS.
Debug compilation PASS.
Release compilation PASS.
AP example smoke tests Three configurations PASS.

Whole-tree architecture and interface checks retain existing findings. Their reports match the previous published feature reports. Naming checks retain the same violation lines. These checks remain FAIL. Mechanical series and source protection checks pass. C++ lint remains unverified without a compilation database.

All 176 physical reorder cases pass. Fresh execution of the exact receiver fixture on its immediate parent remains unavailable because that parent lacks the receive API. Ordinary refactor controls retain their assertions and pass. These results do not establish complete standards conformance.

The final complete Git tree equals the original PR head, 763c3f6d09. No production scaffold, test detour, documentation detour, or unexplained baseline difference remains.

Commands and local evidence

Evidence is under audit/ampdu-pr-split-20261105/. The execution record is ai-logs/executions/2026-11-05_ampdu-pr-split.md. Each source commit in the MAC split has a fresh debug build and focused test record. The prerequisite PHY commits retain their historical evidence. The temporary compatible descriptor omits only the unsupported coverage.report metadata. The checked-in descriptor remains unchanged.

make MODE=debug -j6
opp_run_unit_tests --load /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-exchange-split-20261105/compatible.opp -p inet -m debug --no-build --no-concurrent -f 'Ieee80211(MpduDeaggregation|CompressedBlockAckRate|CompressedBlockAckRecord|ResponseModeSelection|ResponseTimeout|AmpduResponseValidation|BlockAckScheduling|TxNavChoice|SequenceNumberCyclic|AmpduCapabilityEncoding|AmpduConstruction)_1\.test$' --result-file /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-pr-split-20261105/final-unit-results.json
opp_run_module_tests --load /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-exchange-split-20261105/compatible.opp -p inet -m debug --no-build --no-concurrent -f 'Ieee80211(Ampdu(Admission|Exchange|Recovery|ResponseWindow|TxStart|Preparation|RxBoundary|Capabilities|MacBoundary|Reordering)|HtAssociation|MgmtStaSimplifiedInitialization|RxTransmissionCompletion|CompressedBlockAck(Exchange|Input)|VhtHtSupport|HcfMultipleProtection|HcfSingleProtection|SingleProtectionGroup|Txnav)_1\.test$' --result-file /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-pr-split-20261105/final-module-results.json
opp_run_protocol_tests --load /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-exchange-split-20261105/compatible.opp -p inet -m debug --no-build --no-concurrent -f '(N_Ampdu|N_AmpduImplicitBa|WifiBlockAckBarWithoutAgreement|WifiHtAmpduPartialReception|WifiLocalInterframeInputs)\.test$' --result-file /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-pr-split-20261105/final-protocol-results.json -w '^tests/protocol/wifi$'
make MODE=release -j6
opp_run_smoke_tests --load /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-pr-split-20261105/compatible-example.opp -p inet -m debug --no-build --no-concurrent -w '^examples/wireless/htampdu$' -c '^(General|ZeroTxop|Dimensional)$' -r '^0$' -T 60s --result-file /home/user/omnetpp_ws/inet-ieee80211-ampdu-implicit-blockack-a1-a7/audit/ampdu-pr-split-20261105/example-smoke-results.json

Raw logs, JSON results, output archives, source comparisons, and file hashes retain the evidence and preservation checks.

Before this commit, the branch has no plan for HT aggregate reception or implicit Block Ack integration.

After this commit, the plans define separate PHY and MAC duties, staged changes, required evidence, and acceptance limits. Both plans use the integrated master base. Their first stages define wire representation, bounded member ranges, and cached PHY outcomes. MAC acceptance remains separate. This commit changes no runtime behavior.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: plan | behavior.add | - | ieee80211-ampdu-phy-reception
Before this commit, a VHT signal mode creates an HT header. The transmission has the wrong typed header and can enter later HT validation without an HT MCS.

After this commit, the VHT signal mode creates the existing VHT header. Its selected length remains unchanged. This prerequisite adds no VHT serializer or aggregate profile.

WifiVhtHeaderIdentity.test sends an ordinary PSDU through the production radio and checks the header at transmission start. On the parent, the factory supplies an HT object, so the assertion that requires Ieee80211VhtPhyHeader fails. With this commit, the factory supplies a VHT object. The VHT assertion succeeds, the HT exclusion succeeds, and the header length matches the selected mode. The driver then emits its required completion event. Both guard intervals use these assertions.

Protocol verification: tests/protocol/wifi/vht-header-identity.md

Protocol comparison: tests/protocol/wifi/vht-header-identity-comparison.md

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.change.fix | test whatsnew | ieee80211-ampdu-phy-reception
Before this commit, the shared loop stops at an invalid delimiter. In a three-member aggregate, the middle delimiter declares 2000 octets where only 124 remain. The deaggregator returns the first member but loses the later complete member.

After this commit, the same loop examines delimiter candidates at four-octet intervals. Explicit byte reinterpretation permits the search to cross typed MAC headers. A later valid delimiter supplies the final complete MPDU without an intermediate layout.

WifiMpduDeaggregation.test from this commit requires two outputs for the malformed input: the first and final complete members. On the immediate parent, the bounds check stops extraction after the first member. The two-member count assertion therefore fails. With this commit, the search finds the final delimiter and extracts its twenty-octet member. The count, length, and byte-content assertions succeed, so the driver emits its required completion event. Complete input still returns all three members. The fixture applies these assertions to typed chunks and reconstructed bytes.

The unit fixture also compares callback order and offsets across both representations. Extraction alone grants no MAC acceptance.

Protocol verification: tests/protocol/wifi/mpdu-deaggregation.md

Protocol comparison: tests/protocol/wifi/mpdu-deaggregation-comparison.md

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.change.fix | test whatsnew | ieee80211-ampdu-phy-reception
Before this commit, HT header conversion supplies no HT-SIG bytes. A singleton aggregate cannot retain its aggregate identity through byte conversion. The preceding VHT prerequisite already supplies the correct VHT header type.

After this commit, the radio assigns HT-SIG fields and CRC from the selected mode and aggregate identity. The serializer preserves all 48 bits. Validation rejects invalid CRC, unsupported fields, and insufficient content before length-based trailer removal. Ordinary valid HT duration inputs remain unchanged.

WifiHtAmpduWire.test sends a 104-octet singleton through the production radio. It requires the independent HT-SIG vector 00 68 00 0F B4 01. On the parent, the HT serializer writes zero bits for a 48-bit header. The serialization-length check fails before the expected-byte assertion can succeed. With this commit, serialization produces those six octets. Independent decode also satisfies the Length, Aggregation, MCS, guard-interval, and CRC assertions. Typed and raw-byte transmission use the same checks.

The fixture reads new fields through descriptors, so it can compile with the parent's header API. MAC aggregate acceptance remains outside this commit.

Protocol verification: tests/protocol/wifi/ampdu-ht-sig-wire.md

Protocol comparison: tests/protocol/wifi/ampdu-ht-sig-wire-comparison.md

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-ampdu-phy-reception
Before this commit, the public error-model interface offers whole-packet corruption only after a failed reception decision. The common corruption function repeats its samples until some error occurs. That contract cannot represent one unconditional DATA result with correct and incorrect chunks.

After this commit, computeReceivedData() samples each existing DATA chunk once. It returns content of the same length and bytes. Failed chunks receive local incorrect flags; transmitted chunks remain unchanged. An entirely correct result needs no retry. The common probability calculation uses DATA BER. Models can override that calculation with their existing PHY functions. Zero and unit probabilities consume no random number. Invalid probabilities cause a runtime error.

DataChunkCorruption_1.test checks correct content, local errors, unchanged bytes, duplication, extraction, and invalid probabilities without a MAC format. The receiver integration follows in the next commit. Existing whole-packet callers retain their current path.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.physicallayer | behavior.add | test whatsnew | ieee80211-ampdu-phy-reception
Before this commit, the receiver samples an HT aggregate as one packet. It cannot preserve an incorrect payload chunk beside correct content. Rx can inspect that container as a standalone MAC frame and request an invalid header.

After this commit, the receiver validates HT-SIG and PSDU bounds before DATA corruption. The IEEE 802.11 error-model base supplies chunk probabilities through its existing DATA calculation. The common error-model operation samples each chunk once without delimiter or MPDU knowledge. The DATA decision retains the received chunks. WHOLE and result queries reuse them. Failed chunks retain local incorrect flags without a change to the transmitted content.

For three typed members with an incorrect middle payload, the received packet retains that error beside correct first and final members. Byte conversion removes those boundaries, so raw input has one DATA outcome. The protocol fixture checks both cases at the production Rx drop. A later CTS must still set its 50-microsecond NAV. On the parent, the required indication is absent and the fixture fails at the drop. Fresh parent execution remains separate from final-HEAD verification.

Rx rejects aggregate containers before standalone checks. The indication retains header and content facts; chunk flags retain errors. Aggregate error-rate estimates remain unknown with a present model. Ordinary reception keeps its current path. Member acceptance and implicit Block Ack remain separate work.

Protocol verification: tests/protocol/wifi/ampdu-partial-reception.md

Protocol comparison: tests/protocol/wifi/ampdu-partial-reception-comparison.md

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.add+change | test whatsnew migration | ieee80211-ampdu-phy-reception
Before this commit, deterministic fixtures fix selected chunk failures but do not compare production model probabilities and random draws. A receiver could repeat DATA samples without those fixtures detecting every difference.

After this commit, the receiver fixture compares NIST and Yans chunk probabilities with their existing DATA calculations. Fixed seeds verify the sampled chunk flags, retained packet content, cache reuse, and the next random value. Scalar and dimensional radios cover both guard intervals and both reception-part modes. Each existing chunk receives one outcome, including padding.

For an intermediate probability, the reference generator consumes one draw per chunk. Repeated PREAMBLE, HEADER, DATA, WHOLE, and result queries must preserve the recorded flags and draw count. Header failure and insufficient content must prevent DATA draws. A generic BER model needs no aggregation role for initialization.

The fixture also checks pure PHY calculations across 64 HT20 modes, six lengths, and seven SNIR values. Production code and stored fingerprint expectations remain unchanged.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: tests | behavior.add | - | ieee80211-ampdu-phy-reception
Before this commit, ordinary reception controls lack a fixture that compiles unchanged on the pinned parent and the feature branch. The earlier receiver fixture cannot provide that independent compatibility comparison.

After this commit, one fixture records ordinary reception with identical inputs on both revisions. NIST, Yans, absent-model, and non-HT custom controls cover three noise levels and seeds 0, 1, and 2. The campaign uses scalar and dimensional radios with whole and separate signal parts. Each record includes outcomes, duration, metadata, draw counts, and subsequent random values.

For example, a failed ordinary reception must retain the same metadata and next random value as its parent control. The migration guide states the independent-range abstraction and its limits. MAC aggregate receipt and implicit Block Ack remain pending. BerTable retains its documented parent crash, which supplies no successful reception evidence.

The additional fixture and records change no production contract or stored expectation. Execution results belong in the PR description and execution record.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: tests | behavior.add | - | ieee80211-ampdu-phy-reception
Before this commit, the plans describe aggregate-specific probability roles and separate range outcomes. They also describe bounded deaggregation as a prerequisite in the same visible PR. These descriptions obscure the responsibilities of the PHY error model and the MAC parser.

After this commit, the plans assign chunk corruption to the common PHY interface. The receiver caches the received chunks. Error models use PHY conditions and bit lengths without MAC format knowledge. MAC extraction retains delimiter parsing and member validation. Raw byte input has one DATA outcome because byte conversion removes its original chunk boundaries.

The plans also separate the deaggregation prerequisite from recovery and partial PHY reception. Master supplies bounded extraction. The dependent work adds delimiter recovery and cached chunk errors. Member acceptance and implicit Block Ack remain separate future work. Expected results and retained historical evidence remain distinct.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: plan | behavior.change | - | ieee80211-ampdu-phy-reception
Before this commit, valid sequence arithmetic can produce an intermediate value of minus one. The shared helper rejects that value, so 0 - 1 fails instead of returning sequence 4095.

After this commit, the helper reduces every valid intermediate modulo 4096. Constructors and arithmetic operators still reject an unspecified source. The unit fixture checks every sequence value with positive and negative offsets. Aggregate reorder advancement needs this correction at sequence wrap.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.change.fix | test | ieee80211-implicit-blockack
@mgonzalezlopezudc
mgonzalezlopezudc force-pushed the work/ieee80211-ampdu-implicit-blockack-a1-a7 branch 2 times, most recently from 7e69ace to 763c3f6 Compare November 4, 2026 23:49
Before this commit, negotiated HT state lacks the receiver's minimum MPDU start spacing. An aggregate builder therefore cannot apply that receiver limit.

After this commit, full and simplified management preserve the encoded spacing in each negotiated direction. The MIB exposes the local receiver setting. The transmitter can obtain the peer receiver's limit before aggregate construction. Capability fixtures check asymmetric limits, encoding, initialization, and reset.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-implicit-blockack
Before this commit, aggregate construction cannot preview spacing at the selected DATA mode while it preserves the source MPDUs. It also lacks the complete HT duration admission calculation.

After this commit, the builder borrows source references and copies their data and region tags. Alignment padding and zero-length delimiters satisfy negotiated spacing. Construction checks the receiver byte limit, PPDU duration, and L-SIG length. Singleton aggregates retain their delimiter. Construction tests use the existing chunk walker without an intermediate layout.

The wire, traversal, and construction fixtures check serialization, spacing boundaries, source ownership, and malformed input. These operations prepare the later exchange without enabling the default MPDU policy.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add+change | test whatsnew migration | ieee80211-implicit-blockack
Before this commit, Rx excludes a decoded aggregate from standalone FCS checks. A failed common header can lack that decoded property, so its container can reach an unsafe MAC peek.

After this commit, Rx also checks common-header success and complete content before standalone parsing. The boundary fixture supplies malformed containers and proves refusal before the FCS predicate. Correct standalone reception retains its existing path.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.change.fix | test | ieee80211-implicit-blockack
Before this commit, the QoS service can prepare one DATA transmission but cannot retain independent previews beside canonical retry members. An aggregate selection must preserve sources until actual submission.

After this commit, the HT policy selects borrowed members under supplied peer, window, mode, spacing, and length limits. The service gives each queued member an independent preview. Batch commitment validates every source before extraction. Canonical members retain their sequence numbers and deadlines. Forwarded previews use the local transmitter address without changing queued headers or ordinary A-MSDU construction.

HCF rejects aggregate opt-in with a rate-control submodule at initialization. The default Basic policy remains disabled. Preparation fixtures check refusal, wrap, deadlines, limits, retained members, and both AARF rejection configurations.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-implicit-blockack
Before this commit, extension authors lack documentation for HT construction and reversible batch preparation. The MAC still cannot transmit aggregates.

After this commit, the migration guide describes receiver spacing, builders that retain sources, policy selection, batch commitment, and safe Rx rejection. The release note states the available capabilities and limits. This commit changes no runtime behavior.

Change: doc | comment | - | ieee80211-implicit-blockack
Before this commit, byte conversion can omit original chunk error flags during A-MPDU traversal. A converted delimiter or member can therefore appear correct despite a cached PHY failure in its original region.

After this commit, traversal checks the original chunk region before it accepts a delimiter. It marks an extracted member incorrect when the original region failed. The checks follow nested sequence and slice chunks without another PHY error draw.

For example, an incorrect raw DATA region contains bytes that resemble valid delimiters. The original region must prevent their acceptance. The added Ieee80211MpduDeaggregation_1 assertions fail on the parent and check this boundary after the fix. They also cover front offsets and errors across chunk boundaries. These checks establish extraction semantics, not a complete MAC exchange.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.change.fix | test | ieee80211-implicit-blockack
Before this commit, the bitmap builder and response-mode calculation require a received BAR, although their calculations use the agreement and eliciting mode. The later implicit response needs those calculations without an explicit BAR.

After this commit, the recipient procedure builds the bitmap from the agreement, peer, and TID. Rate selection calculates the Compressed response mode from the eliciting mode. Existing explicit BAR paths call these helpers with the same inputs as before.

For example, an explicit Compressed BAR still produces the same receipt bitmap and response mode. The Compressed record, rate, response-mode, and exchange fixtures serve as compatibility controls. This commit enables no aggregate sender or recipient receive path.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | refactor | test migration | ieee80211-implicit-blockack
Before this commit, Rx refuses aggregate content at the MAC boundary. Correct independent members cannot update receipt state, enter the reorder buffer, or request an implicit Compressed response.

After this commit, Rx checks each member against cached PHY outcomes and its FCS. HCF validates addresses, TID, profile, and agreement before it updates receipt state. The recipient sends one Compressed Block Ack after SIFS. One failed member does not invalidate a correct neighbor or cause EIFS when another member is correct.

For example, a fixture sends three MPDUs with a failed middle member through real radios. Rx accepts the two correct members independently. The recipient records those members and returns their bitmap when its agreement permits the implicit response. The reorder fixture also supplies physical SIFS intervals and delimiter gaps. Rx retains delimiter and interval facts across its local Block Ack so release uses actual reception evidence. The receipt record remains the acknowledgment-state owner.

The boundary, reorder, and Compressed input module fixtures check this receiver without a production aggregate sender. WifiHtAmpduPartialReception preserves cached PHY assertions before member extraction. WifiLocalInterframeInputs checks ordinary interval evidence and clears stale aggregate context when timing evidence is absent. The partial-reception fixture uses invalid MAC content, so it establishes no successful member delivery by itself. Fresh parent execution of the new receive API remains unavailable because the parent lacks that API.

The receive callback, receipt context, and reorder consumers enter together because each accepted member needs the complete release contract. Local aggregate selection, DATA submission, and sender recovery remain disabled until sender integration.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-implicit-blockack
Before this commit, the documentation covers aggregate preparation but lacks the recipient contracts. Custom components lack instructions for member validation and an implicit response.

After this commit, the user guide explains eligible recipient agreements, independent member acceptance, and the SIFS response. The migration guide describes Rx ownership, receipt context, agreement inactivity, response construction, and response rates. The release note distinguishes recipient support from local aggregate transmission, which remains unavailable. This commit changes no runtime behavior.

Change: doc | comment | - | ieee80211-implicit-blockack
Before this commit, Tx sets addresses and calculates the FCS inside the single-frame submission method. The later aggregate sender needs that same operation for each independent member before it constructs the aggregate.

After this commit, Tx exposes that operation through finalizeMpdu. Ordinary transmission calls the helper at the same point as before. The frame copy, IFS timer, transmission start, completion callback, and NAV update retain their existing order.

For example, an ordinary frame with computed FCS receives its local transmitter address before FCS calculation. The extracted helper preserves that result. The physical transmission-completion and Compressed exchange fixtures check the ordinary path. Aggregate submission and start callbacks remain outside this commit.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | refactor | test migration | ieee80211-implicit-blockack
Before this commit, the recipient can receive injected aggregates and return an implicit response. The local originator can prepare members but cannot submit an aggregate or resolve its response.

After this commit, HCF admits the complete exchange under agreement, deadline, mode, and airtime limits. RTS selection uses the complete PSDU after each batch reduction. At actual DATA submission, HCF validates the preparation, commits new members, and asks Tx to finalize every member. Tx submits the resulting aggregate. Cancellation before commitment preserves queued sources. Failed RTS updates contention without a DATA attempt or member retry charge.

For example, loss of the middle member retains that member's sequence number and deadline for selective retry. A matched Compressed response completes the other members independently. If the implicit response fails, one BAR probe precedes further DATA. Actual BAR submission consumes the probe requirement. Probe failure permits DATA retry without duplicate DATA feedback. An absent recipient agreement can trigger DELBA, so continuous arrivals do not conceal a stale agreement.

Admission, transmission-start, response-window, exchange, and recovery fixtures cover actual submission, cancellation, selective results, ownership, and probe bounds. N_AmpduImplicitBa uses real association and application traffic across both AP hops. Its assertions require sixty deliveries in each deterministic case and a retried aggregate member after partial loss.

The same fixture compiles on the parent. Both parent cases deliver sixty payloads but miss the required source aggregate event. The protocol tester reports FAIL, and the post-run checker rejects the missing PASS markers. N_Ampdu now checks the complete supported exchange and removes its previously approved expected-failure marker.

The transmit step, callbacks, response wait, cancellation, and recovery enter together because the first production sender needs complete terminal paths. Earlier commits isolate extraction, response helpers, finalization, and the recipient. Local aggregate transmission remains restricted to the fixed-rate HT20 long-GI mixed-preamble profile.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add | test expected whatsnew migration | ieee80211-implicit-blockack
Before this commit, users lack a complete configuration for the new HT aggregate profile. Selecting an HT mode alone does not establish peer capabilities or an accepted agreement.

After this commit, one example uses production management and fixed HT20 long-GI DATA rates. Scalar, dimensional, and zero-TXOP configurations send UDP traffic through an AP. The README explains opt-in, selective retry, probe recovery, and profile limits. These demonstrations establish no throughput result.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: examples | behavior.add | - | ieee80211-implicit-blockack
Before this commit, the documentation covers preparation and reception but still describes local aggregate transmission as unavailable. Sender activation adds configuration and Tx contracts that these documents do not explain.

After this commit, the user guide explains explicit policy selection, independent member state, complete exchange admission, selective retry, and probe recovery. The migration guide describes sender callbacks, cancellation, acknowledgment policy, and member outcome status. The release note states the supported profile and limits. The Wi-Fi evidence report retains the approved HT marker removal and its historical evidence.

This commit restores the complete original documentation after the first two PRs introduce their applicable sections. It changes no runtime behavior.

Change: doc | comment | - | ieee80211-implicit-blockack
Before this commit, the plan lacks the completed MAC execution record. Readers cannot locate the earlier acceptance evidence or its limits from the plan.

After this commit, the record maps implementation stages to their fixtures and historical results. It retains failed attempts, source identities, commands, baseline approvals, and coverage limits. The prerequisite check of the MAC contracts remains open, so the plan stays under pending.

This commit adds historical evidence and plan status. It changes no runtime behavior. The new PR evidence supplies fresh verification for this reconstructed series.

Change: plan | comment | - | ieee80211-implicit-blockack
@mgonzalezlopezudc
mgonzalezlopezudc marked this pull request as draft November 5, 2026 19:43
@mgonzalezlopezudc
mgonzalezlopezudc force-pushed the work/ieee80211-ampdu-implicit-blockack-a1-a7 branch from 763c3f6 to 5c0505f Compare November 5, 2026 19:43
@mgonzalezlopezudc mgonzalezlopezudc changed the title IEEE 802.11: add HT A-MPDU with implicit Compressed Block Ack IEEE 802.11: transmit HT aggregates with selective retry and recovery Nov 5, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant