X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0516a28d2668e23776213960ad19631c4e5a2486..5c2fc51b165ff138acea0ee9589dbc17c99b20d0:/print-tcp.c diff --git a/print-tcp.c b/print-tcp.c index f91ba208..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 } }; @@ -145,7 +147,7 @@ tcp_cksum(netdissect_options *ndo, register const struct tcphdr *tp, register u_int len) { - return nextproto4_cksum(ndo, ip, (const u_int8_t *)tp, len, len, + return nextproto4_cksum(ndo, ip, (const uint8_t *)tp, len, len, IPPROTO_TCP); } @@ -159,10 +161,10 @@ tcp_print(netdissect_options *ndo, register u_char flags; register u_int hlen; register char ch; - u_int16_t sport, dport, win, urp; - u_int32_t seq, ack, thseq, thack; + uint16_t sport, dport, win, urp; + uint32_t seq, ack, thseq, thack; u_int utoval; - u_int16_t magic; + uint16_t magic; register int rev; #ifdef INET6 register const struct ip6_hdr *ip6; @@ -372,7 +374,7 @@ tcp_print(netdissect_options *ndo, if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) { /* Check the checksum, if possible. */ - u_int16_t sum, tcp_sum; + uint16_t sum, tcp_sum; if (IP_V(ip) == 4) { if (ND_TTEST2(tp->th_sport, length)) { @@ -390,7 +392,7 @@ tcp_print(netdissect_options *ndo, #ifdef INET6 else if (IP_V(ip) == 6 && ip6->ip6_plen) { if (ND_TTEST2(tp->th_sport, length)) { - sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, + sum = nextproto6_cksum(ip6, (const uint8_t *)tp, length, length, IPPROTO_TCP); tcp_sum = EXTRACT_16BITS(&tp->th_sum); @@ -476,7 +478,7 @@ tcp_print(netdissect_options *ndo, if (datalen % 8 != 0) { ND_PRINT((ndo, "malformed sack")); } else { - u_int32_t s, e; + uint32_t s, e; ND_PRINT((ndo, " %d ", datalen / 8)); for (i = 0; i < datalen; i += 8) { @@ -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)) { /* @@ -715,7 +723,7 @@ tcp_print(netdissect_options *ndo, * Pass offset of data plus 4 bytes for RPC TCP msg length * to NFS print routines. */ - u_int32_t fraglen; + uint32_t fraglen; register struct sunrpc_msg *rp; enum sunrpc_msg_type direction; @@ -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 @@ -795,11 +827,11 @@ tcp_verify_signature(netdissect_options *ndo, u_char sig[TCP_SIGLEN]; char zero_proto = 0; MD5_CTX ctx; - u_int16_t savecsum, tlen; + uint16_t savecsum, tlen; #ifdef INET6 struct ip6_hdr *ip6; - u_int32_t len32; - u_int8_t nxt; + uint32_t len32; + uint8_t nxt; #endif if (data + length > ndo->ndo_snapend) {