Skip to content

IEEE 802.11: add HT A-MPDU with implicit Compressed Block Ack - #1364

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

mgonzalezlopezudc wants to merge 33 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 currently sends Block Ack DATA in separate PPDUs. This PR adds opt-in HT A-MPDU transmission with one implicit Compressed Block Ack response. Several independent MPDUs can share one PPDU, while each retains its sequence number, FCS, lifetime, and retry state.

A failed member therefore needs no retransmission of its successful neighbors. The originator can combine that retry with fresh DATA in a later aggregate. The default MPDU policy remains disabled; users select the new HT policy explicitly.

This PR depends on #1363, which supplies HT aggregate representation and cached PHY outcomes. The validated implementation base is 56b75c959af104b5db931bef022bdfe5578eead9, the current head of that prerequisite. GitHub requires an upstream branch as the PR base, so this PR targets master and includes prerequisite history. Use the feature-only comparison to review the nine commits from this delivery.

One response can acknowledge independent members

Hypothetical example: the recipient receives members 40 and 42, but member 41 fails. Its bitmap reports those receipts. The originator retains member 41 with its original deadline. A valid partial response does not require a BAR probe.

sequenceDiagram
    participant O as Originator
    participant R as Recipient
    O->>R: One HT PPDU: MPDUs 40, 41, 42
    Note over R: PHY outcome and FCS<br/>accept 40 and 42
    Note over R: Member 41 fails
    R-->>O: After SIFS: Compressed BA for 40 and 42
    Note over O: Complete 40, 42<br/>Retain 41
    O->>R: Later aggregate: retry 41 plus new member 43
    R-->>O: After SIFS: Compressed BA
Loading

Each member carries ACK policy bits 00. Aggregate reception gives those bits their implicit Block Ack meaning. The recipient constructs its response directly from the agreement and receipt state. It does not create a synthetic BAR. Response rate selection uses the actual received DATA mode.

Queue ownership changes at DATA submission

Selection first considers transmitted retries, then numbered unsent members, then new queued members. New members have independent previews. The source queue retains its original MPDUs until the actual DATA start, after any RTS/CTS exchange and IFS delay.

HCF selects one DATA mode before spacing, size reduction, protection prediction, and admission. The complete PSDU length controls RTS selection, including delimiters and spacing. Each reduction therefore checks protection again at that same mode.

flowchart TD
    Q[Queued sources and retained members] --> P[Prepare independent previews at one DATA mode]
    P --> L[Apply window, spacing, byte, and duration limits]
    L --> A{Complete exchange fits?}
    A -->|No| D[Defer; keep sources and sequence state]
    A -->|Yes| R{Complete PSDU requires RTS?}
    R -->|Yes| C[RTS and CTS]
    C -->|RTS failure| F[Update contention state; no DATA attempt]
    C -->|CTS received| I[Existing IFS timer]
    R -->|No| I
    I --> V{Agreement, deadlines, mode, and cost still valid?}
    V -->|No| D
    V -->|Yes| T[Commit new members and finalize each header and FCS]
    T --> S[Build and submit one aggregate PPDU]
Loading

Cancellation before submission causes no DATA attempt, DATA outcome, or member retry charge. Failed RTS also preserves every member's DATA retry state. Actual submission records each transmitted allocation with the agreement owner.

A zero TXOP limit permits one aggregate DATA PPDU with its protection and response. A multiple-member aggregate must fit a positive limit. The existing initial single-MPDU exception remains available for an eligible singleton retry. Admission also refuses a later exchange when Duration rounding leaves a reservation beyond the TXOP deadline.

Receipt remains a MAC decision

The PHY supplies cached common-header and bounded range outcomes. Rx recovers delimiter boundaries and applies each MPDU outcome before its FCS check. A declared-correct FCS therefore cannot accept a PHY-failed member. The shared packet core remains unchanged.

flowchart TD
    P[Cached PHY indication] --> H{Common header and content valid?}
    H -->|No| X[Refuse before standalone MAC or FCS peeks]
    H -->|Yes| D[Recover delimiters and inspect separate members]
    D --> F[Apply member PHY outcome and FCS]
    F --> C{Any correct member?}
    C -->|No| E[One corruption outcome]
    C -->|Yes| N[Suppress EIFS for this PPDU]
    N --> A{Address, profile, and agreement permit receipt?}
    A -->|No| Z[No receipt update or implicit response]
    A -->|Yes| B[Update bitmap and apply mandatory reorder release]
    B --> R[One Compressed BA after SIFS]
Loading

Correct overheard DATA and correct DATA without an agreement still suppress EIFS. They do not gain local receipt or response permission. Physical history supplies the facts for mandatory reorder release, including delimiter continuity and preceding frames. Receipt state remains with the existing Block Ack record.

