# RFC 9946 §8: Test Load Stream Transmission and Measurement Status Feedback Messages

The 57 Requirements of RFC 9946 §8, each quoted from the RFC with its state and the tests that prove it. [Conformance](index.md) explains the states.

| State | Requirements |
|---|--:|
| Tested | 55 |
| Deviation | 2 |

## RFC9946-8.1-1 {#RFC9946-8.1-1}

**Tested**

> When the server is sending Status Feedback messages, they will also contain the latest transmission parameters from the Sending Rate Table that the client SHALL use.

Note: srStruct in the Status PDU. Sizes are IPv4-based and an IPv6 Load Sender subtracts 20 bytes (ADR 0004).

Conformance Records: [ipv4-based-sending-rate-structure-sizes](../conformance/interpretations.md#ipv4-based-sending-rate-structure-sizes).

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::an_upstream_search_converges_near_the_bottleneck`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/upstream.rs::the_server_sends_status_pdus_with_its_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)
- [`crates/udpstp-core/tests/upstream.rs::the_client_follows_the_srstruct_of_later_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)

## RFC9946-8.1-2 {#RFC9946-8.1-2}

**Tested**

> When a Load PDU is received, the receiver SHALL do the following: 1. Verify that the size of the message is greater than or equal to the 'struct loadHdr' size shown in Figure 9. 2. Validate the checksum for the Load PDU header portion of the total message (as described in Section 5.6) if the optional checkSum field is being utilized. 3. Confirm that the PDU ID is 0xBEEF (Load PDU).

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::the_client_ignores_invalid_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-core/tests/downstream_load.rs::the_client_receives_a_valid_load_pdu_after_invalid_ones`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-core/tests/downstream_load.rs::the_client_verifies_a_populated_checksum_when_configured`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::decoding_rejects_short_datagrams_and_other_pdu_ids`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-3 {#RFC9946-8.1-3}

**Tested**

> If any of the above checks fail, the message SHALL be considered invalid.

Conformance Records: [undefined-flags-are-invalid](../conformance/interpretations.md#undefined-flags-are-invalid).

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::the_client_ignores_invalid_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-core/tests/downstream_load.rs::the_client_receives_a_valid_load_pdu_after_invalid_ones`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::decoding_rejects_short_datagrams_and_other_pdu_ids`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-4 {#RFC9946-8.1-4}

**Tested**

> The watchdog timer at the receiver SHALL be reset each time a valid Load PDU is received (which includes verification of the checkSum, if in use).

Note: Timeouts per ADR 0002.

Conformance Records: [receive-timeout-is-final](../conformance/interpretations.md#receive-timeout-is-final).

Proving tests:

- [`crates/udpstp-core/tests/timeouts.rs::traffic_that_comes_back_after_the_timeout_changes_nothing`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)
- [`crates/udpstp-core/tests/timeouts.rs::load_pdus_failing_the_checksum_do_not_reset_the_watchdog`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)

## RFC9946-8.1-5 {#RFC9946-8.1-5}

**Tested**

> When the server is sending Load PDUs in the role of sender, it SHALL use the transmission parameters directly from the Sending Rate Table via the index that is currently selected (which was indirectly based on the feedback in its received Status Feedback messages).

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::a_fixed_row_is_sent_as_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)

## RFC9946-8.1-6 {#RFC9946-8.1-6}

**Deviation**

> However, when the client is sending Load PDUs in the role of sender, it SHALL use the discrete transmission parameters that were communicated by the server in its periodic Status Feedback messages (and not referencing a Sending Rate Table directly).

Note: srStruct in the Status PDU.

Recorded in [sending-rate-structure-sanity-limits](../conformance/deviations.md#sending-rate-structure-sanity-limits), [client-keeps-to-its-max-bandwidth](../conformance/deviations.md#client-keeps-to-its-max-bandwidth).

Conformance Records: [ipv4-based-sending-rate-structure-sizes](../conformance/interpretations.md#ipv4-based-sending-rate-structure-sizes), [random-size-flag](../conformance/interpretations.md#random-size-flag), [sending-rate-structure-only-from-test-status-pdus](../conformance/interpretations.md#sending-rate-structure-only-from-test-status-pdus).

Proving tests:

- [`crates/udpstp-core/tests/upstream.rs::the_client_sends_the_servers_sending_rate_structure`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)
- [`crates/udpstp-core/tests/upstream.rs::the_client_follows_the_srstruct_of_later_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)
- [`crates/udpstp-core/tests/upstream.rs::a_new_srstruct_can_swap_transmitters`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)

