nat: improve icmp type detection performance
[vpp.git] / src / plugins / nat / lib / inlines.h
index fe1f7dd..24e3ba8 100644 (file)
 
 #include <vnet/ip/icmp46_packet.h>
 
-always_inline nat_protocol_t
-ip_proto_to_nat_proto (u8 ip_proto)
-{
-  static const nat_protocol_t lookup_table[256] = {
-    [IP_PROTOCOL_TCP] = NAT_PROTOCOL_TCP,
-    [IP_PROTOCOL_UDP] = NAT_PROTOCOL_UDP,
-    [IP_PROTOCOL_ICMP] = NAT_PROTOCOL_ICMP,
-    [IP_PROTOCOL_ICMP6] = NAT_PROTOCOL_ICMP,
-  };
-
-  return lookup_table[ip_proto];
-}
-
-static_always_inline u8
-nat_proto_to_ip_proto (nat_protocol_t nat_proto)
-{
-  ASSERT (nat_proto <= NAT_PROTOCOL_ICMP);
-
-  static const u8 lookup_table[256] = {
-    [NAT_PROTOCOL_OTHER] = ~0,
-    [NAT_PROTOCOL_TCP] = IP_PROTOCOL_TCP,
-    [NAT_PROTOCOL_UDP] = IP_PROTOCOL_UDP,
-    [NAT_PROTOCOL_ICMP] = IP_PROTOCOL_ICMP,
-  };
-
-  ASSERT (NAT_PROTOCOL_OTHER == nat_proto || NAT_PROTOCOL_TCP == nat_proto
-         || NAT_PROTOCOL_UDP == nat_proto || NAT_PROTOCOL_ICMP == nat_proto);
-
-  return lookup_table[nat_proto];
-}
-
-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__ */