]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip.c
The payload of an SCTP DATA chunk is *not* necessarily ASCII text, so it
[tcpdump] / print-ip.c
index 66da2962b461a51de1a8e977d418d328565a97b9..c14d2fc2977bdedfb5a39166fbd23261cbe2b74f 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.96 2001-05-09 01:06:31 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.102 2001-11-16 02:17:36 itojun Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -34,6 +34,7 @@ static const char rcsid[] =
 
 #include <netinet/in.h>
 
+#include <netdb.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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, u_short 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;
@@ -341,10 +341,10 @@ again:
 #endif
                case IPPROTO_ESP:
                    {
-                       int enh;
-                       advance = esp_print(cp, (const u_char *)ip, &enh);
+                       int enh, padlen;
+                       advance = esp_print(cp, (const u_char *)ip, &enh, &padlen);
                        cp += advance;
-                       len -= advance;
+                       len -= advance + padlen;
                        if (enh < 0)
                                break;
                        nh = enh & 0xff;
@@ -390,10 +390,6 @@ again:
                        break;
 
                case IPPROTO_ND:
-#if 0
-                       (void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
-                               ipaddr_string(&ip->ip_dst));
-#endif
                        (void)printf(" nd %d", len);
                        break;
 
@@ -412,20 +408,14 @@ again:
 #define IPPROTO_IGMP 2
 #endif
                case IPPROTO_IGMP:
-                       igmp_print(cp, len, (const u_char *)ip);
+                       igmp_print(cp, len);
                        break;
 
                case 4:
                        /* DVMRP multicast tunnel (ip-in-ip encapsulation) */
-#if 0
-                       if (vflag)
-                               (void)printf("%s > %s: ",
-                                            ipaddr_string(&ip->ip_src),
-                                            ipaddr_string(&ip->ip_dst));
-#endif
                        ip_print(cp, len);
                        if (! vflag) {
-                               printf(" (ipip)");
+                               printf(" (ipip-proto-4)");
                                return;
                        }
                        break;
@@ -436,17 +426,7 @@ again:
 #endif
                case IP6PROTO_ENCAP:
                        /* ip6-in-ip encapsulation */
-#if 0
-                       if (vflag)
-                               (void)printf("%s > %s: ",
-                                            ipaddr_string(&ip->ip_src),
-                                            ipaddr_string(&ip->ip_dst));
-#endif
                        ip6_print(cp, len);
-                       if (! vflag) {
-                               printf(" (encap)");
-                               return;
-                       }
                        break;
 #endif /*INET6*/
 
@@ -455,31 +435,15 @@ again:
 #define IPPROTO_GRE 47
 #endif
                case IPPROTO_GRE:
-                       if (vflag)
-                               (void)printf("gre %s > %s: ",
-                                            ipaddr_string(&ip->ip_src),
-                                            ipaddr_string(&ip->ip_dst));
                        /* do it */
                        gre_print(cp, len);
-                       if (! vflag) {
-                               printf(" (gre encap)");
-                               return;
-                       }
                        break;
 
 #ifndef IPPROTO_MOBILE
 #define IPPROTO_MOBILE 55
 #endif
                case IPPROTO_MOBILE:
-                       if (vflag)
-                               (void)printf("mobile %s > %s: ",
-                                            ipaddr_string(&ip->ip_src),
-                                            ipaddr_string(&ip->ip_dst));
                        mobile_print(cp, len);
-                       if (! vflag) {
-                               printf(" (mobile encap)");
-                               return;
-                       }
                        break;
 
 #ifndef IPPROTO_PIM
@@ -493,19 +457,15 @@ again:
 #define IPPROTO_VRRP   112
 #endif
                case IPPROTO_VRRP:
-                       if (vflag)
-                               (void)printf("vrrp %s > %s: ",
-                                            ipaddr_string(&ip->ip_src),
-                                            ipaddr_string(&ip->ip_dst));
                        vrrp_print(cp, len, ip->ip_ttl);
                        break;
 
                default:
-#if 0
-                       (void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
-                               ipaddr_string(&ip->ip_dst));
-#endif
-                       (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;
                }
        }
@@ -524,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 */