X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/31a13fa966c5033e87dbce103c015fd8f3f486ef..f72fe0d0de6eb91663b005b7d061ecebb555d667:/print-ip.c diff --git a/print-ip.c b/print-ip.c index 8d1bbdad..c24f5d52 100644 --- a/print-ip.c +++ b/print-ip.c @@ -21,7 +21,7 @@ #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 @@ -34,6 +34,7 @@ static const char rcsid[] = #include +#include #include #include #include @@ -217,7 +218,7 @@ ip_optprint(register const u_char *cp, u_int length) * 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; @@ -257,13 +258,12 @@ ip_print(register const u_char *bp, register u_int length) 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; @@ -408,7 +408,7 @@ again: #define IPPROTO_IGMP 2 #endif case IPPROTO_IGMP: - igmp_print(cp, len, (const u_char *)ip); + igmp_print(cp, len); break; case 4: @@ -461,7 +461,11 @@ again: 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; } } @@ -480,11 +484,17 @@ again: 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 */ @@ -537,8 +547,9 @@ again: 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 = ", "; } }