X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/ed85e20e4d6a27d5405f37366dd34b64c10a9211..5c2fc51b165ff138acea0ee9589dbc17c99b20d0:/print-tcp.c diff --git a/print-tcp.c b/print-tcp.c index 5b1133a6..5c979235 100644 --- a/print-tcp.c +++ b/print-tcp.c @@ -28,7 +28,6 @@ __RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $"); #endif -#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -64,6 +63,8 @@ static int tcp_verify_signature(netdissect_options *ndo, #endif static void print_tcp_rst_data(netdissect_options *, register const u_char *sp, u_int length); +static void print_tcp_fastopen_option(netdissect_options *ndo, register const u_char *cp, + u_int datalen, int exp); #define MAX_RST_DATA_LEN 30 @@ -135,6 +136,7 @@ static const struct tok tcp_option_values[] = { { TCPOPT_AUTH, "enhanced auth" }, { TCPOPT_UTO, "uto" }, { TCPOPT_MPTCP, "mptcp" }, + { TCPOPT_FASTOPEN, "tfo" }, { TCPOPT_EXPERIMENT2, "exp" }, { 0, NULL } }; @@ -584,6 +586,12 @@ tcp_print(netdissect_options *ndo, goto bad; break; + case TCPOPT_FASTOPEN: + datalen = len - 2; + LENCHECK(datalen); + print_tcp_fastopen_option(ndo, cp, datalen, FALSE); + break; + case TCPOPT_EXPERIMENT2: datalen = len - 2; LENCHECK(datalen); @@ -595,21 +603,8 @@ tcp_print(netdissect_options *ndo, switch(magic) { - case 0xf989: - /* TCP Fast Open: draft-ietf-tcpm-fastopen-04 */ - if (datalen == 2) { - /* Fast Open Cookie Request */ - ND_PRINT((ndo, "tfo cookiereq")); - } else { - /* Fast Open Cookie */ - if (datalen % 2 != 0 || datalen < 6 || datalen > 18) { - ND_PRINT((ndo, "tfo malformed")); - } else { - ND_PRINT((ndo, "tfo cookie ")); - for (i = 2; i < datalen; ++i) - ND_PRINT((ndo, "%02x", cp[i])); - } - } + case 0xf989: /* TCP Fast Open RFC 7413 */ + print_tcp_fastopen_option(ndo, cp + 2, datalen - 2, TRUE); break; default: @@ -674,8 +669,10 @@ tcp_print(netdissect_options *ndo, } if (sport == TELNET_PORT || dport == TELNET_PORT) { - if (!ndo->ndo_qflag && ndo->ndo_vflag) - telnet_print(ndo, bp, length); + telnet_print(ndo, bp, length); + } else if (sport == SMTP_PORT || dport == SMTP_PORT) { + ND_PRINT((ndo, ": ")); + smtp_print(ndo, bp, length); } else if (sport == BGP_PORT || dport == BGP_PORT) bgp_print(ndo, bp, length); else if (sport == PPTP_PORT || dport == PPTP_PORT) @@ -691,7 +688,18 @@ tcp_print(netdissect_options *ndo, else if (sport == OPENFLOW_PORT_OLD || dport == OPENFLOW_PORT_OLD || sport == OPENFLOW_PORT_IANA || dport == OPENFLOW_PORT_IANA) openflow_print(ndo, bp, length); - else if (length > 2 && + else if (sport == FTP_PORT || dport == FTP_PORT) { + ND_PRINT((ndo, ": ")); + ftp_print(ndo, bp, length); + } else if (sport == HTTP_PORT || dport == HTTP_PORT || + sport == HTTP_PORT_ALT || dport == HTTP_PORT_ALT) { + ND_PRINT((ndo, ": ")); + http_print(ndo, bp, length); + } else if (sport == RTSP_PORT || dport == RTSP_PORT || + sport == RTSP_PORT_ALT || dport == RTSP_PORT_ALT) { + ND_PRINT((ndo, ": ")); + rtsp_print(ndo, bp, length); + } else if (length > 2 && (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT || sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) { /* @@ -784,6 +792,30 @@ print_tcp_rst_data(netdissect_options *ndo, ND_PRINT((ndo, "]")); } +static void +print_tcp_fastopen_option(netdissect_options *ndo, register const u_char *cp, + u_int datalen, int exp) +{ + u_int i; + + if (exp) + ND_PRINT((ndo, "tfo")); + + if (datalen == 0) { + /* Fast Open Cookie Request */ + ND_PRINT((ndo, " cookiereq")); + } else { + /* Fast Open Cookie */ + if (datalen % 2 != 0 || datalen < 4 || datalen > 16) { + ND_PRINT((ndo, " malformed")); + } else { + ND_PRINT((ndo, " cookie ")); + for (i = 0; i < datalen; ++i) + ND_PRINT((ndo, "%02x", cp[i])); + } + } +} + #ifdef HAVE_LIBCRYPTO USES_APPLE_DEPRECATED_API static int