#ifndef included_ip_ip6_h
#define included_ip_ip6_h
-#include <vlib/mc.h>
#include <vlib/buffer.h>
#include <vnet/ethernet/packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vppinfra/bihash_24_8.h>
#include <vppinfra/bihash_template.h>
#include <vnet/util/radix.h>
+#include <vnet/util/throttle.h>
/*
* Default size of the ip6 fib hash table
typedef struct
{
+ /* required for pool_get_aligned. */
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
+
/* Table ID (hash key) for this FIB. */
u32 table_id;
/* 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;
return 1;
}
+extern int ip6_get_ll_address (u32 sw_if_index, ip6_address_t * addr);
+
always_inline int
ip6_src_address_for_packet (ip_lookup_main_t * lm,
- u32 sw_if_index, ip6_address_t * src)
+ u32 sw_if_index,
+ const ip6_address_t * dst, ip6_address_t * src)
{
- u32 if_add_index = lm->if_address_pool_index_by_sw_if_index[sw_if_index];
- if (PREDICT_TRUE (if_add_index != ~0))
+ if (ip6_address_is_link_local_unicast (dst))
{
- ip_interface_address_t *if_add =
- pool_elt_at_index (lm->if_address_pool, if_add_index);
- ip6_address_t *if_ip = ip_interface_address_get_address (lm, if_add);
- *src = *if_ip;
- return (0);
+ return ip6_get_ll_address (sw_if_index, src);
}
else
{
- src->as_u64[0] = 0;
- src->as_u64[1] = 0;
+ u32 if_add_index =
+ lm->if_address_pool_index_by_sw_if_index[sw_if_index];
+ if (PREDICT_TRUE (if_add_index != ~0))
+ {
+ ip_interface_address_t *if_add =
+ pool_elt_at_index (lm->if_address_pool, if_add_index);
+ ip6_address_t *if_ip =
+ ip_interface_address_get_address (lm, if_add);
+ *src = *if_ip;
+ return (!0);
+ }
}
- return (!0);
+
+ src->as_u64[0] = 0;
+ src->as_u64[1] = 0;
+
+ return (0);
}
/* Find interface address which matches destination. */
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,
ethernet_header_t * eth,
ip6_header_t * ip, u32 sw_if_index, u16 bd_index);
-void send_ip6_na (vlib_main_t * vm, vnet_hw_interface_t * hi);
+void send_ip6_na (vlib_main_t * vm, u32 sw_if_index);
+void send_ip6_na_w_addr (vlib_main_t * vm,
+ const ip6_address_t * addr, u32 sw_if_index);
u8 *format_ip6_forward_next_trace (u8 * s, va_list * args);