Skip to content

Isis srv6 review#474

Open
SuryyaKrJana wants to merge 46 commits into
masterfrom
isis-srv6-review
Open

Isis srv6 review#474
SuryyaKrJana wants to merge 46 commits into
masterfrom
isis-srv6-review

Conversation

@SuryyaKrJana

@SuryyaKrJana SuryyaKrJana commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

Feature Overview

  • Related Issue: (e.g., Fixes #<issue_number>)
  • Brief Description:
    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:

    go get github.com/open-traffic-generator/snappi/gosnappi@<isis-srv6-review-2>
    

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)

 #  USID creation without helper API
    .......................
     .........................
    f.tx_rx.port.tx_name = p1.name
    f.tx_rx.port.rx_name = p2.name
   
    eth = f.packet.add().ethernet
    eth.src.value = "00:11:22:33:44:55"
    eth.dst.value = "00:aa:bb:cc:dd:ee"

    ip6 = f.packet.add().ipv6
    ip6.src.value = "2001:db8::1"
    du = ip6.dst_usids
    du.locator.value = "fc00::"
    du.locator_length.value = 32
    du.usids.add().usid = "0001"
    du.usids.add().usid = "0002"
    du.usids.add().usid = "0003"
    # next_header auto-computed by IxNetwork from the following UDP header

 # USID creation by helper API: set_usid_dst()
    f.tx_rx.port.tx_name = p1.name
    f.tx_rx.port.rx_name = p2.name
   

    eth = f.packet.add().ethernet
    eth.src.value = "00:11:22:33:44:55"
    eth.dst.value = "00:aa:bb:cc:dd:ee"

    ip6 = f.packet.add().ipv6
    ip6.src.value = "2001:db8::1"
    set_usid_dst(ip6.dst_usids, "fc00::", 32, ["0001", "0002"])
 

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)

    usid_container = "fc00:0:1:2:3::"   # F3216: block=fc00:0:, hops=0001,0002,0003
    f.tx_rx.port.tx_name = p1.name
    f.tx_rx.port.rx_name = p2.name
   

    eth = f.packet.add().ethernet
    eth.src.value = "00:11:22:33:44:55"
    eth.dst.value = "00:aa:bb:cc:dd:ee"

    ip6 = f.packet.add().ipv6
    ip6.src.value = "2001:db8::1"
    ip6.dst.value = usid_container
    ip6.next_header.value = 43

    usid = f.packet.add().ipv6_extension_header.routing.segment_routing_usid
    usid.segments_left.value = segments_left
    usid.last_entry.value    = last_entry
    usid.tag.value           = 0
    _add_usid_container(usid.segment_list, usid_container)

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)

     usid_containers = ["fc00:0:1:2::", "fc00:0:3:4::"]   # 2 hops each
    segments_left = 1
    last_entry = 1

    f = b2b_raw_config.flows.add()
    
    f.tx_rx.port.tx_name = p1.name
    f.tx_rx.port.rx_name = p2.name

    eth = f.packet.add().ethernet
    eth.src.value = "00:11:22:33:44:55"
    eth.dst.value = "00:aa:bb:cc:dd:ee"

    ip6 = f.packet.add().ipv6
    ip6.src.value = "2001:db8::1"
    ip6.dst.value = usid_containers[0]
    ip6.next_header.value = 43

    usid = f.packet.add().ipv6_extension_header.routing.segment_routing_usid
    usid.segments_left.value = segments_left
    usid.last_entry.value = last_entry
    usid.tag.value = 0
    for usid_container in usid_containers:
        _add_usid_container(usid.segment_list, usid_container)

SuryyaKrJana and others added 9 commits April 22, 2026 11:34
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>
SuryyaKrJana and others added 4 commits April 28, 2026 19:31
… 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>
Comment thread control/isis.yaml Outdated
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line must be removed.

Comment thread control/isis.yaml Outdated
x-field-uid: 1
x-field-uid: 1
my_local_sid:
$ref: '#/components/schemas/Action.Protocol.Isis.Srv6.MyLocalSid'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, if it is part of set_config then should modify_config not be the right path ?

Comment thread control/isis.yaml Outdated
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to be made generic

Comment thread control/isis.yaml Outdated
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs to be made generic

Comment thread control/isis.yaml Outdated
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generic

Comment thread flow/packet-headers/ipv6.yaml Outdated
igmp: 2
ggp: 3
ip_in_ip: 4
ipv4: 4

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are there two entries with same value. Looks suspicious.

SuryyaKrJana and others added 4 commits May 6, 2026 20:22
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>
Comment thread flow/packet-headers/ipv6_routing.yaml Outdated
x-enum:
srh:
x-field-uid: 1
usid_no_srh:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means there is NO extension header. How can this option be within extension header ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 encodings needed :

  1. 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

  2. Eth
    IPv6
    Extension Hdr
    Routing
    SRH
    [ Many SIDs ] -> Already supported.
    Inner IPv4/v6 header (??)

  3. Et h
    IPv6
    Extension Hdr
    Routing
    SRH ( above = current )
    SRH_Usid
    List of usids [ max pack = 3 per IPv6 ] -> why usid1 , usid2 ?

Comment thread flow/packet-headers/ipv6_routing.yaml Outdated
items:
$ref: '#/components/schemas/Flow.Ipv6SegmentRouting.Segment'
x-field-uid: 5
routing_type:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not needed. Duplicate of existing choice field.

SuryyaKrJana and others added 8 commits May 7, 2026 15:34
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>
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>
SuryyaKrJana and others added 21 commits May 9, 2026 18:09
…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>
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants