X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip6.h;h=bc89a0821ae46f2b3326fd9828b9f2baf40c2e2d;hb=c3a06556d1a4a63646d4cc7aa76274177a56c13f;hp=cf40fbb37aa5f40222feaf5079cb489f6dce3a1d;hpb=78372a9a55098ad43c4d6d941b640cce4ff24226;p=vpp.git diff --git a/src/vnet/ip/ip6.h b/src/vnet/ip/ip6.h index cf40fbb37aa..bc89a0821ae 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 @@ -66,14 +65,14 @@ typedef struct typedef struct { + /* required for pool_get_aligned. */ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + /* Table ID (hash key) for this FIB. */ u32 table_id; /* Index into FIB vector. */ u32 index; - - /* flow hash configuration */ - flow_hash_config_t flow_hash_config; } ip6_fib_t; typedef struct ip6_mfib_t @@ -106,6 +105,16 @@ typedef struct uword function_opaque; } ip6_add_del_interface_address_callback_t; +typedef void (ip6_table_bind_function_t) + (struct ip6_main_t * im, + uword opaque, u32 sw_if_index, u32 new_fib_index, u32 old_fib_index); + +typedef struct +{ + ip6_table_bind_function_t *function; + uword function_opaque; +} ip6_table_bind_callback_t; + /** * Enumeration of the FIB table instance types */ @@ -153,6 +162,9 @@ typedef struct ip6_main_t /* Pool of FIBs. */ struct fib_table_t_ *fibs; + /* Pool of V6 FIBs. */ + ip6_fib_t *v6_fibs; + /** Vector of MFIBs. */ struct mfib_table_t_ *mfibs; @@ -183,6 +195,9 @@ typedef struct ip6_main_t ip6_add_del_interface_address_callback_t * add_del_interface_address_callbacks; + /** Functions to call when interface to table biding changes. */ + ip6_table_bind_callback_t *table_bind_callbacks; + /* Template used to generate IP6 neighbor solicitation packets. */ vlib_packet_template_t discover_neighbor_packet_template; @@ -203,8 +218,16 @@ typedef struct ip6_main_t /* HBH processing enabled? */ u8 hbh_enabled; + + /** ND throttling */ + uword **nd_throttle_bitmaps; + u64 *nd_throttle_seeds; + f64 *nd_throttle_last_seed_change_time; + } ip6_main_t; +#define ND_THROTTLE_BITS 512 + /* Global ip6 main structure. */ extern ip6_main_t ip6_main; @@ -217,23 +240,10 @@ extern vlib_node_registration_t ip6_discover_neighbor_node; extern vlib_node_registration_t ip6_glean_node; extern vlib_node_registration_t ip6_midchain_node; -extern vlib_node_registration_t ip6_icmp_neighbor_discovery_event_node; - -/* ipv6 neighbor discovery - timer/event types */ -typedef enum -{ - ICMP6_ND_EVENT_INIT, -} ip6_icmp_neighbor_discovery_event_type_t; - -typedef union -{ - u32 add_del_swindex; - struct - { - u32 up_down_swindex; - u32 fib_index; - } up_down_event; -} ip6_icmp_neighbor_discovery_event_data_t; +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, @@ -276,25 +286,36 @@ ip6_unaligned_destination_matches_route (ip6_main_t * im, 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. */ @@ -340,9 +361,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); - -clib_error_t *ip6_set_neighbor_limit (u32 neighbor_limit); + u32 sw_if_index, u8 refresh); uword ip6_udp_register_listener (vlib_main_t * vm, @@ -359,19 +378,6 @@ serialize_function_t serialize_vnet_ip6_main, unserialize_vnet_ip6_main; void ip6_ethernet_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai); -int -vnet_set_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, - int is_static); -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); void ip6_link_local_address_from_ethernet_mac_address (ip6_address_t * ip, @@ -384,22 +390,6 @@ ip6_ethernet_mac_address_from_link_local_address (u8 * mac, int vnet_set_ip6_flow_hash (u32 table_id, flow_hash_config_t flow_hash_config); -int -ip6_neighbor_ra_config (vlib_main_t * vm, u32 sw_if_index, - u8 suppress, u8 managed, u8 other, - u8 ll_option, u8 send_unicast, u8 cease, - u8 use_lifetime, u32 lifetime, - u32 initial_count, u32 initial_interval, - u32 max_interval, u32 min_interval, u8 is_no); - -int -ip6_neighbor_ra_prefix (vlib_main_t * vm, u32 sw_if_index, - ip6_address_t * prefix_addr, u8 prefix_len, - u8 use_default, u32 val_lifetime, u32 pref_lifetime, - u8 no_advertise, u8 off_link, u8 no_autoconfig, - u8 no_onlink, u8 is_no); - - clib_error_t *enable_ip6_interface (vlib_main_t * vm, u32 sw_if_index); clib_error_t *disable_ip6_interface (vlib_main_t * vm, u32 sw_if_index); @@ -410,12 +400,6 @@ clib_error_t *set_ip6_link_local_address (vlib_main_t * vm, u32 sw_if_index, ip6_address_t * address); -void vnet_register_ip6_neighbor_resolution_event (vnet_main_t * vnm, - void *address_arg, - uword node_index, - uword type_opaque, - uword data); - int vnet_add_del_ip6_nd_change_event (vnet_main_t * vnm, void *data_callback, u32 pid, @@ -428,13 +412,21 @@ int vnet_ip6_nd_term (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_buffer_t * p0, ethernet_header_t * eth, - ip6_header_t * ip, - u32 sw_if_index, u16 bd_index, u8 shg); + ip6_header_t * ip, u32 sw_if_index, u16 bd_index); + +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; @@ -445,11 +437,30 @@ always_inline u32 ip6_compute_flow_hash (const ip6_header_t * ip, flow_hash_config_t flow_hash_config) { - tcp_header_t *tcp = (void *) (ip + 1); + tcp_header_t *tcp; u64 a, b, c; u64 t1, t2; - uword is_tcp_udp = (ip->protocol == IP_PROTOCOL_TCP - || ip->protocol == IP_PROTOCOL_UDP); + uword is_tcp_udp = 0; + u8 protocol = ip->protocol; + + if (PREDICT_TRUE + ((ip->protocol == IP_PROTOCOL_TCP) + || (ip->protocol == IP_PROTOCOL_UDP))) + { + is_tcp_udp = 1; + tcp = (void *) (ip + 1); + } + else if (ip->protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS) + { + ip6_hop_by_hop_header_t *hbh = (ip6_hop_by_hop_header_t *) (ip + 1); + if ((hbh->protocol == IP_PROTOCOL_TCP) || + (hbh->protocol == IP_PROTOCOL_UDP)) + { + is_tcp_udp = 1; + tcp = (tcp_header_t *) ((u8 *) hbh + ((hbh->length + 1) << 3)); + } + protocol = hbh->protocol; + } t1 = (ip->src_address.as_u64[0] ^ ip->src_address.as_u64[1]); t1 = (flow_hash_config & IP_FLOW_HASH_SRC_ADDR) ? t1 : 0; @@ -459,7 +470,7 @@ 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) ? ip->protocol : 0; + b ^= (flow_hash_config & IP_FLOW_HASH_PROTO) ? protocol : 0; t1 = is_tcp_udp ? tcp->src : 0; t2 = is_tcp_udp ? tcp->dst : 0; @@ -611,6 +622,7 @@ vlib_buffer_push_ip6 (vlib_main_t * vm, vlib_buffer_t * b, sizeof (ip6h->src_address)); clib_memcpy (ip6h->dst_address.as_u8, dst->as_u8, sizeof (ip6h->src_address)); + b->flags |= VNET_BUFFER_F_IS_IP6; return ip6h; }