Skip to content

ieee80211: support immediate Compressed Block Ack - #1345

Open
mgonzalezlopezudc wants to merge 17 commits into
inet-framework:masterfrom
mgonzalezlopezudc:work/compressed-blockack-s5
Open

mgonzalezlopezudc wants to merge 17 commits into
inet-framework:masterfrom
mgonzalezlopezudc:work/compressed-blockack-s5

Conversation

@mgonzalezlopezudc

@mgonzalezlopezudc mgonzalezlopezudc commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

HCF previously rejected Compressed Block Ack, so users could not study its bitmap, response, and recovery behavior through a complete exchange. This PR adds immediate Compressed Block Ack to the supported individual-frame MAC path. Eligible HT infrastructure links and the supported ac path use Compressed by default. Explicit Basic remains available for historical compatibility.

The originator sends individual QoS DATA frames and requests receipt status with an explicit BAR. The recipient returns a 64-bit receipt bitmap. HCF uses the actual profile for response matching, rates, airtime, protection, and timeouts. The Compressed response contains 32 bytes with FCS; Basic contains 152 bytes. A smaller response alone does not prove a performance gain.

The main compatibility changes affect configuration and custom components. Both endpoints must select the same profile because ADDBA does not negotiate it. Links without usable HT state use Normal Ack. Custom MAC and PHY components can require interface changes. The supported path includes A-MSDU, but this PR does not add A-MPDU transfer or complete HT-immediate transfer coverage.

Which links use the new default

HCF resolves blockAckVariant once at initialization. A Block Ack agreement identifies one peer and traffic identifier, or TID. Compressed requires usable local HT support and peer HT state for the relevant direction. A PHY mode name alone does not supply that state. Associated ac peers can qualify through their inherited HT support.

flowchart TD
    E{"Is Block Ack enabled?"}
    E -->|No| N["Use ordinary acknowledgment behavior"]
    E -->|Yes| P{"Which profile does HCF select?"}
    P -->|Basic| B["Retain historical Basic eligibility<br/>Peer HT records are not required"]
    P -->|Compressed default| H{"Are local HT support<br/>and peer HT state usable?"}
    H -->|No| F["Use Normal Ack<br/>Do not establish Compressed"]
    H -->|Yes| A["Apply setup eligibility rules<br/>Use Compressed after ADDBA acceptance"]
Loading

For example, an HT ad hoc configuration can lack peer HT records. The default still selects Compressed, but DATA uses Normal Ack. To retain a historical Basic study, select mac.hcf.blockAckVariant = "basic" at both endpoints. Existing Basic demonstrations retain their explicit selectors and result rows.

For an active Compressed agreement, the originator suppresses fragmentation for that peer and TID. Normal Ack DATA within that agreement has the same restriction. The recipient rejects fragmented DATA before receipt or reorder updates. Basic retains fragment support. Outside a Compressed agreement, the existing fragmentation threshold applies.

Compressed supports immediate policy only. HCF rejects enabled delayedAckPolicySupported in either agreement policy at initialization, before ADDBA. Basic retains its existing configuration contract; that retention does not establish successful delayed Block Ack support.

How the exchange resolves DATA

The following hypothetical example starts with compatible profiles and an accepted agreement. DATA 101 is lost. The recipient retains DATA 102 until retransmission fills the gap. The example assumes no other gap-release condition applies.

sequenceDiagram
    participant O as Originator HCF
    participant R as Recipient HCF
    participant U as Recipient upper protocol
    O->>R: ADDBA Request for peer and TID
    R->>O: Accept immediate agreement
    O->>R: DATA 100 with Block Ack policy
    R->>U: Deliver 100
    O--xR: DATA 101 is lost
    O->>R: DATA 102 with Block Ack policy
    Note over R: Retain 102 behind the gap
    O->>R: Compressed BAR with start 100
    Note over R: Wait SIFS
    R->>O: Compressed Block Ack with bits 1, 0, 1
    Note over O: Resolve 100 and 102. Retain 101 for retry.
    O->>R: Retransmit DATA 101 before its deadline
    R->>U: Deliver 101, then 102
Loading

The response start can differ from the BAR start. The originator maps bits from the response start with modulo-4096 sequence arithmetic. Positive bits resolve only transmitted, unacknowledged frames inside the active transmit window. They cannot acknowledge unsent DATA. Zero bits leave frames unacknowledged.

A timeout or disjoint response releases the BAR wait so requested DATA can become retry eligible. The existing absolute DATA deadlines still apply.

