#include <vnet/ip/ip.h>
#include <vnet/dpo/mpls_label_dpo.h>
#include <vnet/mpls/mpls.h>
+#include <vnet/dpo/drop_dpo.h>
/*
* pool of all MPLS Label DPOs
u32 ii;
mld = mpls_label_dpo_alloc();
+
+ if (MPLS_LABEL_DPO_MAX_N_LABELS < vec_len(label_stack))
+ {
+ clib_warning("Label stack size exceeded");
+ dpo_stack(DPO_MPLS_LABEL,
+ mld->mld_payload_proto,
+ &mld->mld_dpo,
+ drop_dpo_get(DPO_PROTO_MPLS));
+ return (mpls_label_dpo_get_index(mld));
+ }
+
mld->mld_n_labels = vec_len(label_stack);
mld->mld_n_hdr_bytes = mld->mld_n_labels * sizeof(mld->mld_hdr[0]);
mld->mld_payload_proto = payload_proto;
mpls_label_dpo_t *mld;
u32 ii;
- mld = mpls_label_dpo_get(index);
-
s = format(s, "mpls-label:[%d]:", index);
+ if (pool_is_free_index(mpls_label_dpo_pool, index))
+ {
+ /*
+ * the packet trace can be printed after the DPO has been deleted
+ */
+ return (s);
+ }
+
+ mld = mpls_label_dpo_get(index);
+
for (ii = 0; ii < mld->mld_n_labels; ii++)
{
hdr.label_exp_s_ttl =
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
mpls_label_imposition_trace_t * t;
mpls_unicast_header_t hdr;
- uword indent;
+ u32 indent;
t = va_arg (*args, mpls_label_imposition_trace_t *);
indent = format_get_indent (s);