+ ND_PRINT(" %u", utoval);
+ break;
+
+ case TCPOPT_MPTCP:
+ {
+ const u_char *snapend_save;
+ int ret;
+
+ datalen = len - 2;
+ LENCHECK(datalen);
+ /* FIXME: Proof-read mptcp_print() and if it
+ * always covers all bytes when it returns 1,
+ * only do ND_TCHECK_LEN() if it returned 0.
+ */
+ ND_TCHECK_LEN(cp, datalen);
+ /* Update the snapend to the end of the option
+ * before calling mptcp_print(). Some options
+ * (MPTCP or others) may be present after a
+ * MPTCP option. This prevents that, in
+ * mptcp_print(), the remaining length < the
+ * remaining caplen.
+ */
+ snapend_save = ndo->ndo_snapend;
+ ndo->ndo_snapend = ND_MIN(cp - 2 + len,
+ ndo->ndo_snapend);
+ ret = mptcp_print(ndo, cp - 2, len, flags);
+ ndo->ndo_snapend = snapend_save;
+ if (!ret)
+ goto bad;
+ break;
+ }
+
+ case TCPOPT_FASTOPEN:
+ datalen = len - 2;
+ LENCHECK(datalen);
+ ND_TCHECK_LEN(cp, datalen);
+ ND_PRINT(" ");
+ print_tcp_fastopen_option(ndo, cp, datalen);
+ break;
+
+ case TCPOPT_EXPERIMENT2:
+ datalen = len - 2;
+ LENCHECK(datalen);
+ ND_TCHECK_LEN(cp, datalen);
+ if (datalen < 2)
+ goto bad;
+ /* RFC6994 */
+ magic = GET_BE_U_2(cp);
+ ND_PRINT("-");
+
+ switch(magic) {
+
+ case 0xf989: /* TCP Fast Open RFC 7413 */
+ ND_PRINT("tfo");
+ print_tcp_fastopen_option(ndo, cp + 2, datalen - 2);
+ break;
+
+ default:
+ /* Unknown magic number */
+ ND_PRINT("%04x", magic);
+ break;
+ }