The receive step checks profile, addresses, TID, Fragment Number zero, 64 bitmap bits, and supported length before success callbacks. Malformed responses cannot acknowledge DATA, refresh inactivity, or report success. A valid addressed BAR with the other profile causes a fatal configuration diagnostic when an agreement exists. HCF stops before state updates and sends no conflict-triggered DELBA. Users must correct endpoint profiles before a new run. Detection can follow earlier DATA delivery because ADDBA does not negotiate the profile.

Why receipt state survives delivery

The receipt record answers whether DATA arrived. The reorder buffer controls delivery order. Delivery must preserve receipt evidence for a later BAR. Scoreboard movement controls retirement of those bits. An absent receipt produces zero, including positions before the first received DATA.

flowchart TD
    D["Valid DATA for the active peer and TID"] --> S["Receipt record<br/>Record complete-unit reception"]
    S --> R["Reorder buffer<br/>Retain DATA until a release rule applies"]
    R --> U["Deliver eligible units in cyclic order"]
    U --> K["Preserve receipt bits<br/>until scoreboard retirement"]
    B["Valid Compressed BAR"] --> W["Adjust scoreboard window"]
    K --> W
    W --> A["Build 64 response bits<br/>Use zero for absent receipts"]
Loading

The recipient integration test receives DATA 100, 102, and 101. It delivers 100, 101, and 102 in order. A subsequent BAR still receives three positive bits and zero holes. Basic retains its separate fragment bitmap.

How physical timing permits gap release

The supported individual-MPDU release rule can permit delivery across a gap. It requires positive receipt evidence immediately before the scoreboard start. The DATA sequence must also lie inside the reorder window and above its start. The required SIFS or permitted RIFS relation must exist. RIFS means reduced interframe space. Without either receipt evidence or that relation, this rule permits no release.

Local receive timestamps alone cannot establish the interval when propagation delay exists. The medium supplies copied transmission and cached arrival endpoints. The PHY derives the interval at the current transmitter. HCF associates those facts with reception and ACK completion, without retained pointers to expired physical objects.

flowchart TD
    M["Radio medium<br/>Copy transmission and arrival endpoints"] --> P
    P["PHY<br/>Derive interval at current transmitter"] --> H
    E["Reception and ACK completion events"] --> H
    H["HCF<br/>Match event identity<br/>Validate SIFS or RIFS history"] --> C
    S["Receipt record<br/>Supply prior receipt evidence"] --> C
    C{"Do all release conditions hold?"}
    C -->|Yes| D["Reorder service releases eligible units<br/>Advance delivery window"]
    C -->|No| K["This rule permits no gap release"]
Loading

Unrelated, failed, abandoned, or overlapping receptions must not preserve stale eligibility. Local transmission clears prior history; completed ACK transmission can establish new history. HT management preserves advertised RIFS permission. VHT clears that permission. This PR adds no RIFS transmission scheduler.

The PHY also includes the six-microsecond HT signal extension at 2.4 GHz. The authoritative duration includes that extension, so HCF must not add it again. This correction can change airtime and simulation results.

How TXOP admission preserves progress

The initial Compressed candidate exposed a new supported continuation overrun. In General run 6, later A-MSDUs exceeded a one-millisecond TXOP by 310 microseconds. The exact S4 parent did not reproduce that case. The exchange selector checked positive time left without proof that the complete exchange fit.

A final transmit check alone could refuse an aggregate after source removal. The data service now creates a duplicate preview while original MSDUs remain queued. HCF selects one DATA mode and evaluates complete exchange cost. If the aggregate fails admission, HCF evaluates its first ordinary MSDU with the same mode.

flowchart TD
    Q["Original MSDUs remain queued"] --> A["Create aggregate preview<br/>Select one DATA mode"]
    A --> F{"Does the aggregate qualify?"}
    F -->|No| O["Evaluate ordinary MSDU preview<br/>Use the same DATA mode"]
    F -->|Yes| P["Retain preview and modes"]
    O --> G{"Does the ordinary form qualify?"}
    G -->|No| D["End sequence without DATA failure<br/>Preserve queue, deadlines, and sequence state"]
    G -->|Yes| P
    P --> R["Perform RTS/CTS if required"]
    R -->|RTS fails| X["Apply RTS recovery<br/>Discard unused preview"]
    R -->|No RTS or CTS succeeds| V{"Are sources and modes still valid?"}
    V -->|No| Z["Cancel preparation<br/>Preserve valid original sources"]
    V -->|Yes| C["Commit the same preview<br/>Submit DATA with retained mode"]
