+ case BGPTYPE_BGPSEC_PATH:
+ {
+ uint16_t sblen, splen;
+
+ splen = GET_BE_U_2(tptr);
+
+ /*
+ * A secure path has a minimum length of 8 bytes:
+ * 2 bytes length field
+ * 6 bytes per secure path segment
+ */
+ ND_ICHECKMSG_U("secure path length", splen, <, 8);
+
+ ND_PRINT("\n\t Secure Path Length: %u", splen);
+
+ tptr += 2;
+ splen -= 2;
+ /* Make sure the secure path length does not signal trailing bytes */
+ if (splen % 6) {
+ ND_PRINT(" [total segments length %u != N x 6]", splen);
+ goto invalid;
+ }
+
+ /* Parse secure path segments */
+ while (splen != 0) {
+ uint8_t pcount = GET_U_1(tptr);
+ uint8_t flags = GET_U_1(tptr + 1);
+ uint32_t asn = GET_BE_U_4(tptr + 2);
+ ND_PRINT("\n\t Secure Path Segment: pCount: %u, Flags: [%s] (0x%02x), AS: %u",
+ pcount,
+ bittok2str(bgp_bgpsec_bitmap_str, "none", flags),
+ flags,
+ asn);
+ tptr += 6;
+ splen -= 6;
+ }
+
+ sblen = GET_BE_U_2(tptr);
+
+ ND_PRINT("\n\t Signature Block: Length: %u, Algo ID: %u",
+ sblen,
+ GET_U_1(tptr + 2));
+
+ tptr += 3;
+ sblen -= 3;
+ /* Parse signature segments */
+ while (sblen != 0) {
+ uint16_t siglen;
+
+ ND_PRINT("\n\t Signature Segment:\n\t SKI: ");
+ ND_ICHECKMSG_U("remaining length", sblen, <, 20);
+ hex_print(ndo, "\n\t ", tptr, 20);
+ tptr += 20;
+ sblen -= 20;
+ ND_ICHECKMSG_U("remaining length", sblen, <, 2);
+ siglen = GET_BE_U_2(tptr);
+ tptr += 2;
+ sblen -= 2;
+
+ ND_PRINT("\n\t Length: %u", siglen);
+ ND_ICHECKMSG_U("remaining length", sblen, <, siglen);
+ ND_PRINT("\n\t Signature:");
+ hex_print(ndo, "\n\t ", tptr, siglen);
+ tptr += siglen;
+ sblen -= siglen;
+ }
+ break;
+ }
+ case BGPTYPE_OTC:
+ {
+ if (len < 4) {
+ ND_PRINT("invalid len");
+ break;
+ }
+ ND_PRINT("\n\t OTC %u", GET_BE_U_4(pptr));
+ break;
+ }