#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.99 2001-08-20 17:52:39 fenner Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.104 2002-05-29 09:47:04 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include <netinet/in.h>
+#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
* don't modifiy the packet.
*/
u_short
-in_cksum(const u_short *addr, register int len, int csum)
+in_cksum(const u_short *addr, register u_int len, int csum)
{
int nleft = len;
const u_short *w = addr;
register const u_char *cp;
u_char nh;
int advance;
+ struct protoent *proto;
ip = (const struct ip *)bp;
#ifdef LBL_ALIGN
/*
* If the IP header is not aligned, copy into abuf.
- * This will never happen with BPF. It does happen raw packet
- * dumps from -r.
*/
if ((long)ip & 3) {
static u_char *abuf = NULL;
#define IPPROTO_IGMP 2
#endif
case IPPROTO_IGMP:
- igmp_print(cp, len, (const u_char *)ip);
+ igmp_print(cp, len);
break;
case 4:
break;
default:
- (void)printf(" ip-proto-%d %d", nh, len);
+ if ((proto = getprotobynumber(nh)) != NULL)
+ (void)printf(" %s", proto->p_name);
+ else
+ (void)printf(" ip-proto-%d", nh);
+ printf(" %d", len);
break;
}
}
if (off & 0x3fff) {
/*
* if this isn't the first frag, we're missing the
- * next level protocol header. print the ip addr.
+ * next level protocol header. print the ip addr
+ * and the protocol.
*/
- if (off & 0x1fff)
+ if (off & 0x1fff) {
(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
ipaddr_string(&ip->ip_dst));
+ if ((proto = getprotobynumber(ip->ip_p)) != NULL)
+ (void)printf(" %s", proto->p_name);
+ else
+ (void)printf(" ip-proto-%d", ip->ip_p);
+ }
#ifndef IP_MF
#define IP_MF 0x2000
#endif /* IP_MF */
if ((u_char *)ip + hlen <= snapend) {
sum = in_cksum((const u_short *)ip, hlen, 0);
if (sum != 0) {
- (void)printf("%sbad cksum %x!", sep,
- ntohs(ip->ip_sum));
+ (void)printf("%sbad cksum %x (->%x)!", sep,
+ ntohs(ip->ip_sum),
+ ntohs(ip->ip_sum)-sum);
sep = ", ";
}
}