Loading

Commitment removes sources and assigns sequence state immediately before first DATA submission. Refusal preserves original queue frames, deadlines, and sequence state. One selected mode survives RTS/CTS. Failed RTS before commitment updates access-category recovery without a provisional sequence counter. Original lifetimes bound repeated attempts. Expiry or changed capabilities cancel invalid preparation.

Ordinary commitment uses normal dequeue or selected extraction and copies completed region metadata into the retained preview before source deletion. For example, an MSDU that waits 2 ms retains that queueing time and one departure after commitment. Retransmission retains the first measurement without another pull. Aggregation retains its existing source-removal behavior.

The corrected path retains permitted initial ordinary-MSDU and same-size retransmission exceptions. An oversized first-attempt A-MSDU cannot use the retransmission exception. Single protection reserves only the current exchange; a later BAR can require fresh contention. Basic and traffic outside active Compressed agreements retain their existing admission limits. A strict timing fixture preserves an inherited failure outside this scope.

Dependencies and complete commit order

This PR depends on #1343 and #1344. The comparison starts at master commit 675655fc3559231c56b12d651384cb8695255abc and ends at 1dd4ca23785b14b058693e9e20434a4257c3831f. The first seven commits are the exact synchronized #1344 prefix. The next ten supply S5. All 17 commits form the dependency prefix of #1363.

The shared queue contract permits selected service behind deferred DATA with normal pull effects. Agreement handlers and HCF coordinate setup, retirement, and safe physical completion. S4 supplies Basic BAR completion and shared window operations. S5 adds copied physical timing, wire formats, reversible preparation, and complete explicit Compressed exchanges.

  1. 435fc0866d adds selected extraction with ordinary queue effects; it prepares the lifecycle consumer.
  2. 2c6b1df761 connects Action delivery, setup, retirement, reset, and deferred DATA selection.
  3. 832dc3672c gives the frame-sequence handler ownership of interruption outcomes.
  4. 0c23400688 records S3b completion and its verification scope.
  5. 23c1939f27 exposes DATA preview without extraction or sequence assignment.
  6. 2c454a83d1 completes Basic BAR selection, retry feedback, reservation, and final transfer resolution.
  7. 728d3dd911 gives the originator agreement ownership of window operations.
  8. 1f3edba0c6 adds copied physical timing facts to the radio medium and communication caches.
  9. ef9ecba78c includes the six-microsecond HT signal extension at 2.4 GHz.
  10. 2c329da06c preserves advertised RIFS permission through HT management conversion.
  11. b7fb7a52ff releases temporary Basic bitmap allocations before the wire-format change.
  12. 96be3ee415 serializes complete Basic and Compressed Block Ack Types.
  13. ca60df56ee adds reversible QoS DATA preparation and preserves ordinary queue effects at commitment.
  14. 1f7b8f76ea adds Compressed receipt state without runtime activation.
  15. 5b87231f41 adds legal Compressed control-rate selection without runtime activation.
  16. 126c63f561 connects complete explicit immediate Compressed exchanges and their production fixtures.
  17. 1dd4ca2378 selects Compressed by default after the complete runtime path exists.

Receipt and rate helpers precede activation. HCF still rejects Compressed in those two prerequisite commits. The activation commit connects agreement state, receipt state, physical intervals, response timing, and admission because a complete exchange needs those contracts together.

Architecture and migration

HCF owns the immutable profile and local interframe history. Agreement records own receipt state. The reorder service owns delivery order. The rate selector consumes committed MIB rates and distinguishes initial BAR from later BAR. Compressed BAR uses legal non-HT rates. Protection, timeouts, and Duration fields use the actual response profile and airtime.

The serializer independently decodes the complete four-bit wire Type. Type 0 retains Basic compatibility; Type 2 selects Compressed. Unsupported types follow the invalid-frame path. The Compressed header chunk contains 28 bytes; its trailer supplies the four-byte FCS. Compressed reserved bits write zero, and received reserved values do not change the result. Basic producers must keep overlapping Type bits zero.

Custom radio media and communication caches must supply copied timing facts without retained object pointers or cache mutation. Custom IEEE 802.11 modes must expose signal extension. Custom QoS rate selectors, recipient ACK policies, data services, and frame sequences must preserve the new exchange and preparation contracts. The migration guide gives the API obligations. The user guide and WHATSNEW explain configuration effects.

