X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3b8786edf427763293c28f11a3a644894d574336..fb8b947488c7f22b518de1df1a91e663dc7ab33c:/print-gre.c diff --git a/print-gre.c b/print-gre.c index f4465a92..ed4c957b 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.27 2004-07-02 06:39:11 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,15 +196,23 @@ 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: ip_print(bp, len); break; +#ifdef INET6 case ETHERTYPE_IPV6: ip6_print(bp, len); break; +#endif case ETHERTYPE_MPLS: mpls_print(bp, len); break; @@ -229,15 +244,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 +254,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 +261,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 +269,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 +277,32 @@ 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"); - return; - } + if ((flags & GRE_SP) == 0) + printf(", no-payload"); + + if (eflag) + printf(", proto %s (0x%04x)", + tok2str(ethertype_values,"unknown",prot), + prot); + + printf(", length %u",length); + + if ((flags & GRE_SP) == 0) + return; + + 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 +320,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 +340,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 +373,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; }