1 #ifndef included_vnet_sr_packet_h
2 #define included_vnet_sr_packet_h
4 #include <vnet/ip/ip.h>
7 * ipv6 segment-routing header format
9 * Copyright (c) 2013 Cisco and/or its affiliates.
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at:
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
24 * The Segment Routing Header (SRH) is defined as follows:
27 * 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
28 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
29 * | Next Header | Hdr Ext Len | Routing Type | Segments Left |
30 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31 * | Last Entry | Flags | Tag |
32 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 * | Segment List[0] (128 bits IPv6 address) |
37 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 * | Segment List[n] (128 bits IPv6 address) |
48 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 * // Optional Type Length Value objects (variable) //
52 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * o Next Header: 8-bit selector. Identifies the type of header
57 * immediately following the SRH.
59 * o Hdr Ext Len: 8-bit unsigned integer, is the length of the SRH
60 * header in 8-octet units, not including the first 8 octets.
62 * o Routing Type: TBD, to be assigned by IANA (suggested value: 4).
64 * o Segments Left. Defined in [RFC8200], it contains the index, in
65 * the Segment List, of the next segment to inspect. Segments Left
66 * is decremented at each segment.
68 * o Last Entry: contains the index (zero based), in the Segment List,
69 * of the the last element of the Segment List
71 * o Flags: 8 bits of flags. Following flags are defined:
78 * U: Unused and for future use. SHOULD be unset on transmission
79 * and MUST be ignored on receipt.
81 * P-flag: Protected flag. Set when the packet has been rerouted
82 * through FRR mechanism by an SR endpoint node.
84 * O-flag: OAM flag. When set, it indicates that this packet is
85 * an operations and management (OAM) packet.
87 * A-flag: Alert flag. If present, it means important Type Length
88 * Value (TLV) objects are present. See Section 3.1 for details
91 * H-flag: HMAC flag. If set, the HMAC TLV is present and is
92 * encoded as the last TLV of the SRH. In other words, the last
93 * 36 octets of the SRH represent the HMAC information. See
94 * Section 3.1.5 for details on the HMAC TLV.
96 * o Tag: tag a packet as part of a class or group of packets, e.g.,
97 * packets sharing the same set of properties. When tag is not used
98 * at source it MUST be set to zero on transmission. When tag is not
99 * used during SRH Processing it SHOULD be ignored.
101 * o Segment List[n]: 128 bit IPv6 addresses representing the nth
102 * segment in the Segment List. The Segment List is encoded starting
103 * from the last segment of the path. I.e., the first element of the
104 * segment list (Segment List [0]) contains the last segment of the
105 * path while the last segment of the Segment List (Segment List[n])
106 * contains the first segment of the path. The index contained in
107 * "Segments Left" identifies the current active segment.
109 * o Type Length Value (TLV) are described in Section 3.1.
113 #ifndef IPPROTO_IPV6_ROUTE
114 #define IPPROTO_IPV6_ROUTE 43
117 #define ROUTING_HEADER_TYPE_SR 4
121 /* Protocol for next header. */
124 * Length of routing header in 8 octet units,
125 * not including the first 8 octets
129 /* Type of routing header; type 4 = segement routing */
132 /* Next segment in the segment list */
135 /* Pointer to the first segment in the header */
139 #define IP6_SR_HEADER_FLAG_PROTECTED (0x40)
140 #define IP6_SR_HEADER_FLAG_OAM (0x20)
141 #define IP6_SR_HEADER_FLAG_ALERT (0x10)
142 #define IP6_SR_HEADER_FLAG_HMAC (0x80)
144 /* values 0x0, 0x4 - 0x7 are reserved */
148 /* The segment elts */
149 ip6_address_t segments[0];
150 } __attribute__ ((packed)) ip6_sr_header_t;
153 * fd.io coding-style-patch-verification: ON
156 * eval: (c-set-style "gnu")
160 #endif /* included_vnet_sr_packet_h */