ip: improve check_adj_port_range_x1 22/33122/1
authorDamjan Marion <damarion@cisco.com>
Wed, 14 Jul 2021 09:30:00 +0000 (11:30 +0200)
committerDamjan Marion <damarion@cisco.com>
Wed, 14 Jul 2021 09:33:39 +0000 (11:33 +0200)
Type: improvement
Change-Id: I8337f81fdcd196fcb0e61f8129fec322e9a1e8f1
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vnet/ip/ip4_source_and_port_range_check.c

index fe5c1f2..210d5b2 100644 (file)
@@ -99,48 +99,18 @@ static inline u32
 check_adj_port_range_x1 (const protocol_port_range_dpo_t * ppr_dpo,
                         u16 dst_port, u32 next)
 {
-  u16x8vec_t key;
-  u16x8vec_t diff1;
-  u16x8vec_t diff2;
-  u16x8vec_t sum, sum_equal_diff2;
-  u16 sum_nonzero, sum_equal, winner_mask;
+  u16x8 key = u16x8_splat (dst_port);
   int i;
 
   if (NULL == ppr_dpo || dst_port == 0)
     return IP4_SOURCE_AND_PORT_RANGE_CHECK_NEXT_DROP;
 
-  /* Make the obvious screw-case work. A variant also works w/ no MMX */
-  if (PREDICT_FALSE (dst_port == 65535))
-    {
-      int j;
-
-      for (i = 0;
-          i < VLIB_BUFFER_PRE_DATA_SIZE / sizeof (protocol_port_range_t);
-          i++)
-       {
-         for (j = 0; j < 8; j++)
-           if (ppr_dpo->blocks[i].low.as_u16[j] == 65535)
-             return next;
-       }
-      return IP4_SOURCE_AND_PORT_RANGE_CHECK_NEXT_DROP;
-    }
-
-  key.as_u16x8 = u16x8_splat (dst_port);
 
   for (i = 0; i < ppr_dpo->n_used_blocks; i++)
-    {
-      diff1.as_u16x8 =
-       u16x8_sub_saturate (ppr_dpo->blocks[i].low.as_u16x8, key.as_u16x8);
-      diff2.as_u16x8 =
-       u16x8_sub_saturate (ppr_dpo->blocks[i].hi.as_u16x8, key.as_u16x8);
-      sum.as_u16x8 = diff1.as_u16x8 + diff2.as_u16x8;
-      sum_equal_diff2.as_u16x8 = (sum.as_u16x8 == diff2.as_u16x8);
-      sum_nonzero = ~u16x8_zero_byte_mask (sum.as_u16x8);
-      sum_equal = ~u16x8_zero_byte_mask (sum_equal_diff2.as_u16x8);
-      winner_mask = sum_nonzero & sum_equal;
-      if (winner_mask)
-       return next;
-    }
+    if (!u16x8_is_all_zero ((ppr_dpo->blocks[i].low.as_u16x8 >= key) &
+                           (ppr_dpo->blocks[i].hi.as_u16x8 <= key)))
+      return next;
+
   return IP4_SOURCE_AND_PORT_RANGE_CHECK_NEXT_DROP;
 }