mpls_gue_ipv4_decap_test - openconfig/featureprofiles GitHub Wiki

PF-1.19: MPLSoGUE IPV4 decapsulation of IPV4/IPV6 payload

Summary

This test verifies MPLSoGUE decapsulation of IP traffic using static MPLS LSP configuration. MPLSoGUE Traffic on ingress to the DUT is decapsulated and IPV4/IPV6 payload is forwarded towards the IPV4/IPV6 egress nexthop.

Testbed type

Procedure

Test environment setup

DUT has 2 ingress aggregate interfaces and 1 egress aggregate interface.

                         |         | --eBGP-- | ATE Ports 3,4 |
    [ ATE Ports 1,2 ]----|   DUT   |          |               |
                         |         | --eBGP-- | ATE Port 5,6  |

Test uses aggregate 802.3ad bundled interfaces (Aggregate Interfaces).

  • Ingress Ports: Aggregate2 and Aggregate3

    • Aggregate2 (ATE Ports 3,4) and Aggregate3 (ATE Ports 5,6) are used as the source ports for encapsulated traffic.
  • Egress Ports: Aggregate1

    • Traffic is forwarded (egress) on Aggregate1 (ATE Ports 1,2) .

PF-1.19.1: Generate config for MPLS in GRE decap and push to DUT

Configuration

Aggregate1 is the egress port having following configuration:

Ten subinterfaces (customer) with different VLAN-IDs

  • Two VLANs with IPV4 link local address only, /29 address

  • Two VLANs with IPV4 global /30 address

  • Two VLANs with IPV6 address /125 only

  • Four VLANs with IPV4 and IPV6 address

MTU Configuration

  • One VLAN with MTU 9080 (including L2 header)

LLDP must be disabled

Aggregate 2 and Aggregate 3 configuration

  • IPV4 and IPV6 addresses

  • MTU (default 9216)

  • LACP Member link configuration

  • Lag id

  • LACP (default: period short)

  • Carrier-delay (default up:3000 down:150)

  • Statistics load interval (default:30 seconds)

Routing

  • MPLSoGUE decapsulation prefix range must be configurable on the device. MPLSoGUE traffic within prefix ranges must be processed by the device.

  • Static mapping of MPLS label to an egress nexthop must be configurable. Egress nexthop is based on the MPLS label/ static LSP.

  • MPLS label for a single egress VLAN interface must be unique for decapsulated traffic:

    • IPV4 traffic
    • IPV6 traffic
    • Multicast traffic
  • ECMP (Member links in Aggregate1) based on:

    • inner IP packet header AND/OR
    • MPLS label, Outer IP packet header
  • Inner packet TTL and DSCP must be preserved during decap of traffic from MPLSoGUE to IP traffic

MPLS Label

  • Entire Label block must be reallocated for static MPLS

  • Labels from start/end/mid ranges must be usable and configured corresponding to MPLSoGUE decapsulation

Multicast

  • Multicast traffic must be decapsulated and sent out with L2 header based on the multicast payload address.

NOTE: All test cases expected to meet following requirements even though they are not explicitly validated in the test.

  • Egress routes are programmed and LACP bundles are up without any errors, chassis alarms or exception logs
  • There is no recirculation (iow, no impact to line rate traffic. No matter how the port allocation is done) of traffic
  • Header fields are as expected without any bit flips
  • Multicast L2 rewrite/egress headers are correct based on the multicast payload IPV4 destination address
  • Device must be able to resolve the ARP and IPV6 neighbors upon receiving traffic from ATE ports

PF-1.19.2: Verify MPLSoGUE decapsulate action for IPv4 and IPV6 payload

Generate traffic on ATE Ports 3,4,5,6 having:

  • Outer source address: random combination of 1000+ IPV4 source addresses from 100.64.0.0/22
  • Outer destination address: Traffic must fall within the configured IPV4 unicast decap prefix range for MPLSoGUE traffic on the device
  • MPLS Labels: Configure streams that map to every egress interface by having associated IPV4/IPV6/Multicast static MPLS labels in the MPLSoGUE header
  • Inner payload:
    • Both IPV4 and IPV6 unicast payloads, with random source address, destination address, TCP/UDP source port and destination ports
  • Use 64, 128, 256, 512, 1024.. MTU bytes frame size

