aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2019-03-22 13:58:08 +0100
committerFlorin Coras <florin.coras@gmail.com>2019-03-22 17:31:15 +0000
commit831d23866ab1010a7d7343aa1df024c8b65790b9 (patch)
tree1008035e4b707564ed055be748dfa5a2962d98b6
parent3e2e1907d485ed321f99350dd46e6822db6ac4d4 (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.h30
-rw-r--r--src/vnet/ip/protocols.def15
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)