diff options
author | Damjan Marion <damarion@cisco.com> | 2019-03-22 13:58:08 +0100 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2019-03-22 17:31:15 +0000 |
commit | 831d23866ab1010a7d7343aa1df024c8b65790b9 (patch) | |
tree | 1008035e4b707564ed055be748dfa5a2962d98b6 | |
parent | 3e2e1907d485ed321f99350dd46e6822db6ac4d4 (diff) |
ipv6: vectorized ext header check
Change-Id: I454bb01153d1d0536c4a6fe36103e7721aad8cd1
Signed-off-by: Damjan Marion <damarion@cisco.com>
-rw-r--r-- | src/vnet/ip/ip6_packet.h | 30 | ||||
-rw-r--r-- | src/vnet/ip/protocols.def | 15 |
2 files changed, 35 insertions, 10 deletions
diff --git a/src/vnet/ip/ip6_packet.h b/src/vnet/ip/ip6_packet.h index 5d33cc77925..abbea5c46a1 100644 --- a/src/vnet/ip/ip6_packet.h +++ b/src/vnet/ip/ip6_packet.h @@ -513,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) diff --git a/src/vnet/ip/protocols.def b/src/vnet/ip/protocols.def index 4ec0bbc9284..e6c1f6379b0 100644 --- a/src/vnet/ip/protocols.def +++ b/src/vnet/ip/protocols.def @@ -158,10 +158,15 @@ ip_protocol (134, RSVP_E2E_IGNORE) ip_protocol (135, MOBILITY) ip_protocol (136, UDP_LITE) ip_protocol (137, MPLS_IN_IP) -/* - * VPPs way of dealing with fragments is to mark them as 0xfe, to be picked - * by the corresponding nodes based on this protocol - */ -ip_protocol (0xfe, VPP_FRAGMENTATION) +ip_protocol (138, MANET) +ip_protocol (139, HIP) +ip_protocol (140, SHIM6) +ip_protocol (141, WESP) +ip_protocol (142, ROHC) + +/* unassigned 143 - 252 */ + +ip_protocol (253, EXP1) +ip_protocol (254, EXP2) ip_protocol (255, RESERVED) |