Verify:

  • All traffic received on Aggregate2 and Aggregate3 gets decapsulated and forwarded as IPV4/IPV6 unicast on the respective egress interfaces under Aggregate1
  • No packet loss when forwarding with counters incrementing corresponding to traffic
  • Traffic equally load-balanced across member links of the aggregate interfaces
    • Based on inner payload
    • Based on outer payload
    • Based on inner and outer payload

PF-1.19.3: Verify MPLSoGUE decapsulate action for IPv4 and IPV6 payload with changes in IPV4 and IPV6 configs

Send traffic as in PF-1.19.2

  • Remove and add IPV4 interface VLAN configs and verify that there is no IPV6 traffic loss
  • Remove and add IPV6 interface VLAN configs and verify that there is no IPV4 traffic loss
  • Remove and add IPV4 MPLSoGUE decap configs and verify that there is no IPV6 traffic loss
  • Remove and add IPV6 MPLSoGUE decap configs and verify that there is no IPV4 traffic loss

PF-1.19.4: Verify MPLSoGUE decapsulate action for IPv4 multicast payload

Generate traffic on ATE Ports 3,4,5,6 having:

  • Outer source address: random combination of 1000+ IPV4 source addresses from 100.64.0.0/22
  • Outer destination address: Traffic must fall within the configured IPV4 unicast decap prefix range for MPLSoGUE traffic on the device
  • MPLS Labels: Configure streams that map to every egress interface by having associated IPV4/IPV6/Multicast static MPLS labels in the MPLSoGUE header
  • Inner payload:
    • Multicast traffic with random source address, TCP/UDP header with random source and destination ports
  • Use 64, 128, 256, 512, 1024.. MTU bytes frame size

Verify:

  • All traffic received on Aggregate2 and Aggregate3 gets decapsulated and forwarded as multicast traffic on the respective egress interfaces under Aggregate1
  • No packet loss when forwarding with counters incrementing corresponding to traffic
  • Traffic equally load-balanced across member links of the aggregate interfaces
    • Based on inner payload
    • Based on outer payload
    • Based on inner and outer payload

PF-1.19.5: Verify MPLSoGUE DSCP/TTL preserve operation

Generate traffic on ATE Ports 3,4,5,6 having:

  • Outer source address: random combination of 1000+ IPV4 source addresses from 100.64.0.0/22
  • Outer destination address: Traffic must fall within the configured IPV4 unicast decap prefix range for MPLSoGUE traffic on the device
  • MPLS Labels: Configure streams that map to every egress interface by having associated IPV4/IPV6/Multicast static MPLS labels in the MPLSoGUE header
  • Inner payload with all possible DSCP range 0-56 :
    • Both IPV4 and IPV6 unicast payloads, with random source address, destination address, TCP/UDP source port and destination ports
    • Multicast traffic with random source address, TCP/UDP header with random source and destination ports
  • Use 64, 128, 256, 512, 1024.. MTU bytes frame size

Verify:

  • All traffic received on Aggregate2 and Aggregate3 gets decapsulated and forwarded as IPV4/IPV6 unicast on the respective egress interfaces under Aggregate1
  • No packet loss when forwarding with counters incrementing corresponding to traffic
  • Traffic equally load-balanced across member links of the aggregate interfaces
  • Header fields are as expected without any bit flips
  • Inner payload DSCP and TTL values are not altered by the device

PF-1.19.6: Verify IPV4/IPV6 nexthop resolution of decap traffic

