- TCHECK2(*p, sizeof(v));
- v = EXTRACT_32BITS(p);
- printf(" ("); /*)*/
- printf("label %u", MPLS_LABEL(v));
- if (vflag &&
- MPLS_LABEL(v) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
- printf(" (%s)", mpls_labelname[MPLS_LABEL(v)]);
- printf(", exp %u", MPLS_EXP(v));
- if (MPLS_STACK(v))
- printf(", [S]");
- printf(", ttl %u", MPLS_TTL(v));
- /*(*/
- printf(")");
-
- p += sizeof(v);
- } while (!MPLS_STACK(v));
-
- switch (MPLS_LABEL(v)) {
+ if (length < sizeof(label_entry))
+ goto invalid;
+ label_entry = GET_BE_U_4(p);
+ ND_PRINT("%s(label %u",
+ (label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
+ MPLS_LABEL(label_entry));
+ label_stack_depth++;
+ if (ndo->ndo_vflag &&
+ MPLS_LABEL(label_entry) < sizeof(mpls_labelname) / sizeof(mpls_labelname[0]))
+ ND_PRINT(" (%s)", mpls_labelname[MPLS_LABEL(label_entry)]);
+ ND_PRINT(", tc %u", MPLS_TC(label_entry));
+ if (MPLS_STACK(label_entry))
+ ND_PRINT(", [S]");
+ ND_PRINT(", ttl %u)", MPLS_TTL(label_entry));
+
+ p += sizeof(label_entry);
+ length -= sizeof(label_entry);
+ } while (!MPLS_STACK(label_entry));
+
+ /*
+ * Try to figure out the packet type.
+ */
+ switch (MPLS_LABEL(label_entry)) {
+