The replacement plan defines S5. The TXOP correction defines preparation and admission. The execution record gives detailed cases, commands, results, and limits.

Verification and limits

Fresh debug and release builds pass at 1dd4ca23785b14b058693e9e20434a4257c3831f with all 12 available CPUs. The debug campaign covers every changed test fixture in the master comparison. All selected fixtures report their expected successful result.

Check Result
Debug and release compilation Both PASS.
Module fixtures 33 PASS.
Protocol fixtures 4 PASS.
Serializer fixtures 1 PASS under its declared coverage and skip rules.
Unit fixtures 9 PASS.
Functional fingerprint cases 12 PASS, with unchanged expectations.
Series and description gates All five PASS.
Source seals and scoped MAC architecture PASS.
Global architecture, naming, and interface gates The same inherited findings remain. These gates retain exit code 1.

The global comparison checks the finding text. Counts of unchanged interfaces and examined declarations can differ between stages. These counts do not introduce new findings.

Executed commands and selectors

The build commands run from this PR's checkout root:

make MODE=debug -j12
make MODE=release -j12
opp_repl --load /home/user/omnetpp-6.4.0aipre2/.venv/lib/python3.14/site-packages/opp_repl/opp/inet.opp -p inet

The opp_repl adapter selects this checkout's inet_project. It calls the checked-out test functions with these exact arguments. It rejects empty selections and unexpected results.

run_module_tests(simulation_project=inet_project, mode="debug", filter=r"(?:Ieee80211BlockAckActionDelivery_1\.test|Ieee80211BlockAckActionDispatch_1\.test|Ieee80211BlockAckActionDisposal_1\.test|Ieee80211BlockAckAdmission_1\.test|Ieee80211BlockAckAssociationReset_1\.test|Ieee80211BlockAckCompletionCost_1\.test|Ieee80211BlockAckDataSelection_1\.test|Ieee80211BlockAckDeferral_1\.test|Ieee80211BlockAckDeferredCollision_1\.test|Ieee80211BlockAckFragmentRetirement_1\.test|Ieee80211BlockAckLifecycle_1\.test|Ieee80211BlockAckNegotiation_1\.test|Ieee80211BlockAckReordering_1\.test|Ieee80211BlockAckResponseWait_1\.test|Ieee80211BlockAckRetiredData_1\.test|Ieee80211BlockAckScheduling_1\.test|Ieee80211BlockAckVariant_1\.test|Ieee80211CompressedBlockAckAdmission_1\.test|Ieee80211CompressedBlockAckExchange_1\.test|Ieee80211CompressedBlockAckInput_1\.test|Ieee80211CompressedBlockAckInterframe_1\.test|Ieee80211CompressedBlockAckMigration_1\.test|Ieee80211CompressedBlockAckOriginator_1\.test|Ieee80211HcfHeader_1\.test|Ieee80211HcfMultipleProtection_1\.test|Ieee80211HcfMultipleProtection_2\.test|Ieee80211HcfSingleProtection_1\.test|Ieee80211PreparedQosData_1\.test|Ieee80211RecipientNav_1\.test|Ieee80211SingleProtectionGroup_1\.test|Ieee80211Txnav_1\.test|Ieee80211VhtHtSupport_1\.test|PacketSelectiveExtraction_1\.test)$", concurrent=False)
run_protocol_tests(simulation_project=inet_project, mode="debug", filter=r"(?:Ac_BlockAck\.test|Ac_BlockAckFallback\.test|N_BlockAck\.test|N_CompressedBa\.test)$", concurrent=False)
run_serializer_tests(simulation_project=inet_project, mode="debug", filter=r"(?:serializer_chunk_roundtrip\.test)$", concurrent=False)
run_unit_tests(simulation_project=inet_project, mode="debug", filter=r"(?:Ieee80211BlockAckScheduling_1\.test|Ieee80211BlockAckWire_1\.test|Ieee80211CompressedBlockAckRate_1\.test|Ieee80211CompressedBlockAckRecord_1\.test|Ieee80211HtCapabilities_1\.test|Ieee80211HtModeSet_1\.test|Ieee80211MultipleProtection_1\.test|Ieee80211ResponseTimeout_1\.test|TransmissionTimingSnapshot_1\.test)$", concurrent=False)

The fingerprint command runs from tests/fingerprint:

