blob: 7af4ad4d9c03b2e7ff66758f4a82e2e503797aa8 [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001#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
Pablo Camarillofb380952016-12-07 18:34:18 +010023/*
24 * The Segment Routing Header (SRH) is defined as follows:
Keith Burns (alagalah)7214cf12016-08-08 15:56:50 -070025 *
Pablo Camarillofb380952016-12-07 18:34:18 +010026 * 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Ed Warnickecb9cada2015-12-08 15:45:58 -070053 *
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
Pablo Camarillofb380952016-12-07 18:34:18 +010066 * is decremented at each segment.
Ed Warnickecb9cada2015-12-08 15:45:58 -070067 *
Pablo Camarillofb380952016-12-07 18:34:18 +010068 * 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.
Ed Warnickecb9cada2015-12-08 15:45:58 -070071 *
Pablo Camarillofb380952016-12-07 18:34:18 +010072 * o Flags: 8 bits of flags. Following flags are defined:
Ed Warnickecb9cada2015-12-08 15:45:58 -070073 *
Pablo Camarillofb380952016-12-07 18:34:18 +010074 * 0 1 2 3 4 5 6 7
75 * +-+-+-+-+-+-+-+-+
76 * |U|P|O|A|H| U |
77 * +-+-+-+-+-+-+-+-+
Ed Warnickecb9cada2015-12-08 15:45:58 -070078 *
Pablo Camarillofb380952016-12-07 18:34:18 +010079 * U: Unused and for future use. SHOULD be unset on transmission
80 * and MUST be ignored on receipt.
Ed Warnickecb9cada2015-12-08 15:45:58 -070081 *
Pablo Camarillofb380952016-12-07 18:34:18 +010082 * P-flag: Protected flag. Set when the packet has been rerouted
83 * through FRR mechanism by an SR endpoint node.
Ed Warnickecb9cada2015-12-08 15:45:58 -070084 *
Pablo Camarillofb380952016-12-07 18:34:18 +010085 * O-flag: OAM flag. When set, it indicates that this packet is
86 * an operations and management (OAM) packet.
Ed Warnickecb9cada2015-12-08 15:45:58 -070087 *
Pablo Camarillofb380952016-12-07 18:34:18 +010088 * 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.
Ed Warnickecb9cada2015-12-08 15:45:58 -070091 *
Pablo Camarillofb380952016-12-07 18:34:18 +010092 * 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.
Ed Warnickecb9cada2015-12-08 15:45:58 -070096 *
Pablo Camarillofb380952016-12-07 18:34:18 +010097 * o RESERVED: SHOULD be unset on transmission and MUST be ignored on
98 * receipt.
Ed Warnickecb9cada2015-12-08 15:45:58 -070099 *
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 *
Pablo Camarillofb380952016-12-07 18:34:18 +0100108 * o Type Length Value (TLV) are described in Section 3.1.
Ed Warnickecb9cada2015-12-08 15:45:58 -0700109 *
Ed Warnickecb9cada2015-12-08 15:45:58 -0700110 */
111
Chris Luke4b8b7182016-05-25 14:39:47 -0400112#ifndef IPPROTO_IPV6_ROUTE
113#define IPPROTO_IPV6_ROUTE 43
114#endif
115
116#define ROUTING_HEADER_TYPE_SR 4
Pablo Camarillofb380952016-12-07 18:34:18 +0100117
Keith Burns (alagalah)06c5ffd2016-08-06 08:32:45 -0700118typedef struct
119{
Pablo Camarillofb380952016-12-07 18:34:18 +0100120 /* Protocol for next header. */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700121 u8 protocol;
Pablo Camarillofb380952016-12-07 18:34:18 +0100122 /*
Damjan Marion607de1a2016-08-16 22:53:54 +0200123 * Length of routing header in 8 octet units,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124 * not including the first 8 octets
125 */
126 u8 length;
127
Pablo Camarillofb380952016-12-07 18:34:18 +0100128 /* Type of routing header; type 4 = segement routing */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700129 u8 type;
130
Pablo Camarillofb380952016-12-07 18:34:18 +0100131 /* Next segment in the segment list */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700132 u8 segments_left;
133
Pablo Camarillofb380952016-12-07 18:34:18 +0100134 /* Pointer to the first segment in the header */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700135 u8 first_segment;
136
Pablo Camarillofb380952016-12-07 18:34:18 +0100137 /* 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)
Keith Burns (alagalah)06c5ffd2016-08-06 08:32:45 -0700142
Pablo Camarillofb380952016-12-07 18:34:18 +0100143 /* values 0x0, 0x4 - 0x7 are reserved */
144 u8 flags;
145 u16 reserved;
146
147 /* The segment elts */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700148 ip6_address_t segments[0];
Keith Burns (alagalah)06c5ffd2016-08-06 08:32:45 -0700149} __attribute__ ((packed)) ip6_sr_header_t;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700150
Pablo Camarillofb380952016-12-07 18:34:18 +0100151/*
152* fd.io coding-style-patch-verification: ON
153*
154* Local Variables:
155* eval: (c-set-style "gnu")
156* End:
157*/
Ed Warnickecb9cada2015-12-08 15:45:58 -0700158
159#endif /* included_vnet_sr_packet_h */