#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;
extern vlib_node_registration_t ip6_glean_node;
extern vlib_node_registration_t ip6_midchain_node;
+extern void ip6_forward_next_trace (vlib_main_t * vm,
+ vlib_node_runtime_t * node,
+ vlib_frame_t * frame,
+ vlib_rx_or_tx_t which_adj_index);
+
always_inline uword
ip6_destination_matches_route (const ip6_main_t * im,
const ip6_address_t * key,
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);
u32 ip6_tcp_udp_icmp_validate_checksum (vlib_main_t * vm, vlib_buffer_t * p0);
+void ip6_punt_policer_add_del (u8 is_add, u32 policer_index);
+void ip6_punt_redirect_add (u32 rx_sw_if_index,
+ u32 tx_sw_if_index, ip46_address_t * nh);
+void ip6_punt_redirect_del (u32 rx_sw_if_index);
+
int vnet_set_ip6_classify_intfc (vlib_main_t * vm, u32 sw_if_index,
u32 table_index);
extern vlib_node_registration_t ip6_lookup_node;
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;