./fingerprinttest -d -F tyf -t 3 -m 'showcases/wireless/(aggregation|qos|blockack)/|showcases/wireless/fragmentation/.*-c HCFfragblockack |showcases/wireless/txop/|examples/adhoc/qos/.*-c MacQos -r 1|examples/wireless/qos/.*-c MacQosWithBlockAck ' showcases.csv examples.csv

The mechanical checks use the pinned master base 675655fc3559231c56b12d651384cb8695255abc. They cover the complete series and description, source seals, scoped MAC architecture, and the three global gates. This campaign changes no recorded expectation.

All 17 commits retain their scoped debug results from the #1363 reconstruction. Compared with the former head, dedcdffb3696f0402eb4c1e9ba90e448e02cefe5, this prefix adds the already validated ordinary DATA commitment repair. Its four paths are the data service, two production fixtures, and WHATSNEW. The repair preserves normal pull effects and completed region metadata. It changes no wire bytes or baseline value.

S5 introduces no new fingerprint expectation. The seven lifecycle updates remain with 2c6b1df761; the seven S4 updates remain with 2c454a83d1. This synchronization retains their exact approved values. The execution records retain the causal evidence and original approval scope.

Evidence covers the selected deterministic cases and their configured seeds. Recipient prefix release retains the recorded interpretation of individual-MPDU release conditions. Production HT catalogs supply no distinct legal alternate response for the tested 32-byte frame. A selector unit checks that contract separately.

This PR excludes A-MPDU transfer, implicit BAR, delayed Compressed Block Ack, Multi-TID Block Ack, HE bitmap lengths, and dynamic fragmentation. Basic preserves historical compatibility without a complete historical IEEE conformance claim. The supported ac exchanges do not establish complete VHT transfer support. This PR adds no MAC stop/start recovery.

Release behavioral tests, graphical tyf fingerprints, and feature-isolation builds remain unverified. This synchronization supplies no new independent correctness audit. Fingerprint matches do not replace direct exchange or timing evidence.

Before this commit, consumers can inspect queued packets but cannot extract a later eligible packet with ordinary pull effects. Collection removal represents disposal. Deferred Block Ack DATA needs selection past an ineligible head without loss of queue observations.

After this commit, the optional collection contract provides a pure predicate query and atomic selected extraction. PacketQueue, CompoundPacketQueueBase, and PriorityScheduler preserve configured service order. Each layer applies its ordinary pull effects once. For example, extraction behind a deferred head retains ownership, residence metadata, and queue events.

An unsupported provider reports UnsupportedPacketSelection before extraction. Other queue and predicate errors retain their types. Direct tests cover storage, ownership, metadata, events, scheduler order, and unsupported providers. Ordinary head service remains unchanged.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.queueing | behavior.add | test whatsnew | ieee80211-compressed-blockack-replacement
Before this commit, Action dispatch can reuse deleted headers and repeat agreement effects. Setup can accept an uncorrelated response. Teardown can retain obsolete work or unsent fragments of transmitted DATA. DATA extraction can advance sequence state before setup resolves.

After this commit, HCF dispatches complete accepted Actions once. Handlers correlate peer, TID, and dialog token before acceptance. The response determines agreement parameters. Directional retirement detaches the agreement before cleanup. Association replacement clears both roles before notification. Accepted physical exchanges finish safely but cannot submit retired protected frames after CTS.

Setup defers new DATA extraction until the procedure resolves. Already numbered DATA resolves before ADDBA. A later successor can start setup after an empty interval without an empty request. The response timeout starts after the request ACK. Uncertain setup requires DELBA before surviving unsent DATA can resume.

The QoS data service assigns a monotonic allocation index before fragmentation. All fragments retain that index in a tag. The agreement retains its highest transmitted index after ACK removal. Teardown uses that index to discard incomplete DATA. Older retransmissions cannot move the boundary backward. Wire sequence numbers remain unchanged.

For example, sequence 0 transmits before sequences 1 through 2047 expire. Fragment 0 of sequence 2048 next transmits. Teardown discards its unsent siblings despite the exact half-range gap. Later intact DATA and unrelated peer DATA remain eligible. Deferred deletion protects references during accepted physical exchanges.

An internal collision that discards first DATA also triggers retirement. HCF queues DELBA before the unsent successor can resume. Contention uses current eligibility, so deferred work cannot charge another category an internal collision. HCF schedules the earliest absolute deadline across both agreement roles.

These lifecycle contracts change together because retirement requires safe Action invalidation and accepted-exchange completion at first use. The shared queue capability precedes this commit. Direct fixtures cover Action correlation, timeout, collision, fragment retirement, sequence gaps, and association reset. The migration guide explains custom-module contracts.

