tunnel: support copying TTL and flow label from inner to outer
[vpp.git] / src / vnet / ip / ip6_packet.h
index 1be2cea..7a8c31c 100644 (file)
@@ -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)
 {