summaryrefslogtreecommitdiff
path: root/print-gre.c
diff options
context:
space:
mode:
authorfenner <fenner>2001-03-13 01:03:17 +0000
committerfenner <fenner>2001-03-13 01:03:17 +0000
commit13c623cda77c2215c1641c53edf6e2de1786f36b (patch)
tree006af60852a3f6a22eef6e7dd4b897a0003a4968 /print-gre.c
parent9298dc84c8b02a79fbd2f4680d370da0cc316ea5 (diff)
downloadtcpdump-13c623cda77c2215c1641c53edf6e2de1786f36b.tar.gz
Fix checksum and offset printing.
Diffstat (limited to 'print-gre.c')
-rw-r--r--print-gre.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/print-gre.c b/print-gre.c
index 19c545b3..e5a9cbdb 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.12 2001-03-13 01:03:17 fenner Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -63,7 +63,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 */
@@ -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);