diff options
author | Neale Ranns <neale@graphiant.com> | 2021-02-04 11:02:52 +0000 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2021-02-08 11:44:00 +0000 |
commit | a91cb45909642978592c7e21a8f6d2da2e44e506 (patch) | |
tree | eab3c645e03cba2707555647cb61e83ffedef42f /src/vnet/ip | |
parent | 7d527a2292bdabc84ff070f5b27f35c0e858cddd (diff) |
tunnel: support copying TTL and flow label from inner to outer
Type: feature
The added functionality is to support copying TTL and flow label from
inner to outer. The .api was extened to support expressing this and also
adding a common tunnel endpoint type. i find it best to make API changes
in one patch so there are less versions of the API.
Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: I755c1e3f4c475058792af39c1abeda92129efb76
Diffstat (limited to 'src/vnet/ip')
-rw-r--r-- | src/vnet/ip/ip4_packet.h | 12 | ||||
-rw-r--r-- | src/vnet/ip/ip6_packet.h | 39 |
2 files changed, 43 insertions, 8 deletions
diff --git a/src/vnet/ip/ip4_packet.h b/src/vnet/ip/ip4_packet.h index 06530926120..513a7449b54 100644 --- a/src/vnet/ip/ip4_packet.h +++ b/src/vnet/ip/ip4_packet.h @@ -359,6 +359,18 @@ ip4_header_get_ecn (const ip4_header_t * ip4) return (ip4->tos & IP_PACKET_TC_FIELD_ECN_MASK); } +always_inline u8 +ip4_header_get_ttl (const ip4_header_t *ip4) +{ + return (ip4->ttl); +} + +always_inline void +ip4_header_set_ttl (ip4_header_t *ip4, u8 ttl) +{ + ip4->ttl = ttl; +} + always_inline void ip4_header_set_df (ip4_header_t * ip4) { diff --git a/src/vnet/ip/ip6_packet.h b/src/vnet/ip/ip6_packet.h index 1be2ceae5a1..7a8c31cee48 100644 --- a/src/vnet/ip/ip6_packet.h +++ b/src/vnet/ip/ip6_packet.h @@ -343,13 +343,6 @@ ip6_ecn_network_order (const ip6_header_t * ip6) & IP6_PACKET_ECN_MASK) >> 20; } -static_always_inline u32 -ip6_flow_label_network_order (const ip6_header_t *ip6) -{ - return (clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label) & - IP6_PACKET_FL_MASK); -} - static_always_inline void ip6_set_traffic_class_network_order (ip6_header_t * ip6, ip_dscp_t dscp) { @@ -376,10 +369,40 @@ ip6_set_ecn_network_order (ip6_header_t * ip6, ip_ecn_t ecn) u32 tmp = clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label); tmp &= 0xffcfffff; - tmp |= (ecn << 20); + tmp |= ((0x3 & ecn) << 20); ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (tmp); } +static_always_inline u32 +ip6_flow_label_network_order (const ip6_header_t *ip6) +{ + u32 tmp = + clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label); + return (tmp & 0xfffff); +} + +static_always_inline void +ip6_set_flow_label_network_order (ip6_header_t *ip6, u32 flow_label) +{ + u32 tmp = + clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label); + tmp &= 0xfff00000; + tmp |= flow_label & 0x000fffff; + ip6->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (tmp); +} + +static_always_inline u32 +ip6_hop_limit_network_order (const ip6_header_t *ip6) +{ + return (ip6->hop_limit); +} + +static_always_inline void +ip6_set_hop_limit_network_order (ip6_header_t *ip6, u8 hop_limit) +{ + ip6->hop_limit = hop_limit; +} + always_inline void * ip6_next_header (ip6_header_t * i) { |