]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-gre.c
Get rid of unneeded includes of <netinet/in_systm.h> and <netinet/ip.h>.
[tcpdump] / print-gre.c
index 19c545b3127b7f10b1de344d68b68e8ad6028e8a..aa05dc588bf1b3cf65d0657a544f91088279e0f3 100644 (file)
@@ -24,7 +24,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.11 2001-03-12 00:24:55 guy Exp $";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.14 2002-06-01 23:50:31 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -33,7 +33,6 @@ static const char rcsid[] =
 
 #include <sys/param.h>
 #include <sys/time.h>
-#include <sys/uio.h>
 #include <sys/socket.h>
 
 #include <netinet/in.h>
@@ -63,7 +62,8 @@ struct gre {
 #define GRE_sP         0x0800  /* strict source route present */
 #define GRE_RECUR_MASK 0x0700  /* Recursion Control */
 #define GRE_RECUR_SHIFT        8
-#define GRE_OP         0xc000  /* Offset Present */
+
+#define GRE_COP                (GRE_RP|GRE_CP) /* Checksum & Offset Present */
 
 /* "Enhanced GRE" from RFC2637 - PPTP */
 #define GRE_AP         0x0080  /* Ack present */
@@ -87,6 +87,7 @@ gre_print(const u_char *bp, u_int length)
        TCHECK(gre->proto);
        flags = EXTRACT_16BITS(&gre->flags);
        proto = EXTRACT_16BITS(&gre->proto);
+       (void)printf("gre ");
 
        if (flags) {
                /* Decode the flags */
@@ -113,17 +114,27 @@ gre_print(const u_char *bp, u_int length)
                fputs("] ", stdout);
        }
 
-       if (flags & GRE_CP) {
-               TCHECK2(*cp, 4);
-               if (vflag > 1)
-                       printf("C:%08x ", EXTRACT_32BITS(cp));
-               cp += 4;        /* skip checksum */
-       }
-       if (flags & GRE_OP) {
+       if (flags & GRE_COP) {
+               int checksum, offset;
+
                TCHECK2(*cp, 4);
-               if (vflag > 1)
-                       printf("O:%08x ", EXTRACT_32BITS(cp));
-               cp += 4;        /* skip offset */
+               checksum = EXTRACT_16BITS(cp);
+               offset = EXTRACT_16BITS(cp + 2);
+
+               if (flags & GRE_CP) {
+                       /* Checksum present */
+
+                       /* todo: check checksum */
+                       if (vflag > 1)
+                               printf("C:%04x ", checksum);
+               }
+               if (flags & GRE_RP) {
+                       /* Offset present */
+
+                       if (vflag > 1)
+                               printf("O:%04x ", offset);
+               }
+               cp += 4;        /* skip checksum and offset */
        }
        if (flags & GRE_KP) {
                TCHECK2(*cp, 4);