Seven approved Basic fingerprint rows describe the changed setup boundaries. Numbered DATA resolves before setup, while infrastructure MacQosWithBlockAck waits for later DATA instead of empty-successor setup. Graphical expectations remain unchanged. Basic remains the default. Compressed exchanges, final-transfer arbitration, and MAC stop/start remain outside this commit.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.change.fix | test whatsnew migration fingerprint | ieee80211-compressed-blockack-replacement
Before this commit, HCF chooses completion or failure when an accepted Action interrupts a response wait. The frame-sequence handler owns the relevant exchange state, so receive dispatch duplicates that decision.

After this commit, HCF requests interruption without an outcome argument. The frame-sequence handler checks whether recipient processing retires the outgoing frame. A retired frame completes without failure feedback. Other exchanges retain the ordinary failure path. HCF cancels the receive timer at sequence completion.

For example, a correlated Action can retire outgoing management work during a response wait. The handler completes that retired exchange without failure feedback. Existing fixtures also cover refusals, unrelated Actions, and immediate ACK behavior. Custom handlers must implement the no-argument interruption operation. The migration guide explains this contract. Built-in packet behavior and event order remain unchanged.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | refactor | test migration | ieee80211-compressed-blockack-replacement
Before this commit, the branch lacks committed S3b completion records. Reviewers need component responsibilities, scope limits, and verification results in one record.

After this commit, plan/done/ contains the summary and execution record. The summary explains agreement setup, retirement, peer reset, and safe physical completion. The execution record explains allocation indices and separates results by original source revision. Those historical revision identifiers remain unchanged.

The records describe debug and release compilation, focused module fixtures, and functional fingerprint checks for the original implementation and later retirement repair. This documentation commit changes no protocol behavior or recorded expectation. S4 and production Compressed exchanges remain outside the completed stage.

Plan: plan/done/ieee80211-compressed-blockack-s3b-summary.md
Change: plan | behavior.add | -
Before this commit, the shared in-progress queue can obtain a successor only through extraction. The QoS data service already supports preview, but the generic contract does not expose it. BAR selection needs the candidate before queue ownership or sequence state changes.

After this commit, the contract exposes preview, sequence lookup, and aggregation capability. The in-progress queue can return a borrowed candidate and prospective sequence number. The ordinary successor query retains extraction as its default.

For example, a queued frame retains sequence 77 while preview reports prospective sequence 0. Preview leaves the frame in its queue. The DATA-selection fixture checks this result, ownership, and an empty in-progress set. Existing transmission behavior remains unchanged.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | refactor | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, BAR selection can extract DATA and combine counts across peers or TIDs. A short burst can lack a final response when its length remains below the BAR threshold. Duration forecasts can extract or incorrectly reserve an unprepared successor.

After this commit, HCF selects BAR work before DATA extraction. The ACK policy groups outstanding DATA by peer and TID within the accepted window. Below the threshold, it defers BAR only for the next DATA within that group and window. EDCA can contend for BAR without a DATA candidate.

Matched responses resolve only the selected peer and TID. Resolved DATA advances the window; the response starting sequence number alone cannot advance it. BAR policy calls require an explicit agreement-handler argument. Transmitted-BAR processing also requires an explicit originator agreement. Omitted arguments fail compilation. Explicit null arguments retain their documented behavior.

BAR collision and failure update contention state without a DATA retry entry. Retransmitted DATA sets Retry after failed Block Ack feedback. At a safe exchange boundary, final resolution or expiration triggers completion DELBA. HCF first checks queued DATA in the TID category to avoid repeated unrelated scans.

Basic single protection reserves only an already prepared successor. The sequence ends the TXOP before further extraction can change aggregation, fragmentation, or setup. Final zero-limit DATA reserves only its immediate required response. Prepared fragments can continue; unprepared successors require another TXOP. This policy can require more contention. Multiple protection retains its successor policy.

For example, a window of one and BAR threshold of five require BAR before the next sequence leaves the window. Direct fixtures also cover separate peers and TIDs, timeout, collision, expiration, final Duration, and later-BAR admission. The timing fixture checks the former 40-microsecond overrun and the permitted initial Control-frame exception.

Seven previously approved non-graphical fingerprint rows accompany their causal source change. Final ACK reservations, setup order, Retry feedback, and extraction boundaries explain those values. The execution record retains each exact value and its original approval. Graphical values remain unchanged and unverified.

