# RFC 9946 §7: Test Activation Request and Response

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

| State | Requirements |
|---|--:|
| Tested | 44 |

## RFC9946-7.1-1 {#RFC9946-7.1-1}

**Tested**

> Upon a successful setup exchange, the client SHALL compose and send the Test Activation Request to the UDP port number the server communicated in the Test Setup Response (the new ephemeral port, and not the standard UDPSTP port).

Conformance Records: [setup-response-from-another-address](../conformance/interpretations.md#setup-response-from-another-address).

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_completes_the_control_phase_over_ipv4_loopback`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/activation_exchange.rs::downstream_test_is_activated_on_the_test_port`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_exchange.rs)

## RFC9946-7.1-2 {#RFC9946-7.1-2}

**Tested**

> This specification does not provide an ECN-capable transport; therefore, the sender SHALL set the ECN field to not_ECT.

Note: dscpEcn field. What a Server does with ECT bits in a request is unspecified; record dscp-from-an-allowed-set-never-ect.

Conformance Records: [dscp-from-an-allowed-set-never-ect](../conformance/interpretations.md#dscp-from-an-allowed-set-never-ect).

Proving tests:

- [`crates/udpstp-core/tests/activation_coercion.rs::the_server_clears_a_requested_ecn_codepoint`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_sends_not_ect_whatever_the_server_answers`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-runtime/src/ip_options.rs::the_ds_field_reads_back`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-runtime/src/ip_options.rs)

## RFC9946-7.1-3 {#RFC9946-7.1-3}

**Tested**

> Because a value of zero is a valid fixed or starting sending rate index, the field SHALL be set to its maximum (CHTA_SRIDX_DEF) when requesting the default behavior of the server (starting with the selected load rate adjustment algorithm at its minimum/zero index).

Note: srIndexConf field.

Conformance Records: [sr-index-def-ignores-isstart](../conformance/interpretations.md#sr-index-def-ignores-isstart).

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::the_default_search_starts_at_row_0`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_consumer_may_choose_the_starting_row_or_the_default`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.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)
- [`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-7.1-4 {#RFC9946-7.1-4}

**Tested**

> This SHALL be equivalent to setting srIndexConf to zero and setting the CHTA_SRIDX_ISSTART bit.

Note: srIndexConf field.

Conformance Records: [sr-index-def-ignores-isstart](../conformance/interpretations.md#sr-index-def-ignores-isstart).

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::the_default_search_starts_at_row_0`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_consumer_may_choose_the_starting_row_or_the_default`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)
- [`crates/udpstp-core/tests/sending_rate_table.rs::the_server_default_starts_at_row_zero`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)

## RFC9946-7.1-5 {#RFC9946-7.1-5}

**Tested**

> Used by the server in a Test Activation Response for an upstream test to communicate the (initial) Load PDU transmission parameters the client SHALL use.

Note: srStruct field. Sizes are IPv4-based and an IPv6 Load Sender subtracts 20 bytes (ADR 0004); the interpretation belongs on the Section 8.1 entry.

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

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)

## RFC9946-7.1-6 {#RFC9946-7.1-6}

**Tested**

> For a Test Activation Request or a downstream test, this structure SHALL be zeroed.

Note: srStruct field.

Proving tests:

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

## RFC9946-7.1-7 {#RFC9946-7.1-7}

**Tested**

> The Test Activation Request/Response message PDU (as well as the included Sending Rate structure) SHALL be organized as follows:

Note: Figure 7's struct sendingRate and struct controlHdrTA follow.

Proving tests:

- [`crates/udpstp-wire/tests/activation_pdu.rs::activation_pdu_encodes_to_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/activation_pdu.rs)
- [`crates/udpstp-wire/tests/activation_pdu.rs::activation_pdu_decodes_from_the_rfc_layout`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/activation_pdu.rs)
- [`crates/udpstp-wire/tests/obudpst_control_kat.rs::our_wire_layer_reproduces_every_obudpst_pdu_from_its_fields`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/obudpst_control_kat.rs)

## RFC9946-7.1-L1 {#RFC9946-7.1-L1}

**Tested**

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

Note: Test Activation PDU.

Proving tests:

- [`crates/udpstp-core/tests/activation_mode1.rs::server_answers_a_signed_activation_with_a_response_signed_with_the_server_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/control_checksum.rs::every_control_pdu_carries_a_checksum_that_verifies`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/control_checksum.rs)

## RFC9946-7.1-L2 {#RFC9946-7.1-L2}

**Tested**

> Set to CHTA_CREQ_TESTACTUS to indicate an upstream test activation or alternatively to CHTA_CREQ_TESTACTDS to indicate a downstream test activation.

Note: cmdRequest field.

Proving tests:

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

## RFC9946-7.1-L3 {#RFC9946-7.1-L3}

**Tested**

> Note that CHTA_CREQ_NONE remains unused.

Note: cmdRequest field.

Proving tests:

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

## RFC9946-7.1-L4 {#RFC9946-7.1-L4}

**Tested**

> Boolean, default True (if False, use RTT=round-trip delay variation in the load rate adjustment algorithm; if True, use EnableIPDV, which uses one-way delay variation for the load rate adjustment algorithm).

Note: useOwDelVar field. The default differs from OB-UDPST and TR-471; record use-ow-del-var-defaults-to-true.

Conformance Records: [use-ow-del-var-defaults-to-true](../conformance/interpretations.md#use-ow-del-var-defaults-to-true).

Proving tests:

- [`crates/udpstp-core/tests/client_parameters.rs::the_client_asks_for_the_delay_variation_chosen`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/client_parameters.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)
- [`crates/udpstp-core/tests/interval_classification.rs::without_one_way_delay_the_latest_rtt_sample_is_delay_var`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/interval_classification.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-7.1-L5 {#RFC9946-7.1-L5}

**Tested**

> When True, only loss counts toward received packet sequence number errors.

Note: ignoreOooDup field.

Proving tests:

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

## RFC9946-7.1-L6 {#RFC9946-7.1-L6}

**Tested**

> When False, loss, out-of-order, and duplicate totals are all counted as sequence number errors.

Note: ignoreOooDup field.

Proving tests:

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

## RFC9946-7.1-L7 {#RFC9946-7.1-L7}

**Tested**

> Default is True (see also Table 3 of [TR-471]).

Note: ignoreOooDup field.

Proving tests:

- [`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-7.1-L8 {#RFC9946-7.1-L8}

**Tested**

> A 100 us granularity is recommended for optimal rate selection.

Note: txInterval fields; the Sending Rate Table uses multiples of 100 us.

Proving tests:

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

## RFC9946-7.1-L9 {#RFC9946-7.1-L9}

**Tested**

> A four-octet field indicating the size of a single Load PDU to be sent at the end of the txInterval2 send sequence, even when udpPayload2 or burstSize2 are zero and result in no transmission of their own.

Note: udpAddon2 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::both_transmitters_and_the_add_on_are_sent`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)
- [`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)

## RFC9946-7.1-L10 {#RFC9946-7.1-L10}

**Tested**

> Trials with subIntPeriod in a range of 100 to 10000 ms resulted in a default value of 1000 ms.

Note: subIntPeriod field.

Proving tests:

- [`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-7.2-1 {#RFC9946-7.2-1}

**Tested**

> When the server replies to the Test Activation Request message, the Test Activation Response PDU is structured identically to the Request PDU and SHALL retain the original values received in it unless they are explicitly coerced to a server-acceptable value.

Note: Reserved fields are still zeroed (RFC9946-6.1-4), although OB-UDPST carries data in reserved2 and reserved4. Coercions are reported at both ends.

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_asks_for_a_dscp_the_server_allows`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp/tests/loopback.rs::client_test_options_reach_the_server`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::a_coerced_row_is_reported_at_both_ends`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::an_acceptable_request_is_echoed_without_coercions`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/dscp.rs::an_allowed_dscp_marks_both_ends_traffic`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/dscp.rs)

## RFC9946-7.2-2 {#RFC9946-7.2-2}

**Tested**

> When the server receives the Test Activation Request message, it SHALL first follow the Message Verification Procedure listed in Section 6.2, Paragraph 2.

Conformance Records: [activation-auth-matches-setup](../conformance/interpretations.md#activation-auth-matches-setup).

Proving tests:

- [`crates/udpstp-core/tests/activation_mode1.rs::server_answers_a_signed_activation_with_a_response_signed_with_the_server_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/activation_mode1.rs::server_silently_drops_activations_that_fail_verification`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/activation_mode1.rs::server_accepts_an_activation_time_5_s_off`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/activation_mode1.rs::an_unauthenticated_test_connection_drops_a_mode1_activation`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/control_checksum.rs::a_corrupted_activation_request_is_dropped`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/control_checksum.rs)
- [`crates/udpstp-core/tests/troubleshooting_mode.rs::a_failed_activation_request_stays_silent_in_troubleshooting_mode`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/troubleshooting_mode.rs)
- [`crates/udpstp-wire/tests/activation_pdu.rs::wrong_size_or_pdu_id_is_rejected`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-wire/tests/activation_pdu.rs)

## RFC9946-7.2-L1 {#RFC9946-7.2-L1}

**Tested**

> After the server receives the Test Activation Request on the new connection, it chooses to accept, ignore, or modify any of the test parameters.

Proving tests:

- [`crates/udpstp-core/tests/activation_coercion.rs::a_coerced_row_is_reported_at_both_ends`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::an_acceptable_request_is_echoed_without_coercions`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::an_unknown_rate_adjustment_algorithm_is_rejected_with_badparam`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)

## RFC9946-7.2.1-1 {#RFC9946-7.2.1-1}

**Tested**

> When evaluating the Test Activation Request, the server MAY allow the client to specify its own fixed or starting send rate via srIndexConf.

Note: Fixed-Rate Tests only with an Operator Key; record fixed-rate-needs-operator-key.

Proving tests:

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

## RFC9946-7.2.1-2 {#RFC9946-7.2.1-2}

**Tested**

> Alternatively, the server MAY enforce a maximum limit of the fixed or starting send rate, which the client can successfully request.

Conformance Records: [consumer-start-row-capped](../conformance/interpretations.md#consumer-start-row-capped).

Proving tests:

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

## RFC9946-7.2.1-3 {#RFC9946-7.2.1-3}

**Tested**

> If the client's Test Activation Request exceeds the server's configured maximum, the server MUST either reject the request or coerce the value to the configured maximum bit rate, and communicate that maximum to the client in the Test Activation Response.

Note: srIndexConf is a row index, not a bit rate; records sr-index-conf-beyond-the-top-row-coerced and row-above-max-bandwidth-coerced.

Conformance Records: [sr-index-conf-beyond-the-top-row-coerced](../conformance/interpretations.md#sr-index-conf-beyond-the-top-row-coerced), [row-above-max-bandwidth-coerced](../conformance/interpretations.md#row-above-max-bandwidth-coerced), [consumer-start-row-capped](../conformance/interpretations.md#consumer-start-row-capped).

Proving tests:

- [`crates/udpstp-core/tests/activation_coercion.rs::a_coerced_row_is_reported_at_both_ends`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_row_beyond_the_table_is_coerced_to_the_last_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)
- [`crates/udpstp-core/tests/start_row_cap.rs::a_consumer_s_start_row_is_coerced_to_the_cap`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/start_row_cap.rs)
- [`crates/udpstp-core/tests/start_row_cap.rs::by_default_a_search_starts_at_row_100_at_most`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/start_row_cap.rs)

## RFC9946-7.2.1-4 {#RFC9946-7.2.1-4}

**Tested**

> In these cases, the Command Response value SHALL be CHTA_CRSP_ACKOK.

Note: Coercion of the parameters listed before it (RFC9946-7.2.1-L1); the list names useOwDelayVar (meaning useOwDelVar) and highSpeedDelta twice.

Conformance Records: [row-above-max-bandwidth-coerced](../conformance/interpretations.md#row-above-max-bandwidth-coerced).

Proving tests:

- [`crates/udpstp-core/tests/activation_coercion.rs::a_coerced_row_is_reported_at_both_ends`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_row_beyond_the_table_is_coerced_to_the_last_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::out_of_range_values_are_clamped_to_the_nearest_limit`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)

## RFC9946-7.2.1-5 {#RFC9946-7.2.1-5}

**Tested**

> If the authDigest is valid, a Test Activation Response SHALL be sent back to the client with a corresponding Command Response value indicating the reason for the rejection.

Note: The bullet under "If the Test Activation Request must be rejected (due to the Command Response value being CHTA_CRSP_BADPARAM), and".

Proving tests:

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

## RFC9946-7.2.1-6 {#RFC9946-7.2.1-6}

**Tested**

> If the authDigest is invalid, the Test Activation Request SHOULD fail silently.

Note: The RFC permits server administrators to send an Activation Response anyway, for operations and troubleshooting. Troubleshooting Mode answers Setup Requests only: an Activation Request that fails verification stays silent even then.

Conformance Records: [activation-auth-matches-setup](../conformance/interpretations.md#activation-auth-matches-setup).

Proving tests:

- [`crates/udpstp-core/tests/activation_mode1.rs::server_silently_drops_activations_that_fail_verification`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/troubleshooting_mode.rs::a_failed_activation_request_stays_silent_in_troubleshooting_mode`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/troubleshooting_mode.rs)

## RFC9946-7.2.1-7 {#RFC9946-7.2.1-7}

**Tested**

> The additional circumstances when a server SHALL NOT communicate the appropriate Command Response code for an error condition (fail silently) are when: * the Test Activation Request PDU size is not equal to the 'struct controlHdrTA' size shown in Figure 7, * the PDU ID is not 0xACE2 (Test Activation PDU), or * a directed attack has been detected.

Note: Attack detection is out of scope per the RFC, so the third case is not testable.

Proving tests:

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

## RFC9946-7.2.1-L1 {#RFC9946-7.2.1-L1}

**Tested**

> Other parameters where the server has the OPTION to coerce the client to use values other than those in the Test Activation Request are (grouped by role): * Load rate adjustment algorithm: lowThresh, upperThresh, useOwDelayVar, highSpeedDelta, slowAdjThresh, seqErrThresh, highSpeedDelta, ignoreOooDup, and rateAdjAlgo * Test duration/intervals: trialInt, testIntTime, and subIntPeriod * Packet marking: dscpEcn

Note: "OPTION" is not a BCP 14 keyword.

Conformance Records: [parameter-ranges-follow-y1540](../conformance/interpretations.md#parameter-ranges-follow-y1540), [windows-dscp-coerced-to-0](../conformance/interpretations.md#windows-dscp-coerced-to-0).

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_asks_for_a_dscp_the_server_allows`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_server_clears_a_requested_ecn_codepoint`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/dscp.rs::a_server_allowing_only_the_default_coerces_a_priority_dscp_to_0`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/dscp.rs)
- [`crates/udpstp-core/tests/dscp.rs::a_server_that_cant_mark_allows_only_0_even_to_operators`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/dscp.rs)
- [`crates/udpstp-core/tests/interval_classification.rs::the_accepted_threshold_classifies_not_the_requested_one`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/interval_classification.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::out_of_range_values_are_clamped_to_the_nearest_limit`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::a_low_threshold_above_the_upper_one_is_lowered_to_it`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::a_sub_interval_longer_than_the_test_is_shortened`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)

## RFC9946-7.2.1-L2 {#RFC9946-7.2.1-L2}

**Tested**

> Note that the server also has the option of completely rejecting the request and sending back an appropriate cmdResponse field value (currently only CHTA_CRSP_BADPARAM; see Section 12.3.9).

Conformance Records: [server-limits-refuse-with-connfail](../conformance/interpretations.md#server-limits-refuse-with-connfail), [test-has-one-direction](../conformance/interpretations.md#test-has-one-direction).

Proving tests:

- [`crates/udpstp/tests/interop.rs::unauthenticated_and_fixed_rate_tests_interoperate`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/interop.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::an_unknown_rate_adjustment_algorithm_is_rejected_with_badparam`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_fixed_rate_test_is_refused_without_an_operator_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)

## RFC9946-7.2.1-L3 {#RFC9946-7.2.1-L3}

**Tested**

> Whether this error response is sent or not depends on the security mode of operation and the outcome of authDigest validation.

Proving tests:

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

## RFC9946-7.2.1-L4 {#RFC9946-7.2.1-L4}

**Tested**

> The exception is for operations support: server administrators are permitted to send an Activation Response to support operations and troubleshooting.

Note: Troubleshooting Mode.

Conformance Records: [troubleshooting-replies-rate-limited](../conformance/interpretations.md#troubleshooting-replies-rate-limited).

Proving tests:

- [`crates/udpstp-core/tests/troubleshooting_mode.rs::at_most_10_failures_a_second_are_answered`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/troubleshooting_mode.rs)
- [`crates/udpstp-core/tests/troubleshooting_mode.rs::a_replay_stays_silent`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/troubleshooting_mode.rs)
- [`crates/udpstp-core/tests/troubleshooting_mode.rs::a_failed_activation_request_stays_silent_in_troubleshooting_mode`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/troubleshooting_mode.rs)

## RFC9946-7.2.2-1 {#RFC9946-7.2.2-1}

**Tested**

> When the server sends the Test Activation Response, it SHALL set the cmdResponse field to CHTA_CRSP_ACKOK (see Section 12.3.9).

Proving tests:

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

## RFC9946-7.2.2-2 {#RFC9946-7.2.2-2}

**Tested**

> If the client has requested an upstream test, the server SHALL: * include the transmission parameters from the first row of the Sending Rate Table in the Sending Rate structure (if requested by setting srIndexConf to a value of CHTA_SRIDX_DEF), or * include the transmission parameters from the designated Configured Sending Rate Table index (srIndexConf) of the Sending Rate Table where, if CHTA_SRIDX_ISSTART is set in modifierBitmap, this will be used as the starting rate for the load rate adjustment algorithm; else, it will be considered a fixed-rate test.

Proving tests:

- [`crates/udpstp-core/tests/activation_exchange.rs::upstream_test_is_activated`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_exchange.rs)
- [`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)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_consumer_may_choose_the_starting_row_or_the_default`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)
- [`crates/udpstp-core/tests/sending_rate_table.rs::the_server_default_starts_at_row_zero`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)
- [`crates/udpstp-core/tests/sending_rate_table.rs::a_requested_starting_row_is_sent`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)
- [`crates/udpstp-core/tests/sending_rate_table.rs::a_requested_fixed_rate_row_is_sent`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)
- [`crates/udpstp-core/tests/sending_rate_table.rs::a_low_row_is_an_add_on_alone`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sending_rate_table.rs)

## RFC9946-7.2.2-3 {#RFC9946-7.2.2-3}

**Tested**

> When generating the Test Activation Response (acceptance) for a downstream test, the server SHALL set all octets of the Sending Rate structure to zero.

Proving tests:

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

## RFC9946-7.2.2-4 {#RFC9946-7.2.2-4}

**Tested**

> In the case of an upstream test, the server SHALL prepare to use a single timer to send Status PDUs at the specified interval.

Proving tests:

- [`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-7.2.2-5 {#RFC9946-7.2.2-5}

**Tested**

> For a downstream test, the server SHALL prepare to utilize dual timers to send Load PDUs based on: * the transmission parameters directly from the first row of the Sending Rate Table (if requested by srIndexConf having been set to CHTA_SRIDX_DEF), or * the transmission parameters from the designated Configured Sending Rate Table index (srIndexConf) of the Sending Rate Table where, if CHTA_SRIDX_ISSTART is set in modifierBitmap, this will be used as the starting rate for the load rate adjustment algorithm; else, it will be considered a fixed-rate test.

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::the_default_search_starts_at_row_0`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/algorithm_b.rs::a_fixed_rate_test_holds_its_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.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/downstream_load.rs::both_transmitters_and_the_add_on_are_sent`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/downstream_load.rs)

## RFC9946-7.2.2-6 {#RFC9946-7.2.2-6}

**Tested**

> The server SHALL then send the Test Activation Response back to the client, update the watchdog timer with a new timeout value, and set a test duration timer to eventually stop the test.

Note: The new watchdog timeout is unspecified; timeouts per ADR 0002.

Proving tests:

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

## RFC9946-7.3-1 {#RFC9946-7.3-1}

**Tested**

> When the client receives the Test Activation Response message, it SHALL first follow the Message Verification Procedure listed in Section 6.2, Paragraph 2.

Proving tests:

- [`crates/udpstp-core/tests/activation_mode1.rs::client_accepts_a_response_signed_with_the_server_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/activation_mode1.rs::client_ignores_responses_that_fail_verification`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`crates/udpstp-core/tests/control_checksum.rs::a_corrupted_activation_response_or_null_request_is_dropped`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/control_checksum.rs)

## RFC9946-7.3-2 {#RFC9946-7.3-2}

**Tested**

> If the client receives a Test Activation cmdResponse field value that indicates an error, the client SHALL display/report a relevant message to the user or measurement system and exit.

Proving tests:

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

## RFC9946-7.3-3 {#RFC9946-7.3-3}

**Tested**

> If the client receives a Test Activation cmdResponse field value that is not equal to one of the codes defined in Section 12.3.9, the client MUST terminate the connection and terminate operation of the current setup procedure.

Proving tests:

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

## RFC9946-7.3-4 {#RFC9946-7.3-4}

**Tested**

> If the client receives a Test Activation Command Response value that indicates success (e.g., CHTA_CRSP_ACKOK; see Section 12.3.9), the client SHALL update its configuration to use any test parameters modified by the server.

Note: The RFC continues: if the coerced parameters are not acceptable to the client, the client ends the test.

Proving tests:

- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_reports_each_parameter_the_server_coerced`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_reports_a_coercion_of_every_coercible_parameter`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_reports_changed_modifier_bits`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_accepts_coercions_it_did_not_refuse`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/dscp.rs::a_server_allowing_only_the_default_coerces_a_priority_dscp_to_0`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/dscp.rs)
- [`crates/udpstp-core/tests/test_interval_limits.rs::the_client_runs_a_long_test_its_operator_key_allows`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/test_interval_limits.rs)

## RFC9946-7.3-5 {#RFC9946-7.3-5}

**Tested**

> To finalize an accepted test activation, the client SHALL prepare its connection for either an upstream test with dual timers set to send Load PDUs (based on the starting transmission parameters sent by the server) OR a downstream test with a single timer to send Status PDUs at the specified interval.

Proving tests:

- [`crates/udpstp-core/tests/activation_exchange.rs::downstream_test_is_activated_on_the_test_port`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_exchange.rs)
- [`crates/udpstp-core/tests/activation_exchange.rs::upstream_test_is_activated`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_exchange.rs)
- [`crates/udpstp-core/tests/activation_mode1.rs::mode1_tests_are_activated_in_both_directions`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_mode1.rs)
- [`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)

## RFC9946-7.3-6 {#RFC9946-7.3-6}

**Tested**

> Then, the client SHALL stop the test initiation timer and start a watchdog timer to detect if the server goes quiet.

Proving tests:

- [`crates/udpstp/tests/loopback.rs::the_client_reports_a_server_that_goes_away`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/control_timers.rs::an_activated_client_does_not_time_out`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/control_timers.rs)

## RFC9946-7.3-L1 {#RFC9946-7.3-L1}

**Tested**

> If the setup parameters coerced by the server are not acceptable to the client, the client ends the test.

Conformance Records: [multi-connection-parameters-differ](../conformance/interpretations.md#multi-connection-parameters-differ), [test-interval-over-60-s](../conformance/interpretations.md#test-interval-over-60-s), [client-refuses-a-changed-dscp](../conformance/interpretations.md#client-refuses-a-changed-dscp).

Proving tests:

- [`crates/udpstp/tests/loopback.rs::client_test_options_reach_the_server`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_ends_the_test_when_a_coercion_is_unacceptable`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_first_refused_coercion_in_field_order_is_reported`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_reports_changed_modifier_bits`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/activation_coercion.rs::the_client_refuses_a_dscp_it_did_not_ask_for`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/activation_coercion.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::an_acceptance_that_arrives_after_the_abort_is_stopped_at_once`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)
- [`crates/udpstp-core/tests/parameter_ranges.rs::the_client_ends_a_test_it_cannot_run`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/parameter_ranges.rs)
- [`crates/udpstp-core/tests/stop_exchange.rs::a_client_that_refuses_a_coercion_stops_the_server_at_once`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/stop_exchange.rs)
- [`crates/udpstp-core/tests/test_interval_limits.rs::the_client_refuses_a_longer_test_than_it_asked_for`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/test_interval_limits.rs)

