# RFC 9097 §6: Maximum IP-Layer Capacity Metric Definitions (Statistics)

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

| State | Requirements |
|---|--:|
| Tested | 12 |
| Operational | 3 |
| Not applicable | 3 |

## RFC9097-6.2-1 {#RFC9097-6.2-1}

**Not applicable**

> This section lists the REQUIRED input factors to specify the metric, beyond those listed in Section 4.

Note: The section adds no Parameters.

## RFC9097-6.3-1 {#RFC9097-6.3-1}

**Not applicable**

> This section defines the REQUIRED aspects of the Maximum IP-Layer Capacity Metric (unless otherwise indicated) for measurements between specified Source and Destination hosts:

Note: An introduction to the section's Requirements, each recorded with its own ID; nothing to do beyond them.

## RFC9097-6.3-L1 {#RFC9097-6.3-L1}

**Tested**

> Define the Maximum IP-Layer Capacity, Maximum_C(T,I,PM), to be the maximum number of IP-Layer bits n0[dtn,dtn+1] divided by dt that can be transmitted in packets from the Src host and correctly received by the Dst host, over all dt-length intervals in [T,T+I] and meeting the PM criteria.

Note: Maximum IP-Layer Capacity; a definition, but the one the results compute.

Conformance Records: [shallow-queue-search-alternates-at-the-bottleneck](../conformance/interpretations.md#shallow-queue-search-alternates-at-the-bottleneck), [duplicates-count-as-received](../conformance/interpretations.md#duplicates-count-as-received), [empty-sub-interval-meets-no-criterion](../conformance/interpretations.md#empty-sub-interval-meets-no-criterion), [json-at-max-is-the-maximum](../conformance/obudpst-differences.md#json-at-max-is-the-maximum).

Proving tests:

- [`crates/udpstp/src/results.rs::a_watchdog_ended_test_with_two_capacity_modes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/results.rs)
- [`crates/udpstp/tests/netns.rs::downstream_and_upstream_tests_measure_the_bottleneck`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/netns.rs)
- [`crates/udpstp-core/src/results.rs::the_maximum_meets_the_criterion_and_the_highest_need_not`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)
- [`crates/udpstp-core/src/results.rs::a_sub_interval_with_nothing_received_meets_no_criterion`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)
- [`crates/udpstp-core/src/results.rs::no_sub_interval_meeting_the_criterion_means_no_maximum`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)

## RFC9097-6.3-2 {#RFC9097-6.3-2}

**Tested**

> The number of sub-intervals with duration dt MUST be set to a natural number m, so that T+I = T + m*dt with dtn+1 - dtn = dt for 1 &lt;= n &lt;= m.

Note: testIntTime / subIntPeriod Sub-Intervals.

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

Proving tests:

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

## RFC9097-6.3-3 {#RFC9097-6.3-3}

**Tested**

> At least one target performance threshold (PM criterion) MUST be defined.

Note: The Performance Criterion.

Conformance Records: [shallow-queue-search-alternates-at-the-bottleneck](../conformance/interpretations.md#shallow-queue-search-alternates-at-the-bottleneck), [loss-allowance-per-test-connection](../conformance/interpretations.md#loss-allowance-per-test-connection).

Proving tests:

- [`crates/udpstp-core/src/results.rs::no_sub_interval_meeting_the_criterion_means_no_maximum`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)

## RFC9097-6.3-4 {#RFC9097-6.3-4}

**Not applicable**

> If more than one metric and target performance threshold is defined, then the sub-interval with the maximum number of bits transmitted MUST meet all the target performance thresholds.

Note: udpstp defines one Performance Criterion, the Loss Ratio, so there is never more than one threshold to meet.

Conformance Records: [shallow-queue-search-alternates-at-the-bottleneck](../conformance/interpretations.md#shallow-queue-search-alternates-at-the-bottleneck).

## RFC9097-6.3-5 {#RFC9097-6.3-5}

**Tested**

> Users SHALL specify the Parameter Tmax as required by each metric's reference definition.

Note: Tmax.

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

Proving tests:

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

## RFC9097-6.3-6 {#RFC9097-6.3-6}

**Tested**

> At least one target performance threshold (PM criterion) MUST be defined.

Note: Bullet restating RFC9097-6.3-3.

Proving tests:

- [`crates/udpstp-core/src/results.rs::the_maximum_meets_the_criterion_and_the_highest_need_not`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)

## RFC9097-6.3-7 {#RFC9097-6.3-7}

**Tested**

> All sub-intervals MUST be of equal duration.

Note: subIntPeriod is a whole number of Trial Intervals.

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

Proving tests:

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

## RFC9097-6.3-8 {#RFC9097-6.3-8}

**Operational**

> The bit rate of the physical interface of the measurement systems MUST be higher than the smallest of the links on the path whose Maximum_C(T,I,PM) is to be measured (the bottleneck link).

Note: Deployment of the measurement hosts.

## RFC9097-6.3-9 {#RFC9097-6.3-9}

**Tested**

> Measurements according to these definitions SHALL use the UDP transport layer.

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)

## RFC9097-6.4-L1 {#RFC9097-6.4-L1}

**Tested**

> The interval dtn,dtn+1 where Maximum_C(T,I,PM) occurs is the reporting sub-interval for RTD[dtn,dtn+1] and OWL[dtn,dtn+1] within RTD[T,I] and OWL[T,I].

Note: Loss and RTT are reported for the Sub-Interval of the maximum.

Proving tests:

- [`crates/udpstp/src/results.rs::a_completed_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/results.rs)

## RFC9097-6.4-1 {#RFC9097-6.4-1}

**Tested**

> Other metrics MAY be measured: one-way reordering, duplication, and delay variation.

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/sub_interval_results.rs::duplicates_and_reordering_are_reported_apart_from_loss`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/sub_interval_results.rs)

## RFC9097-6.5-1 {#RFC9097-6.5-1}

**Operational**

> If traffic conditioning (e.g., shaping, policing) applies along a path for which Maximum_C(T,I,PM) is to be determined, different values for dt SHOULD be picked and measurements executed during multiple intervals [T,T+I].

Note: The user picks subIntPeriod per Test.

## RFC9097-6.5-2 {#RFC9097-6.5-2}

**Operational**

> Each duration dt SHOULD be chosen so that it is an integer multiple of increasing values k times serialization delay of a Path MTU (PMTU) at the physical interface speed where traffic conditioning is expected.

Note: The user picks subIntPeriod per Test.

## RFC9097-6.6-1 {#RFC9097-6.6-1}

**Tested**

> The IP-Layer Capacity SHOULD be reported with at least single-Megabit resolution, in units of Megabits per second (Mbps) (which, to avoid any confusion, is 1,000,000 bits per second).

Proving tests:

- [`crates/udpstp/src/results.rs::a_completed_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/results.rs)

## RFC9097-6.6-2 {#RFC9097-6.6-2}

**Tested**

> The related One-Way Loss metric and Round-Trip Delay measurements for the same Singleton SHALL be reported, also with meaningful resolution for the values measured.

Proving tests:

- [`crates/udpstp/src/results.rs::a_completed_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/results.rs)

## RFC9097-6.6-3 {#RFC9097-6.6-3}

**Tested**

> When there are demonstrated and repeatable Capacity modes in the Sample, the Maximum IP-Layer Capacity SHALL be reported for each mode, along with the relative time from the beginning of the stream that the mode was observed to be present.

Note: Capacity Modes.

Proving tests:

- [`crates/udpstp/src/json.rs::a_bimodal_test_has_obudpst_keys_and_forms`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/json.rs)
- [`crates/udpstp/src/results.rs::a_watchdog_ended_test_with_two_capacity_modes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/src/results.rs)
- [`crates/udpstp-core/src/results.rs::a_split_makes_two_capacity_modes`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/results.rs)