BAR selection, Duration forecasts, and continuation share one candidate contract without extraction. They stay together so each recorded expectation describes the complete behavior. Production Compressed exchanges, general Basic DATA admission, and complete NAV conformance remain outside this commit.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.change | test whatsnew migration fingerprint | ieee80211-compressed-blockack-replacement
Before this commit, HCF calculates window advancement, while ACK callers repeat modulo-4096 distance calculations. Their results are correct, but separate definitions make later maintenance harder.

After this commit, OriginatorBlockAckAgreement owns sequence distance, bitmap membership, and window advancement. HCF supplies unresolved sequence numbers for the same peer and TID. ACK policy and feedback use the shared operations. Existing virtual window accessors remain in the advancement path.

For example, a window at 4094 advances to unresolved sequence 4095 and next to sequence 0 after resolution. With no unresolved DATA, it advances to the next allocation. Boundary tests also check the distinct 64-position bitmap range. Packet behavior, ownership, event order, and recorded expectations remain unchanged.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | refactor | test | ieee80211-compressed-blockack-replacement
Before this commit, interval consumers need retained transmission pointers or new propagation calculations. Cache expiry removes the relevant objects, so later MAC decisions cannot safely use those pointers.

After this commit, radio media supply copied transmission endpoints and cached arrival endpoints. A snapshot survives cache expiry without object pointers. The receiver includes the transmission identifier in its local signal-time indication. Later delivery can use that identity to locate the evidence.

For example, a recipient can retain arrival endpoints after the medium removes the reception. Const cache queries return absent results without insertion. Missing or identical transmission identities supply no interval evidence. The direct fixture checks copied values and absent states. The shared mechanism supplies no protocol-specific interval decision.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.physicallayer.wireless.common | behavior.add | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, HT duration omits the six-microsecond signal extension at 2.4 GHz. A waveform therefore ends early and supplies incorrect airtime and interval evidence.

After this commit, HT duration includes that extension. Mode queries supply its nominal duration. Transmission queries derive the actual extension from the waveform so interval consumers cannot count it twice. The mode fixture checks the 2.4 GHz extension and the other-band control.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.physicallayer.wireless.ieee80211 | behavior.change.fix | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, HT management conversion loses RIFS Mode. A recipient therefore cannot use received permission to identify a permitted RIFS relation.

After this commit, HT Operation retains RIFS Mode through conversion and equality checks. The MIB permits RIFS for unprotected HT operation and clears the permission for VHT. For example, an unprotected HT operation survives conversion with permission intact. The capability fixture checks these states. This commit adds no RIFS transmission scheduler.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.change.fix | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, Basic and Compressed decoders allocate temporary BitVector objects and copy their values without deletion. Repeated Block Ack decode therefore loses those allocations.

After this commit, the decoders construct bitmap values directly. The generated fields retain their own values without an unowned temporary. For example, independent Basic and Compressed octets retain the same bitmap bits after decode. The direct wire check covers both paths. Type interpretation and frame acceptance remain unchanged.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.change.fix | test whatsnew | ieee80211-compressed-blockack-replacement
Before this commit, Block Ack serialization decodes only part of the Type field. Compressed bitmap and fragment fields lack complete wire validation. The preceding prerequisite already removes the unowned bitmap temporaries.

After this commit, the serializer decodes all four Type bits. Type 0 retains Basic compatibility. Type 2 supplies a 64-bit Compressed bitmap and a 32-byte response with FCS. Both BAR profiles occupy 24 bytes with FCS. Invalid Types and malformed fragment fields fail validation.

For example, Type 2 with a nonzero fragment field fails validation instead of entering the supported Compressed profile. Independent octets cover both Types, malformed fields, reserved bits, lengths, and sequence wrap. The existing Compressed BAR builder supplies its complete header. Synthetic fixtures provide valid FCS lengths and every Basic bitmap entry.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, QoS data services must extract source frames before they can create an aggregate. A caller cannot inspect that aggregate before queue removal and sequence assignment.

After this commit, the service creates an owned preview while original MSDUs remain in their queue. Preparation copies the next sequence value without consumption. Successful commitment validates source identity, eligibility, lifetime, aggregation permission, and sequence state. It transfers the same preview and assigns its sequence number. Refusal preserves the preview and all source frames.

Ordinary commitment uses normal dequeue for the head or selected extraction for a later eligible frame. The service copies completed region metadata into the preview before source deletion. Queue service effects occur once. Aggregation retains its existing source-removal behavior.

