srv6-mobile: Support GTP4/6.DT and User Plane message mapping
[vpp.git] / src / vnet / srv6 / sr_packet.h
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  *   |  Last Entry   |     Flags     |              Tag              |
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 [RFC8200], 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  Last Entry: contains the index (zero based), in the Segment List,
69  *      of the the last element of the Segment List
70  *
71  *   o  Flags: 8 bits of flags.  Following flags are defined:
72  *
73  *         0 1 2 3 4 5 6 7
74  *        +-+-+-+-+-+-+-+-+
75  *        |U|P|O|A|H|  U  |
76  *        +-+-+-+-+-+-+-+-+
77  *
78  *        U: Unused and for future use.  SHOULD be unset on transmission
79  *        and MUST be ignored on receipt.
80  *
81  *        P-flag: Protected flag.  Set when the packet has been rerouted
82  *        through FRR mechanism by an SR endpoint node.
83  *
84  *        O-flag: OAM flag.  When set, it indicates that this packet is
85  *        an operations and management (OAM) packet.
86  *
87  *        A-flag: Alert flag.  If present, it means important Type Length
88  *        Value (TLV) objects are present.  See Section 3.1 for details
89  *        on TLVs objects.
90  *
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.
95  *
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.
100  *
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.
108  *
109  *   o  Type Length Value (TLV) are described in Section 3.1.
110  *
111  */
112
113 #ifndef IPPROTO_IPV6_ROUTE
114 #define IPPROTO_IPV6_ROUTE        43
115 #endif
116
117 #define ROUTING_HEADER_TYPE_SR    4
118
119 typedef struct
120 {
121   /* Protocol for next header. */
122   u8 protocol;
123   /*
124    * Length of routing header in 8 octet units,
125    * not including the first 8 octets
126    */
127   u8 length;
128
129   /* Type of routing header; type 4 = segement routing */
130   u8 type;
131
132   /* Next segment in the segment list */
133   u8 segments_left;
134
135   /* Pointer to the first segment in the header */
136   u8 last_entry;
137
138   /* Flag bits */
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)
143
144   /* values 0x0, 0x4 - 0x7 are reserved */
145   u8 flags;
146   u16 tag;
147
148   /* The segment elts */
149   ip6_address_t segments[0];
150 } __attribute__ ((packed)) ip6_sr_header_t;
151
152 typedef struct
153 {
154   u8 type;
155   u8 length;
156   u8 value[0];
157 } __attribute__ ((packed)) ip6_sr_tlv_t;
158
159 /*
160 * fd.io coding-style-patch-verification: ON
161 *
162 * Local Variables:
163 * eval: (c-set-style "gnu")
164 * End:
165 */
166
167 #endif /* included_vnet_sr_packet_h */