FD.io VPP  v18.04-17-g3a0d853
Vector Packet Processing
sr_packet.h
Go to the documentation of this file.
1 #ifndef included_vnet_sr_packet_h
2 #define included_vnet_sr_packet_h
3 
4 #include <vnet/ip/ip.h>
5 
6 /*
7  * ipv6 segment-routing header format
8  *
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:
13  *
14  * http://www.apache.org/licenses/LICENSE-2.0
15  *
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.
21  */
22 
23 /*
24  * The Segment Routing Header (SRH) is defined as follows:
25  *
26  * 0 1 2 3
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  * | First Segment | Flags | RESERVED |
32  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33  * | |
34  * | Segment List[0] (128 bits IPv6 address) |
35  * | |
36  * | |
37  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38  * | |
39  * | |
40  * ...
41  * | |
42  * | |
43  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44  * | |
45  * | Segment List[n] (128 bits IPv6 address) |
46  * | |
47  * | |
48  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49  * // //
50  * // Optional Type Length Value objects (variable) //
51  * // //
52  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53  *
54  * where:
55  *
56  * o Next Header: 8-bit selector. Identifies the type of header
57  * immediately following the SRH.
58  *
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.
61  *
62  * o Routing Type: TBD, to be assigned by IANA (suggested value: 4).
63  *
64  * o Segments Left. Defined in [RFC2460], it contains the index, in
65  * the Segment List, of the next segment to inspect. Segments Left
66  * is decremented at each segment.
67  *
68  * o First Segment: contains the index, in the Segment List, of the
69  * first segment of the path which is in fact the last element of the
70  * Segment List.
71  *
72  * o Flags: 8 bits of flags. Following flags are defined:
73  *
74  * 0 1 2 3 4 5 6 7
75  * +-+-+-+-+-+-+-+-+
76  * |U|P|O|A|H| U |
77  * +-+-+-+-+-+-+-+-+
78  *
79  * U: Unused and for future use. SHOULD be unset on transmission
80  * and MUST be ignored on receipt.
81  *
82  * P-flag: Protected flag. Set when the packet has been rerouted
83  * through FRR mechanism by an SR endpoint node.
84  *
85  * O-flag: OAM flag. When set, it indicates that this packet is
86  * an operations and management (OAM) packet.
87  *
88  * A-flag: Alert flag. If present, it means important Type Length
89  * Value (TLV) objects are present. See Section 3.1 for details
90  * on TLVs objects.
91  *
92  * H-flag: HMAC flag. If set, the HMAC TLV is present and is
93  * encoded as the last TLV of the SRH. In other words, the last
94  * 36 octets of the SRH represent the HMAC information. See
95  * Section 3.1.5 for details on the HMAC TLV.
96  *
97  * o RESERVED: SHOULD be unset on transmission and MUST be ignored on
98  * receipt.
99  *
100  * o Segment List[n]: 128 bit IPv6 addresses representing the nth
101  * segment in the Segment List. The Segment List is encoded starting
102  * from the last segment of the path. I.e., the first element of the
103  * segment list (Segment List [0]) contains the last segment of the
104  * path while the last segment of the Segment List (Segment List[n])
105  * contains the first segment of the path. The index contained in
106  * "Segments Left" identifies the current active segment.
107  *
108  * o Type Length Value (TLV) are described in Section 3.1.
109  *
110  */
111 
112 #ifndef IPPROTO_IPV6_ROUTE
113 #define IPPROTO_IPV6_ROUTE 43
114 #endif
115 
116 #define ROUTING_HEADER_TYPE_SR 4
117 
118 typedef struct
119 {
120  /* Protocol for next header. */
122  /*
123  * Length of routing header in 8 octet units,
124  * not including the first 8 octets
125  */
127 
128  /* Type of routing header; type 4 = segement routing */
130 
131  /* Next segment in the segment list */
133 
134  /* Pointer to the first segment in the header */
136 
137  /* Flag bits */
138 #define IP6_SR_HEADER_FLAG_PROTECTED (0x40)
139 #define IP6_SR_HEADER_FLAG_OAM (0x20)
140 #define IP6_SR_HEADER_FLAG_ALERT (0x10)
141 #define IP6_SR_HEADER_FLAG_HMAC (0x80)
142 
143  /* values 0x0, 0x4 - 0x7 are reserved */
146 
147  /* The segment elts */
148  ip6_address_t segments[0];
149 } __attribute__ ((packed)) ip6_sr_header_t;
150 
151 /*
152 * fd.io coding-style-patch-verification: ON
153 *
154 * Local Variables:
155 * eval: (c-set-style "gnu")
156 * End:
157 */
158 
159 #endif /* included_vnet_sr_packet_h */
unsigned short u16
Definition: types.h:57
unsigned char u8
Definition: types.h:56