aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ip
diff options
context:
space:
mode:
authorNeale Ranns <neale@graphiant.com>2021-02-04 11:02:52 +0000
committerOle Tr�an <otroan@employees.org>2021-02-08 11:44:00 +0000
commita91cb45909642978592c7e21a8f6d2da2e44e506 (patch)
treeeab3c645e03cba2707555647cb61e83ffedef42f /src/vnet/ip
parent7d527a2292bdabc84ff070f5b27f35c0e858cddd (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.h12
-rw-r--r--src/vnet/ip/ip6_packet.h39
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)
{