X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip6_neighbor.c;h=177bcc14a7d73dc6e5cb43ab36b5d0af6f825f51;hb=cd35e53c928f666e50342e27d69e6dd7d60e1283;hp=8466ba70313500762a08017a09be2434b9a7b641;hpb=0bdd319b3b5d7d4037605f9baba8889d30bd1717;p=vpp.git diff --git a/src/vnet/ip/ip6_neighbor.c b/src/vnet/ip/ip6_neighbor.c index 8466ba70313..177bcc14a7d 100755 --- a/src/vnet/ip/ip6_neighbor.c +++ b/src/vnet/ip/ip6_neighbor.c @@ -2653,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; @@ -2780,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); @@ -2968,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) @@ -3163,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; @@ -3172,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; @@ -3193,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]; @@ -3224,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; @@ -3571,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)); @@ -4677,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;