Repository navigation
ieee80211: add partial HT A-MPDU PHY reception - #1363
Open
mgonzalezlopezudc wants to merge 24 commits into
Open
mgonzalezlopezudc wants to merge 24 commits into
mgonzalezlopezudc wants to merge 24 commits into
Conversation
mgonzalezlopezudc
force-pushed
the
work/ieee80211-ampdu-implicit-blockack
branch
from
October 17, 2026 16:55
bd336df to
0c45db1
Compare
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
mgonzalezlopezudc
force-pushed
the
work/ieee80211-ampdu-implicit-blockack
branch
from
October 17, 2026 21:13
458aaef to
2664911
Compare
This was referenced Oct 17, 2026
mgonzalezlopezudc
force-pushed
the
work/ieee80211-ampdu-implicit-blockack
branch
from
October 17, 2026 21:54
2664911 to
56b75c9
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
An HT A-MPDU can contain a failed MPDU beside successful MPDUs. The former receiver made one error decision for the complete aggregate. It could not retain the separate PHY outcomes that later MAC acceptance needs. HT-SIG also lacked its byte representation, so aggregate identity could not survive independent byte conversion.
This PR adds partial PHY reception for HT aggregates. The radio preserves HT-SIG fields and CRC. The receiver checks the common header, finds bounded delimiter and MPDU ranges, and retains a PHY outcome for each range. A failed member leaves the aggregate bytes intact. Repeated queries reuse the same outcomes without extra random draws.
The supported receive profile is HT mixed format at 20 MHz with NIST or Yans, for long GI and short GI. The model uses independent range outcomes at the configured scalar SNIR reduction. Rx rejects aggregate containers before standalone FCS or MAC header checks. MAC member acceptance, delivery, and implicit Block Ack remain pending.
Complete comparison and dependencies
The comparison starts at master commit
675655fc3559231c56b12d651384cb8695255abc. It includes agreement lifecycle work from #1343, Basic BAR completion from #1344, and explicit Compressed Block Ack from #1345. Those dependencies remain part of the review until they enter master. This series contains 24 commits in the order below.The dependency commits give HCF safe agreement setup and retirement, selected queue service, reversible DATA preparation, and complete explicit Compressed exchanges. The PHY commits add HT-SIG, bounded ranges, pure error-model probabilities, cached outcomes, and compatibility checks. These are distinct delivery stages. The receiver header also states its override contract.
flowchart TD Q["Selected extraction<br/>with normal queue effects"] --> L["Agreement lifecycle<br/>and safe retirement"] L --> B["Basic BAR completion"] T["Copied physical endpoints"] --> C["Explicit immediate<br/>Compressed Block Ack"] B --> C D["Reversible DATA preparation"] --> C C --> P["Partial HT aggregate<br/>PHY reception"] P --> R["Current Rx rejects<br/>aggregate containers"] R -.-> M["Later MAC member acceptance<br/>and implicit Block Ack"]The series keeps shared mechanisms before their consumers. Corrective changes now reside with their semantic owners. Bitmap allocation repair precedes Block Ack Type support. Compressed receipt and rate helpers precede HCF activation. VHT header correction precedes HT-SIG validation. The optional probability role precedes receiver use.
435fc0866dqueueing: add: preserve pull effects for selected extraction.2c6b1df761ieee80211: fix: preserve Block Ack lifecycle boundaries.832dc3672cieee80211: refactor: let frame sequences own interruption outcomes.0c23400688plan: add: record S3b agreement lifecycle completion.23c1939f27ieee80211: refactor: expose DATA preview without extraction.429223850fieee80211: fix: complete Basic BAR transfer resolution.b2a1bd06c7ieee80211: refactor: centralize originator window operations.aff989c34dphysicallayer: add: retain copied physical timing evidence.aa9cb61cdfieee80211: fix: include the HT signal extension at 2.4 GHz.81417fb0f5ieee80211: fix: preserve advertised RIFS permission.9b601af370ieee80211: fix: release temporary Block Ack bitmap allocations.1ab742b9ebieee80211: add: serialize Basic and Compressed Block Ack Types.9a1d6ac562ieee80211: add: prepare QoS DATA without queue extraction.30afc0aaa3ieee80211: add: retain explicit Compressed receipt state.b8048fd514ieee80211: add: select legal Compressed control rates.c00da39c26ieee80211: add: complete explicit immediate Compressed Block Ack.4960ebc3f3ieee80211: change: default HCF to immediate Compressed Block Ack.917471ab57plan: add: define HT A-MPDU reception stages.d2df372532ieee80211: fix: create VHT headers for VHT signal modes.0fe439f77aieee80211: add: preserve HT-SIG and bounded MPDU ranges.dfa51d2a1aieee80211: add: expose pure HT A-MPDU range probabilities.3678e89b11ieee80211: add+change: retain partial HT A-MPDU PHY outcomes.2976c23355tests: add: verify seeded NIST and Yans aggregate reception.56b75c959atests: add: verify ordinary PHY compatibility with the parent.Shared queue and timing contracts
Deferred DATA can hide eligible work behind a queue head. Ordinary collection removal represents disposal and omits normal pull effects. The optional
ISelectivePacketCollectioncontract supplies a pure selection query and atomic selected extraction. Built-in queues and the priority scheduler preserve configured service order and apply normal pull effects once at each layer.For example, a deferred head can leave a later MSDU eligible. Selected extraction retains that MSDU’s residence metadata, queue event, and departure observations. A queue without this optional capability reports unsupported selection before extraction. Ordinary head service retains its existing behavior.
QoS DATA preparation creates an owned preview while source MSDUs remain queued. Successful commitment validates source identity, eligibility, lifetime, aggregation permission, and sequence state. It transfers the same preview and assigns its sequence number. Refusal preserves source frames and the preview. Ordinary commitment uses normal dequeue or selected extraction and copies completed region metadata before source deletion.
For example, an ordinary 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. This measurement correction covers ordinary DATA, including selection behind a deferred head.
The medium supplies copied physical endpoints through
IRadioMediumand the communication caches. The receiver supplies a transmission identity in its local signal-time indication. Later MAC work can query the relevant endpoints without retained reception pointers or new propagation calculations. Missing or identical identities supply no interval evidence. Const cache queries do not insert state.The explicit Compressed recipient uses those endpoints to check SIFS or permitted RIFS relations. Its receipt record remains separate from delivery state. Positive receipts survive delivery, while absent positions remain zero. HCF checks complete DATA exchange cost before destructive preparation. Both endpoints must select the same Block Ack profile because ADDBA does not negotiate it.
Partial PHY outcomes and the MAC boundary
Consider the tested PSDU with three MPDUs of 100, 101, and 102 bytes, plus one spacing delimiter. The PSDU contains 322 bytes. Four delimiter ranges and three MPDU ranges receive outcomes. Three alignment bytes contribute duration but receive no separate outcome or draw.
If the middle MPDU fails, the receiver retains the bytes and all seven outcomes. The aggregate bit-error flag remains clear, while the result reports the failed member separately. Rx rejects the container before standalone FCS or header checks. The drop signal retains the PHY outcomes. Successful aggregates follow the same rejection path until MAC aggregate acceptance exists.
flowchart TD H["Common PHY checks<br/>and HT-SIG succeed"] --> O["Retain four delimiter outcomes<br/>and three MPDU outcomes"] O --> A["MPDU A succeeds"] O --> B["MPDU B fails"] O --> C["MPDU C succeeds"] A --> P["Preserve complete PSDU bytes<br/>and copy all outcomes"] B --> P C --> P P --> R["Rx rejects container<br/>before standalone checks"] R -.-> M["Later member acceptance<br/>applies delimiter and FCS rules"]HT-SIG preserves all 48 bits through serialization and independent decode. The radio derives mode fields from the selected mode and aggregate identity from delimiter content. A singleton aggregate therefore remains distinct from a standalone MPDU. Decode preserves the received CRC so validation can detect corruption. Valid ordinary HT duration inputs remain unchanged.
The shared delimiter inspector reports PSDU-relative byte offsets and lengths. It checks delimiter CRC, signature, length, and content bounds. Bounded recovery can find later complete members after an invalid delimiter. The scan permits explicit byte reinterpretation when a delimiter candidate enters a typed MAC header. Typed and byte representations therefore retain the same recovered ranges. Existing typed delimiter error flags remain effective.
Deaggregation uses the same bounded layout. An incomplete layout can contain recovered complete members, but extraction alone grants no MAC acceptance. The PHY and future MAC therefore share one layout description without a second parser.
Failure boundaries and cache ownership
Invalid HT-SIG CRC or unsupported fields fail the HEADER decision before any range draw. A valid header whose length exceeds the PSDU instead fails DATA bounds checks. That case retains the accepted header property but supplies no ranges. Decapsulation refuses unsafe trailer removal.
Separate-part reception retains the existing PREAMBLE or HEADER abort, which supplies no container to MAC. Whole-signal reception can supply a marked failure container. Neither path supplies valid aggregate content after a failed common header.
The medium’s communication cache owns each decision. PREAMBLE calculates no HEADER or DATA outcome. DATA uses the retained common-field decisions and owns copied range values. WHOLE summarizes DATA. Direct success queries and result creation reuse those decisions.
sequenceDiagram participant R as Radio participant M as Medium and cache participant P as WLAN receiver participant E as NIST or Yans R->>M: Request DATA decision M->>P: Calculate after cache miss P->>M: Obtain common-field decisions loop Each bounded delimiter or MPDU range P->>E: Request success probability for this length E-->>P: Return existing DATA probability P->>P: Sample once when probability requires a draw end P-->>M: Return decision with owned range values M-->>R: Return retained decision R->>M: Repeat decision, success, or result query M-->>R: Reuse outcomes without new drawsThe result indication retains copied values after reception objects leave their lifetime. With a present model, aggregate PER, BER, and SER are
NaN. This profile supplies no aggregate probability estimate. The receiver does not calculate a whole-PSDU estimate solely for those fields. Ordinary MPDU metadata and absent-model metadata retain their existing behavior.Error-model and capability contracts
A present error model in an HT receiver must implement the optional
IIeee80211AmpduErrorModelrole. NIST and Yans implement it through their shared base. The support query is pure. The range operation uses the existing DATA calculation for the requested length and scalar SNIR. The genericIErrorModelcontract remains unchanged.Before its MIB update, the MAC supplies the exact mode set, channel widths, and spatial stream limit to the receiver. The model must cover all advertised long-GI and short-GI receive modes within those bounds. An unsupported mode causes
cRuntimeErrorbefore the update. Modes outside the effective stream limit do not cause rejection.The receiver header now states that override contract. Overrides must preserve the coverage check, failure boundary, capability state, and random draw count. An absent error model needs no probability coverage. It retains acquisition and SNIR checks without error draws. Ordinary unit-disk HT operation retains its absent-model path; this PR supplies no unit-disk aggregate support claim.
The changed PHY surface includes header fields, serialization, the radio, the receiver, the optional C++ and NED role, and copied indication metadata. The MAC adds the capability check before its MIB update. Rx uses its existing drop and contention path for aggregate rejection. These changes add no recovery timer, agreement store, or probability store. They change no sealed Packet API source.
VHT modes now create their existing VHT header type. The former HT header type could enter HT validation without an HT MCS. This correction adds no VHT aggregate profile or VHT serializer implementation.
Verification and limits
The PR head is
56b75c959af104b5db931bef022bdfe5578eead9. All 24 commit trees equal the previously tested trees. The retained scoped debug results identify the earlier head2664911ef9f14fb0080cd9f0dc9a21e770c2717d. The 19 transitions with changed compiled INET inputs also pass incremental debug builds. Other transitions retain the matching library and build their selected test executables.Fresh debug and release builds pass for the final source tree. Compared with
458aaef56af81c998e43d4528e02014db5719272, its only source change is the receiver contract comment.The final union passes 36 module fixtures, 10 unit fixtures, one serializer fixture, and four protocol cases. All 12 selected functional fingerprint cases pass. The five series gates, source seals, and scoped WLAN architecture checks pass. Global architecture, naming, and interface reports retain the same inherited findings as the original audit.
The original audit at
458aaef56af81c998e43d4528e02014db5719272passes debug compilation, the focused wire fixture, and nine module fixtures. Those module fixtures contain 1,138 distinct simulation runs. The PHY and compatibility campaigns use seeds 0, 1, and 2. These results identify the original audit revision; they do not establish per-commit results for the reconstructed series.The retained publication record also supplies debug and release builds and five aggregation and QoS functional fingerprint controls. The eight original PHY commits change no recorded fingerprint expectation. Dependency baseline changes retain their original values and causal commit ownership. This reconstruction introduces no new baseline value.
The retained parent comparison uses
4fa5cc0de15ee57388bcb3f20e866cab5972a670. Its 576 records contain 498 successful receptions, 66 delivered failure containers, and twelve separate-part header aborts. The original publication compares later records with those retained parent records. A new reconstructed-head run does not imply a new parent execution.The first abstraction uses independent range draws at the current scalar SNIR. It does not model correlated FEC errors or interference changes within a member. Alignment padding has no separate outcome. These checks establish model integration and compatibility, not new error accuracy or goodput. Release behavioral tests and feature-isolation builds remain outside the evidence.
The migration guide explains custom queue, timing, QoS, receiver, and error-model obligations. The PHY plan defines the receive profile and ownership. The PHY execution record retains original commands, revisions, seeds, and scope limits. Mermaid diagrams describe the design; they do not represent captured simulation traces.