sr_packet.h revision 5d73eecd
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
118typedef struct
119{
120  /* Protocol for next header. */
121  u8 protocol;
122  /*
123   * Length of routing header in 8 octet units,
124   * not including the first 8 octets
125   */
126  u8 length;
127
128  /* Type of routing header; type 4 = segement routing */
129  u8 type;
130
131  /* Next segment in the segment list */
132  u8 segments_left;
133
134  /* Pointer to the first segment in the header */
135  u8 first_segment;
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 */
144  u8 flags;
145  u16 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 */
160