ipsec: perf improvement of ipsec4_input_node using flow cache
[vpp.git] / src / vnet / ip-neighbor / ip6_neighbor.c
index ca67d85..cf14954 100644 (file)
 
 #include <vnet/ip-neighbor/ip6_neighbor.h>
 #include <vnet/util/throttle.h>
+#include <vnet/fib/fib_sas.h>
+#include <vnet/ip/ip_sas.h>
 
 /** ND throttling */
 static throttle_t nd_throttle;
 
+VLIB_REGISTER_LOG_CLASS (ip6_neighbor_log, static) = {
+  .class_name = "ip6",
+  .subclass_name = "neighbor",
+};
+
+#define log_debug(fmt, ...)                                                   \
+  vlib_log_debug (ip6_neighbor_log.class, fmt, __VA_ARGS__)
 void
-ip6_neighbor_probe_dst (const ip_adjacency_t * adj, const ip6_address_t * dst)
+ip6_neighbor_probe_dst (u32 sw_if_index, const ip6_address_t * dst)
 {
-  ip_interface_address_t *ia;
-  ip6_address_t *src;
-
-  src = ip6_interface_address_matching_destination
-    (&ip6_main, dst, adj->rewrite_header.sw_if_index, &ia);
-
-  if (!src)
-    return;
+  ip6_address_t src;
 
-  ip6_neighbor_probe (vlib_get_main (), vnet_get_main (), adj, src, dst);
+  if (fib_sas6_get (sw_if_index, dst, &src) ||
+      ip6_sas_by_sw_if_index (sw_if_index, dst, &src))
+    ip6_neighbor_probe (vlib_get_main (), vnet_get_main (),
+                       sw_if_index, &src, dst);
 }
 
 void
@@ -51,9 +56,8 @@ ip6_neighbor_advertise (vlib_main_t * vm,
 
   if (addr)
     {
-      clib_warning
-       ("Sending unsolicitated NA IP6 address %U on sw_if_idex %d",
-        format_ip6_address, addr, sw_if_index);
+      log_debug ("Sending unsolicitated NA IP6 address %U on sw_if_idex %d",
+                format_ip6_address, addr, sw_if_index);
 
       /* Form unsolicited neighbor advertisement packet from NS pkt template */
       int bogus_length;
@@ -210,15 +214,16 @@ ip6_discover_neighbor_inline (vlib_main_t * vm,
           * Choose source address based on destination lookup
           * adjacency.
           */
-         if (!ip6_src_address_for_packet (sw_if_index0,
-                                          &ip0->dst_address, &src))
+         if (!fib_sas6_get (sw_if_index0, &ip0->dst_address, &src) ||
+             !ip6_sas_by_sw_if_index (sw_if_index0, &ip0->dst_address, &src))
            {
              /* There is no address on the interface */
              p0->error = node->errors[IP6_NBR_ERROR_NO_SOURCE_ADDRESS];
              continue;
            }
 
-         b0 = ip6_neighbor_probe (vm, vnm, adj0, &src, &ip0->dst_address);
+         b0 = ip6_neighbor_probe (vm, vnm, sw_if_index0,
+                                  &src, &ip0->dst_address);
 
          if (PREDICT_TRUE (NULL != b0))
            {