Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Both runs use real association, production transmission, and the wireless medium
| 0 | No agreement for station `sta1` and TID 5 | Recipient-role DELBA for that station and TID |
| 1 | Real ADDBA establishes an agreement for `sta1` and TID 6 | Basic Block Ack for that station and TID |

Run 0 starts application traffic after the simulation's time limit. Run 1 supplies a short traffic batch before the crafted BAR. Read-only queries check the required agreement state at both endpoints before transmission. The control must establish its agreement before the response assertion can test normal behavior.
Run 0 starts application traffic after the simulation's time limit. Run 1 supplies a short traffic batch before the crafted BAR. At 1.002 seconds, the fixture blocks station contention while queued DATA remains. This control retains the agreement until the crafted BAR, despite S4's completion teardown. It changes no agreement state. Read-only queries check the required agreement state at both endpoints before transmission.

```mermaid
sequenceDiagram
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# DATA Retry: before and after the correction

> **Kind:** measurement · **Status:** current · **Seal:** none · **Owns:** — · **Stands on:** [guide](blockack-data-retry.md)

Both feedback cases fail at the Retry assertion on the parent. Both pass when the control adds only HCF's Retry branch. The final S4 source also passes both cases.

## Exact inputs and source controls

| Control | Production source |
| --- | --- |
| Parent | Commit `02f24a3a4d519511cf24731e25d926068b11d24d`; source tree `2a26acc1bd1d8d5ccac42c509cbfced219554175`. |
| Isolated correction | The same parent plus HCF's eleven-line Retry branch; source tree `5a58b7601444e9872312112e6f6e8ffc86207f67`. |
| Integrated S4 | Source tree `20aade533739a1877a87391909da7dd2a91c79c7`. |

All controls use the same `WifiBlockAckDataRetry.test` input. Its SHA-256 is `271696667cf84e675683c6e146d66fd0bd57fed144cf3221caefd7e18e2c14bf`. The fixture and shared lifecycle support build on both sides. No expected-failure declaration applies.

## Observed results

| Run | Parent | Isolated correction | Integrated S4 |
| --- | --- | --- | --- |
| 0: lost Block Ack | FAIL at the Retry predicate. | PASS. | PASS. |
| 1: cleared bitmap | FAIL at the Retry predicate. | PASS. | PASS. |

The parent reaches the retransmission of the captured sequence and TID. It fails because Retry remains clear. These failures are runtime assertion results, not setup or compilation errors. The isolated source changes only that transmitted header branch.

## Commands and artifacts

Build each source with `make MODE=debug -j12` before the test. From each checkout root, run:

```sh
inet_run_protocol_tests -p inet -m debug -w '^tests/protocol/wifi$' -f 'WifiBlockAckDataRetry\.test$'
```

The parent run uses `/tmp/pr1344-controls-20261022`. Its combined control command also selects the completion and two existing lifecycle fixtures. The parent log is `/tmp/pr1344-control-base-protocol.log`. Preserved outputs are under `/tmp/pr1344-parent-protocol-artifacts/WifiBlockAckDataRetry/`.

The isolated run uses the same retained worktree after the source patch. Its log is `/tmp/pr1344-control-retry-protocol.log`. The integrated log is `/tmp/pr1344-correction-final-protocol-regression.log`. Both integrated Retry cases pass. The combined parent runner returns 1 for the two new failing fixtures.

All runs use General configuration, runs 0 and 1, seed 0, and a 1.1-second limit. The protocol program stops each run when it reaches its verdict. No additional seed or loss campaign follows from these results.

## Fingerprint scope

The isolated correction completes seven existing fingerprint cases. Five `~tND` values differ. Every selected event and packet-length fingerprint remains equal to its parent baseline. The detailed calculation is `/tmp/pr1344-retry-fingerprints.out`.

The user approved the five intermediate values on 2026-10-22. They apply only before transfer completion enters the series. The final S4 source retains its seven previously accepted baseline rows. These measurements do not establish aggregate retransmission behavior or complete Basic conformance.
52 changes: 52 additions & 0 deletions doc/project/evidence/model/wifi/tests/blockack-data-retry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Standalone DATA Retry after Block Ack failure

> **Kind:** reference · **Status:** current · **Seal:** none · **Owns:** — · **Stands on:** [test](../../../../../../tests/protocol/wifi/common/WifiBlockAckDataRetry.test), [comparison](blockack-data-retry-comparison.md)

The originator must set Retry when it retransmits standalone DATA after failed Block Ack feedback. The test observes the production transmitted header. It requires the retransmission to retain the captured sequence and TID.

## Scenario and requirement

The infrastructure network contains an AP and two stations. A UDP stream starts at sta1 after association. The AP relays its traffic to sta2. Production ADDBA establishes the uplink agreement. Seed 0 and a 0.1 ms send interval make the selected exchange deterministic.

The test selects INET's Basic compatibility profile and disables A-MSDU aggregation. It inherits the lifecycle configuration and its inactive inactivity timer. The continuous stream reaches threshold five without a final-transfer requirement.

IEEE Std 802.11-2024, 9.2.4.1.6 requires Retry for retransmitted standalone DATA. Lost feedback can occur between compliant peers. The cleared bitmap is a controlled negative-feedback input. It tests the originator's response; it does not model the physical cause of every failed DATA reception.

## Faults and assertions

| Run | Fault at sta1 | Required result |
| --- | --- | --- |
| 0 | The radio tap drops the first Block Ack. | The same DATA sequence and TID return with Retry set after timeout. |
| 1 | The radio tap clears all bits in the first Block Ack. | The same DATA identity returns with Retry set after negative feedback. |

The first observed Block Ack DATA must have Retry clear. The test captures its identity before BAR. It next observes BAR, then the retransmission of that identity. Typed header queries avoid an ambiguous field lookup through the packet trailer.

The radio tap changes only received feedback. Association, agreement setup, DATA selection, timeout, ACK status, and retransmission remain production operations.

```mermaid
sequenceDiagram
participant O as Originator
participant R as Recipient
O->>R: Standalone DATA, Retry = 0
O->>R: BAR
alt Run 0: feedback loss
R--xO: Block Ack lost at the radio tap
else Run 1: negative feedback
R-->>O: Block Ack with cleared bitmap
end
alt Before P2
O->>R: Same sequence and TID, Retry = 0
else After P2
O->>R: Same sequence and TID, Retry = 1
end
```

## Cause and correction

The parent ACK handler already makes missing-feedback and negative-feedback DATA eligible. HCF previously forwarded that frame without setting Retry. The independent correction changes the header before Tx receives the retransmission. No candidate preview or completion DELBA is necessary for this path.

The [reviewer document](../../../../../../tests/protocol/wifi/blockack-data-retry.md) associates this fixture with plan P2. The [comparison record](blockack-data-retry-comparison.md) separates executed evidence from expected behavior.

## Limits

Two fixed-seed cases check header identity and Retry. They do not estimate loss probability, cover aggregates, or establish complete Basic conformance. The tap's cleared bitmap is test stimulus. It is not evidence of a particular physical error pattern.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ The fixture creates these roles through real ADDBA exchanges. It never inserts a

## Test sequence

The initial uplink batch starts at `1 s`. The reverse batch starts at `1.01 s`. Both batches end before replacement. At `1.1 s`, the station agent requires all four roles and saves the peer rate sets and advertised HT capabilities at both endpoints.
The initial uplink batch starts at `1 s`. The reverse batch starts one microsecond later. Both batches end before replacement. At `1.008 s`, the station agent requires all four roles and saves the peer rate sets and advertised HT capabilities at both endpoints. This early probe precedes S4's completion teardown.

The fixture uses 6 Mbit/s and disables A-MSDU aggregation. It disables Block Ack on sta2 and uses 100-byte downlink packets. The AP's Block Ack length limit excludes its larger forwarded uplink packets. These controls isolate agreements on the target link. Coincident transmissions produce a warning; this diagnostic setting changes no reception calculation.

The agent requests reassociation with its current AP without another authentication exchange. This condition matters because authentication could clear the old association before the test reaches the replacement path. The request's receiver and Current AP field must both identify the current AP.

Expand All @@ -50,7 +52,7 @@ sequenceDiagram
participant G as Station test agent
participant A as AP management and HCF
Note over S,A: Real traffic establishes both agreement directions
G->>G: Require four roles and save peer parameters at 1.1 s
G->>G: Require four roles and save peer parameters at 1.008 s
G->>S: Request reassociation with current AP
S->>A: Reassociation Request
A-->>S: Successful Reassociation Response
Expand All @@ -61,7 +63,7 @@ sequenceDiagram
Note over S,A: New traffic starts at 1.3 s and 1.31 s
S->>A: Fresh uplink ADDBA setup
A->>S: Fresh downlink ADDBA setup
G->>G: Require four fresh roles at 1.4 s
G->>G: Require four fresh roles at 1.38 s
```

