u8*
format_adj_glean (u8* s, va_list *ap)
{
- index_t index = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ index_t index = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
vnet_main_t * vnm = vnet_get_main();
ip_adjacency_t * adj = adj_get(index);
u8*
format_adj_midchain (u8* s, va_list *ap)
{
- index_t index = va_arg(ap, index_t);
- u32 indent = va_arg(ap, u32);
+ index_t index = va_arg(*ap, index_t);
+ u32 indent = va_arg(*ap, u32);
vnet_main_t * vnm = vnet_get_main();
ip_adjacency_t * adj = adj_get(index);
u8*
format_adj_nbr_incomplete (u8* s, va_list *ap)
{
- index_t index = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ index_t index = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
vnet_main_t * vnm = vnet_get_main();
ip_adjacency_t * adj = adj_get(index);
u8*
format_adj_nbr (u8* s, va_list *ap)
{
- index_t index = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ index_t index = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
vnet_main_t * vnm = vnet_get_main();
ip_adjacency_t * adj = adj_get(index);
static u8*
format_drop_dpo (u8 *s, va_list *ap)
{
- CLIB_UNUSED(index_t index) = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ CLIB_UNUSED(index_t index) = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
return (format(s, "dpo-drop %U", format_dpo_proto, index));
}
u8*
format_load_balance (u8 * s, va_list * args)
{
- index_t lbi = va_arg(args, index_t);
- load_balance_format_flags_t flags = va_arg(args, load_balance_format_flags_t);
+ index_t lbi = va_arg(*args, index_t);
+ load_balance_format_flags_t flags = va_arg(*args, load_balance_format_flags_t);
return (load_balance_format(lbi, flags, 0, s));
}
static u8*
format_load_balance_dpo (u8 * s, va_list * args)
{
- index_t lbi = va_arg(args, index_t);
- u32 indent = va_arg(args, u32);
+ index_t lbi = va_arg(*args, index_t);
+ u32 indent = va_arg(*args, u32);
return (load_balance_format(lbi, LOAD_BALANCE_FORMAT_DETAIL, indent, s));
}
lookup_dpo_ip6_inline (vlib_main_t * vm,
vlib_node_runtime_t * node,
vlib_frame_t * from_frame,
- int input_src_addr)
+ int input_src_addr,
+ int table_from_interface)
{
vlib_combined_counter_main_t * cm = &load_balance_main.lbm_to_counters;
u32 n_left_from, next_index, * from, * to_next;
/* dst lookup was done by ip6 lookup */
lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
lkd0 = lookup_dpo_get(lkdi0);
- fib_index0 = lkd0->lkd_fib_index;
+
+ /*
+ * choose between a lookup using the fib index in the DPO
+ * or getting the FIB index from the interface.
+ */
+ if (table_from_interface)
+ {
+ fib_index0 =
+ ip4_fib_table_get_index_for_sw_if_index(
+ vnet_buffer(b0)->sw_if_index[VLIB_RX]);
+ }
+ else
+ {
+ fib_index0 = lkd0->lkd_fib_index;
+ }
/*
* choose between a source or destination address lookup in the table
vlib_node_runtime_t * node,
vlib_frame_t * from_frame)
{
- return (lookup_dpo_ip6_inline(vm, node, from_frame, 0 /*use src*/));
+ return (lookup_dpo_ip6_inline(vm, node, from_frame, 0 /*use src*/, 0));
}
VLIB_REGISTER_NODE (lookup_ip6_dst_node) = {
};
VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_dst_node, lookup_ip6_dst)
+always_inline uword
+lookup_ip6_dst_itf (vlib_main_t * vm,
+ vlib_node_runtime_t * node,
+ vlib_frame_t * from_frame)
+{
+ return (lookup_dpo_ip6_inline(vm, node, from_frame, 0 /*use src*/, 1));
+}
+
+VLIB_REGISTER_NODE (lookup_ip6_dst_itf_node) = {
+ .function = lookup_ip6_dst_itf,
+ .name = "lookup-ip6-dst-itf",
+ .vector_size = sizeof (u32),
+ .format_trace = format_lookup_trace,
+ .sibling_of = "ip6-lookup",
+};
+VLIB_NODE_FUNCTION_MULTIARCH (lookup_ip6_dst_itf_node, lookup_ip6_dst_itf)
+
always_inline uword
lookup_ip6_src (vlib_main_t * vm,
vlib_node_runtime_t * node,
vlib_frame_t * from_frame)
{
- return (lookup_dpo_ip6_inline(vm, node, from_frame, 1 /*use src*/));
+ return (lookup_dpo_ip6_inline(vm, node, from_frame, 1, 0));
}
VLIB_REGISTER_NODE (lookup_ip6_src_node) = {
lookup_dpo_sub_types[LOOKUP_SUB_TYPE_DST] =
dpo_register_new_type(&lkd_vft, lookup_dst_nodes);
lookup_dpo_sub_types[LOOKUP_SUB_TYPE_DST_TABLE_FROM_INTERFACE] =
- dpo_register_new_type(&lkd_vft, lookup_dst_nodes);
+ dpo_register_new_type(&lkd_vft, lookup_dst_from_interface_nodes);
}
static u8*
format_punt_dpo (u8 *s, va_list *ap)
{
- CLIB_UNUSED(index_t index) = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ CLIB_UNUSED(index_t index) = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
return (format(s, "dpo-punt"));
}
static u8*
format_receive_dpo (u8 *s, va_list *ap)
{
- CLIB_UNUSED(index_t index) = va_arg(ap, index_t);
- CLIB_UNUSED(u32 indent) = va_arg(ap, u32);
+ CLIB_UNUSED(index_t index) = va_arg(*ap, index_t);
+ CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
vnet_main_t * vnm = vnet_get_main();
receive_dpo_t *rd;
return (fib_entry->fe_prefix.fp_proto);
}
+static dpo_proto_t
+fib_entry_get_payload_proto (const fib_entry_t * fib_entry)
+{
+ switch (fib_entry->fe_prefix.fp_proto)
+ {
+ case FIB_PROTOCOL_IP4:
+ case FIB_PROTOCOL_IP6:
+ return fib_proto_to_dpo(fib_entry->fe_prefix.fp_proto);
+ case FIB_PROTOCOL_MPLS:
+ return fib_entry->fe_prefix.fp_payload_proto;
+ }
+
+ return (fib_entry->fe_prefix.fp_proto);
+}
+
void
fib_entry_src_register (fib_source_t source,
const fib_entry_src_vft_t *vft)
.fct = fct,
};
- lb_proto = fib_proto_to_dpo(fib_entry_get_proto(fib_entry));
+ lb_proto = fib_entry_get_payload_proto(fib_entry);
fib_path_list_walk(esrc->fes_pl,
fib_entry_src_collect_forwarding,
static u8 *
format_ppr_dpo (u8 * s, va_list * args)
{
- index_t index = va_arg (args, index_t);
- CLIB_UNUSED (u32 indent) = va_arg (args, u32);
+ index_t index = va_arg (*args, index_t);
+ CLIB_UNUSED (u32 indent) = va_arg (*args, u32);
protocol_port_range_dpo_t *ppr_dpo;
int i, j;
{
lisp_gpe_adjacency_t *ladj = va_arg (*args, lisp_gpe_adjacency_t *);
lisp_gpe_adjacency_format_flags_t flags =
- va_arg (args, lisp_gpe_adjacency_format_flags_t);
+ va_arg (*args, lisp_gpe_adjacency_format_flags_t);
if (flags & LISP_GPE_ADJ_FORMAT_FLAG_DETAIL)
{
.flags = VNET_HW_INTERFACE_CLASS_FLAG_P2P,
};
-/**
- * A conversion of DPO next object tpyes to VLIB graph next nodes from
- * the mpls_post_rewrite node
- */
-static const int dpo_next_2_mpls_post_rewrite[DPO_LAST] = {
- [DPO_LOAD_BALANCE] = IP_LOOKUP_NEXT_LOAD_BALANCE,
-};
-
static void
mpls_gre_fixup (vlib_main_t *vm,
ip_adjacency_t *adj,