#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.91 2001-10-08 21:25:23 fenner Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.101 2002-08-20 00:17:23 hannes Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <sys/param.h>
-#include <sys/time.h>
+#include <tcpdump-stdinc.h>
#include <rpc/rpc.h>
-#include <netinet/in.h>
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
#include "interface.h"
#include "addrtoname.h"
#ifndef PPTP_PORT
#define PPTP_PORT 1723
#endif
-#define BXXP_PORT 10288
+#define BEEP_PORT 10288
#ifndef NFS_PORT
#define NFS_PORT 2049
#endif
#define MSDP_PORT 639
+#define LDP_PORT 646
static int tcp_cksum(register const struct ip *ip,
register const struct tcphdr *tp,
phu.ph.mbz = 0;
phu.ph.proto = IPPROTO_TCP;
memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
- memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+ if (IP_HL(ip) == 5)
+ memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+ else
+ phu.ph.dst = ip_finddst(ip);
sp = &phu.pa[0];
return in_cksum((u_short *)tp, len,
sport = ntohs(tp->th_sport);
dport = ntohs(tp->th_dport);
-
hlen = TH_OFF(tp) * 4;
/*
}
if (IP_V(ip) == 4 && vflag && !fragmented) {
- int sum;
+ u_int16_t sum, tcp_sum;
if (TTEST2(tp->th_sport, length)) {
sum = tcp_cksum(ip, tp, length);
- if (sum != 0)
- (void)printf(" [bad tcp cksum %x!]", sum);
- else
+ if (sum != 0) {
+ tcp_sum = ntohs(tp->th_sum);
+ (void)printf(" [bad tcp cksum %x (->%x)!]",
+ tcp_sum, in_cksum_shouldbe(tcp_sum, sum));
+ } else
(void)printf(" [tcp sum ok]");
}
}
length -= hlen;
if (vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST))
- (void)printf(" %u:%u(%d)", seq, seq + length, length);
+ (void)printf(" %u:%u(%u)", seq, seq + length, length);
if (flags & TH_ACK)
(void)printf(" ack %u", ack);
else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT)
nbt_tcp_print(bp, length);
#endif
- else if (sport == BXXP_PORT || dport == BXXP_PORT)
- bxxp_print(bp, length);
+ else if (sport == BEEP_PORT || dport == BEEP_PORT)
+ beep_print(bp, length);
else if (length > 2 &&
- (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT)) {
- /* TCP DNS query has 2byte length at the head */
+ (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);
} else if (sport == MSDP_PORT || dport == MSDP_PORT) {
msdp_print(bp, length);
}
+ else if (sport == LDP_PORT || dport == LDP_PORT)
+ printf(": LDP, length: %u", length);
}
return;
bad: