a positive test proves Ze does what the requirement demands and a negative one proves it refuses what the requirement forbids
RFC 9830 - BGP Extensions for the Advertisement of Segment Routing (SR) Policies
Every requirement this repository extracted from RFC 9830, the tests bound to it, and what a reader has verified about them. This summary is enrolled and gated by ./le rfc check.
Overview
Positive
what Ze has
the requirement admits no counter-case, so one polarity plus a recorded reason is the whole proof available for it
one direction is tested, the other is neither tested nor excused, and nothing states which
scoped tests exist; the remaining obligation is unmet or unproven, with zero whole-requirement credit
a red was observed once under a recorded procedure, and the unit, the claim and the producer it rested on still hash to what was recorded. The break is not re-run. A test pair is not a proof until one has been observed
Neutral
measures that are neither good news nor bad
MUST-level requirements the gate HOLDS. A population, not a result: the shares beside it are what says how Ze stands
an obligation that does not bind Ze. A {not-applicable} annotation says it never bound; a {feature-declined} annotation says its condition is an optional feature Ze does not offer, and quotes the RFC sentence that makes it optional. Scope, not coverage: it stays in the denominator every share on this page is taken over
a {not-applicable} annotation says the obligation does not bind Ze, so no test is owed for it. It stays in the denominator every share here is taken over
a {lower-layer} annotation says a layer under Ze performs the behavior, on state Ze installs into that layer, and names the producer that installs it. The obligation binds Ze and is met; Ze proves none of it, because its own boundary carries no value the behavior reads
a {feature-declined} annotation says the obligation is conditional on a feature the RFC makes optional and Ze does not offer, and it quotes the sentence that makes it optional. The condition is false, so nothing is owed and nothing is missing. It stays in the denominator every share here is taken over
Negative
what Ze owes
no test carries the requirement id, whether or not a gap states why
The 8 shares marked as a part above are the whole of the 97 gated MUSTs: they add to 100%. Proven by a recorded break is a share of TAGGED UNITS, a different population, so it is not one of them.
How to read the colors
A color names what the measure MEANS, not how well Ze scores on it. Green is a good outcome at any value, red is a bad one, and neither a population nor a scope count is an outcome, so both take no color. The number under the label is what says how far Ze has got.
| Card | Tone here | Why that color |
|---|---|---|
| Gated MUSTs | neutral | no color: a population is a scale, and a larger one is neither good news nor bad. It is the accounting total |
| Out of scope | neutral | no color: an obligation that never bound Ze is neither an achievement nor a failure, and counting it either way would be a claim |
| Tested both ways | ok | green at every value: a test pair is the outcome this gate exists to produce, and the share under the label is what says how far Ze has got |
| One polarity plus reason | ok | green at every value: where no counter-case exists, one polarity IS the complete answer, and a recorded reason is what the gate demands beside it |
| One polarity, unexcused | ok | green at zero, RED above it: half a proof with no reason for the other half |
| Partial proof; remaining gap | ok | green at zero, RED above it: a tested clause cannot prove the whole requirement |
| No test at all | bad | green at zero, RED above it: a binding obligation nothing exercises is a claim with nothing behind it, whether or not a reason is stated |
| Not applicable | neutral | no color: an obligation that never bound Ze is neither an achievement nor a failure, and counting it either way would be a claim |
| Met below Ze | neutral | no color: an obligation met below Ze is neither a test Ze wrote nor work Ze owes, and the two green shares above are what says how much Ze proves itself |
| Optional feature declined | neutral | no color: an obligation whose condition Ze never meets is neither an achievement nor a failure. The absent FEATURE is disclosed on the RFC's own status row, as an implementation gap a later scope decision can revisit |
| Proven by a recorded break | ok | green at every value: an observed break is the outcome the discrimination gate exists to produce. The denominator is TAGGED UNITS, not obligations, so this share is not one of the parts above |
| Audit verdicts | warn | RED on the first weak, wrong or unimplemented verdict, amber while a verdict is no longer current or a gated MUST is unjudged, green when every one is judged sound and current |
At a glance
| Field | Value |
|---|---|
| Public status | Partial |
| Enrolment | Enrolled |
| Requirements | 138 |
| Gated MUST-level | 97 |
| Not applicable, so out of scope | 12 |
| Declared gaps | 12 |
| Declared gaps a test demonstrates | 0 |
| Gated with no test | 0 |
| Nightly-only evidence | 0 |
| Test tags | 230 |
| Tagged units | 229 |
| Recorded audit verdicts | 61 |
| Discrimination records | 115 |
| Summary | rfc/short/rfc9830.md |
| Requirement shard | rfc/requirements/rfc9830.md |
| RFC text | rfc/full/rfc9830.txt |
Enrolment
Enrolled: BGP Extensions for SR Policy
What the public ledger says
Status: Partial
What the ledger says is covered
Ze encodes, parses and splits SAFI 73 NLRIs and originates a type-15 Tunnel Encapsulation TLV containing configured Preference, MPLS or SRv6 Binding SID, Priority, weighted segment lists and names (internal/component/bgp/plugins/nlri/srpolicy). Receive enforcement checks outer and top-level sub-TLV framing, requires exactly one type-15 TLV on actual AFI 1/73 and 2/73 carriers, and ignores inapplicable endpoint/color sub-TLVs (internal/component/bgp/reactor/session_tunnel_encap.go). Repaired receipt fixtures use a valid EBGP AS_PATH and IPv4-format Route Target, preserve assigned SRv6 Binding SID S/I/B bits and Type B V/B bits, and exercise ignored octets separately through receive dispatch, actual cached export and a downstream receive consumer. The codec's Preference readback and opaque byte retention are not SRPM interpretation.
What the ledger says remains
Full RFC support is not established. SID-structure length-sum validation and origination without Route Target/NO_ADVERTISE remain separately recorded encoding gaps or defects. The Binding SID unassigned transmit bit is corrected; its regression reproduced the invalid 0x10 Flags octet before the fix. Type-20 BSID structure origination is an absent form. Receive validation of the SAFI 73 NLRI length (treat-as-withdraw, or session reset when the section cannot be walked) and of the Tunnel Encapsulation attribute (present, with exactly one Tunnel Type 15 TLV) is implemented, but nested sub-TLV validation, mandatory target-community validation and the policy-specific default EBGP propagation restriction are not established by these proofs. SRPM candidate-path validation/selection, BSID/Weight/segment interpretation, eligibility and steering remain explicit implementation gaps outside this proof repair; no BGP proof credits the separate configured VPP policy lifecycle. Canonical discrimination recording and independent rejudgment of the repaired tests are still required; historical per-row gap counts are not current verification results.Coverage
| Bucket | Count | What it counts |
|---|---|---|
| Positive and negative tests | 70 | one part of the gated population |
| Annotated (including scoped evidence) | 27 | one part of the gated population |
| One polarity only | 0 | one part of the gated population |
| No test and no annotation | 0 | one part of the gated population |
| Partial proof; remaining gap (subset of annotated; zero whole-requirement credit) | 0 | an overlay: each of these is also counted by the part it falls in |
| Evidence that runs nightly only | 0 | an overlay: each of these is also counted by the part it falls in |
| Derived from other rows | 0 | outside the gated population: each asserts nothing and derives its state from the rows it names, which the parts above already count |
| Gated MUST-level requirements | 97 | every gated MUST falls in exactly one bucket above |
Positive and negative tests (70): RFC9830-2.1-1, RFC9830-2.1-2, RFC9830-2.1-3, RFC9830-2.2-1, RFC9830-2.2-3, RFC9830-2.3-1, RFC9830-2.3-3, RFC9830-2.4-1, RFC9830-2.4-2, RFC9830-2.4.1-2, RFC9830-2.4.1-3, RFC9830-2.4.1-4, RFC9830-2.4.1-5, RFC9830-2.4.1-6, RFC9830-2.4.1-7, RFC9830-2.4.2-2, RFC9830-2.4.2-4, RFC9830-2.4.2-12, RFC9830-2.4.2-5, RFC9830-2.4.2-6, RFC9830-2.4.2-7, RFC9830-2.4.2-8, RFC9830-2.4.2-9, RFC9830-2.4.2-10, RFC9830-2.4.2-11, RFC9830-2.4.3-4, RFC9830-2.4.3-5, RFC9830-2.4.3-6, RFC9830-2.4.3-7, RFC9830-2.4.4-4, RFC9830-2.4.4-5, RFC9830-2.4.4.1-2, RFC9830-2.4.4.1-3, RFC9830-2.4.4.1-4, RFC9830-2.4.4.1-5, RFC9830-2.4.4.1-6, RFC9830-2.4.4.1-7, RFC9830-2.4.4.2.1-1, RFC9830-2.4.4.2.1-2, RFC9830-2.4.4.2.1-3, RFC9830-2.4.4.2.1-4, RFC9830-2.4.4.2.1-5, RFC9830-2.4.4.2.2-1, RFC9830-2.4.4.2.2-2, RFC9830-2.4.4.2.2-3, RFC9830-2.4.4.2.2-4, RFC9830-2.4.4.2.3-1, RFC9830-2.4.4.2.3-2, RFC9830-2.4.4.2.3-3, RFC9830-2.4.4.2.4-2, RFC9830-2.4.4.2.4-3, RFC9830-2.4.6-3, RFC9830-2.4.6-4, RFC9830-2.4.6-5, RFC9830-2.4.6-6, RFC9830-2.4.7-5, RFC9830-2.4.7-6, RFC9830-2.4.7-7, RFC9830-2.4.8-5, RFC9830-2.4.8-6, RFC9830-2.4.8-7, RFC9830-4.2.1-2, RFC9830-4.2.1-3, RFC9830-4.2.1-6, RFC9830-4.2.1-7, RFC9830-4.2.3-6, RFC9830-5-1, RFC9830-5-2, RFC9830-5-4, RFC9830-5-9
Annotated (including scoped evidence) (27): RFC9830-2.2-2, RFC9830-2.4.3-3, RFC9830-2.4.3-9, RFC9830-2.4.4.2.4-4, RFC9830-2.4.5-2, RFC9830-2.4.5-3, RFC9830-2.4.5-4, RFC9830-2.4.5-5, RFC9830-2.4.5-6, RFC9830-2.4.5-7, RFC9830-2.4.5-8, RFC9830-3-3, RFC9830-4.1-2, RFC9830-4.2.1-1, RFC9830-4.2.1-4, RFC9830-4.2.1-5, RFC9830-4.2.1-8, RFC9830-4.2.1-9, RFC9830-4.2.2-1, RFC9830-4.2.2-2, RFC9830-4.2.2-5, RFC9830-4.2.3-1, RFC9830-4.2.3-2, RFC9830-5-5, RFC9830-5-6, RFC9830-5-7, RFC9830-5-8
Requirements
| Requirement | Level | Section | Tests |
|---|---|---|---|
RFC9830-2.1-1 | The AFI used MUST be IPv4(1) or IPv6(2) (§2.1) | ||
| MUST | 2.1 | ||
RFC9830-2.1-2 | When AFI = 1, the value MUST be 96; when AFI = 2, the value MUST be 192. (§2.1) | ||
| MUST | 2.1 | ||
RFC9830-2.1-3 | A BGP UPDATE message that carries the MP_REACH_NLRI or MP_UNREACH_NLRI attribute with the SR Policy SAFI MUST also carry the BGP mandatory attributes. (§2.1) | ||
| MUST | 2.1 | ||
RFC9830-2.2-1 | This document specifies the use of the Tunnel Encapsulation Attribute with the SR Policy Tunnel Type and the use of any other Tunnel Type with the SR Policy SAFI MUST be considered malformed and handled by the "treat-as-withdraw" strategy [RFC7606]. (§2.2) | ||
| MUST | 2.2 | ||
RFC9830-2.2-2 | A Tunnel Encapsulation Attribute MUST NOT contain more than one TLV of type "SR Policy" (§2.2) | ||
| MUST NOT | 2.2 | negative
no testno negative test{single-polarity}: buildTunnelEncap assembles every configured sub-TLV into a single Tunnel Type 15 TLV and has no path that appends a second one (internal/component/bgp/plugins/nlri/srpolicy/config.go:365-370), so no input to ze's encoder produces the forbidden encoding for a negative to assert. The receive-side obligation to treat two such TLVs as malformed is the separate RFC9830-2.2-3 |
|
RFC9830-2.2-3 | A Tunnel Encapsulation Attribute MUST NOT contain more than one TLV of type "SR Policy"; such updates MUST be considered malformed and handled by the "treat-as-withdraw" strategy [RFC7606]. (§2.2) | ||
| MUST | 2.2 | ||
RFC9830-2.3-1 | If these sub-TLVs are present, a BGP speaker MUST ignore them (§2.3) | ||
| MUST | 2.3 | ||
RFC9830-2.3-3 | Similarly, any other sub-TLVs, including those specified in [RFC9012], that do not have explicitly defined applicability to the SR Policy SAFI MUST be ignored by the BGP speaker (§2.3) | ||
| MUST | 2.3 | ||
RFC9830-2.4-1 | For the TLVs/sub-TLVs that are specified as single instance, only the first instance of that TLV/sub-TLV is used: the other instances MUST be ignored (§2.4) | ||
| MUST | 2.4 | ||
RFC9830-2.4-2 | For the TLVs/sub-TLVs that are specified as single instance, only the first instance of that TLV/sub-TLV is used: the other instances MUST be ignored and MUST NOT considered to be malformed. (§2.4) | ||
| MUST NOT | 2.4 | ||
RFC9830-2.4.1-2 | The Preference sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.1) | ||
| MUST NOT | 2.4.1 | ||
RFC9830-2.4.1-3 | Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.1) | ||
| MUST | 2.4.1 | ||
RFC9830-2.4.1-4 | The Flags field MUST be set to zero on transmission (§2.4.1) | ||
| MUST | 2.4.1 | ||
RFC9830-2.4.1-5 | The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.1) | ||
| MUST | 2.4.1 | ||
RFC9830-2.4.1-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.1) | ||
| MUST | 2.4.1 | ||
RFC9830-2.4.1-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.1) | ||
| MUST | 2.4.1 | ||
RFC9830-2.4.2-2 | The Binding SID sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.2) | ||
| MUST NOT | 2.4.2 | ||
RFC9830-2.4.2-4 | 6 when an SR-MPLS BSID is present, or 2 when no BSID is present. (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-12 | The value MUST be 18 when a SRv6 BSID is present (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-5 | The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-6 | The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-7 | RESERVED: 1 octet of reserved bits. MUST be set to zero on transmission (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-8 | RESERVED: 1 octet of reserved bits. MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-9 | Traffic Class (TC), S, and TTL (Total of 12 bits) are RESERVED and MUST be set to zero (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-10 | Traffic Class (TC), S, and TTL (Total of 12 bits) are RESERVED and MUST be set to zero and MUST be ignored. (§2.4.2) | ||
| MUST | 2.4.2 | ||
RFC9830-2.4.2-11 | The Label field is validated by the SRPM but MUST NOT contain the reserved MPLS label values (0-15). (§2.4.2) | ||
| MUST NOT | 2.4.2 | ||
RFC9830-2.4.3-3 | The value MUST be 26 when the SRv6 Endpoint Behavior and SID Structure is present; else, it MUST be 18. (§2.4.3) | ||
| MUST | 2.4.3 | negative
no testno negative test{single-polarity}: buildSRv6BindingSIDSubTLV always writes the 18-octet form and never appends the SRv6 Endpoint Behavior and SID Structure (internal/component/bgp/plugins/nlri/srpolicy/config.go:409-416), so the 26-octet case has no producer and there is no contrasting length to assert. The same 18-versus-26 rule for the Type B segment sub-TLV, where ze DOES produce both, is covered with both polarities under RFC9830-2.4.4.2.2-1 |
|
RFC9830-2.4.3-4 | The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.3) | ||
| MUST | 2.4.3 | ||
RFC9830-2.4.3-5 | The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.3) | ||
| MUST | 2.4.3 | ||
RFC9830-2.4.3-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.3) | ||
| MUST | 2.4.3 | ||
RFC9830-2.4.3-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.3) | ||
| MUST | 2.4.3 | ||
RFC9830-2.4.3-9 | The SRv6 Endpoint Behavior and SID Structure MUST NOT be included when the SRv6 SID has not been included (§2.4.3) | ||
| MUST NOT | 2.4.3 | negative
no testno negative test{single-polarity}: the SRv6 Binding SID sub-TLV ze writes always carries the 16-octet SID and never the Endpoint Behavior and SID Structure (internal/component/bgp/plugins/nlri/srpolicy/config.go:409-416), so the forbidden combination has no producer to drive a negative from. The parallel Type B rule, where an endpoint-behavior token without a preceding SRv6 SID IS refused, is covered with both polarities under RFC9830-2.4.4.2.2-4 |
|
RFC9830-2.4.4-4 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4) | ||
| MUST | 2.4.4 | ||
RFC9830-2.4.4-5 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4) | ||
| MUST | 2.4.4 | ||
RFC9830-2.4.4.1-2 | The Weight sub-TLV is OPTIONAL; it MUST NOT appear more than once inside the Segment List sub-TLV. (§2.4.4.1) | ||
| MUST NOT | 2.4.4.1 | ||
RFC9830-2.4.4.1-3 | Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.4.1) | ||
| MUST | 2.4.4.1 | ||
RFC9830-2.4.4.1-4 | The Flags field MUST be set to zero on transmission (§2.4.4.1) | ||
| MUST | 2.4.4.1 | ||
RFC9830-2.4.4.1-5 | The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.1) | ||
| MUST | 2.4.4.1 | ||
RFC9830-2.4.4.1-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.1) | ||
| MUST | 2.4.4.1 | ||
RFC9830-2.4.4.1-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.1) | ||
| MUST | 2.4.4.1 | ||
RFC9830-2.4.4.2.1-1 | Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.4.2.1) | ||
| MUST | 2.4.4.2.1 | ||
RFC9830-2.4.4.2.1-2 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.1) | ||
| MUST | 2.4.4.2.1 | ||
RFC9830-2.4.4.2.1-3 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.1) | ||
| MUST | 2.4.4.2.1 | ||
RFC9830-2.4.4.2.1-4 | The S bit MUST be zero upon transmission (§2.4.4.2.1) | ||
| MUST | 2.4.4.2.1 | ||
RFC9830-2.4.4.2.1-5 | The S bit MUST be zero upon transmission and MUST be ignored upon reception. (§2.4.4.2.1) | ||
| MUST | 2.4.4.2.1 | ||
RFC9830-2.4.4.2.2-1 | The value MUST be 26 when the SRv6 Endpoint Behavior and SID Structure is present; else, it MUST be 18. (§2.4.4.2.2) | ||
| MUST | 2.4.4.2.2 | ||
RFC9830-2.4.4.2.2-2 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.2) | ||
| MUST | 2.4.4.2.2 | ||
RFC9830-2.4.4.2.2-3 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.2) | ||
| MUST | 2.4.4.2.2 | ||
RFC9830-2.4.4.2.2-4 | The SRv6 Endpoint Behavior and SID Structure MUST NOT be included when the SRv6 SID has not been included. (§2.4.4.2.2) | ||
| MUST NOT | 2.4.4.2.2 | ||
RFC9830-2.4.4.2.3-1 | The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.4.2.3) | ||
| MUST | 2.4.4.2.3 | ||
RFC9830-2.4.4.2.3-2 | The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.4.2.3) | ||
| MUST | 2.4.4.2.3 | ||
RFC9830-2.4.4.2.3-3 | If B-Flag appears with Segment Type A, it MUST be ignored. (§2.4.4.2.3) | ||
| MUST | 2.4.4.2.3 | ||
RFC9830-2.4.4.2.4-2 | Reserved: 2 octets of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.4) | ||
| MUST | 2.4.4.2.4 | ||
RFC9830-2.4.4.2.4-3 | Reserved: 2 octets of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.4) | ||
| MUST | 2.4.4.2.4 | ||
RFC9830-2.4.4.2.4-4 | The total of the locator block, locator node, function, and argument lengths MUST be less than or equal to 128 (§2.4.4.2.4) | ||
| MUST | 2.4.4.2.4 | positive
no testno positive testnegative
no testno negative test{gap}: the four SID-structure lengths are parsed as independent octets with no sum check (internal/component/bgp/plugins/nlri/srpolicy/config.go:312-318) and written verbatim into the segment sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:478-481), so a configuration whose locator block, locator node, function and argument lengths total more than 128 is encoded rather than refused |
|
RFC9830-2.4.5-2 | The ENLP sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.5) | ||
| MUST NOT | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze neither encodes nor interprets the ENLP sub-TLV, so it never writes a second instance. The SR Policy sub-TLV constant set holds no type 14 (internal/component/bgp/plugins/nlri/srpolicy/config.go:23-29), buildTunnelEncap has no ENLP branch (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363), and grep -rniE '\benlp\b|explicit.?null.?label' over the Go tree matches only the OSPF MPLS Explicit NULL label, an unrelated feature |
|
RFC9830-2.4.5-3 | Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 3. (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze writes no ENLP sub-TLV, so it declares no length for one. There is no type-14 constant in the SR Policy encoder (internal/component/bgp/plugins/nlri/srpolicy/config.go:23-29) and no ENLP branch in buildTunnelEncap (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
|
RFC9830-2.4.5-4 | The Flags field MUST be set to zero on transmission (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze transmits no ENLP sub-TLV, so it has no ENLP Flags field to zero; the config keyword set has no ENLP spelling (internal/component/bgp/plugins/nlri/srpolicy/config.go:72-187) and buildTunnelEncap emits no type-14 sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
|
RFC9830-2.4.5-5 | The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze decodes no ENLP sub-TLV, so it reads no ENLP Flags field. Preference is the only typed sub-TLV accessor (internal/core/bgp/attribute/tunnel_encap.go:145) and the sub-TLV type constants stop at Segment List (internal/core/bgp/attribute/tunnel_encap.go:87-92) |
|
RFC9830-2.4.5-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze transmits no ENLP sub-TLV, so it has no ENLP RESERVED octet to zero; buildTunnelEncap emits no type-14 sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
|
RFC9830-2.4.5-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze decodes no ENLP sub-TLV, so it reads no ENLP RESERVED octet; the only typed sub-TLV accessor is Preference (internal/core/bgp/attribute/tunnel_encap.go:145) |
|
RFC9830-2.4.5-8 | Implementations adhering to this document MUST ignore the ENLP sub-TLV with unrecognized values (viz. other than 1 through 4). (§2.4.5) | ||
| MUST | 2.4.5 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze interprets no ENLP value, recognized or not. The requirement presupposes a receiver that acts on values 1 through 4; ze has no ENLP decoder at all (internal/core/bgp/attribute/tunnel_encap.go:87-92, :145) and no Explicit NULL push driven by an SR Policy |
|
RFC9830-2.4.6-3 | The Priority sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.6) | ||
| MUST NOT | 2.4.6 | ||
RFC9830-2.4.6-4 | Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 2. (§2.4.6) | ||
| MUST | 2.4.6 | ||
RFC9830-2.4.6-5 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.6) | ||
| MUST | 2.4.6 | ||
RFC9830-2.4.6-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.6) | ||
| MUST | 2.4.6 | ||
RFC9830-2.4.7-5 | The SR Policy Candidate Path Name sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.7) | ||
| MUST NOT | 2.4.7 | ||
RFC9830-2.4.7-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.7) | ||
| MUST | 2.4.7 | ||
RFC9830-2.4.7-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.7) | ||
| MUST | 2.4.7 | ||
RFC9830-2.4.8-5 | The SR Policy Name sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.8) | ||
| MUST NOT | 2.4.8 | ||
RFC9830-2.4.8-6 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.8) | ||
| MUST | 2.4.8 | ||
RFC9830-2.4.8-7 | RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.8) | ||
| MUST | 2.4.8 | ||
RFC9830-3-3 | Type 3 (bits 11): Reserved for future use and SHOULD NOT be used. Upon reception, an implementation MUST treat it like Type 0. (§3) | ||
| MUST | 3 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze performs no color-based steering, so it never compares a route's Color Extended Community with an SR Policy and the Color-Only bits are never read. The eight octets are carried as an opaque extended community (internal/core/bgp/attribute/community.go, ParseExtendedCommunities) and grep -rniE 'color.?only|colorExtended' over the Go tree matches only test names, with no producer that decodes the CO field |
|
RFC9830-4.1-2 | In such a case, the NO_ADVERTISE community [RFC1997] MUST be attached to the SR Policy update (see further details in Section 4.2.3). (§4.1) | ||
| MUST | 4.1 | positive
no testno positive testnegative
no testno negative test{gap}: ze attaches neither a route target nor NO_ADVERTISE to an SR Policy advertisement. parseConfigRoute builds exactly one attribute, the Tunnel Encapsulation attribute (internal/component/bgp/plugins/nlri/srpolicy/config.go:218-225), and deliberately ignores the pre-parsed attribute block that carries communities for other families (internal/component/bgp/plugins/nlri/srpolicy/config.go:43-44), so an SR Policy route ze originates carries no community at all |
|
RFC9830-4.2.1-1 | When a BGP speaker receives an SR Policy NLRI from a neighbor, it MUST first perform validation based on the following rules in addition to the validation described in Section 5 (§4.2.1) | ||
| MUST | 4.2.1 | positive
no testno positive testnegative
no testno negative test{gap}: the Section 4.2.1 receive validation is partial. Ze judges the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap); the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated on receipt, so an SR Policy update carrying neither reaches the RIB |
|
RFC9830-4.2.1-2 | The SR Policy NLRI MUST include a distinguisher, Color, and Endpoint field (§4.2.1) | ||
| MUST | 4.2.1 | ||
RFC9830-4.2.1-3 | the length of the NLRI MUST be either 12 or 24 octets (depending on the address family of the Endpoint). (§4.2.1) | ||
| MUST | 4.2.1 | ||
RFC9830-4.2.1-4 | * The SR Policy update MUST have either the NO_ADVERTISE community, at least one Route Target extended community in IPv4-address format, or both. (§4.2.1) | ||
| MUST | 4.2.1 | positive
no testno positive testnegative
no testno negative test{gap}: nothing inspects the communities of a received SR Policy update. There is no RFC 7606 validator for attribute 23 and none for the SAFI (internal/component/bgp/message/rfc7606.go:415-429, :701-704), and no code path reads NO_ADVERTISE or a route target for SAFI 73: grep for SAFISRPolicy outside the NLRI codec matches only the family registry and the next-hop length table (internal/core/bgp/attribute/mpnlri.go:277) |
|
RFC9830-4.2.1-5 | If a router supporting this specification receives an SR Policy update with no Route Target extended communities and no NO_ADVERTISE community, the update MUST be considered to be malformed. (§4.2.1) | ||
| MUST | 4.2.1 | positive
no testno positive testnegative
no testno negative test{gap}: an SR Policy update with neither a route target nor NO_ADVERTISE is accepted like any other. The malformed decision would have to come from an RFC 7606 validator for attribute 23 or for SAFI 73, and neither exists (internal/component/bgp/message/rfc7606.go:415-429, :701-704) |
|
RFC9830-4.2.1-6 | The Tunnel Encapsulation Attribute MUST be attached to the BGP UPDATE message (§4.2.1) | ||
| MUST | 4.2.1 | ||
RFC9830-4.2.1-7 | The Tunnel Encapsulation Attribute MUST be attached to the BGP UPDATE message and MUST have a Tunnel Type TLV set to SR Policy (code point is 15). (§4.2.1) | ||
| MUST | 4.2.1 | ||
RFC9830-4.2.1-8 | A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed (§4.2.1) | ||
| MUST | 4.2.1 | positive
no testno positive testnegative
no testno negative test{gap}: of the Section 4.2.1 criteria, the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap) drive a malformed verdict; the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated, so an update failing only that criterion is not treated as malformed |
|
RFC9830-4.2.1-9 | A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed, and the SR Policy CP MUST NOT be passed to the SRPM. (§4.2.1) | ||
| MUST NOT | 4.2.1 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze has no SRPM. grep -rni '\bsrpm\b' over the Go tree matches nothing, the SR Policy plugin registers only an NLRI codec and a config route encoder (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40), and no candidate path is ever handed to a policy manager, valid or otherwise |
|
RFC9830-4.2.2-1 | If one or more route targets are present, then at least one route target MUST match the BGP Identifier of the receiver for the update to be considered usable. (§4.2.2) | ||
| MUST | 4.2.2 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze never makes an SR Policy locally usable, so there is no eligibility decision for a route target to gate. There is no SRPM (grep -rni '\bsrpm\b' over the Go tree matches nothing) and no SAFI 73 consumer outside the NLRI codec and the family registry (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40, internal/core/family/family.go:93) |
|
RFC9830-4.2.2-2 | The BGP Identifier is defined in [RFC4271] as a 4-octet IPv4 address and is updated by [RFC6286] as a 4-octet, unsigned, non-zero integer. Therefore, the Route Target extended community MUST be of the same format. (§4.2.2) | ||
| MUST | 4.2.2 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze compares no route target against its BGP Identifier for SAFI 73, because it makes no SR Policy locally usable; there is no SRPM and no local-use path (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40), so the format constraint governs a comparison ze never performs |
|
RFC9830-4.2.2-5 | When an update for an SR Policy NLRI results in its becoming unusable, BGP MUST delete its corresponding SR Policy CP from the SRPM. (§4.2.2) | ||
| MUST | 4.2.2 | positive
no testno positive testnegative
no testno negative test{not-applicable}: ze holds no SR Policy candidate path to delete. grep -rni '\bsrpm\b' over the Go tree matches nothing and the SR Policy plugin keeps no state beyond the NLRI codec (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40); withdrawal of a SAFI 73 route removes the RIB entry and nothing else |
|
RFC9830-4.2.3-1 | SR Policy NLRIs that have the NO_ADVERTISE community attached to them MUST NOT be propagated. (§4.2.3) | ||
| MUST NOT | 4.2.3 | positive
no testno positive testnegative
no testno negative test{gap}: the egress gate consults only the operator-configured export filter chain and never inspects community values (writeUpdateGated, internal/component/bgp/reactor/session_write.go:263-283), so an SR Policy NLRI carrying NO_ADVERTISE is propagated unless an operator filter happens to match it. The same omission is disclosed for RFC 1997 |
|
RFC9830-4.2.3-2 | By default, a BGP node receiving an SR Policy NLRI MUST NOT propagate it to any External BGP (EBGP) neighbor. (§4.2.3) | ||
| MUST NOT | 4.2.3 | positive
no testno positive testnegative
no testno negative test{gap}: propagation of SAFI 73 is family-generic with no eBGP default. The reactor's forwarding path keys on the negotiated families and the per-peer export filter, and grep for SAFISRPolicy over internal/component/bgp/reactor matches nothing, so a received SR Policy NLRI is forwarded to an eBGP neighbor that negotiated the family like any other route |
|
RFC9830-4.2.3-6 | A BGP node MUST NOT alter the SR Policy information carried in the Tunnel Encapsulation Attribute during propagation (§4.2.3) | ||
| MUST NOT | 4.2.3 | ||
RFC9830-5-1 | A BGP speaker MUST perform the following syntactic validation of the SR Policy NLRI to determine if it is malformed. This includes the validation of the length of each NLRI and the total length of the MP_REACH_NLRI and MP_UNREACH_NLRI attributes. It also includes the validation of the consistency of the NLRI length with the AFI and the endpoint address as specified in Section 2.1. (§5) | ||
| MUST | 5 | ||
RFC9830-5-2 | When the error determined allows for the router to skip the malformed NLRI(s) and continue the processing of the rest of the BGP UPDATE message, then it MUST handle such malformed NLRIs as 'treat-as- withdraw'. (§5) | ||
| MUST | 5 | ||
RFC9830-5-4 | Alternately, the router MUST perform "session reset" when the session is only being used for SR Policy or when a "AFI/SAFI disable" action is not possible. (§5) | ||
| MUST | 5 | ||
RFC9830-5-5 | The validation of the TLVs/sub-TLVs introduced in this document and defined in their respective subsections of Section 2.4 MUST be performed to determine if they are malformed or invalid. (§5) | ||
| MUST | 5 | positive
no testno positive testnegative
no testno negative test{gap}: only one Section 2.4 sub-TLV is validated. TunnelTLV.Preference checks the mandated 6-octet value length before reading it (internal/core/bgp/attribute/tunnel_encap.go:151); every other sub-TLV is walked for framing only by TunnelTLV.SubTLVs (internal/core/bgp/attribute/tunnel_encap.go:104-131) and no length, flag or field of the Binding SID, SRv6 Binding SID, Priority, Segment List, Weight, Segment or name sub-TLVs is checked |
|
RFC9830-5-6 | The validation of the Tunnel Encapsulation Attribute itself and the other TLVs/sub-TLVs specified in Section 13 of [RFC9012] MUST be done as described in that document. (§5) | ||
| MUST | 5 | positive
no testno positive testnegative
no testno negative test{gap}: the RFC 9012 Section 13 structural validation exists but is never driven at reception. ParseTunnelEncap is registered as the parser for attribute 23 (internal/core/bgp/attribute/wire.go:418) and rejects broken TLV framing (internal/core/bgp/attribute/tunnel_encap.go:41-54), but attributes are parsed lazily, only when something reads them (internal/core/bgp/attribute/wire.go:346), and nothing reads attribute 23 for a SAFI 73 route; there is no RFC 7606 validator that would force the parse (internal/component/bgp/message/rfc7606.go:415-429) |
|
RFC9830-5-7 | In case of any error detected, either at the attribute or its TLV/sub-TLV level, the "treat-as-withdraw" strategy MUST be applied. (§5) | ||
| MUST | 5 | positive
no testno positive testnegative
no testno negative test{gap}: an error at the attribute or sub-TLV level produces no treat-as-withdraw. The RFC 7606 validator table has no entry for attribute 23 (internal/component/bgp/message/rfc7606.go:415-429), so the ParseTunnelEncap and SubTLVs errors (internal/core/bgp/attribute/tunnel_encap.go:43, :109) are only ever seen by a caller that chose to parse, never by the UPDATE validation path |
|
RFC9830-5-8 | An SR Policy update that is determined not to be valid (and, therefore, malformed) based on the rules described in Section 4.2.1 MUST be handled by the "treat-as-withdraw" strategy. (§5) | ||
| MUST | 5 | positive
no testno positive testnegative
no testno negative test{gap}: an update failing the Section 4.2.1 NLRI length rule or the Tunnel Encapsulation rule is handled as treat-as-withdraw (the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap)); the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated, so an update failing only that criterion is never treat-as-withdraw |
|
RFC9830-5-9 | A BGP implementation MUST NOT perform semantic verification of such fields nor consider the SR Policy update to be invalid or not usable based on such validation. (§5) | ||
| MUST NOT | 5 | ||
RFC9830-2.1-5 | It has to be noted that if several CPs of the same SR Policy (Endpoint, Color) are signaled via BGP to a headend, then it is RECOMMENDED that each NLRI use a different distinguisher. (§2.1) | ||
| RECOMMENDED | 2.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.2-3 | It is RECOMMENDED that the SRv6 Binding SID sub-TLV, as defined in Section 2.4.3, be used when signaling an SRv6 BSID for an SR Policy CP. (§2.4.2) | ||
| RECOMMENDED | 2.4.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.7-2 | It is RECOMMENDED that the size of the symbolic name for the CP be limited to 255 bytes (§2.4.7) | ||
| RECOMMENDED | 2.4.7 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.8-2 | It is RECOMMENDED that the size of the symbolic name for the SR Policy be limited to 255 bytes (§2.4.8) | ||
| RECOMMENDED | 2.4.8 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-3-2 | Type 3 (bits 11): Reserved for future use and SHOULD NOT be used. (§3) | ||
| SHOULD NOT | 3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.1-1 | Moreover, one or more route targets SHOULD be attached to the advertisement, where each route target identifies one or more intended headends for the advertised SR Policy update. (§4.1) | ||
| SHOULD | 4.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.2.2-3 | When the SR Policy tunnel type includes any sub-TLV that is unrecognized or unsupported, the update SHOULD NOT be considered usable. (§4.2.2) | ||
| SHOULD NOT | 4.2.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.2.3-4 | By default, a BGP node receiving an SR Policy NLRI SHOULD NOT remove the Route Target extended community before propagation (§4.2.3) | ||
| SHOULD NOT | 4.2.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-5-3 | In other cases, where the error in the NLRI encoding results in the inability to process the BGP UPDATE message (e.g., length-related encoding errors), then the router SHOULD handle such malformed NLRIs as "AFI/SAFI disable" when other AFI/SAFIs besides SR Policy are being advertised over the same session. (§5) | ||
| SHOULD | 5 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-5-10 | An implementation SHOULD log any errors found during the above validation (§5) | ||
| SHOULD | 5 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.1-4 | In addition, the BGP UPDATE message MAY also contain any of the BGP optional attributes. (§2.1) | ||
| MAY | 2.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.3-2 | If these sub-TLVs are present, a BGP speaker MUST ignore them and MAY remove them from the Tunnel Encapsulation Attribute during propagation. (§2.3) | ||
| MAY | 2.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.3-4 | Similarly, any other sub-TLVs, including those specified in [RFC9012], that do not have explicitly defined applicability to the SR Policy SAFI MUST be ignored by the BGP speaker and MAY be removed from the Tunnel Encapsulation Attribute during propagation. (§2.3) | ||
| MAY | 2.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.1-1 | The Preference sub-TLV is OPTIONAL (§2.4.1) | ||
| OPTIONAL | 2.4.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.2-1 | The Binding SID sub-TLV is OPTIONAL (§2.4.2) | ||
| OPTIONAL | 2.4.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.3-1 | The SRv6 Binding SID sub-TLV is OPTIONAL (§2.4.3) | ||
| OPTIONAL | 2.4.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.3-2 | More than one SRv6 Binding SID sub-TLV MAY be signaled in the same SR Policy encoding (§2.4.3) | ||
| MAY | 2.4.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.3-8 | SRv6 Binding SID: Contains a 16-octet SRv6 SID. The value 0 MAY be used when the controller wants to indicate the desired SRv6 Endpoint Behavior, SID Structure, or flags without specifying the BSID. (§2.4.3) | ||
| MAY | 2.4.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4-1 | The Segment List sub-TLV is OPTIONAL (§2.4.4) | ||
| OPTIONAL | 2.4.4 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4-2 | The Segment List sub-TLV is OPTIONAL and MAY appear multiple times in the SR Policy encoding. (§2.4.4) | ||
| MAY | 2.4.4 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4-3 | The Segment List sub-TLV contains zero or more Segment sub-TLVs and MAY contain a Weight sub-TLV. (§2.4.4) | ||
| MAY | 2.4.4 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4.1-1 | The Weight sub-TLV is OPTIONAL (§2.4.4.1) | ||
| OPTIONAL | 2.4.4.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4.2-1 | The Segment sub-TLVs are OPTIONAL (§2.4.4.2) | ||
| OPTIONAL | 2.4.4.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4.2-2 | The Segment sub-TLVs are OPTIONAL and MAY appear multiple times in the Segment List sub-TLV. (§2.4.4.2) | ||
| MAY | 2.4.4.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4.2.1-6 | The receiver MAY override the originator's values for these fields. This would be determined by local policy at the receiver. (§2.4.4.2.1) | ||
| MAY | 2.4.4.2.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.4.2.4-1 | The Segment Type sub-TLVs described above MAY contain the SRv6 Endpoint Behavior and SID Structure [RFC8986] encoding as described below (§2.4.4.2.4) | ||
| MAY | 2.4.4.2.4 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.5-1 | The ENLP sub-TLV is OPTIONAL (§2.4.5) | ||
| OPTIONAL | 2.4.5 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.5-9 | The behavior signaled in this sub-TLV MAY be overridden by local configuration by the network operator based on their deployment requirements. (§2.4.5) | ||
| MAY | 2.4.5 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.6-1 | An operator MAY set the SR Policy Priority sub-TLV to indicate the order in which the SR policies are recomputed upon topological change. (§2.4.6) | ||
| MAY | 2.4.6 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.6-2 | The Priority sub-TLV is OPTIONAL (§2.4.6) | ||
| OPTIONAL | 2.4.6 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.7-1 | An operator MAY set the SR Policy Candidate Path Name sub-TLV to attach a symbolic name to the SR Policy CP (§2.4.7) | ||
| MAY | 2.4.7 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.7-3 | Implementations MAY choose to truncate long names to 255 bytes when signaling via BGP. (§2.4.7) | ||
| MAY | 2.4.7 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.7-4 | The SR Policy Candidate Path Name sub-TLV is OPTIONAL (§2.4.7) | ||
| OPTIONAL | 2.4.7 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.8-1 | An operator MAY set the SR Policy Name sub-TLV to associate a symbolic name with the SR Policy (§2.4.8) | ||
| MAY | 2.4.8 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.8-3 | Implementations MAY choose to truncate long names to 255 bytes when signaling via BGP. (§2.4.8) | ||
| MAY | 2.4.8 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-2.4.8-4 | The SR Policy Name sub-TLV is OPTIONAL (§2.4.8) | ||
| OPTIONAL | 2.4.8 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-3-1 | The Color Extended Community MAY be carried in any BGP UPDATE message whose AFI/SAFI is 1/1 (IPv4 Unicast), 2/1 (IPv6 Unicast), 1/4 (IPv4 Labeled Unicast), 2/4 (IPv6 Labeled Unicast), 1/128 (VPN-IPv4 Labeled Unicast), 2/128 (VPN-IPv6 Labeled Unicast), or 25/70 (Ethernet VPN, usually known as EVPN). (§3) | ||
| MAY | 3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-3-4 | One or more Color Extended Communities MAY be associated with a BGP route update (§3) | ||
| MAY | 3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.2.2-4 | An implementation MAY provide an option for ignoring unsupported sub-TLVs (§4.2.2) | ||
| MAY | 4.2.2 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.2.3-3 | An implementation MAY provide an explicit configuration to override this and enable the propagation of valid SR Policy NLRIs to specific EBGP neighbors where the SR domain comprises multiple ASes within a single service provider domain (see Section 7 for details). (§4.2.3) | ||
| MAY | 4.2.3 | positive
no testno positive testnegative
no testno negative test |
|
RFC9830-4.2.3-5 | An implementation MAY provide support for configuration to filter and/or remove the Route Target extended community before propagation (§4.2.3) | ||
| MAY | 4.2.3 | positive
no testno positive testnegative
no testno negative test |
|
Gaps and untested MUSTs
| Requirement | State | Reason |
|---|---|---|
RFC9830-2.4.4.2.4-4 The total of the locator block, locator node, function, and argument lengths MUST be less than or equal to 128 (§2.4.4.2.4) |
{gap}, no test | the four SID-structure lengths are parsed as independent octets with no sum check (internal/component/bgp/plugins/nlri/srpolicy/config.go:312-318) and written verbatim into the segment sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:478-481), so a configuration whose locator block, locator node, function and argument lengths total more than 128 is encoded rather than refused |
RFC9830-2.4.5-2 The ENLP sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze neither encodes nor interprets the ENLP sub-TLV, so it never writes a second instance. The SR Policy sub-TLV constant set holds no type 14 (internal/component/bgp/plugins/nlri/srpolicy/config.go:23-29), buildTunnelEncap has no ENLP branch (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363), and grep -rniE '\benlp\b|explicit.?null.?label' over the Go tree matches only the OSPF MPLS Explicit NULL label, an unrelated feature |
RFC9830-2.4.5-3 Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 3. (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze writes no ENLP sub-TLV, so it declares no length for one. There is no type-14 constant in the SR Policy encoder (internal/component/bgp/plugins/nlri/srpolicy/config.go:23-29) and no ENLP branch in buildTunnelEncap (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
RFC9830-2.4.5-4 The Flags field MUST be set to zero on transmission (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze transmits no ENLP sub-TLV, so it has no ENLP Flags field to zero; the config keyword set has no ENLP spelling (internal/component/bgp/plugins/nlri/srpolicy/config.go:72-187) and buildTunnelEncap emits no type-14 sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
RFC9830-2.4.5-5 The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze decodes no ENLP sub-TLV, so it reads no ENLP Flags field. Preference is the only typed sub-TLV accessor (internal/core/bgp/attribute/tunnel_encap.go:145) and the sub-TLV type constants stop at Segment List (internal/core/bgp/attribute/tunnel_encap.go:87-92) |
RFC9830-2.4.5-6 RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze transmits no ENLP sub-TLV, so it has no ENLP RESERVED octet to zero; buildTunnelEncap emits no type-14 sub-TLV (internal/component/bgp/plugins/nlri/srpolicy/config.go:339-363) |
RFC9830-2.4.5-7 RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze decodes no ENLP sub-TLV, so it reads no ENLP RESERVED octet; the only typed sub-TLV accessor is Preference (internal/core/bgp/attribute/tunnel_encap.go:145) |
RFC9830-2.4.5-8 Implementations adhering to this document MUST ignore the ENLP sub-TLV with unrecognized values (viz. other than 1 through 4). (§2.4.5) |
no test | no test carries this requirement id; annotated {not-applicable}: ze interprets no ENLP value, recognized or not. The requirement presupposes a receiver that acts on values 1 through 4; ze has no ENLP decoder at all (internal/core/bgp/attribute/tunnel_encap.go:87-92, :145) and no Explicit NULL push driven by an SR Policy |
RFC9830-3-3 Type 3 (bits 11): Reserved for future use and SHOULD NOT be used. Upon reception, an implementation MUST treat it like Type 0. (§3) |
no test | no test carries this requirement id; annotated {not-applicable}: ze performs no color-based steering, so it never compares a route's Color Extended Community with an SR Policy and the Color-Only bits are never read. The eight octets are carried as an opaque extended community (internal/core/bgp/attribute/community.go, ParseExtendedCommunities) and grep -rniE 'color.?only|colorExtended' over the Go tree matches only test names, with no producer that decodes the CO field |
RFC9830-4.1-2 In such a case, the NO_ADVERTISE community [RFC1997] MUST be attached to the SR Policy update (see further details in Section 4.2.3). (§4.1) |
{gap}, no test | ze attaches neither a route target nor NO_ADVERTISE to an SR Policy advertisement. parseConfigRoute builds exactly one attribute, the Tunnel Encapsulation attribute (internal/component/bgp/plugins/nlri/srpolicy/config.go:218-225), and deliberately ignores the pre-parsed attribute block that carries communities for other families (internal/component/bgp/plugins/nlri/srpolicy/config.go:43-44), so an SR Policy route ze originates carries no community at all |
RFC9830-4.2.1-1 When a BGP speaker receives an SR Policy NLRI from a neighbor, it MUST first perform validation based on the following rules in addition to the validation described in Section 5 (§4.2.1) |
{gap}, no test | the Section 4.2.1 receive validation is partial. Ze judges the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap); the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated on receipt, so an SR Policy update carrying neither reaches the RIB |
RFC9830-4.2.1-4 * The SR Policy update MUST have either the NO_ADVERTISE community, at least one Route Target extended community in IPv4-address format, or both. (§4.2.1) |
{gap}, no test | nothing inspects the communities of a received SR Policy update. There is no RFC 7606 validator for attribute 23 and none for the SAFI (internal/component/bgp/message/rfc7606.go:415-429, :701-704), and no code path reads NO_ADVERTISE or a route target for SAFI 73: grep for SAFISRPolicy outside the NLRI codec matches only the family registry and the next-hop length table (internal/core/bgp/attribute/mpnlri.go:277) |
RFC9830-4.2.1-5 If a router supporting this specification receives an SR Policy update with no Route Target extended communities and no NO_ADVERTISE community, the update MUST be considered to be malformed. (§4.2.1) |
{gap}, no test | an SR Policy update with neither a route target nor NO_ADVERTISE is accepted like any other. The malformed decision would have to come from an RFC 7606 validator for attribute 23 or for SAFI 73, and neither exists (internal/component/bgp/message/rfc7606.go:415-429, :701-704) |
RFC9830-4.2.1-8 A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed (§4.2.1) |
{gap}, no test | of the Section 4.2.1 criteria, the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap) drive a malformed verdict; the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated, so an update failing only that criterion is not treated as malformed |
RFC9830-4.2.1-9 A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed, and the SR Policy CP MUST NOT be passed to the SRPM. (§4.2.1) |
no test | no test carries this requirement id; annotated {not-applicable}: ze has no SRPM. grep -rni '\bsrpm\b' over the Go tree matches nothing, the SR Policy plugin registers only an NLRI codec and a config route encoder (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40), and no candidate path is ever handed to a policy manager, valid or otherwise |
RFC9830-4.2.2-1 If one or more route targets are present, then at least one route target MUST match the BGP Identifier of the receiver for the update to be considered usable. (§4.2.2) |
no test | no test carries this requirement id; annotated {not-applicable}: ze never makes an SR Policy locally usable, so there is no eligibility decision for a route target to gate. There is no SRPM (grep -rni '\bsrpm\b' over the Go tree matches nothing) and no SAFI 73 consumer outside the NLRI codec and the family registry (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40, internal/core/family/family.go:93) |
RFC9830-4.2.2-2 The BGP Identifier is defined in [RFC4271] as a 4-octet IPv4 address and is updated by [RFC6286] as a 4-octet, unsigned, non-zero integer. Therefore, the Route Target extended community MUST be of the same format. (§4.2.2) |
no test | no test carries this requirement id; annotated {not-applicable}: ze compares no route target against its BGP Identifier for SAFI 73, because it makes no SR Policy locally usable; there is no SRPM and no local-use path (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40), so the format constraint governs a comparison ze never performs |
RFC9830-4.2.2-5 When an update for an SR Policy NLRI results in its becoming unusable, BGP MUST delete its corresponding SR Policy CP from the SRPM. (§4.2.2) |
no test | no test carries this requirement id; annotated {not-applicable}: ze holds no SR Policy candidate path to delete. grep -rni '\bsrpm\b' over the Go tree matches nothing and the SR Policy plugin keeps no state beyond the NLRI codec (internal/component/bgp/plugins/nlri/srpolicy/register.go:29-40); withdrawal of a SAFI 73 route removes the RIB entry and nothing else |
RFC9830-4.2.3-1 SR Policy NLRIs that have the NO_ADVERTISE community attached to them MUST NOT be propagated. (§4.2.3) |
{gap}, no test | the egress gate consults only the operator-configured export filter chain and never inspects community values (writeUpdateGated, internal/component/bgp/reactor/session_write.go:263-283), so an SR Policy NLRI carrying NO_ADVERTISE is propagated unless an operator filter happens to match it. The same omission is disclosed for RFC 1997 |
RFC9830-4.2.3-2 By default, a BGP node receiving an SR Policy NLRI MUST NOT propagate it to any External BGP (EBGP) neighbor. (§4.2.3) |
{gap}, no test | propagation of SAFI 73 is family-generic with no eBGP default. The reactor's forwarding path keys on the negotiated families and the per-peer export filter, and grep for SAFISRPolicy over internal/component/bgp/reactor matches nothing, so a received SR Policy NLRI is forwarded to an eBGP neighbor that negotiated the family like any other route |
RFC9830-5-5 The validation of the TLVs/sub-TLVs introduced in this document and defined in their respective subsections of Section 2.4 MUST be performed to determine if they are malformed or invalid. (§5) |
{gap}, no test | only one Section 2.4 sub-TLV is validated. TunnelTLV.Preference checks the mandated 6-octet value length before reading it (internal/core/bgp/attribute/tunnel_encap.go:151); every other sub-TLV is walked for framing only by TunnelTLV.SubTLVs (internal/core/bgp/attribute/tunnel_encap.go:104-131) and no length, flag or field of the Binding SID, SRv6 Binding SID, Priority, Segment List, Weight, Segment or name sub-TLVs is checked |
RFC9830-5-6 The validation of the Tunnel Encapsulation Attribute itself and the other TLVs/sub-TLVs specified in Section 13 of [RFC9012] MUST be done as described in that document. (§5) |
{gap}, no test | the RFC 9012 Section 13 structural validation exists but is never driven at reception. ParseTunnelEncap is registered as the parser for attribute 23 (internal/core/bgp/attribute/wire.go:418) and rejects broken TLV framing (internal/core/bgp/attribute/tunnel_encap.go:41-54), but attributes are parsed lazily, only when something reads them (internal/core/bgp/attribute/wire.go:346), and nothing reads attribute 23 for a SAFI 73 route; there is no RFC 7606 validator that would force the parse (internal/component/bgp/message/rfc7606.go:415-429) |
RFC9830-5-7 In case of any error detected, either at the attribute or its TLV/sub-TLV level, the "treat-as-withdraw" strategy MUST be applied. (§5) |
{gap}, no test | an error at the attribute or sub-TLV level produces no treat-as-withdraw. The RFC 7606 validator table has no entry for attribute 23 (internal/component/bgp/message/rfc7606.go:415-429), so the ParseTunnelEncap and SubTLVs errors (internal/core/bgp/attribute/tunnel_encap.go:43, :109) are only ever seen by a caller that chose to parse, never by the UPDATE validation path |
RFC9830-5-8 An SR Policy update that is determined not to be valid (and, therefore, malformed) based on the rules described in Section 4.2.1 MUST be handled by the "treat-as-withdraw" strategy. (§5) |
{gap}, no test | an update failing the Section 4.2.1 NLRI length rule or the Tunnel Encapsulation rule is handled as treat-as-withdraw (the NLRI length (internal/component/bgp/plugins/nlri/srpolicy/split.go::judgeSRPolicySection, registered per family and read by internal/component/bgp/message/rfc7606.go::validateMPNLRISyntax) and the Tunnel Encapsulation attribute, present with exactly one Tunnel Type 15 TLV (internal/component/bgp/reactor/session_tunnel_encap.go::applyTunnelEncap)); the Route Target / NO_ADVERTISE criterion (RFC9830-4.2.1-4, RFC9830-4.2.1-5) is not evaluated, so an update failing only that criterion is never treat-as-withdraw |
Proof state
A tagged unit reads unproven where no discrimination record exists for it: nothing in this tree has been observed to break it, so the claim its tag makes is unproven.
RFC9830-2.1-1
The AFI used MUST be IPv4(1) or IPv6(2) (§2.1)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRIAddressFamilies |
unit/verify | unproven |
| positive | TestRFC9830NLRIAddressFamilies |
unit/verify | unproven |
RFC9830-2.1-2
When AFI = 1, the value MUST be 96; when AFI = 2, the value MUST be 192. (§2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830NLRIAddressFamilies. Forbidden: a length octet other than 96 for AFI 1 or other than 192 for AFI 2. Red: assert.Equal(byte(96), v4[0]) and assert.Equal(byte(192), v6[0]) on EncodeNLRIHex output, with assert.Len on the 12/24-octet body. Negative: Parse(AFIIPv6, 12-octet body) require.ErrorIs ErrSRPolicyTruncated, and SplitSRPolicy refuses a 100-bit length.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRIAddressFamilies |
unit/verify | unproven |
| positive | TestRFC9830NLRIAddressFamilies |
unit/verify | unproven |
RFC9830-2.1-3
A BGP UPDATE message that carries the MP_REACH_NLRI or MP_UNREACH_NLRI attribute with the SR Policy SAFI MUST also carry the BGP mandatory attributes. (§2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Both halves now proven. MP_UNREACH_NLRI: TestRFC9830SRPolicyWithdrawalCarriesMandatoryAttributes (planBatchAttrs records, unchanged). MP_REACH_NLRI: TestRFC9830SRPolicyAnnounceCarriesMandatoryAttributes finds MP_REACH 00 01 49, ORIGIN 40/00 and the eBGP AS_PATH 40/02 01 0000FDE8 by attribute.AttrFind over the parsed path attribute section, iBGP MP_REACH and ORIGIN likewise; TestRFC9830SRPolicyIBGPAnnounceKeepsAnEmptyASPath forces the iBGP empty-path input (R1(b)) and requires AS_PATH present, flags 40, zero-length value. BuildPlugin is the producer the reactor's config send shares (peer_initial_sync.go). Judge break (overlay, update_build_plugin.go: drop every attribute appendASPath wrote on iBGP) turned the new negative red and the new positive green; the c32 author's probes cover dropped ORIGIN (positive red). Revert records on BuildPlugin for the two new units and the two HEAD tags of TestRFC9830UpdateCarriesMandatoryAttributes. Residual: the HEAD negative (LOCAL_PREF only on iBGP) proves attribute categorisation rather than presence of the mandatory set, supplementary here.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830UpdateCarriesMandatoryAttributes |
unit/verify | revert, verified |
| negative | TestRFC9830SRPolicyIBGPAnnounceKeepsAnEmptyASPath |
unit/verify | revert, verified |
| negative | TestRFC9830SRPolicyWithdrawalCarriesMandatoryAttributes |
unit/verify | revert, verified |
| positive | TestRFC9830UpdateCarriesMandatoryAttributes |
unit/verify | revert, verified |
| positive | TestRFC9830SRPolicyAnnounceCarriesMandatoryAttributes |
unit/verify | revert, verified |
| positive | TestRFC9830SRPolicyWithdrawalCarriesMandatoryAttributes |
unit/verify | revert, verified |
RFC9830-2.2-1
This document specifies the use of the Tunnel Encapsulation Attribute with the SR Policy Tunnel Type and the use of any other Tunnel Type with the SR Policy SAFI MUST be considered malformed and handled by the "treat-as-withdraw" strategy [RFC7606]. (§2.2)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830TunnelTypeReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830TunnelTypeReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-2.2-2
A Tunnel Encapsulation Attribute MUST NOT contain more than one TLV of type "SR Policy" (§2.2)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| positive | TestRFC9830SinglePolicyTLVPerAttribute |
unit/verify | unproven |
RFC9830-2.2-3
A Tunnel Encapsulation Attribute MUST NOT contain more than one TLV of type "SR Policy"; such updates MUST be considered malformed and handled by the "treat-as-withdraw" strategy [RFC7606]. (§2.2)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830TunnelTypeReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830TunnelTypeReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-2.3-1
If these sub-TLVs are present, a BGP speaker MUST ignore them (§2.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent whole-clause rejudgment against RFC 9830 §2.3: "The Tunnel Egress Endpoint and Color sub-TLVs of the Tunnel Encapsulation Attribute, as defined in [RFC9012], are not utilized for SR Policy encodings. Consequently, their values are not relevant within the context of the SR Policy SAFI NLRI. If these sub-TLVs are present, a BGP speaker MUST ignore them and MAY remove them from the Tunnel Encapsulation Attribute during propagation." The current summary has no partial/gap annotation for this requirement. All four current tags were read: both polarities in reactor TestRFC9830InapplicableSubTLVsIgnoredOnReceipt and attribute TestRFC9830EgressEndpointAndColorSubTLVsIgnored. The reactor's positive cases compare a clean policy with individually added endpoint and Color sub-TLVs on actual AFI 1/73 and 2/73 carriers, requiring no error, exactly RFC7606ActionNone, unchanged MP_REACH including its NLRI and next hop, one retained type-15 tunnel, and readable Preference 100. Its negative controls add duplicate endpoints or an endpoint with a one-octet value and require the same outcomes, catching erroneous application of unicast endpoint-count/value validation to an SR Policy. These inputs isolate applicability: teSub/teTLV encode their actual lengths, so the short endpoint has invalid endpoint content but intact sub-TLV and outer framing; teSRPolicyBody supplies a single type-15 TLV, correctly sized policy NLRI, ORIGIN, four-octet AS_SEQUENCE 65002 and an IPv4-format Route Target, with no legacy announcement. The attribute positive control reads equal Preference values with and without endpoint/Color; its separate negative control changes the applicable Preference from 4242 to 9999 and requires a changed result, excluding blanket disregard of all sub-TLVs. Round-trip equality additionally pins Ze's permitted retention choice. Source inspection confirms applyRFC7606 calls applyTunnelEncap and consumes both returned values; applyTunnelEncap identifies the policy from MP_REACH AFI/SAFI, and tunnelTLVLayout still validates framing but skips endpoint semantic/count checks when policy is true and assigns no meaning to Color. TunnelTLV.Preference consumes only type 12 with the required six-octet value; its readback is a codec assertion, not evidence of SRPM selection. processValidatedMessage forwards accepted announcements through onMessageReceived; notifyMessageReceiver caches the accepted WireUpdate before dispatch. teForwardedAttrs exercises that real receive/cache/ForwardUpdate path to an iBGP socket and a downstream processMessage consumer, both without the MED policy and with an actual MED=50 rebuild, asserting preserved attributes/MP_REACH, one announcement and no synthesized withdrawal. Ignoring these contents does not require erasing their wire bytes: byte retention is a conforming implementation choice under MAY, not an additional RFC MUST. Stored native records for this reactor cover name replacement of applyTunnelEncap by panic; those establish sensitivity to that producer halt only, not selective endpoint/Color discrimination. Historical records naming the former carry-test cover likewise do not extend current semantic proof. No checks, mutations, hashes or canonical edits were performed for this rejudgment. Credit is limited to the implemented receive, codec and cached propagation behavior demonstrated by these assertions; no separate route-server rail, SR Policy Manager, attribute-driven steering or dataplane proof is claimed, and absent consumers remain separately unimplemented scope. RFC9830-2.3-3 is not rejudged. No code map is needed for this enforced pending entry.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830InapplicableSubTLVsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830EgressEndpointAndColorSubTLVsIgnored |
unit/verify | unproven |
| positive | TestRFC9830InapplicableSubTLVsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830EgressEndpointAndColorSubTLVsIgnored |
unit/verify | unproven |
RFC9830-2.3-3
Similarly, any other sub-TLVs, including those specified in [RFC9012], that do not have explicitly defined applicability to the SR Policy SAFI MUST be ignored by the BGP speaker (§2.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent RFC 9830 Section 2.3 rejudgment retains enforced for ignoring sub-TLVs without explicitly defined applicability to the SR Policy SAFI; the same full sentence permits their removal during propagation. TestRFC9012MeaninglessSubTLVIgnoredNotRemoved proves the applicable Preference counter-control but is not the sole proof. TestRFC9830InapplicableSubTLVsIgnoredOnReceipt isolates well-framed VXLAN, Embedded Label Handling and UDP sub-TLVs on both SAFI 73 AFIs and requires exact no-action, intact MP_REACH and readable Preference. teForwardedAttrs traverses actual receive/cache/ForwardUpdate/Session output/downstream receipt with unchanged and MED-rebuilt cached forwarding. The corrected tag now describes those two cached modes rather than claiming the separate RS rail. applyTunnelEncap/tunnelTLVLayout ignore inapplicable semantics while retaining framing checks; Preference consumes only its applicable type. A native four-octet next hop on AFI-2 SR Policy remains legal under the independent wire-family contract. Preserving the bytes is a conforming choice, not a prohibition on the RFC’s MAY removal. No SRPM, dataplane, full-RFC or fresh selective execution claim is made.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830InapplicableSubTLVsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9012MeaninglessSubTLVIgnoredNotRemoved |
unit/verify | revert, verified |
| positive | TestRFC9830InapplicableSubTLVsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9012MeaninglessSubTLVIgnoredNotRemoved |
unit/verify | revert, verified |
RFC9830-2.4-1
For the TLVs/sub-TLVs that are specified as single instance, only the first instance of that TLV/sub-TLV is used: the other instances MUST be ignored (§2.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Judge 2026-09-30, re-read after the RFC9012-13-7 tag lines left the unit (assertions unchanged). TestRFC9012DuplicateSingleInstanceSubTLVs: + with two Preference sub-TLVs Preference() returns the first (100); - the second value standing alone IS returned (200), so the choice is positional.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9012DuplicateSingleInstanceSubTLVs |
unit/verify | unproven |
| positive | TestRFC9012DuplicateSingleInstanceSubTLVs |
unit/verify | unproven |
RFC9830-2.4-2
For the TLVs/sub-TLVs that are specified as single instance, only the first instance of that TLV/sub-TLV is used: the other instances MUST be ignored and MUST NOT considered to be malformed. (§2.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Judge 2026-09-30, re-read after the RFC9012-13-7 tag lines left the unit (assertions unchanged). TestRFC9012DuplicateSingleInstanceSubTLVs: the duplicate Preference parses without error, both sub-TLVs are enumerated and the attribute round-trips octet-equal, so the ignored instance is not treated as malformed.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9012MalformedAttributeIsRejected |
unit/verify | unproven |
| positive | TestRFC9012DuplicateSingleInstanceSubTLVs |
unit/verify | unproven |
RFC9830-2.4.1-2
The Preference sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PreferenceSubTLV. Forbidden: two Preference sub-TLVs in one encoding. Red: assert.Len(srpAll(repeated, subTLVPreference), 1) for a config naming preference twice. Negative: a config with no preference emits none (assert.Empty), so the count is real.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
| positive | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
RFC9830-2.4.1-3
Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PreferenceSubTLV. Forbidden: a Preference length other than 6. Red: require.Len(value, 6) on a value srpSubs cut at the declared length (a wrong declared length also fails the walk's require.NoError), with the preference in value[2:6]. Negative (internal/core/bgp/attribute/rfc9830_test.go::TestRFC9830PreferenceFlagsAndReservedIgnored): 4- and 8-octet values are not read.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PreferenceFlagsAndReservedIgnored |
unit/verify | unproven |
| positive | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
RFC9830-2.4.1-4
The Flags field MUST be set to zero on transmission (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PreferenceSubTLV. Forbidden: a non-zero Preference Flags octet on transmission. Red: assert.Equal(byte(0), value[0]) on the srpDirty encoding. Negative: assert.NotEqual(make([]byte, 6), value), preference 0xDEADBEEF beside it.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
| positive | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
RFC9830-2.4.1-5
The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.1: "The Flags field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Preference Flags now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-01-preference-flags changes buf[2] = 1 in buildPreferenceSubTLV and produces only the field diagnostics ["Preference Flags = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830PreferenceFlagsAndReservedIgnored |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830PreferenceFlagsAndReservedIgnored |
unit/verify | unproven |
RFC9830-2.4.1-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PreferenceSubTLV. Forbidden: a non-zero Preference RESERVED octet on transmission. Red: assert.Equal(byte(0), value[1]) on the srpDirty encoding. Negative: assert.NotEqual(make([]byte, 6), value).
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
| positive | TestRFC9830PreferenceSubTLV |
unit/verify | unproven |
RFC9830-2.4.1-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.1: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Preference RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-02-preference-reserved changes buf[3] = 1 in buildPreferenceSubTLV and produces only the field diagnostics ["Preference RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830PreferenceFlagsAndReservedIgnored |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830PreferenceFlagsAndReservedIgnored |
unit/verify | unproven |
RFC9830-2.4.2-2
The Binding SID sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830BindingSIDSubTLV. Forbidden: two Binding SID sub-TLVs. Red: assert.Len(srpAll(repeated, subTLVBindingSID), 1) for 'binding-sid mpls 24000 binding-sid null'. Negative: none configured, none emitted (assert.Empty).
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
| positive | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.2-4
6 when an SR-MPLS BSID is present, or 2 when no BSID is present. (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Row narrowed to the two clauses ze produces: 6 with an SR-MPLS BSID, 2 with none (the 18-octet SRv6 clause split to RFC9830-2.4.2-12, a {gap}). TestRFC9830BindingSIDSubTLV asserts require.Len(withBSID, 6) from a binding-sid mpls config and require.Len(noBSID, 2) from binding-sid null, through the sub-TLV the config encoder emits; a constant-length or swapped encoder fails one of them. Revert records observed red for both tags (buildBindingSIDSubTLV, buildBindingSIDNullSubTLV). The label-width defect (spec-bgp-sr-policy-rfc-defects D2) will change buildBindingSIDSubTLV and stale the positive record
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDSubTLV |
unit/verify | revert, verified |
| positive | TestRFC9830BindingSIDSubTLV |
unit/verify | revert, verified |
RFC9830-2.4.2-12
The value MUST be 18 when a SRv6 BSID is present (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-19 (independent auditor, after 8d18d4c4c3). The earlier not-applicable verdict rested on the owner's 2026-10-11 decline of the type-13 SRv6 form; 8d18d4c4c3 records the owner's reversal, implements the form and removes the {feature-declined} annotation, so no_code_path no longer holds. RFC 9830 Section 2.4.2: "Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 18 when a SRv6 BSID is present, 6 when an SR-MPLS BSID is present, or 2 when no BSID is present." Producer: srpolicy/config.go::buildBindingSIDSRv6SubTLV, reached from parseConfigRoute via 'binding-sid srv6 <ipv6-address>' (buildTunnelEncap writes at most one type-13 sub-TLV); receive rendering srpolicy/attr_json.go::bindingSIDToJSON reads type 13 by length (2, 6, 18, else malformed). TestRFC9830BindingSIDSRv6Encode asserts the whole Tunnel Encapsulation TLV octet for octet (0d12 0000 + 16-octet SID); its negative tag (SR-MPLS written at Length 6) shows 18 is not a constant but strictly exercises the neighbouring RFC9830-2.4.2-4 form. TestRFC9830BindingSIDSRv6Decode asserts a Length-18 sub-TLV renders as the SRv6 SID and a Length-20 one carrying the same 16 octets is malformed and never an SRv6 SID, a genuine violating input of this row. Overlay mutants (tags ze_core ze_bgp): encoder writes Length 16 (Encode red); decoder accepts any length >= 18 as SRv6 (Decode red); decoder rejects 18 (Decode red). All killed. Note: when 'binding-sid mpls' and 'binding-sid srv6' are both configured the MPLS form silently wins (Section 2.4.2 single-instance rule); not this row.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDSRv6Decode |
unit/verify | revert, verified |
| negative | TestRFC9830BindingSIDSRv6Encode |
unit/verify | revert, verified |
| positive | TestRFC9830BindingSIDSRv6Decode |
unit/verify | revert, verified |
| positive | TestRFC9830BindingSIDSRv6Encode |
unit/verify | revert, verified |
RFC9830-2.4.2-5
The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-only judgment of RFC9830-2.4.2-5 after removing its obsolete gap annotation. RFC9830 Section 2.4.2 states the whole sentence: "The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt." This row extracts the transmission conjunct only; the receive conjunct remains the separately judged RFC9830-2.4.2-6. Figure 5 assigns S/I to 0x80/0x40, leaving 0x3F unassigned. buildBindingSIDSubTLV now leaves Flags zero instead of writing 0x10, and buildBindingSIDNullSubTLV already leaves Flags zero. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission carries both -5 polarities: bsid[0]&0x3F must be zero beside the exact configured 0xFFFFF label, so an empty/all-zero payload cannot satisfy the pair. The actual pre-fix log job-enum-bsid-unassigned-before-4d050848.log fails precisely the Flags assertion. The repaired tagged test passes in job-enum-acl-bsid-repaired-race-f0d445d5.log, whose separate old-golden package failures are not erased. In semantic-observations-9r9vkava, clean selected baseline passes and rfc9830-tx-22-binding-sid-unassigned-flags restores only buf[2]=0x10; the observed sole tagged-unit failure is Binding SID unassigned Flags = 0x10 on transmission, want 0, with the single-TLV control passing. These executions precede only the new -5 tag comments; the assertion and producer behavior are unchanged, but fresh canonical tagged-unit/claim records remain parent-owned. This proves implemented TX zeroing, not exhaustive per-bit fault enumeration, S/I behavior, SRPM, dataplane, live FRR or full RFC conformance.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
RFC9830-2.4.2-6
The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent bounded new-row rejudgment. RFC9830 Section 2.4.2: "The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt." RFC9830 Figure 5 assigns only S/I (0x80/0x40), leaving mask 0x3F unassigned. buildBindingSIDSubTLV now leaves the zeroed Flags octet untouched; buildBindingSIDNullSubTLV already does so. The change removes the unconditional 0x10 write without changing label bits, framing, assigned S/I behavior or buffer allocation. New tagged TX assertions require bsid[0]&0x3F==0 beside label 0xFFFFF. The actual pre-fix job-enum-bsid-unassigned-before-4d050848.log fails exactly Binding SID unassigned Flags = 0x10; the repaired tagged unit passes in job-enum-acl-bsid-repaired-race-f0d445d5.log (that package run separately failed old Go goldens, so no full-package success is inferred). The current selected semantic baseline passes, and rfc9830-tx-22-binding-sid-unassigned-flags reinstates only buf[2]=0x10 and fails exactly the new Flags assertion while the single-TLV control passes. Existing tagged TestRFC9830ReceivedFieldsAreIgnoredNotRead contrasts 0x3F and zero with fixed label and exact Preference/round-trip controls. Supplementary actual-carrier rx-bsid-unassigned in semantic-observations-nsr9c7y4 rejects only policy type13 flags&0x3F: both AFIs fail the isolated ignored-octet-14 and combined-dirty receive-action assertion while clean and every other isolated leaf survive. That reactor witness is supplementary, not falsely claimed as a new RFC9830-2.4.2-6 reactor tag. TX zeroing and implemented BGP RX disregard are now observed; no Binding SID/SRPM interpretation is invented. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.2-7
RESERVED: 1 octet of reserved bits. MUST be set to zero on transmission (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830BindingSIDSubTLV. Forbidden: a non-zero Binding SID RESERVED octet. Red: assert.Equal(byte(0), withBSID[1]) and assert.Equal(byte(0), noBSID[1]). Negative: assert.NotEqual(make([]byte, 6), withBSID) beside label 0xFFFFF.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
| positive | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.2-8
RESERVED: 1 octet of reserved bits. MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.2: "MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Binding SID RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-03-binding-sid-reserved changes buf[3] = 1 in buildBindingSIDSubTLV and produces only the field diagnostics ["Binding SID RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.2-9
Traffic Class (TC), S, and TTL (Total of 12 bits) are RESERVED and MUST be set to zero (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830BindingSIDSubTLV. Forbidden: non-zero TC, S or TTL in the transmitted label stack entry. Red: assert.Equal(byte(0), withBSID[4]&0x0E) (TC), withBSID[4]&0x01 (S), withBSID[5] (TTL). Negative: the 20-bit label reads 0xFFFFF, so the zeroes are field layout, not a small label.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
| positive | TestRFC9830BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.2-10
Traffic Class (TC), S, and TTL (Total of 12 bits) are RESERVED and MUST be set to zero and MUST be ignored. (§2.4.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.2: "Traffic Class (TC), S, and TTL (Total of 12 bits) are RESERVED and MUST be set to zero and MUST be ignored." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Binding SID TC/S/TTL now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-04-binding-sid-tc changes buf[6] |= 2 in buildBindingSIDSubTLV and produces only the field diagnostics ["Binding SID TC and S = 0x02 on transmission, want 0"]. rfc9830-tx-05-binding-sid-s changes buf[6] |= 1 in buildBindingSIDSubTLV and produces only the field diagnostics ["Binding SID TC and S = 0x01 on transmission, want 0"]. rfc9830-tx-06-binding-sid-ttl changes buf[7] = 1 in buildBindingSIDSubTLV and produces only the field diagnostics ["Binding SID TTL = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.2-11
The Label field is validated by the SRPM but MUST NOT contain the reserved MPLS label values (0-15). (§2.4.2)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830BindingSIDLabelRange |
unit/verify | revert, verified |
| positive | TestRFC9830BindingSIDLabelRange |
unit/verify | revert, verified |
RFC9830-2.4.3-3
The value MUST be 26 when the SRv6 Endpoint Behavior and SID Structure is present; else, it MUST be 18. (§2.4.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SRv6BindingSIDSubTLV. Forbidden: a length other than 18 without the Endpoint Behavior and SID Structure. Red: require.Len(value, 18). The 26 case has no producer (buildSRv6BindingSIDSubTLV never appends the structure), carried by the row's single-polarity annotation.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| positive | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.3-4
The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SRv6BindingSIDSubTLV. Forbidden: non-zero unassigned Flags bits on transmission (ze sets no assigned flag). Red: assert.Equal(byte(0), value[0]). Negative: assert.NotEqual(make([]byte, 18), value), SID octets non-zero.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.3-5
The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.3: "The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of SRv6 Binding SID unassigned Flags now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-07-srv6-binding-sid-unassigned-flags changes buf[2] = 1 in buildSRv6BindingSIDSubTLV and produces only the field diagnostics ["SRv6 Binding SID Flags = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.3-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SRv6BindingSIDSubTLV. Forbidden: a non-zero RESERVED octet on transmission. Red: assert.Equal(byte(0), value[1]). Negative: assert.NotEqual(make([]byte, 18), value).
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.3-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.3: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of SRv6 Binding SID RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-08-srv6-binding-sid-reserved changes buf[3] = 1 in buildSRv6BindingSIDSubTLV and produces only the field diagnostics ["SRv6 Binding SID RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.3-9
The SRv6 Endpoint Behavior and SID Structure MUST NOT be included when the SRv6 SID has not been included (§2.4.3)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| positive | TestRFC9830SRv6BindingSIDSubTLV |
unit/verify | unproven |
RFC9830-2.4.4-4
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentListSubTLV. Forbidden: a non-zero Segment List RESERVED octet on transmission. Red: assert.Equal(byte(0), value[0]). Negative: the following sub-TLVs are non-empty (require.NotEmpty(inner)) and the value is not blank.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
RFC9830-2.4.4-5
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of both MPLS and SRv6 Segment List RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-09-segment-list-reserved changes payload[0] = 1 in buildSegmentListSubTLV and produces only the field diagnostics ["Segment List RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.1-2
The Weight sub-TLV is OPTIONAL; it MUST NOT appear more than once inside the Segment List sub-TLV. (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentListSubTLV. Forbidden: a second Weight sub-TLV in one Segment List. Red: require.Len(weights, 1) on the srpDirty encoding, and require.Error on parseConfigRoute for 'segment-list weight 1 weight 2 ...', so the config path cannot produce a second one.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.1-3
Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentListSubTLV. Forbidden: a Weight length other than 6 (e.g. the 8-octet total). Red: require.Len(weight, 6) on a value cut at the declared length, srpSegSubs require.NoError on the walk, and assert.Len(value, 1+8+8+28) on the whole segment list.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.1-4
The Flags field MUST be set to zero on transmission (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentListSubTLV. Forbidden: a non-zero Weight Flags octet. Red: assert.Equal(byte(0), weight[0]). Negative: assert.NotEqual(make([]byte, 6), weight), weight 0xCAFEBABE.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.1-5
The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.1: "The Flags field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of both nested Weight Flags now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-10-weight-flags changes wbuf[2] = 1 in buildSegmentListSubTLV and produces only the field diagnostics ["Weight Flags = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.1-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentListSubTLV. Forbidden: a non-zero Weight RESERVED octet on transmission. Red: assert.Equal(byte(0), weight[1]) on the srpDirty encoding. Negative: assert.NotEqual(make([]byte, 6), weight) with weight[2:6] pinned to 0xCAFEBABE, so the zero is written, not a blank buffer.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentListSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.1-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.1: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of both nested Weight RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-11-weight-reserved changes wbuf[3] = 1 in buildSegmentListSubTLV and produces only the field diagnostics ["Weight RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.1-1
Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 6. (§2.4.4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeASubTLV. Forbidden: a Type A length other than 6 (e.g. the 8-octet total). Red: require.Len(value, 6) on a value srpSegSubs cut at the declared length. Negative: assert.Len(inner, 3), which a length of 8 breaks by swallowing the Type B sub-TLV header that follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.1-2
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeASubTLV. Forbidden: a non-zero Type A RESERVED octet on transmission. Red: assert.Equal(byte(0), value[1]). Negative: assert.NotEqual(make([]byte, 6), value) with the label pinned to 0xFFFFF.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.1-3
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.2.1: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Type A RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-12-type-a-reserved changes buf[3] = 1 in buildSegmentTypeA and produces only the field diagnostics ["Type A RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.1-4
The S bit MUST be zero upon transmission (§2.4.4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeASubTLV. Forbidden: S bit set in the transmitted Type A label stack entry. Red: assert.Equal(byte(0), value[4]&0x01). Negative: assert.Equal(uint32(0xFFFFF), label), so every label bit is set beside the clear S bit and the zero is not a blank low octet.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.1-5
The S bit MUST be zero upon transmission and MUST be ignored upon reception. (§2.4.4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.2.1: "The S bit MUST be zero upon transmission and MUST be ignored upon reception." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Type A S now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-13-type-a-s changes buf[6] |= 1 in buildSegmentTypeA and produces only the field diagnostics ["Type A S bit = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.2-1
The value MUST be 26 when the SRv6 Endpoint Behavior and SID Structure is present; else, it MUST be 18. (§2.4.4.2.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeBSubTLV. Forbidden: a length other than 26 with the Endpoint Behavior and SID Structure, or other than 18 without it. Red: require.Len(value, 26) on the srpDirty segment and require.Len(bare[0], 18) on the bare type-b segment; both clauses have an assertion and the pair shows the length tracks the content.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.2-2
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeBSubTLV. Forbidden: a non-zero Type B RESERVED octet on transmission. Red: assert.Equal(byte(0), value[1]) and assert.Equal(byte(0), bare[0][1]), with and without the structure. Negative: assert.NotEqual(make([]byte, 26), value) and value[2] pinned to 0xFC.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.2-3
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.2.2: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Type B RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-14-type-b-reserved changes buf[3] = 1 in buildSegmentTypeB and produces only the field diagnostics ["Type B RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.2-4
The SRv6 Endpoint Behavior and SID Structure MUST NOT be included when the SRv6 SID has not been included. (§2.4.4.2.2)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeBSubTLV. Forbidden: the Endpoint Behavior and SID Structure encoded without an SRv6 SID. Red: require.Error on parseSegmentList and on parseConfigRoute for 'segment endpoint-behavior ...' with no preceding type-b srv6 SID, the only route to a structure ze has. Positive: the structure follows a 16-octet SID (assert.Equal(byte(0xEF), value[17])).
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.3-1
The unassigned bits in the Flags field MUST be set to zero upon transmission (§2.4.4.2.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeASubTLV and TestRFC9830SegmentTypeBSubTLV. Forbidden: any unassigned Segment Flags bit set on transmission. Red: assert.Equal(byte(0), value[0]) on Type A and assert.Equal(byte(0), value[0]&^byte(0x10)) on Type B. Negative: the Type B Flags octet is 0x10 (the assigned B-Flag, bit 3 per Figure 13) and not zero, and 0 without the structure, so the assertion is on which bits are set, not on a blank byte.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeASubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.3-2
The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt. (§2.4.4.2.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.2.3: "The unassigned bits in the Flags field MUST be set to zero upon transmission and MUST be ignored upon receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Type A and Type B unassigned Flags now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-15-type-a-unassigned-flags changes buf[2] = 1 in buildSegmentTypeA and produces only the field diagnostics ["Type A Flags = 0x01 on transmission, want 0"]. rfc9830-tx-16-type-b-unassigned-flags changes buf[2] |= 1 in buildSegmentTypeB and produces only the field diagnostics ["Type B unassigned Flags bits = 0x01 on transmission, want 0", "Type B Flags (B-Flag only) = 11, want 10"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.3-3
If B-Flag appears with Segment Type A, it MUST be ignored. (§2.4.4.2.3)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent semantic rejudgment: RFC9830 Section 2.4.4.2.3: "If B-Flag appears with Segment Type A, it MUST be ignored." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. The source-mapped rx-typea-b mutant is bounded to nested Type A value[0]&0x10. Both AFIs fail their isolated Type A B-bit victim and combined dirty input at the receive-action assertion; unchanged B=0 controls and valid Type B B=1/structure controls pass. This is the receive-only obligation: no missing transmit conjunct is invented, and assigned Type B B is not rejected. These are inspected scratch semantic executions, not canonical discrimination records. Current native record renewal/stamping remains parent-owned; no pending FRR carrier run, SRPM behavior, dataplane behavior, or full-RFC acceptance is inferred.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.4-2
Reserved: 2 octets of reserved bits. This field MUST be set to zero on transmission (§2.4.4.2.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830SegmentTypeBSubTLV. Forbidden: non-zero Reserved octets in the Endpoint Behavior and SID Structure on transmission. Red: assert.Equal([]byte{0x00, 0x00}, value[20:22]). Negative: endpoint behavior 0xFFFF at value[18:20] and structure 32/16/16/64 at value[22:26], so the zeros are written at the right offset.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
| positive | TestRFC9830SegmentTypeBSubTLV |
unit/verify | unproven |
RFC9830-2.4.4.2.4-3
Reserved: 2 octets of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.4.2.4)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.4.2.4: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of both SRv6 endpoint-behavior Reserved octets in Type B and top-level SRv6 Binding SID now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-17-endpoint-behavior-reserved-first-octet changes if seg.hasEndpointBehavior { buf[22] = 1 } in buildSegmentTypeB and produces only the field diagnostics ["SRv6 Endpoint Behavior Reserved = 0100, want 0000"]. rfc9830-tx-18-endpoint-behavior-reserved-second-octet changes if seg.hasEndpointBehavior { buf[23] = 1 } in buildSegmentTypeB and produces only the field diagnostics ["SRv6 Endpoint Behavior Reserved = 0001, want 0000"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.4.2.4-4
The total of the locator block, locator node, function, and argument lengths MUST be less than or equal to 128 (§2.4.4.2.4)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.4.2.4-4, so no unit is bound to it.
RFC9830-2.4.5-2
The ENLP sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-2, so no unit is bound to it.
RFC9830-2.4.5-3
Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 3. (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-3, so no unit is bound to it.
RFC9830-2.4.5-4
The Flags field MUST be set to zero on transmission (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-4, so no unit is bound to it.
RFC9830-2.4.5-5
The Flags field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-5, so no unit is bound to it.
RFC9830-2.4.5-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-6, so no unit is bound to it.
RFC9830-2.4.5-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-7, so no unit is bound to it.
RFC9830-2.4.5-8
Implementations adhering to this document MUST ignore the ENLP sub-TLV with unrecognized values (viz. other than 1 through 4). (§2.4.5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-2.4.5-8, so no unit is bound to it.
RFC9830-2.4.6-3
The Priority sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.6)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PrioritySubTLV. Forbidden: two Priority sub-TLVs in one encoding. Red: assert.Len(srpAll(repeated, subTLVPriority), 1) for a config naming priority twice. Negative (control): a config with no priority emits none (assert.Empty), so the instance is counted rather than always written; a violating output cannot be built from a conforming encoder.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PrioritySubTLV |
unit/verify | unproven |
| positive | TestRFC9830PrioritySubTLV |
unit/verify | unproven |
RFC9830-2.4.6-4
Length: Specifies the length of the value field (i.e., not including Type and Length fields) in terms of octets. The value MUST be 2. (§2.4.6)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PrioritySubTLV and TestRFC9830PriorityLengthIsValueLength. Forbidden: a Priority length other than 2 (e.g. the 4-octet total). Red: require.Len(value, 2) on a value cut at the declared length, and assert.Equal([]byte{15, 2, 255, 0}, only[4:]) pinning the length octet itself.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PriorityLengthIsValueLength |
unit/verify | unproven |
| positive | TestRFC9830PrioritySubTLV |
unit/verify | unproven |
RFC9830-2.4.6-5
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.6)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830PrioritySubTLV. Forbidden: a non-zero Priority RESERVED octet on transmission. Red: assert.Equal(byte(0), value[1]). Negative: assert.NotEqual([]byte{0,0}, value) with value[0] pinned to 255, so the zero is written and the fields are not transposed.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830PrioritySubTLV |
unit/verify | unproven |
| positive | TestRFC9830PrioritySubTLV |
unit/verify | unproven |
RFC9830-2.4.6-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.6)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.6: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Priority RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-19-priority-reserved changes buf[3] = 1 in buildPrioritySubTLV and produces only the field diagnostics ["Priority RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.7-5
The SR Policy Candidate Path Name sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.7)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830NameSubTLVs. Forbidden: two Candidate Path Name sub-TLVs in one encoding. Red: assert.Len(srpAll(repeated, subTLVCandidatePathNam), 1) for a config naming the candidate path twice. Negative (control): an unnamed candidate path emits none (assert.Empty); a violating output cannot be built from a conforming encoder.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NameSubTLVs |
unit/verify | unproven |
| positive | TestRFC9830NameSubTLVs |
unit/verify | unproven |
RFC9830-2.4.7-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.7)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830NameSubTLVs. Forbidden: a non-zero Candidate Path Name RESERVED octet on transmission. Red: assert.Equal(byte(0), value[0]) in the loop case for 'primary'. Negative: require.Len(value, 1+len(want)) and assert.Equal(want, string(value[1:])), so the zero is a separate written octet ahead of the whole name.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NameSubTLVs |
unit/verify | unproven |
| positive | TestRFC9830NameSubTLVs |
unit/verify | unproven |
RFC9830-2.4.7-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.7)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.7: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Candidate Path Name RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-20-candidate-path-name-reserved changes if stype == subTLVCandidatePathNam { buf[3] = 1 } in buildNameSubTLV and produces only the field diagnostics ["Candidate Path Name RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-2.4.8-5
The SR Policy Name sub-TLV is OPTIONAL; it MUST NOT appear more than once in the SR Policy encoding. (§2.4.8)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830NameSubTLVs. Forbidden: two SR Policy Name sub-TLVs in one encoding. Red: assert.Len(srpAll(repeated, subTLVPolicyName), 1) for a config naming the policy twice. Negative (control): an unnamed policy emits none (assert.Empty); a violating output cannot be built from a conforming encoder.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NameSubTLVs |
unit/verify | unproven |
| positive | TestRFC9830NameSubTLVs |
unit/verify | unproven |
RFC9830-2.4.8-6
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission (§2.4.8)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/component/bgp/plugins/nlri/srpolicy/rfc9830_test.go::TestRFC9830NameSubTLVs. Forbidden: a non-zero SR Policy Name RESERVED octet on transmission. Red: assert.Equal(byte(0), value[0]) in the loop case for 'alpha'. Negative: assert.NotEqual(make([]byte, 6), ...) and assert.Equal(want, string(value[1:])), so the zero is written ahead of the whole name.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NameSubTLVs |
unit/verify | unproven |
| positive | TestRFC9830NameSubTLVs |
unit/verify | unproven |
RFC9830-2.4.8-7
RESERVED: 1 octet of reserved bits. This field MUST be set to zero on transmission and MUST be ignored on receipt. (§2.4.8)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Independent TX-completion rejudgment. RFC9830 Section 2.4.8: "This field MUST be set to zero on transmission and MUST be ignored on receipt." TestRFC9830ReservedFieldsIgnoredOnReceipt uses valid route-target/ASN4 carriers for both SAFI-73 AFIs, exact no-action and one-attribute assertions before real cache/export/downstream announcement, and nonzero meaningful neighbors. Renewed receive-source-mapped-assessment.json maps actual teSRPolicyValue offsets to immutable mutant/log victim names; its corrected receive victims, not original classifier false flags, are credited. Selective overvalidation of Policy Name RESERVED now fails the intended receive-action assertion while clean and structurally valid B=1 controls survive. The corrected 14-case aggregate is 34 isolated victim leaves plus 28 all-ignored-fields failures and 56 clean controls, not 62 isolated field tests. The missing transmission counterfactual is now executed: rfc9830-tx-21-policy-name-reserved changes if stype == subTLVPolicyName { buf[3] = 1 } in buildNameSubTLV and produces only the field diagnostics ["Policy Name RESERVED = 0x01 on transmission, want 0"]. Current TestRFC9830FieldsToIgnoreAreZeroOnTransmission traverses config parsing/buildTunnelEncap, pins zero/mask fields beside the configured Preference, labels, SID, Weight, endpoint behavior/structure, Priority and names, and keeps the positive neighbors intact. Only that tagged unit fails under each TX fault; TestRFC9830SinglePolicyTLVPerAttribute passes. The selected baseline unit passes without overlays. Both clauses are therefore independently discriminated, replacing the prior TX-evidence hold; the earlier RX mapping limitations are unchanged. This is executed host semantic evidence, not a canonical native discrimination renewal. Native recording/stamping and the five FRR scenarios remain parent-owned and are not declared verified here. No SRPM, dataplane, absent encoding form, full-RFC, or exhaustive-per-bit claim follows.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| negative | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| negative | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
| positive | TestRFC9830FieldsToIgnoreAreZeroOnTransmission |
unit/verify | revert, verified |
| positive | TestRFC9830ReservedFieldsIgnoredOnReceipt |
unit/verify | revert, verified |
| positive | TestRFC9830ReceivedFieldsAreIgnoredNotRead |
unit/verify | unproven |
RFC9830-3-3
Type 3 (bits 11): Reserved for future use and SHOULD NOT be used. Upon reception, an implementation MUST treat it like Type 0. (§3)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-3-3, so no unit is bound to it.
RFC9830-4.1-2
In such a case, the NO_ADVERTISE community [RFC1997] MUST be attached to the SR Policy update (see further details in Section 4.2.3). (§4.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.1-2, so no unit is bound to it.
RFC9830-4.2.1-1
When a BGP speaker receives an SR Policy NLRI from a neighbor, it MUST first perform validation based on the following rules in addition to the validation described in Section 5 (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.1-1, so no unit is bound to it.
RFC9830-4.2.1-2
The SR Policy NLRI MUST include a distinguisher, Color, and Endpoint field (§4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-18 (independent auditor, after e5724325c1). Section 4.2.1: "The SR Policy NLRI MUST include a distinguisher, Color, and Endpoint field that implies that the length of the NLRI MUST be either 12 or 24 octets (depending on the address family of the Endpoint)." TestRFC9830NLRILengthReceiveVerdicts changed only in its MP_UNREACH-alone block, which bears the RFC9830-5-2 and RFC7606-5.2-1 claims, not this row's. The two RFC9830-4.2.1-2 blocks are identical: positive, 12 octets under AFI 1 and 24 under AFI 2 accepted through processMessage with nothing written and dispatched byte-identical (srRequireKept); negative, 13 and 24 octets under AFI 1, 12 and 25 under AFI 2, a 13-octet NLRI beside a good one and in MP_UNREACH beside reachable NLRI are treat-as-withdraw with the session Established and the received body never dispatched (srRequireWithdrawn). Producer: srpolicy/split.go judgeSRPolicySection; a receiver accepting any byte-aligned length reddens the negative, and 12 octets under AFI 2 is the missing-field case.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-4.2.1-3
the length of the NLRI MUST be either 12 or 24 octets (depending on the address family of the Endpoint). (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-4.2.1-4
* The SR Policy update MUST have either the NO_ADVERTISE community, at least one Route Target extended community in IPv4-address format, or both. (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.1-4, so no unit is bound to it.
RFC9830-4.2.1-5
If a router supporting this specification receives an SR Policy update with no Route Target extended communities and no NO_ADVERTISE community, the update MUST be considered to be malformed. (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.1-5, so no unit is bound to it.
RFC9830-4.2.1-6
The Tunnel Encapsulation Attribute MUST be attached to the BGP UPDATE message (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SRPolicyWithoutTunnelEncapIsMalformed |
unit/verify | revert, verified |
| positive | TestRFC9830SRPolicyWithoutTunnelEncapIsMalformed |
unit/verify | revert, verified |
RFC9830-4.2.1-7
The Tunnel Encapsulation Attribute MUST be attached to the BGP UPDATE message and MUST have a Tunnel Type TLV set to SR Policy (code point is 15). (§4.2.1)
Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-14 (independent auditor) after 9450048187. RFC 9830 Section 4.2.1: 'The Tunnel Encapsulation Attribute MUST be attached to the BGP UPDATE message and MUST have a Tunnel Type TLV set to SR Policy (code point is 15).' First clause: rfc9830_tunnel_receive_test.go::TestRFC9830SRPolicyWithoutTunnelEncapIsMalformed requires an AFI 1/2 SAFI 73 UPDATE with NLRI and no attribute 23 to be treat-as-withdraw through processMessage, and the same NLRI with one type-15 TLV to be delivered unchanged. Second clause: TestRFC9830SRPolicyTunnelTypeNot15IsMalformed attaches attribute 23 whose only TLV is VXLAN (8) or 0xFFFE and requires treat-as-withdraw with the session kept, and requires the type-15 TLV in the same position to be delivered unchanged. The recorded breaks replace all of applyTunnelEncap with a panic, which shows reachability only, so the auditor ran a targeted mutant through a go test overlay: disabling only the '!= 15' check in applyTunnelEncap (session_tunnel_encap.go, 'non-SR-Policy tunnel type on SAFI 73') turns TestRFC9830SRPolicyTunnelTypeNot15IsMalformed red ('vxlan: the malformed UPDATE was dispatched as received'), so the tagged negative discriminates the type-15 rule itself; an over-rejecting producer fails the type-15 positive.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830SRPolicyTunnelTypeNot15IsMalformed |
unit/verify | revert, verified |
| negative | TestRFC9830SRPolicyWithoutTunnelEncapIsMalformed |
unit/verify | revert, verified |
| positive | TestRFC9830SRPolicyTunnelTypeNot15IsMalformed |
unit/verify | revert, verified |
| positive | TestRFC9830SRPolicyWithoutTunnelEncapIsMalformed |
unit/verify | revert, verified |
RFC9830-4.2.1-8
A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.1-8, so no unit is bound to it.
RFC9830-4.2.1-9
A router that receives an SR Policy update that is not valid according to these criteria MUST treat the update as malformed, and the SR Policy CP MUST NOT be passed to the SRPM. (§4.2.1)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.1-9, so no unit is bound to it.
RFC9830-4.2.2-1
If one or more route targets are present, then at least one route target MUST match the BGP Identifier of the receiver for the update to be considered usable. (§4.2.2)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.2-1, so no unit is bound to it.
RFC9830-4.2.2-2
The BGP Identifier is defined in [RFC4271] as a 4-octet IPv4 address and is updated by [RFC6286] as a 4-octet, unsigned, non-zero integer. Therefore, the Route Target extended community MUST be of the same format. (§4.2.2)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.2-2, so no unit is bound to it.
RFC9830-4.2.2-5
When an update for an SR Policy NLRI results in its becoming unusable, BGP MUST delete its corresponding SR Policy CP from the SRPM. (§4.2.2)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.2-5, so no unit is bound to it.
RFC9830-4.2.3-1
SR Policy NLRIs that have the NO_ADVERTISE community attached to them MUST NOT be propagated. (§4.2.3)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.3-1, so no unit is bound to it.
RFC9830-4.2.3-2
By default, a BGP node receiving an SR Policy NLRI MUST NOT propagate it to any External BGP (EBGP) neighbor. (§4.2.3)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-4.2.3-2, so no unit is bound to it.
RFC9830-4.2.3-6
A BGP node MUST NOT alter the SR Policy information carried in the Tunnel Encapsulation Attribute during propagation (§4.2.3)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9012AllSubTLVsPropagate |
unit/verify | unproven |
| positive | TestRFC9012AllSubTLVsPropagate |
unit/verify | unproven |
RFC9830-5-1
A BGP speaker MUST perform the following syntactic validation of the SR Policy NLRI to determine if it is malformed. This includes the validation of the length of each NLRI and the total length of the MP_REACH_NLRI and MP_UNREACH_NLRI attributes. It also includes the validation of the consistency of the NLRI length with the AFI and the endpoint address as specified in Section 2.1. (§5)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-5-2
When the error determined allows for the router to skip the malformed NLRI(s) and continue the processing of the rest of the BGP UPDATE message, then it MUST handle such malformed NLRIs as 'treat-as- withdraw'. (§5)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC7606Section52MPUnreachOnlyNotEscalated |
unit/verify | revert, producer-changed (the producer's behavior changed since the break was applied to it) |
| positive | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, producer-changed (the producer's behavior changed since the break was applied to it) |
RFC9830-5-4
Alternately, the router MUST perform "session reset" when the session is only being used for SR Policy or when a "AFI/SAFI disable" action is not possible. (§5)
Audit verdict: not audited: no reader has judged these tests
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
| positive | TestRFC9830NLRILengthReceiveVerdicts |
unit/verify | revert, verified |
RFC9830-5-5
The validation of the TLVs/sub-TLVs introduced in this document and defined in their respective subsections of Section 2.4 MUST be performed to determine if they are malformed or invalid. (§5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-5-5, so no unit is bound to it.
RFC9830-5-6
The validation of the Tunnel Encapsulation Attribute itself and the other TLVs/sub-TLVs specified in Section 13 of [RFC9012] MUST be done as described in that document. (§5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-5-6, so no unit is bound to it.
RFC9830-5-7
In case of any error detected, either at the attribute or its TLV/sub-TLV level, the "treat-as-withdraw" strategy MUST be applied. (§5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-5-7, so no unit is bound to it.
RFC9830-5-8
An SR Policy update that is determined not to be valid (and, therefore, malformed) based on the rules described in Section 4.2.1 MUST be handled by the "treat-as-withdraw" strategy. (§5)
Audit verdict: not audited: no reader has judged these tests
No test carries RFC9830-5-8, so no unit is bound to it.
RFC9830-5-9
A BGP implementation MUST NOT perform semantic verification of such fields nor consider the SR Policy update to be invalid or not usable based on such validation. (§5)
Audit verdict: enforced (the tests do what the requirement demands), fresh. internal/core/bgp/attribute/rfc9830_test.go::TestRFC9830NoSemanticVerification. ParseTunnelEncap is the only receive parser of attribute 23 (wire.go knownAttrParsers) and Preference the only field ze consumes. Forbidden: refusing, or not using, an SR Policy update because a field value is semantically wrong. Red: require.NoError(ParseTunnelEncap), require.NoError(SubTLVs) with assert.Len(stlvs, 5), assert.Equal(uint32(4242), pref) and the byte-identical round trip, over weight 0, reserved label 3, a SID structure totalling 255, ENLP 99 and an empty segment list. Negative: framing errors are still refused (require.Error twice), so the skip is limited to field semantics. A verification with no observable effect cannot be asserted; every effect it could have is.
| Polarity | Test | Kind and tier | Proof state |
|---|---|---|---|
| negative | TestRFC9830NoSemanticVerification |
unit/verify | unproven |
| positive | TestRFC9830NoSemanticVerification |
unit/verify | unproven |
Extraction sign-off
| Field | Value |
|---|---|
| Reviewer | claude |
| Signed off | 2026-09-21 |
| Register | prose |
| Source | rfc/full/rfc9830.txt |
| Source fingerprint | 35ee1db5cdbf6fc4 |
| Record | rfc/extraction/rfc9830.json |
| Mapped sentences | 71 |
| Declined as scope | 5 |
| Relocated to a spec, which Ze OWES | 0 |
| Unclassified | 0 |
Sections
| Section | Name | Sites | Disposition | Reason |
|---|---|---|---|---|
front |
not stated | 1 | walked | not stated |
1 |
not stated | 0 | walked | not stated |
1.1 |
not stated | 0 | walked | not stated |
2 |
not stated | 0 | walked | not stated |
2.1 |
not stated | 3 | walked | not stated |
2.2 |
not stated | 2 | walked | not stated |
2.3 |
not stated | 2 | walked | not stated |
2.4 |
not stated | 1 | walked | not stated |
2.4.1 |
not stated | 4 | walked | not stated |
2.4.2 |
not stated | 6 | walked | not stated |
2.4.3 |
not stated | 4 | walked | not stated |
2.4.4 |
not stated | 2 | walked | not stated |
2.4.4.1 |
not stated | 4 | walked | not stated |
2.4.4.2 |
not stated | 0 | walked | not stated |
2.4.4.2.1 |
not stated | 3 | walked | not stated |
2.4.4.2.2 |
not stated | 3 | walked | not stated |
2.4.4.2.3 |
not stated | 2 | walked | not stated |
2.4.4.2.4 |
not stated | 2 | walked | not stated |
2.4.5 |
not stated | 6 | walked | not stated |
2.4.6 |
not stated | 3 | walked | not stated |
2.4.7 |
not stated | 3 | walked | not stated |
2.4.8 |
not stated | 3 | walked | not stated |
3 |
not stated | 1 | walked | not stated |
4 |
not stated | 0 | walked | not stated |
4.1 |
not stated | 1 | walked | not stated |
4.2 |
not stated | 0 | walked | not stated |
4.2.1 |
not stated | 6 | walked | not stated |
4.2.2 |
not stated | 3 | walked | not stated |
4.2.3 |
not stated | 3 | walked | not stated |
5 |
not stated | 8 | walked | not stated |
6 |
not stated | 0 | walked | not stated |
6.1 |
not stated | 0 | walked | not stated |
6.2 |
not stated | 0 | walked | not stated |
6.3 |
not stated | 0 | walked | not stated |
6.4 |
not stated | 0 | walked | not stated |
6.5 |
not stated | 0 | walked | not stated |
6.6 |
not stated | 0 | walked | not stated |
6.7 |
not stated | 0 | walked | not stated |
6.8 |
not stated | 0 | walked | not stated |
6.9 |
not stated | 0 | walked | not stated |
6.10 |
not stated | 0 | walked | not stated |
7 |
not stated | 0 | walked | not stated |
8 |
not stated | 0 | walked | not stated |
9 |
not stated | 0 | walked | not stated |
9.1 |
not stated | 0 | walked | not stated |
9.2 |
not stated | 0 | walked | not stated |
Excluded sentences
| Site | Excluded kind | Reason | Quote |
|---|---|---|---|
front:1 |
not-a-requirementnever bound Ze the sentence states a fact or describes another document, and directs no implementation |
IETF Trust boilerplate on the Revised BSD License for extracted Code Components; it states no protocol obligation. | Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. |
2.4.4:1 |
not-a-requirementnever bound Ze the sentence states a fact or describes another document, and directs no implementation |
Descriptive prose explaining the format diagram: "required" is lowercase and is not an RFC 2119 keyword. The Segment List sub-TLV length field width is the diagram's, not an obligation on a speaker. | A 2-octet length is thus required. |
2.4.5:1 |
not-a-requirementnever bound Ze the sentence states a fact or describes another document, and directs no implementation |
Introductory description of what the ENLP sub-TLV indicates; "must" is lowercase and is not an RFC 2119 keyword. The normative ENLP obligations are the sites 2.4.5:2 through 2.4.5:6. | The Explicit NULL Label Policy (ENLP) sub-TLV is used to indicate whether an Explicit NULL Label [RFC3032] must be pushed on an unlabeled IP packet before any other labels. |
2.4.7:1 |
not-a-requirementnever bound Ze the sentence states a fact or describes another document, and directs no implementation |
Descriptive prose explaining the format diagram: "required" is lowercase and is not an RFC 2119 keyword. | A 2-octet length is thus required. |
2.4.8:1 |
not-a-requirementnever bound Ze the sentence states a fact or describes another document, and directs no implementation |
Descriptive prose explaining the format diagram: "required" is lowercase and is not an RFC 2119 keyword. | A 2-octet length is thus required. |
Superseded
No document obsoletes RFC 9830, so its obligations are stated where they were written.