Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 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 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 23 | /* |
| 24 | * The Segment Routing Header (SRH) is defined as follows: |
Keith Burns (alagalah) | 7214cf1 | 2016-08-08 15:56:50 -0700 | [diff] [blame] | 25 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 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 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 31 | * | Last Entry | Flags | Tag | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 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 Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 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 | * |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 64 | * o Segments Left. Defined in [RFC8200], it contains the index, in |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 65 | * the Segment List, of the next segment to inspect. Segments Left |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 66 | * is decremented at each segment. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 67 | * |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 68 | * o Last Entry: contains the index (zero based), in the Segment List, |
| 69 | * of the the last element of the Segment List |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 70 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 71 | * o Flags: 8 bits of flags. Following flags are defined: |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 72 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 73 | * 0 1 2 3 4 5 6 7 |
| 74 | * +-+-+-+-+-+-+-+-+ |
| 75 | * |U|P|O|A|H| U | |
| 76 | * +-+-+-+-+-+-+-+-+ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 77 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 78 | * U: Unused and for future use. SHOULD be unset on transmission |
| 79 | * and MUST be ignored on receipt. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 80 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 81 | * P-flag: Protected flag. Set when the packet has been rerouted |
| 82 | * through FRR mechanism by an SR endpoint node. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 83 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 84 | * O-flag: OAM flag. When set, it indicates that this packet is |
| 85 | * an operations and management (OAM) packet. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 86 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 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. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 90 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 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. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 95 | * |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 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. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 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 | * |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 109 | * o Type Length Value (TLV) are described in Section 3.1. |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 110 | * |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 111 | */ |
| 112 | |
Chris Luke | 4b8b718 | 2016-05-25 14:39:47 -0400 | [diff] [blame] | 113 | #ifndef IPPROTO_IPV6_ROUTE |
| 114 | #define IPPROTO_IPV6_ROUTE 43 |
| 115 | #endif |
| 116 | |
| 117 | #define ROUTING_HEADER_TYPE_SR 4 |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 118 | |
Keith Burns (alagalah) | 06c5ffd | 2016-08-06 08:32:45 -0700 | [diff] [blame] | 119 | typedef struct |
| 120 | { |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 121 | /* Protocol for next header. */ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 122 | u8 protocol; |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 123 | /* |
Damjan Marion | 607de1a | 2016-08-16 22:53:54 +0200 | [diff] [blame] | 124 | * Length of routing header in 8 octet units, |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 125 | * not including the first 8 octets |
| 126 | */ |
| 127 | u8 length; |
| 128 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 129 | /* Type of routing header; type 4 = segement routing */ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 130 | u8 type; |
| 131 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 132 | /* Next segment in the segment list */ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 133 | u8 segments_left; |
| 134 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 135 | /* Pointer to the first segment in the header */ |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 136 | u8 last_entry; |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 137 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 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) |
Keith Burns (alagalah) | 06c5ffd | 2016-08-06 08:32:45 -0700 | [diff] [blame] | 143 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 144 | /* values 0x0, 0x4 - 0x7 are reserved */ |
| 145 | u8 flags; |
Ahmed Abdelsalam | be83704 | 2019-06-20 11:18:57 +0000 | [diff] [blame] | 146 | u16 tag; |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 147 | |
| 148 | /* The segment elts */ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 149 | ip6_address_t segments[0]; |
Keith Burns (alagalah) | 06c5ffd | 2016-08-06 08:32:45 -0700 | [diff] [blame] | 150 | } __attribute__ ((packed)) ip6_sr_header_t; |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 151 | |
Pablo Camarillo | fb38095 | 2016-12-07 18:34:18 +0100 | [diff] [blame] | 152 | /* |
| 153 | * fd.io coding-style-patch-verification: ON |
| 154 | * |
| 155 | * Local Variables: |
| 156 | * eval: (c-set-style "gnu") |
| 157 | * End: |
| 158 | */ |
Ed Warnicke | cb9cada | 2015-12-08 15:45:58 -0700 | [diff] [blame] | 159 | |
| 160 | #endif /* included_vnet_sr_packet_h */ |