X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip6.h;h=6e0cfff5164df59b64d88d39d5b7c8faa3092055;hb=2af0e3a;hp=6f6724b390393ad03b8ced081e0e9c207c96c1c6;hpb=9f781d84b0943b03af2a9fd0b7c4cef721d1d4c6;p=vpp.git diff --git a/src/vnet/ip/ip6.h b/src/vnet/ip/ip6.h index 6f6724b3903..6e0cfff5164 100644 --- a/src/vnet/ip/ip6.h +++ b/src/vnet/ip/ip6.h @@ -40,7 +40,6 @@ #ifndef included_ip_ip6_h #define included_ip_ip6_h -#include #include #include #include @@ -50,6 +49,7 @@ #include #include #include +#include /* * Default size of the ip6 fib hash table @@ -219,8 +219,13 @@ typedef struct ip6_main_t /* HBH processing enabled? */ u8 hbh_enabled; + + /** ND throttling */ + throttle_t nd_throttle; } ip6_main_t; +#define ND_THROTTLE_BITS 512 + /* Global ip6 main structure. */ extern ip6_main_t ip6_main; @@ -354,7 +359,7 @@ ip6_address_t *ip6_interface_first_address (ip6_main_t * im, u32 sw_if_index); int ip6_address_compare (ip6_address_t * a1, ip6_address_t * a2); clib_error_t *ip6_probe_neighbor (vlib_main_t * vm, ip6_address_t * dst, - u32 sw_if_index); + u32 sw_if_index, u8 refresh); uword ip6_udp_register_listener (vlib_main_t * vm, @@ -463,7 +468,6 @@ ip6_compute_flow_hash (const ip6_header_t * ip, a = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ? t2 : t1; b = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ? t1 : t2; - b ^= (flow_hash_config & IP_FLOW_HASH_PROTO) ? protocol : 0; t1 = is_tcp_udp ? tcp->src : 0; t2 = is_tcp_udp ? tcp->dst : 0; @@ -471,6 +475,23 @@ ip6_compute_flow_hash (const ip6_header_t * ip, t1 = (flow_hash_config & IP_FLOW_HASH_SRC_PORT) ? t1 : 0; t2 = (flow_hash_config & IP_FLOW_HASH_DST_PORT) ? t2 : 0; + if (flow_hash_config & IP_FLOW_HASH_SYMMETRIC) + { + if (b < a) + { + c = a; + a = b; + b = c; + } + if (t2 < t1) + { + t2 += t1; + t1 = t2 - t1; + t2 = t2 - t1; + } + } + + b ^= (flow_hash_config & IP_FLOW_HASH_PROTO) ? protocol : 0; c = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ? ((t1 << 16) | t2) : ((t2 << 16) | t1); @@ -611,10 +632,10 @@ vlib_buffer_push_ip6 (vlib_main_t * vm, vlib_buffer_t * b, ip6h->hop_limit = 0xff; ip6h->protocol = proto; - clib_memcpy (ip6h->src_address.as_u8, src->as_u8, - sizeof (ip6h->src_address)); - clib_memcpy (ip6h->dst_address.as_u8, dst->as_u8, - sizeof (ip6h->src_address)); + clib_memcpy_fast (ip6h->src_address.as_u8, src->as_u8, + sizeof (ip6h->src_address)); + clib_memcpy_fast (ip6h->dst_address.as_u8, dst->as_u8, + sizeof (ip6h->src_address)); b->flags |= VNET_BUFFER_F_IS_IP6; return ip6h;