u16 as_u16[8];
u32 as_u32[4];
u64 as_u64[2];
+ u64x2 as_u128;
uword as_uword[16 / sizeof (uword)];
}
-ip6_address_t;
+__clib_packed ip6_address_t;
+
+STATIC_ASSERT_SIZEOF (ip6_address_t, 16);
typedef struct
{
ip6_address_t src_address, dst_address;
} ip6_header_t;
+#define IP6_PACKET_TC_MASK 0x0FF00000
+#define IP6_PACKET_DSCP_MASK 0x0FC00000
+#define IP6_PACKET_ECN_MASK 0x00300000
+#define IP6_PACKET_FL_MASK 0x000FFFFF
+
always_inline ip_dscp_t
ip6_traffic_class (const ip6_header_t * i)
{
- return (i->ip_version_traffic_class_and_flow_label & 0x0FF00000) >> 20;
+ return (i->ip_version_traffic_class_and_flow_label & IP6_PACKET_TC_MASK) >>
+ 20;
}
static_always_inline ip_dscp_t
ip6_traffic_class_network_order (const ip6_header_t * ip6)
{
return (clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label)
- & 0x0ff00000) >> 20;
+ & IP6_PACKET_TC_MASK) >> 20;
}
static_always_inline ip_dscp_t
ip6_dscp_network_order (const ip6_header_t * ip6)
{
return (clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label)
- & 0x0fc00000) >> 22;
+ & IP6_PACKET_DSCP_MASK) >> 22;
}
static_always_inline ip_ecn_t
ip6_ecn_network_order (const ip6_header_t * ip6)
{
return (clib_net_to_host_u32 (ip6->ip_version_traffic_class_and_flow_label)
- & 0x00300000) >> 20;
+ & IP6_PACKET_ECN_MASK) >> 20;
}
static_always_inline void
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)
{