The one-millisecond delay follows station reassociation confirmation. It permits the AP to receive the response ACK and commit replacement before the joint query. Inactivity expiration remains disabled, so it cannot explain removal of the agreements.
Expand All @@ -70,7 +72,7 @@ The one-millisecond delay follows station reassociation confirmation. It permits

The first state assertion requires four old roles. The next frame assertion checks same-AP reassociation. After completion, the fixture requires equal peer rate sets and advertised HT capabilities. It then requires zero old roles before the new traffic batches start.

The later batches must trigger fresh ADDBA Requests in both directions. Concurrent observations require new traffic at UDP on both destination stations. At `1.4 s`, the fixture requires four fresh agreement roles. This final condition excludes a repair that clears state but prevents later setup.
The later batches must trigger fresh ADDBA Requests in both directions. Concurrent observations require new traffic at UDP on both destination stations. The batches continue until `1.4 s` to retain useful transfer context. At `1.38 s`, the fixture requires four fresh agreement roles. This final condition excludes a repair that clears state but prevents later setup.

The test agent, `BlockAckReassociationAgent`, supplies only the reassociation request, state queries, and observation times. Production management performs the association transitions. Production HCF and its agreement handlers perform setup and cleanup. The agent never calls the peer reset operation.

Expand All @@ -93,7 +95,7 @@ inet_run_protocol_tests -p inet -m debug -w '^tests/protocol/wifi$' \