For example, ordinary DATA that waits 2 ms retains 2 ms of queueing time and one queue departure after commitment. Direct service tests cover head and non-head commitment, refusal, stale state, and cancellation. Existing extraction remains available. Later runtime activation uses this contract to admit the complete DATA exchange before destructive preparation.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, recipient receipt state uses the Basic fragment bitmap. Delivery cleanup cannot supply the independent complete-MPDU receipt evidence that a Compressed response needs.

After this commit, the record retains explicit complete receipts within its Compressed window. The agreement selects that record profile. The response builder copies receipt truth into a 64-bit bitmap. Positive receipts survive delivery cleanup, while absent positions remain zero.

For example, a window at 4094 retains sequence 4094 after delivery and moves across sequence wrap without false positive bits. The direct record fixture checks window movement, the preceding receipt, absent positions, and response construction. HCF still refuses Compressed selection. This prerequisite activates no incomplete exchange.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.add | test whatsnew | ieee80211-compressed-blockack-replacement
Before this commit, QoS rate selection supports only the Basic Block Ack response contract. Compressed exchanges need distinct non-HT BAR selection and response-duration rules.

After this commit, the selector uses the applicable local, BSS, and peer rate sets for initial and later BAR. Compressed responses use their non-HT reference rate and 32-byte airtime. Invalid configured overrides fail explicitly. The new pure interface operation requires matching custom implementations.

For example, two peers with different operational rates can require different later-BAR rates. The direct rate fixture checks both peers, both response directions, Basic compatibility, and invalid overrides. HCF still refuses Compressed selection. This prerequisite activates no incomplete exchange.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, HCF still rejects the Compressed profile. Wire support, explicit receipt state, and rate helpers exist, but production exchanges do not use them.

After this commit, explicit Compressed profiles complete immediate exchanges on eligible HT links. Receipt bits survive delivery, absent receipts remain zero, and shifted responses apply only within the active window. Actual physical endpoints establish SIFS or permitted RIFS relations. Active Compressed agreements suppress fragmentation.

HCF uses the prepared non-HT BAR rates and 32-byte response airtime. Both endpoints must select the same profile because ADDBA does not negotiate it. Conflicting addressed BAR stops the simulation before agreement updates. Delayed Compressed policy fails initialization. Basic remains the default.

Active Compressed DATA checks complete exchange cost before destructive aggregation. Refusal preserves queue frames, deadlines, and sequence state. An oversized aggregate can fall back to its first ordinary MSDU. One selected mode survives RTS/CTS. Failed RTS updates category recovery without a provisional sequence counter. Original lifetimes bound repeated attempts.

For example, an aggregate that exceeds the exchange limit leaves its sources intact. HCF can instead admit its first ordinary MSDU with the same selected mode. Commitment records one queue departure and retains its queueing time through retransmission. Direct exchange and admission fixtures check refusal, fallback, retry, and response behavior.

Agreement activation, physical interval use, DATA admission, and frame sequences change together to expose a complete supported exchange. Shared queue, timing, permission, wire, preparation, receipt, and rate prerequisites precede activation. Single protection reserves only the current exchange. The following commit changes the default separately.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-compressed-blockack-replacement
Before this commit, a configuration without a profile selector uses Basic. The complete Compressed runtime requires an explicit selector.

After this commit, HCF selects Compressed by default. Eligible HT links use immediate Compressed exchanges. Links without usable local or peer HT state retain Normal Ack. Explicit Basic retains its historical compatibility path and fragment bitmap.

For example, an eligible n link without blockAckVariant now uses Compressed. The n and ac consumers cover explicit Basic, explicit Compressed, and the default. Migration cases cover capability fallback, profile conflict, and unsupported delayed policy. Existing Basic demonstrations retain explicit selectors.

Execution records retain supported scope and evidence limits. A-MPDU, Multi-TID Block Ack, delayed Compressed policy, complete historical Basic conformance, and complete VHT transfer remain outside this result. Admission limits outside active Compressed agreements also remain outside the correction.

Plan: plan/pending/ieee80211-compressed-blockack-replacement.md
Change: src.ieee80211 | behavior.change | test whatsnew migration | ieee80211-compressed-blockack-replacement
@mgonzalezlopezudc
mgonzalezlopezudc force-pushed the work/compressed-blockack-s5 branch from dedcdff to 1dd4ca2 Compare October 17, 2026 21:29

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