## RFC9946-8.1-7 {#RFC9946-8.1-7}

**Tested**

> The threshold of consecutive feedback intervals SHALL be configurable with a default of 3 intervals.

Note: Fast Mode of algorithm B; slowAdjThresh field (Section 7.1).

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::the_accepted_parameters_drive_the_algorithm`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::the_client_asks_for_the_defaults`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)

## RFC9946-8.1-8 {#RFC9946-8.1-8}

**Tested**

> An OPTIONAL load rate adjustment algorithm (designated C) has been defined in [TR-471].

Note: rateAdjAlgo C (Section 12.3.8).

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_can_ask_for_algorithm_c`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::algorithm_c_is_accepted`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/algorithm_c.rs::a_search_with_algorithm_c_converges_near_the_bottleneck`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_c.rs)

## RFC9946-8.1-9 {#RFC9946-8.1-9}

**Tested**

> On the other hand, the test configuration MAY use a fixed sending rate requested by the client, using the field srIndexConf.

Note: Fixed-Rate Tests.

Proving tests:

- [`crates/udpstp-core/tests/fixed_rate.rs::an_operator_runs_a_fixed_rate_test_at_the_requested_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)

## RFC9946-8.1-10 {#RFC9946-8.1-10}

**Tested**

> The client MAY communicate the desired fixed rate in its Test Activation Request.

Note: srIndexConf without CHTA_SRIDX_ISSTART.

Proving tests:

- [`crates/udpstp-core/tests/sending_rate_table.rs::the_client_asks_for_the_row_in_its_activation_request`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)

## RFC9946-8.1-11 {#RFC9946-8.1-11}

**Tested**

> The UDP PDU format layout SHALL be as follows (big-endian AB):

Note: Figure 8, the Load PDU layout, follows.

Proving tests:

