diff options
author | hannes <hannes> | 2004-06-29 08:12:06 +0000 |
---|---|---|
committer | hannes <hannes> | 2004-06-29 08:12:06 +0000 |
commit | 32db3d2be241b76e47a8c6929906422329bcd965 (patch) | |
tree | a5ac9bd77544993541b637137784ed6411b7937d /print-gre.c | |
parent | 6c02156d08bdf0e588e36265cbdeffa91f7a55b0 (diff) | |
download | tcpdump-32db3d2be241b76e47a8c6929906422329bcd965.tar.gz |
-call the PPP printer in GREv1 (to better debug PPTP)
-commatized and multipline output for better readability
-make use of bittok2str() for flag processing
Diffstat (limited to 'print-gre.c')
-rw-r--r-- | print-gre.c | 109 |
1 files changed, 56 insertions, 53 deletions
diff --git a/print-gre.c b/print-gre.c index f4465a92..e7853085 100644 --- a/print-gre.c +++ b/print-gre.c @@ -38,7 +38,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.25 2004-06-12 16:32:56 hannes Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.26 2004-06-29 08:12:06 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -64,6 +64,18 @@ static const char rcsid[] _U_ = #define GRE_sP 0x0800 /* source routing */ #define GRE_RECRS 0x0700 /* recursion count */ #define GRE_AP 0x0080 /* acknowledgment# present */ + +struct tok gre_flag_values[] = { + { GRE_CP, "checksum present"}, + { GRE_RP, "routing present"}, + { GRE_KP, "key present"}, + { GRE_SP, "sequence# present"}, + { GRE_sP, "source routing present"}, + { GRE_RECRS, "recursion count"}, + { GRE_AP, "ack present"}, + { 0, NULL } +}; + #define GRE_VERS_MASK 0x0007 /* protocol version */ /* source route entry types */ @@ -110,14 +122,9 @@ gre_print_0(const u_char *bp, u_int length) u_int16_t flags, prot; flags = EXTRACT_16BITS(bp); - if (vflag && flags) { - printf("[%s%s%s%s%s] ", - (flags & GRE_CP) ? "C" : "", - (flags & GRE_RP) ? "R" : "", - (flags & GRE_KP) ? "K" : "", - (flags & GRE_SP) ? "S" : "", - (flags & GRE_sP) ? "s" : ""); - } + if (vflag) + printf(", Flags [%s]", + bittok2str(gre_flag_values,"none",flags)); len -= 2; bp += 2; @@ -132,13 +139,13 @@ gre_print_0(const u_char *bp, u_int length) if (len < 2) goto trunc; if (vflag) - printf("sum 0x%x ", EXTRACT_16BITS(bp)); + printf(", sum 0x%x", EXTRACT_16BITS(bp)); bp += 2; len -= 2; if (len < 2) goto trunc; - printf("off 0x%x ", EXTRACT_16BITS(bp)); + printf(", off 0x%x", EXTRACT_16BITS(bp)); bp += 2; len -= 2; } @@ -146,7 +153,7 @@ gre_print_0(const u_char *bp, u_int length) if (flags & GRE_KP) { if (len < 4) goto trunc; - printf("key=0x%x ", EXTRACT_32BITS(bp)); + printf(", key=0x%x", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } @@ -154,7 +161,7 @@ gre_print_0(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf("seq %u ", EXTRACT_32BITS(bp)); + printf(", seq %u", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } @@ -189,7 +196,13 @@ gre_print_0(const u_char *bp, u_int length) printf(", proto %s (0x%04x)", tok2str(ethertype_values,"unknown",prot), prot); - printf(": "); + + printf(", length %u",length); + + if (vflag < 1) + printf(": "); /* put in a colon as protocol demarc */ + else + printf("\n\t"); /* if verbose go multiline */ switch (prot) { case ETHERTYPE_IP: @@ -229,15 +242,9 @@ gre_print_1(const u_char *bp, u_int length) len -= 2; bp += 2; - if (vflag) { - printf("[%s%s%s%s%s%s] ", - (flags & GRE_CP) ? "C" : "", - (flags & GRE_RP) ? "R" : "", - (flags & GRE_KP) ? "K" : "", - (flags & GRE_SP) ? "S" : "", - (flags & GRE_sP) ? "s" : "", - (flags & GRE_AP) ? "A" : ""); - } + if (vflag) + printf(", Flags [%s]", + bittok2str(gre_flag_values,"none",flags)); if (len < 2) goto trunc; @@ -245,22 +252,6 @@ gre_print_1(const u_char *bp, u_int length) len -= 2; bp += 2; - if (flags & GRE_CP) { - printf("cpset!"); - return; - } - if (flags & GRE_RP) { - printf("rpset!"); - return; - } - if ((flags & GRE_KP) == 0) { - printf("kpunset!"); - return; - } - if (flags & GRE_sP) { - printf("spset!"); - return; - } if (flags & GRE_KP) { u_int32_t k; @@ -268,7 +259,7 @@ gre_print_1(const u_char *bp, u_int length) if (len < 4) goto trunc; k = EXTRACT_32BITS(bp); - printf("call %d ", k & 0xffff); + printf(", call %d", k & 0xffff); len -= 4; bp += 4; } @@ -276,7 +267,7 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf("seq %u ", EXTRACT_32BITS(bp)); + printf(", seq %u", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } @@ -284,19 +275,31 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_AP) { if (len < 4) goto trunc; - printf("ack %u ", EXTRACT_32BITS(bp)); + printf(", ack %u", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } if ((flags & GRE_SP) == 0) { - printf("no-payload"); + printf(", no-payload"); return; } + if (eflag) + printf(", proto %s (0x%04x)", + tok2str(ethertype_values,"unknown",prot), + prot); + + printf(", length %u",length); + + if (vflag < 1) + printf(": "); /* put in a colon as protocol demarc */ + else + printf("\n\t"); /* if verbose go multiline */ + switch (prot) { case ETHERTYPE_PPP: - printf("gre-ppp-payload"); + ppp_print(bp, len); break; default: printf("gre-proto-0x%x", prot); @@ -314,17 +317,17 @@ gre_sre_print(u_int16_t af, u_int8_t sreoff, u_int8_t srelen, { switch (af) { case GRESRE_IP: - printf("(rtaf=ip"); + printf(", (rtaf=ip"); gre_sre_ip_print(sreoff, srelen, bp, len); printf(") "); break; case GRESRE_ASN: - printf("(rtaf=asn"); + printf(", (rtaf=asn"); gre_sre_asn_print(sreoff, srelen, bp, len); printf(") "); break; default: - printf("(rtaf=0x%x) ", af); + printf(", (rtaf=0x%x) ", af); } } void @@ -334,15 +337,15 @@ gre_sre_ip_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) const u_char *up = bp; if (sreoff & 3) { - printf(" badoffset=%u", sreoff); + printf(", badoffset=%u", sreoff); return; } if (srelen & 3) { - printf(" badlength=%u", srelen); + printf(", badlength=%u", srelen); return; } if (sreoff >= srelen) { - printf(" badoff/len=%u/%u", sreoff, srelen); + printf(", badoff/len=%u/%u", sreoff, srelen); return; } @@ -367,15 +370,15 @@ gre_sre_asn_print(u_int8_t sreoff, u_int8_t srelen, const u_char *bp, u_int len) const u_char *up = bp; if (sreoff & 1) { - printf(" badoffset=%u", sreoff); + printf(", badoffset=%u", sreoff); return; } if (srelen & 1) { - printf(" badlength=%u", srelen); + printf(", badlength=%u", srelen); return; } if (sreoff >= srelen) { - printf(" badoff/len=%u/%u", sreoff, srelen); + printf(", badoff/len=%u/%u", sreoff, srelen); return; } |