#include <vnet/dpo/classify_dpo.h>
#include <vnet/dpo/punt_dpo.h>
#include <vnet/dpo/receive_dpo.h>
+#include <vnet/dpo/ip_null_dpo.h>
/**
* @file
void ip_lookup_init (ip_lookup_main_t * lm, u32 is_ip6)
{
/* ensure that adjacency is cacheline aligned and sized */
- ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline0) == 0);
- ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline1) == CLIB_CACHE_LINE_BYTES);
+ STATIC_ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline0) == 0,
+ "Cache line marker must be 1st element in struct");
+ STATIC_ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline1) == CLIB_CACHE_LINE_BYTES,
+ "Data in cache line 0 is bigger than cache line size");
/* Preallocate three "special" adjacencies */
lm->adjacency_heap = adj_pool;
dpo_copy(dpo, punt_dpo_get(proto));
else if (unformat (input, "local"))
receive_dpo_add_or_lock(proto, ~0, NULL, dpo);
+ else if (unformat (input, "null-send-unreach"))
+ ip_null_dpo_add_and_lock(proto, IP_NULL_ACTION_SEND_ICMP_UNREACH, dpo);
+ else if (unformat (input, "null-send-prohibit"))
+ ip_null_dpo_add_and_lock(proto, IP_NULL_ACTION_SEND_ICMP_PROHIBIT, dpo);
+ else if (unformat (input, "null"))
+ ip_null_dpo_add_and_lock(proto, IP_NULL_ACTION_NONE, dpo);
else if (unformat (input, "classify"))
{
u32 classify_table_index;
}
dpo_set(dpo, DPO_CLASSIFY, proto,
- classify_dpo_create(fp, classify_table_index));
+ classify_dpo_create(proto, classify_table_index));
}
else
return 0;
{
unformat_input_t _line_input, * line_input = &_line_input;
fib_route_path_t *rpaths = NULL, rpath;
- dpo_id_t dpo = DPO_NULL, *dpos = NULL;
+ dpo_id_t dpo = DPO_INVALID, *dpos = NULL;
fib_prefix_t *prefixs = NULL, pfx;
+ mpls_label_t out_label, via_label;
clib_error_t * error = NULL;
- mpls_label_t out_label;
u32 table_id, is_del;
vnet_main_t * vnm;
u32 fib_index;
table_id = 0;
count = 1;
memset(&pfx, 0, sizeof(pfx));
+ out_label = via_label = MPLS_LABEL_INVALID;
/* Get a line of input. */
if (! unformat_user (main_input, unformat_line_input, line_input))
error = clib_error_return(0 , "Paths then labels");
goto done;
}
- rpaths[vec_len(rpaths)-1].frp_label = out_label;
+ vec_add1(rpaths[vec_len(rpaths)-1].frp_label_stack, out_label);
+ }
+ else if (unformat (line_input, "via-label %U",
+ unformat_mpls_unicast_label,
+ &rpath.frp_local_label))
+ {
+ rpath.frp_weight = 1;
+ rpath.frp_proto = FIB_PROTOCOL_MPLS;
+ rpath.frp_sw_if_index = ~0;
+ vec_add1(rpaths, rpath);
}
else if (unformat (line_input, "count %f", &count))
;
&rpath.frp_sw_if_index,
&rpath.frp_weight))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP4;
vec_add1(rpaths, rpath);
}
&rpath.frp_sw_if_index,
&rpath.frp_weight))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP6;
vec_add1(rpaths, rpath);
}
unformat_vnet_sw_interface, vnm,
&rpath.frp_sw_if_index))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_weight = 1;
rpath.frp_proto = FIB_PROTOCOL_IP4;
vec_add1(rpaths, rpath);
unformat_vnet_sw_interface, vnm,
&rpath.frp_sw_if_index))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_weight = 1;
rpath.frp_proto = FIB_PROTOCOL_IP6;
vec_add1(rpaths, rpath);
{
rpath.frp_weight = 1;
rpath.frp_sw_if_index = ~0;
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP4;
vec_add1(rpaths, rpath);
}
{
rpath.frp_weight = 1;
rpath.frp_sw_if_index = ~0;
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP6;
vec_add1(rpaths, rpath);
}
rpath.frp_fib_index = table_id;
rpath.frp_weight = 1;
rpath.frp_sw_if_index = ~0;
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP4;
vec_add1(rpaths, rpath);
}
rpath.frp_fib_index = table_id;
rpath.frp_weight = 1;
rpath.frp_sw_if_index = ~0;
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = FIB_PROTOCOL_IP6;
vec_add1(rpaths, rpath);
}
"lookup in table %d",
&rpath.frp_fib_index))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
rpath.frp_proto = pfx.fp_proto;
rpath.frp_sw_if_index = ~0;
vec_add1(rpaths, rpath);
unformat (line_input, "via %U",
unformat_dpo, &dpo, prefixs[0].fp_proto))
{
- rpath.frp_label = MPLS_LABEL_INVALID;
vec_add1 (dpos, dpo);
}
else