An active Basic agreement cannot accept an implicit Compressed request. HCF stops with a profile-conflict diagnostic in that case. Both peers must select the same Block Ack profile; ADDBA does not negotiate that selector.

One probe exposes lost recipient state

An absent or invalid implicit response arms one explicit BAR probe before further DATA for that agreement. This probe is an INET recovery policy. The flag survives refusal or cancellation and clears only when Tx actually submits BAR.

stateDiagram-v2
    state "Ready for DATA" as DataReady
    state "Wait for implicit BA" as WaitImplicit
    state "One probe pending" as ProbePending
    state "Wait for probe result" as WaitProbe
    state "Agreement retired" as Retired
    [*] --> DataReady
    DataReady --> WaitImplicit: Submit aggregate DATA
    WaitImplicit --> DataReady: Valid BA, including zero bitmap
    WaitImplicit --> ProbePending: Missing or invalid BA
    ProbePending --> ProbePending: No legal admission or cancellation
    ProbePending --> WaitProbe: Actually submit one BAR
    WaitProbe --> DataReady: BA or probe failure
    WaitProbe --> Retired: Recipient DELBA
    Retired --> DataReady: Later accepted ADDBA
Loading

Probe failure returns to DATA retry without a second DATA outcome or another probe between those DATA attempts. A recipient without an agreement answers BAR through the existing DELBA path. The originator can then retire its stale agreement and establish another one while fresh DATA remains queued. This progress requires a responsive peer and a legal probe admission opportunity.

Supported configuration and extension changes

The transmit profile uses HT mixed format, 20 MHz, long GI, fixed DATA rates, and immediate Compressed Block Ack. The receiver also accepts advertised HT20 short-GI aggregates. HCF rejects aggregate opt-in with a rate-control submodule during initialization.

The example supplies scalar, dimensional, and zero-TXOP configurations. Production management establishes peer capabilities and receiver limits across both AP hops. The user guide explains opt-in and recovery. The migration guide lists the changed extension roles.

The architectural surface includes aggregate policies, QoS data services, Tx/Rx callbacks, recipient receipt context, frame sequences, ACK policy, and response rate selection. Each new interface method is pure virtual. Custom implementations must supply the declared operation or an explicit unsupported-capability diagnostic.

Commit order

  1. Repair cyclic sequence arithmetic at zero.
  2. Preserve negotiated receiver spacing.
  3. Add source-preserving HT construction and bounded admission calculations.
  4. Refuse failed PHY containers before standalone parsing.
  5. Add independent member preparation and the HT policy.
  6. Complete MAC reception, submission, response, selective retry, and probe recovery.
  7. Add the infrastructure example.
  8. Explain operation, migration, and the approved HT expectation change.
  9. Record completion and verification boundaries.

The large integration commit keeps the exchange contracts and their consumers together. Its earlier commits isolate the parts that can stand alone. The arithmetic fix is necessary because mandatory reorder advancement crosses sequence zero.

Boundary fixture integration

The PR audit found one test integration defect. The earlier PHY boundary fixture expected Rx to drop each whole aggregate. MAC integration extracts separate members and removes their aggregate indication. The stale listener requests that indication from a member drop and aborts.

The MAC integration commit now updates that fixture. Each member has a valid computed FCS trailer and a zero Duration value. The fixture checks PHY metadata on the aggregate, accepted members from production Rx, and failed member drops. All 16 DCF/HCF, typed/byte, scalar/dimensional, and reception-part combinations pass. Every run retains malformed-delimiter recovery and the standalone CTS check for a 50 us NAV.

The related Rx boundary fixture passes one run. The physical reorder fixture passes all 176 runs. The repair changes the test; production reception behavior remains unchanged.

Evidence and limits

Debug and release compilation pass at the final head. The original nine feature commits also compile in release mode in an isolated checkout. The final implementation evidence covers:

Check Observed result
Focused unit tests. 17 fixtures pass.
Module tests. 46 distinct fixtures pass, including 176 physical reorder/history cases and 57 admission runs.
Infrastructure exchange. 16 PHY/protection/TXOP configurations and three healthy-agreement recovery cases pass.
Complete Wi-Fi inventory. 77 distinct fixtures: 48 passes and 29 declared expected failures after bounded disk-space retries.
Ordinary fingerprints. All 23 selected configurations pass without baseline changes.
Graphical fingerprints. All 20 actual values match the pinned parent. Both revisions differ from 18 stored expectations.
Examples. Scalar, dimensional, and zero-TXOP configurations reach the simulation limit without error.

