+ break;
+ case IPCPOPT_IPCOMP_HDRCOMP:
+ if (len < IPCPOPT_IPCOMP_MINLEN) {
+ ND_PRINT(" (length bogus, should be >= %u)",
+ IPCPOPT_IPCOMP_MINLEN);
+ return 0;
+ }
+
+ ND_TCHECK_LEN(p + 2, IPCPOPT_IPCOMP_MINLEN);
+ ND_PRINT("\n\t TCP Space %u, non-TCP Space %u"
+ ", maxPeriod %u, maxTime %u, maxHdr %u",
+ EXTRACT_BE_U_2(p + 4),
+ EXTRACT_BE_U_2(p + 6),
+ EXTRACT_BE_U_2(p + 8),
+ EXTRACT_BE_U_2(p + 10),
+ EXTRACT_BE_U_2(p + 12));
+
+ /* suboptions present ? */
+ if (len > IPCPOPT_IPCOMP_MINLEN) {
+ ipcomp_subopttotallen = len - IPCPOPT_IPCOMP_MINLEN;
+ p += IPCPOPT_IPCOMP_MINLEN;
+
+ ND_PRINT("\n\t Suboptions, length %u", ipcomp_subopttotallen);
+
+ while (ipcomp_subopttotallen >= 2) {
+ ND_TCHECK_2(p);
+ ipcomp_subopt = EXTRACT_U_1(p);
+ ipcomp_suboptlen = EXTRACT_U_1(p + 1);
+
+ /* sanity check */
+ if (ipcomp_subopt == 0 ||
+ ipcomp_suboptlen == 0 )
+ break;
+
+ /* XXX: just display the suboptions for now */
+ ND_PRINT("\n\t\t%s Suboption #%u, length %u",
+ tok2str(ipcpopt_compproto_subopt_values,
+ "Unknown",
+ ipcomp_subopt),
+ ipcomp_subopt,
+ ipcomp_suboptlen);
+
+ ipcomp_subopttotallen -= ipcomp_suboptlen;
+ p += ipcomp_suboptlen;
+ }
+ }
+ break;
+ default:
+ break;
+ }