Isis srv6 review#474
Conversation
New file device/isis/srv6.yaml adds 7 schemas for SRv6 config: IsisSRv6.NodeCapability, NodeMsd, LinkMsd -- SRv6 Caps Sub-TLV (type 25) with O-flag, C-flag (uSID), and MSD types 41-45 + T.Insert (43) IsisSRv6.Locator -- SRv6 Locator TLV (type 27) with 20 fields including Flex-Algo algorithm binding, Prefix Attribute Flags (RFC 7794 X/R/N/A), Source Router ID sub-TLVs (RFC 9350), and locator-as-prefix controls IsisSRv6.EndSid -- End SID sub-TLV (type 5), 11 endpoint behaviors IsisSRv6.AdjSid -- End.X SID sub-TLV (type 43/44), 10 endpoint behaviors IsisSRv6.SidStructure -- SID Structure sub-sub-TLV (type 1) Modified device/isis/segmentrouting.yaml: Isis.SegmentRouting: added srv6_locators array (uid 2) Isis.RouterCapability: added srv6_capability (uid 8) Modified device/isis/interface.yaml: Isis.Interface: added srv6_adj_sids (uid 15) and srv6_link_msd (uid 16) Modified result/isislsp.yaml: IsisLsp.Tlvs: added srv6_locator_tlvs (uid 9) IsisLsp.Capability: added srv6_capability (uid 7) IsisLsp.ExtendedNeighbor: added srv6_adj_sids (uid 3) New schemas: SRv6Capability, SRv6NodeMsd, SRv6LocatorTlv, SRv6EndSid, SRv6AdjSid, SRv6SidStructure Added MODEL-GUIDE.md best-practice sections: Object presence vs enable booleans, config vs state schema patterns, required+default constraint, cross-file $ref, build instructions, artifacts/ must not be committed Added project_isis_srv6.md design record for this feature branch Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
RFC 9350 Source Router ID sub-TLVs (type 11/12) are Flex-Algo specific and out of scope for this delivery phase. Removed: - include_source_router_id / ipv4_source_router_id / ipv6_source_router_id (uids 18-20) from IsisSRv6.Locator - ipv4_source_router_id / ipv6_source_router_id (uids 13-14) from IsisLsp.SRv6LocatorTlv The algorithm field (uid 4) is retained — it is a mandatory SRv6 locator wire-format field per RFC 9352, not Flex-Algo specific. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace flat prefix_attr_enabled + x_flag/r_flag/n_flag/a_flag fields on IsisSRv6.Locator (uids 13-17) with a single prefix_attributes object (uid 13) referencing the new IsisSRv6.PrefixAttributes schema. Object presence/absence replaces the boolean gate: when present, the Prefix Attribute Flags Sub-TLV (RFC 7794, sub-TLV type 4) is advertised; when absent, it is suppressed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nerator/models into isis-srv6-review
… lifecycle API - flow/ipv6.yaml: add ipv4:4 constant to next_header for IPinIPv6 (USD) stacks - flow/ipv6_routing.yaml: add routing_type (UID 6, RFC 8754 Routing Type 4), srv6_encap_mode (UID 7, uN variant selector), usid_container (UID 2) on Segment (non-breaking, keeps existing segment UID 1), new USidContainer and USid schemas for structured F3216 uSID container assembly (RFC 9800) - control/isis.yaml: extend Action.Protocol.Isis with srv6 choice (UID 2), add full Srv6.MyLocalSid add/modify/delete lifecycle hierarchy (RFC 8986 S4) - device/isis/srv6.yaml: update EndSid description, add x-reserved-field-uids - .gitignore: add .venv Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| Trigger a My Local SID lifecycle operation (add, modify, or delete) on | ||
| the specified IS-IS routers (RFC 8986 Section 4 Instantiation, | ||
| Re-instantiation, and Un-instantiation). | ||
| In IxNetwork, this operation manipulates isisSRv6EndSIDList entries |
There was a problem hiding this comment.
This line must be removed.
| x-field-uid: 1 | ||
| x-field-uid: 1 | ||
| my_local_sid: | ||
| $ref: '#/components/schemas/Action.Protocol.Isis.Srv6.MyLocalSid' |
There was a problem hiding this comment.
What happens on repeated invocation across start/stop ; does it retain old values or only values from last start ?
Is this also part of set_config ?
There was a problem hiding this comment.
Also, if it is part of set_config then should modify_config not be the right path ?
| Program new SRv6 My Local SID entries on the routers specified by | ||
| router_names. After this operation the router matches packets whose | ||
| DA falls within each SID prefix and applies the configured behavior. | ||
| Session impact: implementation-specific. In IxNetwork the IS-IS router |
There was a problem hiding this comment.
This needs to be made generic
| router_names. Each entry is matched by sid_prefix + prefix_length; | ||
| the remaining fields replace the existing values without a | ||
| delete-and-re-add cycle. | ||
| Session impact: implementation-specific. In IxNetwork IS-IS re-sends |
There was a problem hiding this comment.
Needs to be made generic
| Remove SRv6 My Local SID entries from the routers specified by | ||
| router_names. After deletion, packets whose DA matches these SID | ||
| prefixes are no longer forwarded (RFC 8986 Section 4 Un-instantiation). | ||
| Session impact: implementation-specific. In IxNetwork IS-IS withdraws |
| igmp: 2 | ||
| ggp: 3 | ||
| ip_in_ip: 4 | ||
| ipv4: 4 |
There was a problem hiding this comment.
Why are there two entries with same value. Looks suspicious.
RFC alignment fixes in device/isis/srv6.yaml: - Correct RFC 8986 endpoint behavior codepoints: end_dt6 (16), end_dt4 (17), end_dt46 (18), end_dx6 (14), end_dx4 (15) - Fix mt_id maximum 255 to 4095 per RFC 5120 Section 2 (12-bit field) - Remove sid_structure from IsisSRv6.AdjSid (RFC 9352 Section 9: structure is locator-level only); reserve uid 9 - Remove IsisSRv6.NodeMsd schema and node_msds from NodeCapability; reserve uid 2 - Remove IsisSRv6.LinkMsd schema - Remove a_flag from IsisSRv6.PrefixAttributes (X/R/N flags only); reserve uid 4 Scope changes in device/isis/interface.yaml: - Remove srv6_link_msd from Isis.Interface; reserve uid 16 Scope changes in control/isis.yaml: - Remove SRv6 My Local SID control actions deferred to a future PR; reserve uid 3 All descriptions updated to RFC/implementation-agnostic language. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…DEL-GUIDE.md x-reserved-field-uids are only needed for released schemas to prevent wire-format corruption. All SRv6 schemas are on an unreleased feature branch, so reservations added during the design phase are unnecessary and have been removed from: - device/isis/srv6.yaml (NodeCapability, PrefixAttributes, EndSid, AdjSid) - device/isis/interface.yaml (Isis.Interface) - control/isis.yaml (Action.Protocol.Isis) MODEL-GUIDE.md reverted to origin/master baseline; internal guidance (cross-file $ref paths, object presence gate, UID lifecycle) moved to the private ai/CLAUDE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| x-enum: | ||
| srh: | ||
| x-field-uid: 1 | ||
| usid_no_srh: |
There was a problem hiding this comment.
This means there is NO extension header. How can this option be within extension header ?
There was a problem hiding this comment.
3 encodings needed :
-
Eth
IPv6 outer -> dest has compressed usid info upto 3 hops. [ in ipv6.dst ] -> How can user give this into within Extension Header if that is completely missing. [ Difficult with current but a helper in code maybe ; nothing needed in model extra ?]
IPv6 / IPv4 inner [ Might not be present ]
TCP/UDP -
Eth
IPv6
Extension Hdr
Routing
SRH
[ Many SIDs ] -> Already supported.
Inner IPv4/v6 header (??) -
Et h
IPv6
Extension Hdr
Routing
SRH ( above = current )
SRH_Usid
List of usids [ max pack = 3 per IPv6 ] -> why usid1 , usid2 ?
| items: | ||
| $ref: '#/components/schemas/Flow.Ipv6SegmentRouting.Segment' | ||
| x-field-uid: 5 | ||
| routing_type: |
There was a problem hiding this comment.
Not needed. Duplicate of existing choice field.
Add a second choice 'segment_routing_usid' to Flow.Ipv6Routing alongside the existing 'segment_routing'. The new choice points to a new Flow.Ipv6SegmentRoutingUsid schema whose segment_list entries are plain pre-computed 128-bit uSID container IPv6 addresses (RFC 9800 Section 4). Key design decisions: - No decomposition fields (locator_block_length, etc.) in the flow schema; those are control-plane concepts not present on the wire. - Users supply the pre-computed container value directly, enabling raw traffic generation independent of any control plane configuration. - Flow.Ipv6SegmentRouting is unchanged; the new choice is non-breaking. - routing_type (always 4 per RFC 8754) is not exposed as a field. - srv6_encap_mode removed; the choice in Flow.Ipv6Routing is the signal. - Packet format diagrams added to both schema descriptions for Redocly. - Max capacity documented: 127 containers per SRH, F3216 = 3 uSIDs/container. - Remove duplicate ipv4:4 constant from Flow.Ipv6.next_header (kept ip_in_ip:4). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ed artifacts Do not commit files under artifacts/ - they are auto-generated by CI. Add an explicit rule to the Pull Requests section of MODEL-GUIDE.md documenting this convention. Also revert artifacts/openapi.yaml and artifacts/otg.proto to their pre-commit state; these were incorrectly included in the previous commit. Only source YAML files under flow/ and config/ should be committed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nerator/models into isis-srv6-review
SRv6 OAM is a P1 PRD item deferred to a dedicated future PR. Removed the oam field from Flow.Ipv6SegmentRouting.Flags and renumbered alert from uid 3 to uid 2 (pre-release branch, no reservation needed per UID lifecycle rules). Flags now: protected (uid 1), alert (uid 2). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nerator/models into isis-srv6-review
…SD fields device/isis/srv6.yaml: - Add new IsisSRv6.Msd object (RFC 9352 Section 6) with max_sl, max_end_pop_srh, max_h_encaps, max_end_d_srh, max_t_insert, max_t_encaps (UIDs 1-6) - Add node_msds (UID 2) on IsisSRv6.NodeCapability referencing IsisSRv6.Msd - Trim c_flag description to remove worked example (moved to docs) device/isis/interface.yaml: - Add srv6_link_msd (UID 16) on Isis.Interface referencing IsisSRv6.Msd flow/packet-headers/ipv6_routing.yaml: - Add SRH TLV fields: ingress_node_tlv (UID 6, RFC 9259 Section 3.1), egress_node_tlv (UID 7, RFC 9259 Section 3.2), opaque_tlv (UID 8), pad_tlv (UID 9) on Flow.Ipv6SegmentRouting - Simplify Flow.Ipv6SegmentRouting description Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nerator/models into isis-srv6-review
…nerator/models into isis-srv6-review
…nerator/models into isis-srv6-review
…nerator/models into isis-srv6-review
…nerator/models into isis-srv6-review
…on input New Flow.Ipv6.UsidDst schema (locator, locator_length, usids) lets callers supply a structured locator + uSID list instead of manually packing the 128-bit IPv6 dst. ipv6_routing.yaml descriptions updated to reference ipv6.dst_usids. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Feature Overview
#<issue_number>)This time, highlighting only SRv6 Traffic part
Feature Details
Redocly docs for this feature/branch
New Locations/Nomenclature:
Flow / traffic schemas (flow/packet-headers/)
ipv6_routing.yaml — new SRH (Segment Routing Header) packet-header schema; fields: routing_type (fixed 4), segments_left, last_entry, flags, tag, and segment_list (array of IPv6 SID addresses) — resolves P0 gap G-T1b
ipv6.yaml — updated to allow SRH as a next-header option so flow stacks can include an SRv6 routing extension header
uSID container encoding — segment_list items accept packed uSID values (e.g. fc00:0:1:1:2:1::) directly; no decomposition helper needed — resolves G-T3/G-UN1
Reduced-SRH (no-SRH) / USD inner-payload — modeled by omitting the SRH layer from the flow stack; inner IPv4/IPv6 payload stacked after outer IPv6 DA set to the active uSID — resolves G-T5/G-UN2
[Dev-Snappi branch reference] (Isis srv6 review 2 snappi#282)
Example command to fetch the dev-snappi branch:
Code snippets
Example - 1: Multiple uSIDs with NO SRH: 3-hop path packed into one F3216 uSID container,
placed directly in the IPv6 destination via ipv6.dst_usids - no routing extension
header required.
OTG model used:
Flow.Ipv6 (dst = uSID container, NH auto-set to 17 by next header)
F3216 uSID container layout (128 bits):
fc00:0:1:2:3::
Locator-Block = fc00:0000 (32 bits, shared domain prefix)
uSID-1 = 0001 (16 bits, hop 1 - egress of node 1)
uSID-2 = 0002 (16 bits, hop 2 - egress of node 2)
uSID-3 = 0003 (16 bits, hop 3 - egress of node 3)
Remaining = 0:: (48 bits, zeros = end of uSID list)
Example - 2: Multiple uSIDs with 1 uSID SRH container: 3-hop path packed in one F3216 uSID
container, carried inside a uSID SRH extension header with a single segment entry.
OTG model used:
Flow.Ipv6 (NH=43, dst = uSID container)
Flow.Ipv6ExtHeader.routing.segment_routing_usid (Flow.Ipv6SegmentRoutingUsid)
segment_list: 1 entry (last_entry=0, segments_left=0)
F3216 uSID container layout (128 bits):
fc00:0:1:2:3::
Locator-Block = fc00:0000 (32 bits, shared domain prefix)
uSID-1 = 0001 (16 bits, hop 1)
uSID-2 = 0002 (16 bits, hop 2)
uSID-3 = 0003 (16 bits, hop 3)
Remaining = 0:: (48 bits, zeros = end of uSID list)
Example - 1: Multiple uSIDs with more than 1 uSID SRH container: 4-hop path spread across
2 F3216 uSID containers, carried in a uSID SRH with 2 segment list entries.
OTG model used:
Flow.Ipv6 (NH=43, dst = first/active uSID container)
Flow.Ipv6ExtHeader.routing.segment_routing_usid (Flow.Ipv6SegmentRoutingUsid)
segment_list: 2 entries (last_entry=1, segments_left=1)
F3216 uSID containers (128 bits each):
container-1: fc00:0:1:2::
Locator-Block = fc00:0000 (32 bits)
uSID-1 = 0001 (16 bits, hop 1)
uSID-2 = 0002 (16 bits, hop 2)
Remaining = 0:: (64 bits, zeros)
container-2: fc00:0:3:4::
Locator-Block = fc00:0000 (32 bits)
uSID-3 = 0003 (16 bits, hop 3)
uSID-4 = 0004 (16 bits, hop 4)
Remaining = 0:: (64 bits, zeros)