BD ARP entry use common API types
[vpp.git] / src / vnet / ip / ip6_neighbor.c
index a54f9e9..177bcc1 100755 (executable)
@@ -414,8 +414,9 @@ static void ip6_neighbor_set_unset_rpc_callback
 static void set_unset_ip6_neighbor_rpc
   (vlib_main_t * vm,
    u32 sw_if_index,
-   ip6_address_t * a, u8 * link_layer_address, int is_add, int is_static,
-   int is_no_fib_entry)
+   const ip6_address_t * a,
+   const u8 * link_layer_address,
+   int is_add, int is_static, int is_no_fib_entry)
 {
   ip6_neighbor_set_unset_rpc_args_t args;
   void vl_api_rpc_call_main_thread (void *fp, u8 * data, u32 data_length);
@@ -772,8 +773,8 @@ force_reuse_neighbor_entry (void)
 int
 vnet_set_ip6_ethernet_neighbor (vlib_main_t * vm,
                                u32 sw_if_index,
-                               ip6_address_t * a,
-                               u8 * link_layer_address,
+                               const ip6_address_t * a,
+                               const u8 * link_layer_address,
                                uword n_bytes_link_layer_address,
                                int is_static, int is_no_fib_entry)
 {
@@ -895,7 +896,7 @@ check_customers:
          pool_put (nm->pending_resolutions, pr);
        }
 
-      mhash_unset (&nm->pending_resolutions_by_address, a, 0);
+      mhash_unset (&nm->pending_resolutions_by_address, (void *) a, 0);
     }
 
   /* Customer(s) requesting ND event for this address? */
@@ -914,7 +915,8 @@ check_customers:
          /* Call the user's data callback, return 1 to suppress dup events */
          if (fp)
            rv =
-             (*fp) (mc->data, link_layer_address, sw_if_index, &ip6a_zero);
+             (*fp) (mc->data, (u8 *) link_layer_address, sw_if_index,
+                    &ip6a_zero);
          /*
           * Signal the resolver process, as long as the user
           * says they want to be notified
@@ -931,10 +933,7 @@ check_customers:
 
 int
 vnet_unset_ip6_ethernet_neighbor (vlib_main_t * vm,
-                                 u32 sw_if_index,
-                                 ip6_address_t * a,
-                                 u8 * link_layer_address,
-                                 uword n_bytes_link_layer_address)
+                                 u32 sw_if_index, const ip6_address_t * a)
 {
   ip6_neighbor_main_t *nm = &ip6_neighbor_main;
   ip6_neighbor_key_t k;
@@ -944,7 +943,7 @@ vnet_unset_ip6_ethernet_neighbor (vlib_main_t * vm,
 
   if (vlib_get_thread_index ())
     {
-      set_unset_ip6_neighbor_rpc (vm, sw_if_index, a, link_layer_address,
+      set_unset_ip6_neighbor_rpc (vm, sw_if_index, a, NULL,
                                  0 /* unset */ , 0, 0);
       return 0;
     }
@@ -983,8 +982,7 @@ static void ip6_neighbor_set_unset_rpc_callback
                                    a->link_layer_address, 6, a->is_static,
                                    a->is_no_fib_entry);
   else
-    vnet_unset_ip6_ethernet_neighbor (vm, a->sw_if_index, &a->addr,
-                                     a->link_layer_address, 6);
+    vnet_unset_ip6_ethernet_neighbor (vm, a->sw_if_index, &a->addr);
 }
 
 static int
@@ -1122,8 +1120,7 @@ set_ip6_neighbor (vlib_main_t * vm,
                                    mac_address, sizeof (mac_address),
                                    is_static, is_no_fib_entry);
   else
-    vnet_unset_ip6_ethernet_neighbor (vm, sw_if_index, &addr,
-                                     mac_address, sizeof (mac_address));
+    vnet_unset_ip6_ethernet_neighbor (vm, sw_if_index, &addr);
   return 0;
 }
 