The file contains one simulation run with seed 0. Its required result is `PROTOCOLTEST wifi_block_ack_same_ap_reassociation: PASS`.

This test uses the Basic profile and successful same-AP reassociation. It does not cover another AP, refused reassociation, association loss, or replacement during an active DATA exchange. The state queries complement the frame trace. They do not establish full standards conformance.
This test uses the Basic profile and successful same-AP reassociation. It does not cover another AP, refused reassociation, or association loss. The state queries complement the frame trace. They do not establish full standards conformance.

## Profile limits

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Basic transfer completion: before and after the change

> **Kind:** measurement · **Status:** current · **Seal:** none · **Owns:** — · **Stands on:** [guide](blockack-transfer-completion.md)

Both completion cases fail before S4 and pass on its final production source. The queue-exhaustion case misses BAR. The one-position-window case observes DATA where BAR is required.

## Exact source and fixture inputs

The parent is `02f24a3a4d519511cf24731e25d926068b11d24d`, with source tree `2a26acc1bd1d8d5ccac42c509cbfced219554175`. The final S4 source tree is `20aade533739a1877a87391909da7dd2a91c79c7`.

The recorded controls use `WifiBlockAckTransferCompletion.test` with SHA-256 `e46b8804822747bc1558a802d0d7054aadf04b445370992bd5b5714b9864b0fa`. The shared topology and lifecycle inputs remain equal. No fixture supplies agreement state or injected feedback.

The current fixture also rejects the program's FAIL line. This output guard changes no runtime scenario or protocol assertion. It prevents one successful run from hiding the other run's failure.

## Verification of the output guard

The corrected fixture has SHA-256 `7d526bcf8c213ebe7fdb4e4e5182393d546ef60e79feb4e044c97c3372d08156`. Both normal runs pass through the integrated debug protocol runner. Separate diagnostic INI files delay traffic beyond the protocol deadline in either run or both runs. Each simulation batch returns status 0, even when a protocol verdict is FAIL.

The checks compare the same captured output against the previous fixture and the corrected fixture:

| Run 0 | Run 1 | Previous aggregate | Corrected aggregate |
| --- | --- | --- | --- |
| PASS | PASS | PASS | PASS |
| FAIL | PASS | PASS | FAIL |
| PASS | FAIL | PASS | FAIL |
| FAIL | FAIL | FAIL | FAIL |

These diagnostic failures are intentional controls, not failures of the normal completion scenarios. `opp_test check` returns 0 for PASS and 2 for FAIL, with zero harness errors. The guard rejects both mixed-result orders while it preserves the valid two-PASS result.

The debug build log is `/tmp/pr1344-r1-debug.log`. The normal protocol log is `/tmp/pr1344-r1-protocol.log`. The verdict matrix is `/tmp/pr1344-r1-verdict-matrix.json`. Detailed checker logs use `/tmp/pr1344-r1-<case>-<before|after>.log`. These local artifacts can be absent in another checkout.

## Observed results

| Run | Before S4 | After S4 |
| --- | --- | --- |
| 0: two packets, window 64 | FAIL: BAR deadline at step 3 expires. | PASS through matched feedback, DELBA, and ACK. |
| 1: four packets, window one | FAIL: the next DATA-or-BAR event fails the BAR predicate. | PASS through matched feedback, DELBA, and ACK. |

Both parent failures occur after real association, successful ADDBA, and the first Block Ack DATA. They reach the intended protocol boundary. They do not arise from a build or initialization error.

After S4, the policy selects BAR below threshold five. HCF permits BAR-only contention. The frame sequence receives matching feedback. Completion DELBA follows when no DATA remains. Zero inactivity timeout excludes inactivity teardown as an explanation.

## Commands and evidence

Build debug artifacts with `make MODE=debug -j12`. From each checkout root, run:

```sh
inet_run_protocol_tests -p inet -m debug -w '^tests/protocol/wifi$' -f 'WifiBlockAckTransferCompletion\.test$'
```

The parent command uses `/tmp/pr1344-controls-20261022`. Its combined selection also includes the Retry fixture and two existing lifecycle controls. Its log is `/tmp/pr1344-control-base-protocol.log`. Preserved outputs are under `/tmp/pr1344-parent-protocol-artifacts/WifiBlockAckTransferCompletion/`.

The integrated run uses `/home/user/omnetpp_ws/inet-compressed-blockack-s4`. Its log is `/tmp/pr1344-correction-final-protocol-regression.log`. The completion fixture passes both runs. That wider selection also exposes two pre-existing lifecycle fixture assumptions; its aggregate failure is not a completion-test failure.

General configuration runs 0 and 1 use seed 0 and a 1.1-second limit. The program stops when it reaches its verdict. The parent runner returns 1. The isolated final completion selection returns 0.

## Limits

These controls establish the two stated exchange sequences. The independent Retry correction does not create BAR-only access or completion DELBA. The exact reconstructed parent comparison receives its own verification record. No general performance, NAV, admission, or additional-seed claim follows from these results.
Loading
Loading