#ifndef included_vnet_sr_packet_h #define included_vnet_sr_packet_h #include /* * ipv6 segment-routing header format * * Copyright (c) 2013 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * The Segment Routing Header (SRH) is defined as follows: * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Next Header | Hdr Ext Len | Routing Type | Segments Left | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Last Entry | Flags | Tag | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | Segment List[0] (128 bits IPv6 address) | * | | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | | * ... * | | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | | * | Segment List[n] (128 bits IPv6 address) | * | | * | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * // // * // Optional Type Length Value objects (variable) // * // // * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * where: * * o Next Header: 8-bit selector. Identifies the type of header * immediately following the SRH. * * o Hdr Ext Len: 8-bit unsigned integer, is the length of the SRH * header in 8-octet units, not including the first 8 octets. * * o Routing Type: TBD, to be assigned by IANA (suggested value: 4). * * o Segments Left. Defined in [RFC8200], it contains the index, in * the Segment List, of the next segment to inspect. Segments Left * is decremented at each segment. * * o Last Entry: contains the index (zero based), in the Segment List, * of the the last element of the Segment List * * o Flags: 8 bits of flags. Following flags are defined: * * 0 1 2 3 4 5 6 7 * +-+-+-+-+-+-+-+-+ * |U|P|O|A|H| U | * +-+-+-+-+-+-+-+-+ * * U: Unused and for future use. SHOULD be unset on transmission * and MUST be ignored on receipt. * * P-flag: Protected flag. Set when the packet has been rerouted * through FRR mechanism by an SR endpoint node. * * O-flag: OAM flag. When set, it indicates that this packet is * an operations and management (OAM) packet. * * A-flag: Alert flag. If present, it means important Type Length * Value (TLV) objects are present. See Section 3.1 for details * on TLVs objects. * * H-flag: HMAC flag. If set, the HMAC TLV is present and is * encoded as the last TLV of the SRH. In other words, the last * 36 octets of the SRH represent the HMAC information. See * Section 3.1.5 for details on the HMAC TLV. * * o Tag: tag a packet as part of a class or group of packets, e.g., * packets sharing the same set of properties. When tag is not used * at source it MUST be set to zero on transmission. When tag is not * used during SRH Processing it SHOULD be ignored. * * o Segment List[n]: 128 bit IPv6 addresses representing the nth * segment in the Segment List. The Segment List is encoded starting * from the last segment of the path. I.e., the first element of the * segment list (Segment List [0]) contains the last segment of the * path while the last segment of the Segment List (Segment List[n]) * contains the first segment of the path. The index contained in * "Segments Left" identifies the current active segment. * * o Type Length Value (TLV) are described in Section 3.1. * */ #ifndef IPPROTO_IPV6_ROUTE #define IPPROTO_IPV6_ROUTE 43 #endif #define ROUTING_HEADER_TYPE_SR 4 typedef struct { /* Protocol for next header. */ u8 protocol; /* * Length of routing header in 8 octet units, * not including the first 8 octets */ u8 length; /* Type of routing header; type 4 = segement routing */ u8 type; /* Next s