X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/9298dc84c8b02a79fbd2f4680d370da0cc316ea5..ad6df73f5a6c46a409c7629f5588b1b81dff6357:/print-gre.c diff --git a/print-gre.c b/print-gre.c index 19c545b3..aa05dc58 100644 --- a/print-gre.c +++ b/print-gre.c @@ -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 #include -#include #include #include @@ -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);