- 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)) {
+ ND_TCHECK2(*p, sizeof(label_entry));
+ if (length < sizeof(label_entry)) {
+ ND_PRINT((ndo, "[|MPLS], length %u", length));
+ return;
+ }
+ label_entry = EXTRACT_32BITS(p);
+ ND_PRINT((ndo, "%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((ndo, " (%s)", mpls_labelname[MPLS_LABEL(label_entry)]));
+ ND_PRINT((ndo, ", exp %u", MPLS_EXP(label_entry)));
+ if (MPLS_STACK(label_entry))
+ ND_PRINT((ndo, ", [S]"));
+ ND_PRINT((ndo, ", 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)) {
+