The later audit covers all changed test fixtures: 15 unit fixtures and 47 module fixtures pass across audit and repair runs. The repair reruns the 16 boundary cases and both related reception fixtures in debug mode with seed zero. Final publication checks repeat debug and release builds and the three focused module fixtures. The repair remains within the MAC integration commit, so the branch retains 33 commits, including nine feature commits. The rewrite changes no other file content. Intermediate tests for the complete prerequisite series remain unverified.

The complete protocol invocation exhausted disk space near its end. Its setup and matcher errors remain in the record. Filtered retries replace only incomplete observations. The approved N_Ampdu marker removal follows actual aggregate observation, an implicit response, and exactly 60 application deliveries. VHT markers and fingerprint baselines remain unchanged.

The execution record contains commands, configurations, seeds, failed attempts, and evidence boundaries. Raw implementation artifacts remain local under out/verification/ampdu-a2-a7/. Publication checks and per-commit build logs remain local under out/verification/ampdu-pr/. These artifacts are not repository files.

Scoped WLAN architecture, changed-file naming, and source seals pass. Global architecture, naming, and interface checks report the same findings as the pinned parent. The complete link check finds absent standards files in unchanged documents. C++ lint cannot run without a compilation database. These checks do not receive inferred passes.

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 has no runtime proof under the supported consistent mode configurations. The feature establishes neither throughput results nor complete amendment conformance. The approved base exception does not close prerequisite merge gate A0.

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.fix | 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
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. The PHY plan records the approved exception to the merge prerequisite. Its first stages define wire representation, bounded member ranges, and cached PHY outcomes. Later 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, VHT signal mode constructs an HT PHY header. The header type therefore disagrees with the selected PHY mode.

After this commit, VHT signal mode constructs the existing VHT PHY header. For example, a VHT transmission retains its VHT header identity instead of entering later HT validation with no HT MCS. The HT/VHT support fixture supplies the production control. This prerequisite adds no VHT serializer or aggregate profile.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.change.fix | whatsnew | ieee80211-ampdu-phy-reception
Before this commit, HT header conversion supplies no HT-SIG bytes. A byte-backed singleton aggregate therefore cannot retain its aggregate identity. Deaggregation lacks a shared bounded description of delimiters and complete MPDUs.

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 refuses invalid CRC, unsupported fields, and insufficient content before trailer removal. The shared delimiter inspector supplies bounded ranges for deaggregation and later PHY outcomes.

For example, an invalid delimiter starts bounded recovery across a typed MPDU header. The inspector permits explicit byte reinterpretation of each delimiter candidate instead of a failing typed conversion. Typed and byte representations retain the same later complete MPDU ranges. Existing typed delimiter error flags remain effective.

The wire fixture checks independent bytes, CRC, singleton identity, length limits, alignment, truncation, and typed delimiter recovery. Ordinary valid HT duration inputs remain unchanged. The preceding prerequisite already corrects VHT header identity. MAC aggregate acceptance remains outside this commit.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.add | test whatsnew migration | ieee80211-ampdu-phy-reception
Before this commit, error models expose complete-packet probabilities but no optional contract for HT aggregate ranges. Receiver integration needs a pure mode-support query and per-length success probability.

After this commit, the optional WLAN role supplies both operations. NIST and Yans implement the role through their shared base. The range operation uses the existing DATA calculation with the requested length. It rejects unsupported modes and invalid ranges without a random draw. The generic IErrorModel contract remains unchanged.

For example, an HT20 MPDU range uses the same probability as the existing DATA calculation for that length and scalar SNIR. Direct checks cover 64 HT20 modes, six lengths, seven SNIR values, and minimum and mean reductions. They also check mode support and unchanged draw counts. The receiver does not use the role until the next commit.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.add | test whatsnew | ieee80211-ampdu-phy-reception
Before this commit, the receiver samples an aggregate as one packet. It cannot retain successful members after partial DATA loss. Rx also treats an aggregate container as a standalone MAC frame and can fail during header or FCS checks.

After this commit, the medium cache owns common-field decisions and bounded delimiter and MPDU outcomes. Repeated queries reuse those samples. Partial DATA loss preserves the aggregate bytes. A result tag copies outcomes without reception pointers. Rx rejects aggregate containers before standalone checks through its existing drop and contention path.

For example, an aggregate with one failed MPDU retains successful neighbors and all range outcomes. The drop signal preserves those outcomes when Rx rejects the container. A standalone CTS still updates NAV. DCF and HCF cases cover typed and byte representations, scalar and dimensional radios, and whole and separate signal parts.

The receiver uses the preceding probability role. The MAC supplies exact receive-capability bounds before its MIB update. A present model must cover every advertised HT receive mode within those bounds. The header defines the override contract and required cRuntimeError boundary. Validation cannot change capabilities or consume random draws.

