*/
#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
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
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) {
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;
}
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;
}
#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);
#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) {
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;
default:
datalen = len - 2;
+ if (datalen)
+ printf(" 0x");
for (i = 0; i < datalen; ++i) {
LENCHECK(i);
(void)printf("%02x", cp[i]);
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;
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);
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)) {
* 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;
putchar(' ');
while (length-- && sp <= snapend) {
c = *sp++;
- safeputchar(c);
+ safeputchar(gndo, c);
}
putchar(']');
}