{
/**
* This table stores the routes that are used to forward traffic.
- * The key is the prefix, the result the adjacnecy to forward on.
+ * The key is the prefix, the result the adjacency to forward on.
*/
IP6_FIB_TABLE_FWDING,
/**
#define IP6_FIB_NUM_TABLES (IP6_FIB_TABLE_NON_FWDING+1)
/**
- * A represenation of a single IP6 table
+ * A representation of a single IP6 table
*/
typedef struct ip6_fib_table_instance_t_
{
} ip6_fib_table_instance_t;
/**
- * A represenation of a single IP6 mfib table
+ * A representation of a single IP6 mfib table
*/
typedef struct ip6_mfib_table_instance_t_
{
int *bogus_lengthp);
void ip6_register_protocol (u32 protocol, u32 node_index);
+void ip6_unregister_protocol (u32 protocol);
+void ip6_local_hop_by_hop_register_protocol (u32 protocol, u32 node_index);
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);
-
-void
+always_inline void
ip6_link_local_address_from_ethernet_mac_address (ip6_address_t * ip,
- u8 * mac);
+ u8 * mac)
+{
+ ip->as_u64[0] = clib_host_to_net_u64 (0xFE80000000000000ULL);
+ /* Invert the "u" bit */
+ ip->as_u8[8] = mac[0] ^ (1 << 1);
+ ip->as_u8[9] = mac[1];
+ ip->as_u8[10] = mac[2];
+ ip->as_u8[11] = 0xFF;
+ ip->as_u8[12] = 0xFE;
+ ip->as_u8[13] = mac[3];
+ ip->as_u8[14] = mac[4];
+ ip->as_u8[15] = mac[5];
+}
-void
+always_inline void
ip6_ethernet_mac_address_from_link_local_address (u8 * mac,
- ip6_address_t * ip);
+ ip6_address_t * ip)
+{
+ /* Invert the previously inverted "u" bit */
+ mac[0] = ip->as_u8[8] ^ (1 << 1);
+ mac[1] = ip->as_u8[9];
+ mac[2] = ip->as_u8[10];
+ mac[3] = ip->as_u8[13];
+ mac[4] = ip->as_u8[14];
+ mac[5] = ip->as_u8[15];
+}
int vnet_set_ip6_flow_hash (u32 table_id,
flow_hash_config_t flow_hash_config);
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_add_paths (u32 rx_sw_if_index,
+ fib_route_path_t * paths);
void ip6_punt_redirect_del (u32 rx_sw_if_index);
int vnet_set_ip6_classify_intfc (vlib_main_t * vm, u32 sw_if_index,
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;
+ vnet_buffer (b)->l3_hdr_offset = (u8 *) ip6h - b->data;
+ b->flags |= VNET_BUFFER_F_IS_IP6 | VNET_BUFFER_F_L3_HDR_OFFSET_VALID;
return ip6h;
}