Absent error models retain common PHY checks without error draws. Aggregate error-rate estimates remain unknown; ordinary MPDU metadata remains unchanged. Direct fixtures cover cached decisions, malformed headers, insufficient content, missing roles, and incomplete mode coverage. MAC member acceptance and implicit Block Ack remain pending.

Plan: plan/pending/ieee80211-ampdu-phy-reception.md
Change: src.ieee80211 | behavior.add+change | test whatsnew migration | ieee80211-ampdu-phy-reception
Before this commit, pure calculation checks cover range probabilities, but deterministic receiver checks do not verify seeded NIST and Yans outcomes. The real models need direct checks through the production receiver.

After this commit, test subclasses call the real implementations through the receiver. Each range probability must equal the existing DATA calculation. Independent generators replay HEADER and range draws. The fixture compares cached outcomes, draw counts, and subsequent random values. Repeated PREAMBLE, decision, and result queries must reuse cached samples.

For example, a second DATA query must retain every outcome and leave the random generator at its expected next value. The reference matrix covers 64 HT20 modes, six lengths, seven SNIR values, and minimum and mean reductions. The receiver campaign uses scalar and dimensional radios, both signal-part modes, and seeds 0, 1, and 2. These checks establish no error-accuracy or goodput claim.

The complete receiver fixture now contains the pure probability matrix from the earlier prerequisite. The temporary independent fixture is removed. Production behavior 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. Plan records close the declared PHY verification stages. 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, 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
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. Bounded delimiter inspection retains invalid ranges for later MAC history checks.

The wire and construction fixtures check serialization, spacing boundaries, source preservation, and malformed layouts. 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, prepared aggregates lack a complete MAC exchange. Rx cannot accept independent members, and HCF cannot submit a batch or resolve its implicit response.

After this commit, Rx validates each member against cached PHY outcomes and its FCS. HCF applies agreement and address checks, records receipt, and supplies physical history for mandatory reorder release. The recipient returns one Compressed Block Ack after SIFS. A failed member cannot invalidate a correct neighbor or force EIFS after correct receipt.

At actual DATA submission, HCF validates the agreement, deadlines, retained mode, and complete exchange cost. Tx finalizes each member before envelope construction. RTS selection uses the complete PSDU. Cancellation preserves queued sources. Failed RTS updates contention state without a DATA attempt or member retry charge.

An unsuccessful implicit response requires one BAR probe before further DATA. Actual BAR submission consumes that requirement. Probe failure returns to DATA retry without duplicate DATA feedback. A recipient without an agreement can use the existing DELBA path, so continuous arrivals do not prevent stale-agreement retirement.

For example, loss of the middle member retains that member's original deadline for selective retry. The other members can complete independently. Physical fixtures cover partial loss, SIFS responses, admission, cancellation, ownership, response windows, recovery, and reachable release conditions. Protocol fixtures prove sixty application deliveries through both AP hops. The approved HT expected-failure marker removal accompanies this feature.

The earlier PHY boundary fixture now checks separate members through production Rx. Valid FCS trailers permit correct members to pass. The fixture checks member drops, delimiter recovery, and standalone CTS NAV across all 16 configurations. Related Rx boundary and reorder fixtures pass their 1 and 176 runs.

The aggregate step, callback contracts, receipt context, response wait, and reset handling must land together. Their consumers share one exchange lifetime. Splitting this integration further would leave incomplete contracts or require temporary implementations. Earlier commits isolate the independent arithmetic, capabilities, construction, refusal, and preparation changes.

Plan: plan/pending/ieee80211-ampdu-implicit-blockack.md
Change: src.ieee80211 | behavior.add+change | 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, user documentation describes A-MPDU transmission as unavailable. Extension authors also lack the aggregate preparation, submission, reception, and response contracts.

After this commit, the user guide explains configuration, independent member state, complete-PSDU RTS selection, implicit responses, and probe recovery. The migration guide names each changed extension role. WHATSNEW describes the supported profile and its limits. The Wi-Fi evidence report records the approved HT marker removal while it preserves the historical audit.

Change: doc | comment | - | ieee80211-implicit-blockack
Before this commit, the plan records the proposed exchange and A1 status. It lacks the completed MAC evidence and the final verification boundaries.

After this commit, the execution record maps A1 through A7 to their fixtures and results. It preserves failed attempts, disk-space recovery, the approved base exception, and the separate HT marker approval. Ordinary fingerprints pass. Graphical controls match the parent despite pre-existing baseline differences. The record states the interface, link, C++ analysis, and positive-RIFS limits.

The user separately authorizes commit, push, and PR creation. A0 remains open, so the plan stays under pending. This publication does not change the validated source base or approve a merge.

Change: plan | comment | - | ieee80211-implicit-blockack

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