nat: improve icmp type detection performance 96/26896/5
authorKlement Sekera <ksekera@cisco.com>
Wed, 6 May 2020 10:11:36 +0000 (10:11 +0000)
committerOle Tr�an <otroan@employees.org>
Tue, 10 May 2022 16:03:09 +0000 (16:03 +0000)
Replace code with branchless code.

Type: improvement

Signed-off-by: Klement Sekera <ksekera@cisco.com>
Change-Id: Ic38a20ad33483c1c26f90a927f8b963b0ead4a87

src/plugins/nat/lib/inlines.h

index 46be64d..24e3ba8 100644 (file)
 
 #include <vnet/ip/icmp46_packet.h>
 
-static_always_inline u8
+static_always_inline u64
 icmp_type_is_error_message (u8 icmp_type)
 {
-  switch (icmp_type)
-    {
-    case ICMP4_destination_unreachable:
-    case ICMP4_time_exceeded:
-    case ICMP4_parameter_problem:
-    case ICMP4_source_quench:
-    case ICMP4_redirect:
-    case ICMP4_alternate_host_address:
-      return 1;
-    }
-  return 0;
+  int bmp = 0;
+  bmp |= 1 << ICMP4_destination_unreachable;
+  bmp |= 1 << ICMP4_time_exceeded;
+  bmp |= 1 << ICMP4_parameter_problem;
+  bmp |= 1 << ICMP4_source_quench;
+  bmp |= 1 << ICMP4_redirect;
+  bmp |= 1 << ICMP4_alternate_host_address;
+
+  return (1ULL << icmp_type) & bmp;
 }
 
 #endif /* included_nat_inlines_h__ */