X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvnet%2Fip%2Fip6_packet.h;h=abbea5c46a1488ad29847a2437e8bc774d48d316;hb=refs%2Fchanges%2F83%2F18483%2F2;hp=97d33713d3ca786762e76744b9207a44568fb383;hpb=b7b929931a07fbb27b43d5cd105f366c3e29807e;p=vpp.git diff --git a/src/vnet/ip/ip6_packet.h b/src/vnet/ip/ip6_packet.h index 97d33713d3c..abbea5c46a1 100644 --- a/src/vnet/ip/ip6_packet.h +++ b/src/vnet/ip/ip6_packet.h @@ -181,6 +181,13 @@ ip46_address_is_multicast (const ip46_address_t * a) ip6_address_is_multicast (&a->ip6); } +always_inline void +ip6_address_copy (ip6_address_t * dst, const ip6_address_t * src) +{ + dst->as_u64[0] = src->as_u64[0]; + dst->as_u64[1] = src->as_u64[1]; +} + always_inline void ip6_set_reserved_multicast_address (ip6_address_t * a, ip6_multicast_address_scope_t scope, @@ -347,6 +354,18 @@ ip6_is_solicited_node_multicast_address (const ip6_address_t * a) && a->as_u8[12] == 0xff); } +always_inline u32 +ip6_address_hash_to_u32 (const ip6_address_t * a) +{ + return (a->as_u32[0] ^ a->as_u32[1] ^ a->as_u32[2] ^ a->as_u32[3]); +} + +always_inline u64 +ip6_address_hash_to_u64 (const ip6_address_t * a) +{ + return (a->as_u64[0] ^ a->as_u64[1]); +} + typedef struct { /* 4 bit version, 8 bit traffic class and 20 bit flow label. */ @@ -494,16 +513,36 @@ typedef CLIB_PACKED (struct { u8 n_data_u64s; }) ip6_ext_header_t; +#define foreach_ext_hdr_type \ + _(IP6_HOP_BY_HOP_OPTIONS) \ + _(IPV6_ROUTE) \ + _(IPV6_FRAGMENTATION) \ + _(IPSEC_ESP) \ + _(IPSEC_AH) \ + _(IP6_DESTINATION_OPTIONS) \ + _(MOBILITY) \ + _(HIP) \ + _(SHIM6) + always_inline u8 ip6_ext_hdr(u8 nexthdr) { +#ifdef CLIB_HAVE_VEC128 + static const u8x16 ext_hdr_types = { +#define _(x) IP_PROTOCOL_##x, + foreach_ext_hdr_type +#undef _ + }; + + return !u8x16_is_all_zero (ext_hdr_types == u8x16_splat (nexthdr)); +#else /* * find out if nexthdr is an extension header or a protocol */ - return (nexthdr == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS) || - (nexthdr == IP_PROTOCOL_IPV6_FRAGMENTATION) || - (nexthdr == IP_PROTOCOL_IPSEC_AH) || - (nexthdr == IP_PROTOCOL_IPV6_ROUTE) || - (nexthdr == IP_PROTOCOL_IP6_DESTINATION_OPTIONS); + return 0 +#define _(x) || (nexthdr == IP_PROTOCOL_##x) + foreach_ext_hdr_type; +#undef _ +#endif } #define ip6_ext_header_len(p) ((((ip6_ext_header_t *)(p))->n_data_u64s+1) << 3)