- [`crates/udpstp-wire/tests/load_pdu.rs::header_encodes_to_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::header_decodes_from_the_rfc_layout_with_any_payload_after_it`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-12 {#RFC9946-8.1-12}

**Tested**

> All outgoing Load or Status PDUs SHALL continue to assert this indication until traffic is received again, or the test is terminated.

Note: rxStopped field.

Conformance Records: [receive-timeout-is-final](../conformance/interpretations.md#receive-timeout-is-final).

Proving tests:

- [`crates/udpstp-core/tests/timeouts.rs::rx_stopped_clears_when_traffic_comes_back_in_time`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)
- [`crates/udpstp-core/tests/timeouts.rs::the_load_sender_keeps_sending_when_status_pdus_come_back_in_time`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)

## RFC9946-8.1-13 {#RFC9946-8.1-13}

**Tested**

> The Load PDU SHALL be organized as follows (followed by any payload content):

Note: Figure 9's struct loadHdr follows.

Proving tests:

- [`crates/udpstp-wire/tests/load_pdu.rs::header_encodes_to_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::header_decodes_from_the_rfc_layout_with_any_payload_after_it`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-L1 {#RFC9946-8.1-L1}

**Tested**

> The default algorithm (B; see [Y.1540]) has three paths to its decision on the next sending rate: 1. When there are no impairments present (no sequence errors and low delay variation), resulting in a sending rate increase. 2. When there are low impairments present (no sequence errors but higher levels of delay variation), the same sending rate is maintained. 3. When the impairment levels are above the thresholds set for this purpose and "congestion" is inferred, resulting in a sending rate decrease.

Note: Load Rate Adjustment Algorithm; its requirements are in Section 5.1.

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::congestion_is_confirmed_by_back_to_back_errored_intervals`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/algorithm_b.rs::intermittent_errored_intervals_do_not_confirm_congestion`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/interval_classification.rs::the_average_rounds_and_clean_is_strictly_below_the_low_threshold`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/interval_classification.rs)

## RFC9946-8.1-L2 {#RFC9946-8.1-L2}

**Tested**

> Consecutive feedback intervals that have a supra- threshold count of sequence number anomalies and/or contain an upper delay variation threshold exception in all of the consecutive intervals are sufficient to declare "congestion" within a test.

Note: Fast Mode of algorithm B.

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::congestion_is_confirmed_by_back_to_back_errored_intervals`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/algorithm_b.rs::intermittent_errored_intervals_do_not_confirm_congestion`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)

## RFC9946-8.1-L3 {#RFC9946-8.1-L3}

**Tested**

> The single-step mode continues after the first inference of "congestion" from measured impairments.

Note: Algorithm B; algorithm C may make a Fast-Mode Retry.

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::algorithm_b_never_leaves_single_step_mode`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)

## RFC9946-8.1-L4 {#RFC9946-8.1-L4}

**Tested**

> Boolean, 0 or 1, used to indicate to the remote endpoint that local receive traffic (either Load or Status PDUs) has stopped.

Note: rxStopped field.

Proving tests:

- [`crates/udpstp-core/tests/timeouts.rs::a_downstream_path_that_breaks_stops_within_1_s_and_ends_at_3_s`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)
- [`crates/udpstp-core/tests/timeouts.rs::an_upstream_client_stops_when_status_pdus_stop`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)
- [`crates/udpstp-core/tests/timeouts.rs::rx_stopped_is_clear_while_traffic_flows`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)
- [`crates/udpstp-core/tests/timeouts.rs::a_load_pdu_with_undefined_flags_is_invalid`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)

## RFC9946-8.1-L5 {#RFC9946-8.1-L5}

**Tested**

> The time threshold to trigger this condition is expected to be a reasonable fraction of the watchdog timeout (a default of one second is recommended).

Note: rxStopped field; record rx-stopped-from-half-the-timeout and ADR 0002.

Conformance Records: [rx-stopped-from-half-the-timeout](../conformance/interpretations.md#rx-stopped-from-half-the-timeout).

Proving tests:

- [`crates/udpstp-core/tests/timeouts.rs::a_downstream_path_that_breaks_stops_within_1_s_and_ends_at_3_s`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/timeouts.rs)

## RFC9946-8.1-L6 {#RFC9946-8.1-L6}

**Tested**

> A four-octet field indicating the Load PDU sequence number (starting at 1).

Note: lpduSeqNo field.

Proving tests:

- [`crates/udpstp/tests/loopback.rs::batched_load_pdus_arrive_whole_in_order_and_at_their_sizes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/downstream_load.rs::a_fixed_row_is_sent_as_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::loss_counts_every_missing_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::a_first_load_pdu_numbered_0_counts_no_loss`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::a_forged_first_load_pdu_is_ignored`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.1-L7 {#RFC9946-8.1-L7}

**Tested**

> This field allows the Load PDU receiver to maintain accurate receive statistics if utilizing receive truncation (only requesting the Load PDU message header octets from the protocol stack).

Note: udpPayload field.

Conformance Records: [received-bytes-from-datagram-length](../conformance/interpretations.md#received-bytes-from-datagram-length).

Proving tests:

- [`crates/udpstp/tests/loopback.rs::batched_load_pdus_arrive_whole_in_order_and_at_their_sizes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::bytes_are_counted_from_the_datagram_not_its_udp_payload_field`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-core/tests/sub_interval_results.rs::a_forged_udp_payload_field_doesnt_inflate_the_capacity`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sub_interval_results.rs)
- [`crates/udpstp-runtime/src/socket/batch_read.rs::batched_datagrams_arrive_whole_and_in_order`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-runtime/src/socket/batch_read.rs)

## RFC9946-8.1-L8 {#RFC9946-8.1-L8}

**Tested**

> This is determined by the Status PDU sequence number (spduSeqNo) in the most recently received Status PDU.

Note: spduSeqErr field.

Conformance Records: [spdu-seq-err-is-the-gap-before-the-latest](../conformance/interpretations.md#spdu-seq-err-is-the-gap-before-the-latest).

Proving tests:

- [`crates/udpstp-core/tests/stale_status_pdus.rs::spdu_seq_err_reports_the_status_pdus_missing_before_the_latest`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/stale_status_pdus.rs)
- [`crates/udpstp-core/tests/status_loss.rs::a_load_sender_counts_the_status_pdus_it_never_received`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_loss.rs)
- [`crates/udpstp-core/tests/status_loss.rs::a_load_receiver_counts_load_pdus_reporting_missed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_loss.rs)

## RFC9946-8.1-L9 {#RFC9946-8.1-L9}

**Tested**

> Two four-octet fields containing a copy of the most recent spduTime_sec/spduTime_nsec from the last Status PDU received.

Note: spduTime_sec/spduTime_nsec fields of the Load PDU.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_is_the_time_since_the_status_pdu_arrived`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.1-L10 {#RFC9946-8.1-L10}

**Tested**

> Two four-octet fields containing the local send time of the Load PDU.

Note: lpduTime_sec/lpduTime_nsec fields.

Conformance Records: [lpdu-time-per-burst](../conformance/interpretations.md#lpdu-time-per-burst).

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::lpdu_time_is_the_send_time_and_ignores_wall_clock_steps`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)

## RFC9946-8.1-L11 {#RFC9946-8.1-L11}

**Tested**

> On the Load PDU sender, it is the number of ms from reception of the most recent Status PDU (when the latest spduTime_sec/spduTime_nsec was obtained) to the transmission of the Load PDU (where the previously obtained spduTime_sec/spduTime_nsec is returned).

Note: rttRespDelay field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_is_the_time_since_the_status_pdu_arrived`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_counts_from_the_kernel_receive_time`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.1-L12 {#RFC9946-8.1-L12}

**Tested**

> When the Load PDU receiver is calculating RTT, by subtracting the copied Status PDU send time (in the Load PDU) from the local Load PDU receive time, this value is subtracted from the raw RTT to correct for any response delay due to Load PDU scheduling.

Note: rttRespDelay field.

Conformance Records: [rtt-sample-rules](../conformance/interpretations.md#rtt-sample-rules).

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_adjusts_the_rtt`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.1-L13 {#RFC9946-8.1-L13}

**Tested**

> The checksum does not cover the payload content.

Note: checkSum field of the Load PDU.

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::the_server_fills_the_header_checksum_when_configured`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::load_header_checksum_covers_the_header_only`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-L14 {#RFC9946-8.1-L14}

**Tested**

> The calculation is done as the very last step of building the PDU header, with the checkSum field set to zero.

Note: checkSum field of the Load PDU.

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::the_server_fills_the_header_checksum_when_configured`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-wire/tests/load_pdu.rs::load_header_checksum_covers_the_header_only`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/load_pdu.rs)

## RFC9946-8.1-L15 {#RFC9946-8.1-L15}

**Tested**

> All zeroes, all ones, or a pseudorandom binary sequence.

Note: Payload Content; randomized with the Test Activation modifier bit 0x02 (Section 12.3.7).

Proving tests:

- [`crates/udpstp-core/tests/downstream_load.rs::payload_content_is_zeros_by_default`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`crates/udpstp-core/tests/downstream_load.rs::payload_content_is_random_when_asked_for`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)

## RFC9946-8.2-1 {#RFC9946-8.2-1}

**Tested**

> The Load PDU receiver SHALL send a Status PDU to the sender during a test at the configured feedback interval, after at least one Load PDU has been received (when there is something to provide status on).

Note: The "feedback interval" is the Trial Interval, trialInt.

Conformance Records: [status-pdu-grid-from-first-load-pdu](../conformance/interpretations.md#status-pdu-grid-from-first-load-pdu).

Proving tests:

- [`crates/udpstp-core/src/data_phase.rs::sender_estimate_work_is_bounded_for_large_forward_timestamps`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/data_phase.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::status_pdus_follow_the_first_load_pdu_every_trial_interval`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::no_status_pdu_is_sent_before_a_load_pdu_arrives`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-core/tests/upstream.rs::the_server_sends_status_pdus_with_its_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/upstream.rs)

## RFC9946-8.2-2 {#RFC9946-8.2-2}

**Tested**

> In these cases, the Status PDU SHALL NOT be sent.

Note: Before the first Load PDU arrives.

Proving tests:

- [`crates/udpstp-core/tests/status_pdus.rs::no_status_pdu_is_sent_before_a_load_pdu_arrives`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-3 {#RFC9946-8.2-3}

**Tested**

> When the Load PDU sender receives a Status PDU message, it SHALL first follow the Message Verification Procedure listed in Section 6.2, Paragraph 2.

Proving tests:

- [`crates/udpstp-core/tests/status_pdus.rs::the_load_sender_rejects_status_pdus_of_other_sizes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::the_load_sender_verifies_a_populated_status_checksum`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-wire/tests/status_pdu.rs::decoding_rejects_other_sizes_and_pdu_ids`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/status_pdu.rs)

## RFC9946-8.2-4 {#RFC9946-8.2-4}

**Tested**

> The watchdog timer at the Load PDU sender SHALL be reset each time a valid Status PDU is received (which includes verification of the checkSum and/or authDigest, if in use).

Note: Timeouts per ADR 0002.

Conformance Records: [stale-status-pdus-count-only-as-heard](../conformance/interpretations.md#stale-status-pdus-count-only-as-heard).

Proving tests:

- [`crates/udpstp-core/tests/stale_status_pdus.rs::a_stale_status_pdu_still_counts_as_heard`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/stale_status_pdus.rs)

## RFC9946-8.2-5 {#RFC9946-8.2-5}

**Tested**

> The UDP PDU format layout SHALL be as follows (big-endian AB):

Note: Figure 10, the Status PDU layout, follows.

Proving tests:

- [`crates/udpstp-wire/tests/status_pdu.rs::status_pdu_encodes_to_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/status_pdu.rs)
- [`crates/udpstp-wire/tests/status_pdu.rs::status_pdu_decodes_from_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/status_pdu.rs)

## RFC9946-8.2-6 {#RFC9946-8.2-6}

**Tested**

> Both sets of statistics SHALL always be populated by the Load PDU receiver, regardless of role (client or server).

Note: sisSav and the Trial Interval fields.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::sub_intervals_collect_the_delay_samples_of_their_trial_intervals`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::sub_intervals_count_sequence_errors_too`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::each_status_pdu_counts_its_trial_interval`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::sub_intervals_are_counted_from_the_first_status_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-7 {#RFC9946-8.2-7}

**Tested**

> This minimum SHALL be kept current (and continuously updated) via each Load PDU received with an updated spduTime_sec/spduTime_nsec.

Note: rttMinimum field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_var_sample_has_no_value_without_a_new_sample`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-8 {#RFC9946-8.2-8}

**Deviation**

> This value MUST be positive.

Note: rttMinimum field.

Recorded in [rtt-minimum-may-be-zero](../conformance/deviations.md#rtt-minimum-may-be-zero).

## RFC9946-8.2-9 {#RFC9946-8.2-9}

**Tested**

> Before an initial value can be established, and because zero is itself valid, it SHALL be set to STATUS_NODEL when communicated in the Status PDU.

Note: rttMinimum field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::delay_variation_is_rounded_per_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::status_pdus_follow_the_first_load_pdu_every_trial_interval`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-10 {#RFC9946-8.2-10}

**Tested**

> When a new value is unavailable (possibly due to packet loss), and because zero is itself valid, it SHALL be set to STATUS_NODEL when communicated in the Status PDU.

Note: rttVarSample field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_var_sample_has_no_value_without_a_new_sample`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-11 {#RFC9946-8.2-11}

**Tested**

> The Status Feedback message PDU (as well as the included Sub-Interval statistics structure) SHALL be organized as follows:

Note: Figure 11's struct subIntStats and struct statusHdr follow.

Proving tests:

- [`crates/udpstp-wire/tests/status_pdu.rs::status_pdu_encodes_to_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/status_pdu.rs)
- [`crates/udpstp-wire/tests/status_pdu.rs::status_pdu_decodes_from_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/status_pdu.rs)

## RFC9946-8.2-L1 {#RFC9946-8.2-L1}

**Tested**

> The authentication and checkSum fields follow the same methodology as with the Setup Request and Response.

Note: Status PDU; Section 6.1.

Proving tests:

- [`crates/udpstp-core/tests/mode2_status.rs::each_status_pdu_is_signed_with_its_sender_s_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/mode2_status.rs)
- [`crates/udpstp-core/tests/status_pdus.rs::status_pdus_carry_a_checksum_when_configured`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-L2 {#RFC9946-8.2-L2}

**Tested**

> A four-octet field containing the Status PDU sequence number (starting at 1).

Note: spduSeqNo field.

Conformance Records: [stale-status-pdus-count-only-as-heard](../conformance/interpretations.md#stale-status-pdus-count-only-as-heard).

Proving tests:

- [`crates/udpstp-core/tests/status_pdus.rs::status_pdus_follow_the_first_load_pdu_every_trial_interval`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-L3 {#RFC9946-8.2-L3}

**Tested**

> A four-octet field containing the Sub-Interval sequence number (starting at 1) that corresponds to the statistics provided in sisSav, for the last saved (completed) Sub-Interval.

Note: subIntSeqNo field.

Conformance Records: [sub-interval-boundaries](../conformance/interpretations.md#sub-interval-boundaries).

Proving tests:

- [`crates/udpstp-core/tests/status_pdus.rs::sub_intervals_are_counted_from_the_first_status_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-L4 {#RFC9946-8.2-L4}

**Tested**

> seqErrOoo and seqErrDup are realized by comparing sequence numbers.

Proving tests:

- [`crates/udpstp-core/src/data_phase.rs::sender_estimate_keeps_ordinary_gaps_duplicates_and_out_of_order_load`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/data_phase.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::the_rfc_example_counts_four_out_of_order`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::a_repeated_load_pdu_is_a_duplicate`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::reordered_and_duplicated_load_pdus_are_counted`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L5 {#RFC9946-8.2-L5}

**Tested**

> A lookback list of the last n sequence numbers received is used as the basis.

Note: seqErrOoo and seqErrDup.

Proving tests:

- [`crates/udpstp-core/tests/sequence_errors.rs::a_repeated_load_pdu_is_a_duplicate`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::the_lookback_holds_32_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L6 {#RFC9946-8.2-L6}

**Tested**

> Each Load PDU sequence number is checked against this lookback.

Note: seqErrOoo and seqErrDup.

Proving tests:

- [`crates/udpstp-core/tests/sequence_errors.rs::a_repeated_load_pdu_is_a_duplicate`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::a_late_load_pdu_enters_the_lookback`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L7 {#RFC9946-8.2-L7}

**Tested**

> The number n may depend on the implementation and on typical characteristics of environments, where UDPSTP is deployed (like mobile networks or Wi-Fi).

Note: Lookback length.

Proving tests:

- [`crates/udpstp-core/tests/sequence_errors.rs::the_lookback_holds_32_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L8 {#RFC9946-8.2-L8}

**Tested**

> Currently, a default sequence number interval of n=32 has been chosen.

Note: Lookback length.

Proving tests:

- [`crates/udpstp-core/tests/sequence_errors.rs::the_lookback_holds_32_load_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L9 {#RFC9946-8.2-L9}

**Tested**

> Specifically for seqErrOoo, each successively received higher seqno sets the next-expected seqno to seqno+1, and anything below that is considered out of order (i.e., delayed).

Conformance Records: [late-load-pdu-decrement-in-its-own-interval](../conformance/interpretations.md#late-load-pdu-decrement-in-its-own-interval), [lpdu-seq-no-modulo-2-32](../conformance/interpretations.md#lpdu-seq-no-modulo-2-32).

Proving tests:

- [`crates/udpstp-core/src/data_phase.rs::sender_estimate_keeps_ordinary_gaps_duplicates_and_out_of_order_load`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/data_phase.rs)
- [`crates/udpstp-core/tests/sequence_errors.rs::the_rfc_example_counts_four_out_of_order`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sequence_errors.rs)

## RFC9946-8.2-L10 {#RFC9946-8.2-L10}

**Tested**

> For each Load PDU received, the send time (lpduTime_sec/lpduTime_nsec) is subtracted from the local receive time, which is then normalized by subtracting the current clockDeltaMin.

Note: delayVarMin/delayVarMax/delayVarSum/delayVarCnt fields.

Conformance Records: [ms-rounding-half-up](../conformance/interpretations.md#ms-rounding-half-up).

Proving tests:

- [`crates/udpstp-core/tests/bottleneck.rs::a_full_buffer_shows_as_its_drain_time_in_delay_variation`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/bottleneck.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::delay_variation_is_rounded_per_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L11 {#RFC9946-8.2-L11}

**Tested**

> Equivalent to the sum of each deltaTime (although in ms) sent in each Status PDU during the test.

Note: accumTime field.

Conformance Records: [sub-interval-boundaries](../conformance/interpretations.md#sub-interval-boundaries).

Proving tests:

- [`crates/udpstp-core/tests/status_pdus.rs::sub_intervals_are_counted_from_the_first_status_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/status_pdus.rs)

## RFC9946-8.2-L12 {#RFC9946-8.2-L12}

**Tested**

> Obtained by subtracting the send time of each Load PDU (lpduTime_sec/ lpduTime_nsec) from the local time that it was received.

Note: clockDeltaMin field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::delay_variation_is_rounded_per_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::clock_offset_and_drift_show_in_clock_delta_min_only`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L13 {#RFC9946-8.2-L13}

**Tested**

> This value is initialized with the first Load PDU received and is updated with each subsequent one to maintain a current (and continuously updated) minimum.

Note: clockDeltaMin field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::delay_variation_is_rounded_per_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L14 {#RFC9946-8.2-L14}

**Tested**

> Otherwise, this value may be negative but still valid for one-way delay variation measurements for the default test duration (default is 10 seconds).

Note: clockDeltaMin field; the RFC gives no encoding for a negative value.

Conformance Records: [clock-delta-min-encoding](../conformance/interpretations.md#clock-delta-min-encoding).

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::clock_offset_and_drift_show_in_clock_delta_min_only`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L15 {#RFC9946-8.2-L15}

**Tested**

> RTT is obtained by subtracting the copied spduTime_sec/ spduTime_nsec in the received Load PDU from the local time at which it was received.

Note: rttMinimum field; adjusted by rttRespDelay (RFC9946-8.1-L12).

Conformance Records: [rtt-sample-rules](../conformance/interpretations.md#rtt-sample-rules).

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_adjusts_the_rtt`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L16 {#RFC9946-8.2-L16}

**Tested**

> RTT delay variation is obtained by subtracting the current (and continuously updated) "adjusted" RTT minimum, communicated as rttMinimum (in Status PDU), from each "adjusted" RTT measurement (which is itself obtained by subtracting the copied spduTime_sec/spduTime_nsec in the received Load PDU from the local time at which it was received).

Note: rttVarSample field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L17 {#RFC9946-8.2-L17}

**Tested**

> Note that while one-way delay variation is measured for every Load PDU received, RTT delay variation is only sampled via the Status PDU sent and the very next Load PDU received with the corresponding updated spduTime_sec/spduTime_nsec.

Note: rttVarSample field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::rtt_is_measured_from_echoed_status_pdus`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_var_sample_has_no_value_without_a_new_sample`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

## RFC9946-8.2-L18 {#RFC9946-8.2-L18}

**Tested**

> Boolean, 0 or 1, indicating that the clockDeltaMin and/or rttMinimum (in Status PDU), as measured by the Load PDU receiver, has been updated.

Note: delayMinUpd field.

Proving tests:

- [`crates/udpstp-core/tests/delay_variation.rs::delay_variation_is_rounded_per_load_pdu`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)
- [`crates/udpstp-core/tests/delay_variation.rs::rtt_resp_delay_adjusts_the_rtt`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/delay_variation.rs)

