X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/13517532c13ab96c279fd58de69f4b6a02063512..f78c60f54a9beb04f1409712ec95b46f2d52a0ab:/print-tcp.c diff --git a/print-tcp.c b/print-tcp.c index aedc6661..4e970038 100644 --- a/print-tcp.c +++ b/print-tcp.c @@ -24,8 +24,6 @@ */ #ifndef lint -static const char rcsid[] _U_ = -"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.135 2008-11-09 23:35:03 mcr Exp $ (LBL)"; #else __RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $"); #endif @@ -144,8 +142,8 @@ static int tcp_cksum(register const struct ip *ip, register const struct tcphdr *tp, register u_int len) { - return (nextproto4_cksum(ip, (const u_int8_t *)tp, len, - IPPROTO_TCP)); + return nextproto4_cksum(gndo, ip, (const u_int8_t *)tp, len, len, + IPPROTO_TCP); } void @@ -187,42 +185,6 @@ tcp_print(register const u_char *bp, register u_int length, hlen = TH_OFF(tp) * 4; - /* - * If data present, header length valid, and NFS port used, - * assume NFS. - * Pass offset of data plus 4 bytes for RPC TCP msg length - * to NFS print routines. - */ - if (!qflag && hlen >= sizeof(*tp) && hlen <= length && - (length - hlen) >= 4) { - u_char *fraglenp; - u_int32_t fraglen; - register struct sunrpc_msg *rp; - enum sunrpc_msg_type direction; - - fraglenp = (u_char *)tp + hlen; - if (TTEST2(*fraglenp, 4)) { - fraglen = EXTRACT_32BITS(fraglenp) & 0x7FFFFFFF; - if (fraglen > (length - hlen) - 4) - fraglen = (length - hlen) - 4; - rp = (struct sunrpc_msg *)(fraglenp + 4); - if (TTEST(rp->rm_direction)) { - direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction); - if (dport == NFS_PORT && - direction == SUNRPC_CALL) { - nfsreq_print((u_char *)rp, fraglen, - (u_char *)ip); - return; - } - if (sport == NFS_PORT && - direction == SUNRPC_REPLY) { - nfsreply_print((u_char *)rp, fraglen, - (u_char *)ip); - return; - } - } - } - } #ifdef INET6 if (ip6) { if (ip6->ip6_nxt == IPPROTO_TCP) { @@ -296,16 +258,16 @@ tcp_print(register const u_char *bp, register u_int length, if (sport > dport) rev = 1; else if (sport == dport) { - if (memcmp(src, dst, sizeof ip6->ip6_dst) > 0) + if (UNALIGNED_MEMCMP(src, dst, sizeof ip6->ip6_dst) > 0) rev = 1; } if (rev) { - memcpy(&tha.src, dst, sizeof ip6->ip6_dst); - memcpy(&tha.dst, src, sizeof ip6->ip6_src); + UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip6->ip6_dst); + UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip6->ip6_src); tha.port = dport << 16 | sport; } else { - memcpy(&tha.dst, dst, sizeof ip6->ip6_dst); - memcpy(&tha.src, src, sizeof ip6->ip6_src); + UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip6->ip6_dst); + UNALIGNED_MEMCPY(&tha.src, src, sizeof ip6->ip6_src); tha.port = sport << 16 | dport; } @@ -352,16 +314,16 @@ tcp_print(register const u_char *bp, register u_int length, if (sport > dport) rev = 1; else if (sport == dport) { - if (memcmp(src, dst, sizeof ip->ip_dst) > 0) + if (UNALIGNED_MEMCMP(src, dst, sizeof ip->ip_dst) > 0) rev = 1; } if (rev) { - memcpy(&tha.src, dst, sizeof ip->ip_dst); - memcpy(&tha.dst, src, sizeof ip->ip_src); + UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip->ip_dst); + UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip->ip_src); tha.port = dport << 16 | sport; } else { - memcpy(&tha.dst, dst, sizeof ip->ip_dst); - memcpy(&tha.src, src, sizeof ip->ip_src); + UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip->ip_dst); + UNALIGNED_MEMCPY(&tha.src, src, sizeof ip->ip_src); tha.port = sport << 16 | dport; } @@ -424,7 +386,8 @@ tcp_print(register const u_char *bp, register u_int length, #ifdef INET6 else if (IP_V(ip) == 6 && ip6->ip6_plen) { if (TTEST2(tp->th_sport, length)) { - sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, length, IPPROTO_TCP); + sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, + length, length, IPPROTO_TCP); tcp_sum = EXTRACT_16BITS(&tp->th_sum); (void)printf(", cksum 0x%04x", tcp_sum); @@ -488,7 +451,7 @@ tcp_print(register const u_char *bp, register u_int length, #define LENCHECK(l) { if ((l) > hlen) goto bad; TCHECK2(*cp, l); } - printf("%s", tok2str(tcp_option_values, "Unknown Option %u", opt)); + printf("%s", tok2str(tcp_option_values, "unknown-%u", opt)); switch (opt) { @@ -613,7 +576,7 @@ tcp_print(register const u_char *bp, register u_int length, case TCPOPT_MPTCP: datalen = len - 2; LENCHECK(datalen); - if (!mptcp_print(cp-2, len, flags)) + if (!mptcp_print(gndo, cp-2, len, flags)) goto bad; break; @@ -654,6 +617,8 @@ tcp_print(register const u_char *bp, register u_int length, default: datalen = len - 2; + if (datalen) + printf(" 0x"); for (i = 0; i < datalen; ++i) { LENCHECK(i); (void)printf("%02x", cp[i]); @@ -693,12 +658,12 @@ tcp_print(register const u_char *bp, register u_int length, if ((flags & TH_RST) && vflag) { print_tcp_rst_data(bp, length); return; - } + } if (packettype) { switch (packettype) { case PT_ZMTP1: - zmtp1_print(bp, length); + zmtp1_print(gndo, bp, length); break; } return; @@ -706,11 +671,11 @@ tcp_print(register const u_char *bp, register u_int length, if (sport == TELNET_PORT || dport == TELNET_PORT) { if (!qflag && vflag) - telnet_print(bp, length); + telnet_print(gndo, bp, length); } else if (sport == BGP_PORT || dport == BGP_PORT) - bgp_print(bp, length); + bgp_print(gndo, bp, length); else if (sport == PPTP_PORT || dport == PPTP_PORT) - pptp_print(bp); + pptp_print(gndo, bp); #ifdef TCPDUMP_DO_SMB else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT) nbt_tcp_print(bp, length); @@ -718,9 +683,10 @@ tcp_print(register const u_char *bp, register u_int length, smb_tcp_print(bp, length); #endif else if (sport == BEEP_PORT || dport == BEEP_PORT) - beep_print(bp, length); - else if (sport == OPENFLOW_PORT || dport == OPENFLOW_PORT) - openflow_print(bp, length); + beep_print(gndo, bp, length); + else if (sport == OPENFLOW_PORT_OLD || dport == OPENFLOW_PORT_OLD || + sport == OPENFLOW_PORT_IANA || dport == OPENFLOW_PORT_IANA) + openflow_print(gndo, bp, length); else if (length > 2 && (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT || sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) { @@ -728,14 +694,44 @@ tcp_print(register const u_char *bp, register u_int length, * TCP DNS query has 2byte length at the head. * XXX packet could be unaligned, it can go strange */ - ns_print(bp + 2, length - 2, 0); + ns_print(gndo, bp + 2, length - 2, 0); } else if (sport == MSDP_PORT || dport == MSDP_PORT) { - msdp_print(bp, length); + msdp_print(gndo, bp, length); } else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) { - rpki_rtr_print(bp, length); + rpki_rtr_print(gndo, bp, length); } else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) { - ldp_print(bp, length); + ldp_print(gndo, bp, length); + } + else if ((sport == NFS_PORT || dport == NFS_PORT) && + length >= 4 && TTEST2(*bp, 4)) { + /* + * If data present, header length valid, and NFS port used, + * assume NFS. + * Pass offset of data plus 4 bytes for RPC TCP msg length + * to NFS print routines. + */ + u_int32_t fraglen; + register struct sunrpc_msg *rp; + enum sunrpc_msg_type direction; + + fraglen = EXTRACT_32BITS(bp) & 0x7FFFFFFF; + if (fraglen > (length) - 4) + fraglen = (length) - 4; + rp = (struct sunrpc_msg *)(bp + 4); + if (TTEST(rp->rm_direction)) { + direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction); + if (dport == NFS_PORT && direction == SUNRPC_CALL) { + (void)printf(": NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)); + nfsreq_print_noaddr(gndo, (u_char *)rp, fraglen, (u_char *)ip); + return; + } + if (sport == NFS_PORT && direction == SUNRPC_REPLY) { + (void)printf(": NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)); + nfsreply_print_noaddr(gndo, (u_char *)rp, fraglen, (u_char *)ip); + return; + } + } } return; @@ -781,7 +777,7 @@ print_tcp_rst_data(register const u_char *sp, u_int length) putchar(' '); while (length-- && sp <= snapend) { c = *sp++; - safeputchar(c); + safeputchar(gndo, c); } putchar(']'); }