Generate traffic (100K packets at 1000 pps) on ATE Ports 3,4,5,6 having:

  • Outer source address: random combination of 1000+ IPV4 source addresses from 100.64.0.0/22
  • Outer destination address: Traffic must fall within the configured IPV4 unicast decap prefix range for MPLSoGUE traffic on the device
  • MPLS Labels: Configure streams that map to every egress interface by having associated IPV4/IPV6/Multicast static MPLS labels in the MPLSoGUE header
  • Inner payload with all possible DSCP range 0-56 :
    • Both IPV4 and IPV6 unicast payloads, with random source address, destination address, TCP/UDP source port and destination ports
    • Multicast traffic with random source address, TCP/UDP header with random source and destination ports
  • Use 64, 128, 256, 512, 1024.. MTU bytes frame size
  • Clear ARP entries and IPV6 neighbors on the device

Verify:

  • No packet loss when forwarding with counters incrementing corresponding to traffic

PF-1.19.v6: Validate decapsulation of MPLS over GUE with an IPv6 outer header

Test Setup

  1. Connect the DUT to the ATE matching the testbed topology.
  2. Port 1 acts as the ingress interface for GUE traffic.
  3. Port 2 acts as the egress interface for the inner payload.

Configuration

  1. Configure IPv6 subinterfaces on both the ingress and egress ports (Port 1 and Port 2).
  2. Configure a Policy-Based Routing (PBR) rule on the DUT to identify incoming GUE traffic. The match criteria must include:
    • The outer IPv6 Destination Address (DUT's IPv6 IP).
    • IPv6 Next Header set to UDP (17).
    • Specific UDP destination port indicating GUE.
  3. Apply the decapsulation action by configuring /network-instances/network-instance[name=default]/policy-forwarding/policies/policy/rules/rule/action/config/decap-network-instance pointing to the appropriate routing network instance (e.g., default) that will process the inner payload.

Canonical OC Configuration

{
  "openconfig-network-instance:network-instances": {
    "network-instance": [
      {
        "name": "default",
        "config": {
          "name": "default",
          "type": "openconfig-network-instance-types:DEFAULT_INSTANCE"
        },
        "policy-forwarding": {
          "policies": {
            "policy": [
              {
                "policy-id": "gue-v6-decap-policy",
                "config": {
                  "policy-id": "gue-v6-decap-policy",
                  "type": "PBR_POLICY"
                },
                "rules": {
                  "rule": [
                    {
                      "sequence-id": 10,
                      "config": {
                        "sequence-id": 10
                      },
                      "ipv6": {
                        "config": {
                          "destination-address": "2001:db8::1/128",
                          "protocol": 17
                        }
                      },
                      "transport": {
                        "config": {
                          "destination-port": 6080
                        }
                      },
                      "action": {
                        "config": {
                          "decapsulate-gue": true,
                          "decap-network-instance": "default"
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  }
}

Telemetry (gNMI Subscribe)

  • Subscribe to ingress and egress interface packet counters:
    • /interfaces/interface/state/counters/in-pkts
    • /interfaces/interface/state/counters/out-pkts
  • Subscribe to PBR rule match counters (if supported by the platform) to verify the policy is hit:
    • /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/state/matched-pkts

Traffic Execution

  1. Generate MPLS over GUE traffic from the ATE on Port 1.
  2. Ensure the outer header is IPv6 with the Source IP set to the ATE and the Destination IP set to the DUT's IPv6 address.
  3. Construct the inner payload as standard IPv4 or IPv6 routed traffic destined for an ATE subnet connected to the egress port (Port 2).

Pass/Fail Criteria

  • Pass: The DUT correctly identifies the GUE traffic, strips the IPv6 outer header, the UDP header, and the MPLS labels. It performs a route lookup on the inner payload and forwards it out the egress port (Port 2). The ATE receives the pristine inner payload on Port 2 with zero packet loss. The matched PBR rule counters and interface transit counters increment accordingly.
  • Fail: Packets are dropped at the ingress interface, the DUT forwards the packet without decapsulating, or the DUT crashes due to IPv6 GUE decap parsing errors.

Canonical OC

{
  "network-instances": {
    "network-instance": [
      {
        "config": {
          "name": "default"
        },
        "mpls": {
          "lsps": {
            "static-lsps": {
              "static-lsp": [
                {
                  "config": {
                    "name": "Customer IPV4 in:40571 out:pop"
                  },
                  "egress": {
                    "config": {
                      "incoming-label": 40571,
                      "next-hop": "169.254.1.138"
                    }
                  },
                  "name": "Customer IPV4 in:40571 out:pop"
                },
                {
                  "config": {
                    "name": "Customer IPV6 in:40572 out:pop"
                  },
                  "egress": {
                    "config": {
                      "incoming-label": 40572,
                      "next-hop": "2600:2d00:0:1:4000:15:69:2072"
                    }
                  },
                  "name": "Customer IPV6 in:40572 out:pop"
                }
              ]
            }
          }
        },
        "name": "default",
        "policy-forwarding": {
          "policies": {
            "policy": [
              {
                "config": {
                  "policy-id": "customer10"
                },
                "policy-id": "customer10",
                "rules": {
                  "rule": [
                    {
                      "action": {
                        "config": {
                          "decapsulate-gue": true
                        }
                      },
                      "config": {
                        "sequence-id": 10
                      },
                      "ipv4": {
                        "config": {
                          "destination-address": "169.254.125.155/28",
                          "protocol": 4
                        }
                      },
                      "sequence-id": 10
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  }
}

OpenConfig Path and RPC Coverage

TODO: Finalize and update the below paths after the review and testing on any vendor device.

paths:
  # Telemetry for GRE decap rule    
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/state/matched-pkts:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/state/matched-octets:
    
  # Config paths for GRE decap
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decapsulate-mpls-in-udp:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/action/config/decap-network-instance:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/ipv6/config/destination-address:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/ipv6/config/protocol:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/transport/config/destination-port:

  /interfaces/interface/state/counters/in-discards:
  /interfaces/interface/state/counters/in-errors:
  /interfaces/interface/state/counters/in-multicast-pkts:
  /interfaces/interface/state/counters/in-pkts:
  /interfaces/interface/state/counters/in-unicast-pkts:
  /interfaces/interface/state/counters/out-discards:
  /interfaces/interface/state/counters/out-errors:
  /interfaces/interface/state/counters/out-multicast-pkts:
  /interfaces/interface/state/counters/out-pkts:
  /interfaces/interface/state/counters/out-unicast-pkts:

  /interfaces/interface/subinterfaces/subinterface/state/counters/in-discards:
  /interfaces/interface/subinterfaces/subinterface/state/counters/in-errors:
  /interfaces/interface/subinterfaces/subinterface/state/counters/in-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/state/counters/in-pkts:
  /interfaces/interface/subinterfaces/subinterface/state/counters/in-unicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/state/counters/out-discards:
  /interfaces/interface/subinterfaces/subinterface/state/counters/out-errors:
  /interfaces/interface/subinterfaces/subinterface/state/counters/out-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/state/counters/out-pkts:
  /interfaces/interface/subinterfaces/subinterface/state/counters/out-unicast-pkts:

  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/in-discarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/in-error-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/in-forwarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/in-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/in-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/out-discarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/out-error-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/out-forwarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/out-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv4/state/counters/out-pkts:
  
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/in-discarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/in-error-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/in-forwarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/in-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/in-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/out-discarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/out-error-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/out-forwarded-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/out-multicast-pkts:
  /interfaces/interface/subinterfaces/subinterface/ipv6/state/counters/out-pkts:

  /network-instances/network-instance/afts/policy-forwarding/policy-forwarding-entry/state/counters/packets-forwarded:
  /network-instances/network-instance/afts/policy-forwarding/policy-forwarding-entry/state/counters/octets-forwarded:
  /network-instances/network-instance/policy-forwarding/policies/policy/rules/rule/state/sequence-id:

rpcs:
  gnmi:
    gNMI.Set:
    gNMI.Subscribe:

Minimum DUT platform requirement

FFF

⚠️ **GitHub.com Fallback** ⚠️