@@ -2656,7 +2653,7 @@ ip6_neighbor_sw_interface_add_del (vnet_main_t * vnm,
          nm->if_radv_pool_index_by_sw_if_index[sw_if_index] = ri;
 
          /* initialize default values (most of which are zero) */
-         memset (a, 0, sizeof (a[0]));
+         clib_memset (a, 0, sizeof (a[0]));
 
          a->sw_if_index = sw_if_index;
          a->max_radv_interval = DEF_MAX_RADV_INTERVAL;
@@ -2783,7 +2780,7 @@ ip6_neighbor_send_mldpv2_report (u32 sw_if_index)
   ip0 = (ip6_header_t *) & rp0->ip;
   rh0 = (icmp6_multicast_listener_report_header_t *) & rp0->report_hdr;
 
-  memset (rp0, 0x0, sizeof (icmp6_multicast_listener_report_packet_t));
+  clib_memset (rp0, 0x0, sizeof (icmp6_multicast_listener_report_packet_t));
 
   ip0->ip_version_traffic_class_and_flow_label =
     clib_host_to_net_u32 (0x6 << 28);
@@ -2971,7 +2968,7 @@ ip6_neighbor_process_timer_event (vlib_main_t * vm,
 
         h0 =  vlib_buffer_get_current (b0);
 
-        memset (h0, 0, sizeof (icmp6_router_solicitation_header_t));
+        clib_memset (h0, 0, sizeof (icmp6_router_solicitation_header_t));
 
         h0->ip.ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (0x6 << 28);
         h0->ip.payload_length = clib_host_to_net_u16 (sizeof (icmp6_router_solicitation_header_t)
@@ -3166,7 +3163,6 @@ ip6_discover_neighbor_inline (vlib_main_t * vm,
   ip_lookup_main_t *lm = &im->lookup_main;
   u32 *from, *to_next_drop;
   uword n_left_from, n_left_to_next_drop;
-  f64 time_now;
   u64 seed;
   u32 thread_index = vm->thread_index;
   int bogus_length;
@@ -3175,16 +3171,7 @@ ip6_discover_neighbor_inline (vlib_main_t * vm,
   if (node->flags & VLIB_NODE_FLAG_TRACE)
     ip6_forward_next_trace (vm, node, frame, VLIB_TX);
 
-  time_now = vlib_time_now (vm);
-  if (time_now - im->nd_throttle_last_seed_change_time[thread_index] > 1e-3)
-    {
-      (void) random_u64 (&im->nd_throttle_seeds[thread_index]);
-      memset (im->nd_throttle_bitmaps[thread_index], 0,
-             ND_THROTTLE_BITS / BITS (u8));
-
-      im->nd_throttle_last_seed_change_time[thread_index] = time_now;
-    }
-  seed = im->nd_throttle_seeds[thread_index];
+  seed = throttle_seed (&im->nd_throttle, thread_index, vlib_time_now (vm));
 
   from = vlib_frame_vector_args (frame);
   n_left_from = frame->n_vectors;
@@ -3196,15 +3183,12 @@ ip6_discover_neighbor_inline (vlib_main_t * vm,
 
       while (n_left_from > 0 && n_left_to_next_drop > 0)
        {
-         vlib_buffer_t *p0;
-         ip6_header_t *ip0;
-         u32 pi0, adj_index0, w0, sw_if_index0, drop0;
-         u64 r0;
-         uword m0;
-         ip_adjacency_t *adj0;
+         u32 pi0, adj_index0, sw_if_index0, drop0, r0, next0;
          vnet_hw_interface_t *hw_if0;
          ip6_radv_t *radv_info;
-         u32 next0;
+         ip_adjacency_t *adj0;
+         vlib_buffer_t *p0;
+         ip6_header_t *ip0;
 
          pi0 = from[0];
 
@@ -3227,18 +3211,10 @@ ip6_discover_neighbor_inline (vlib_main_t * vm,
          sw_if_index0 = adj0->rewrite_header.sw_if_index;
          vnet_buffer (p0)->sw_if_index[VLIB_TX] = sw_if_index0;
 
-         /* Compute the ND throttle bitmap hash */
-         r0 = ip0->dst_address.as_u64[0] ^ ip0->dst_address.as_u64[1] ^ seed;
-
-         /* Find the word and bit */
-         r0 &= ND_THROTTLE_BITS - 1;
-         w0 = r0 / BITS (uword);
-         m0 = (uword) 1 << (r0 % BITS (uword));
+         /* combine the address and interface for a hash */
+         r0 = ip6_address_hash_to_u64 (&ip0->dst_address) ^ sw_if_index0;
 
-         /* If the bit is set, drop the ND request */
-         drop0 = (im->nd_throttle_bitmaps[thread_index][w0] & m0) != 0;
-         /* (unconditionally) mark the bit "inuse" */
-         im->nd_throttle_bitmaps[thread_index][w0] |= m0;
+         drop0 = throttle_check (&im->nd_throttle, thread_index, r0, seed);
 
          from += 1;
          n_left_from -= 1;
@@ -3574,7 +3550,7 @@ ip6_neighbor_ra_prefix (vlib_main_t * vm, u32 sw_if_index,
          mhash_set (&radv_info->address_to_prefix_index, prefix_addr, pi,
                     /* old_value */ 0);
 
-         memset (prefix, 0x0, sizeof (ip6_radv_prefix_t));
+         clib_memset (prefix, 0x0, sizeof (ip6_radv_prefix_t));
 
          prefix->prefix_len = prefix_len;
          clib_memcpy (&prefix->prefix, prefix_addr, sizeof (ip6_address_t));
@@ -4680,7 +4656,7 @@ ip6_neighbor_init (vlib_main_t * vm)
 
   /* add call backs */
   ip6_add_del_interface_address_callback_t cb;
-  memset (&cb, 0x0, sizeof (ip6_add_del_interface_address_callback_t));
+  clib_memset (&cb, 0x0, sizeof (ip6_add_del_interface_address_callback_t));
 
   /* when an interface address changes... */
   cb.function = ip6_neighbor_add_del_interface_address;
@@ -4928,8 +4904,7 @@ ip6_neighbor_proxy_add_del (u32 sw_if_index, ip6_address_t * addr, u8 is_del)
                                   sw_if_index,
                                   ~0, 1, FIB_ROUTE_PATH_FLAG_NONE);
       /* flush the ND cache of this address if it's there */
-      vnet_unset_ip6_ethernet_neighbor (vlib_get_main (),
-                                       sw_if_index, addr, NULL, 0);
+      vnet_unset_ip6_ethernet_neighbor (vlib_get_main (), sw_if_index, addr);
     }
   else
     {