X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/e0451bbf40e46ea709eb39d6789a162cf415fe57..refs/heads/tcpdump-4.1:/print-gre.c diff --git a/print-gre.c b/print-gre.c index 70840025..106e6fd3 100644 --- a/print-gre.c +++ b/print-gre.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-gre.c,v 1.5 2002/09/18 20:40:06 jason Exp $ */ +/* $OpenBSD: print-gre.c,v 1.6 2002/10/30 03:04:04 fgsch Exp $ */ /* * Copyright (c) 2002 Jason L. Wright (jason@thought.net) @@ -37,8 +37,8 @@ */ #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.18 2002-09-24 23:39:22 hannes Exp $ (LBL)"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.28 2005-04-06 21:32:39 mcr Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -55,6 +55,7 @@ static const char rcsid[] = #include "extract.h" #include "ip.h" +#include "ethertype.h" #define GRE_CP 0x8000 /* checksum present */ #define GRE_RP 0x4000 /* routing present */ @@ -63,11 +64,19 @@ static const char rcsid[] = #define GRE_sP 0x0800 /* source routing */ #define GRE_RECRS 0x0700 /* recursion count */ #define GRE_AP 0x0080 /* acknowledgment# present */ -#define GRE_VERS 0x0007 /* protocol version */ -#define GREPROTO_IP 0x0800 /* IP */ -#define GREPROTO_PPP 0x880b /* PPTP */ -#define GREPROTO_ISO 0xfefe /* OSI */ +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 */ #define GRESRE_IP 0x0800 /* IP */ @@ -88,14 +97,20 @@ gre_print(const u_char *bp, u_int length) printf("[|gre]"); return; } - vers = EXTRACT_16BITS(bp) & 7; - - if (vers == 0) - gre_print_0(bp, len); - else if (vers == 1) - gre_print_1(bp, len); - else - printf("gre-unknown-version=%u", vers); + vers = EXTRACT_16BITS(bp) & GRE_VERS_MASK; + printf("GREv%u",vers); + + switch(vers) { + case 0: + gre_print_0(bp, len); + break; + case 1: + gre_print_1(bp, len); + break; + default: + printf(" ERROR: unknown-version"); + break; + } return; } @@ -107,14 +122,9 @@ gre_print_0(const u_char *bp, u_int length) u_int16_t flags, prot; flags = EXTRACT_16BITS(bp); - if (vflag) { - 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; @@ -129,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; } @@ -143,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; } @@ -151,7 +161,7 @@ gre_print_0(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf("seq=0x%x ", EXTRACT_32BITS(bp)); + printf(", seq %u", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } @@ -182,13 +192,42 @@ gre_print_0(const u_char *bp, u_int length) } } + 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 GREPROTO_IP: - ip_print(bp, len); + case ETHERTYPE_IP: + ip_print(gndo, bp, len); + break; +#ifdef INET6 + case ETHERTYPE_IPV6: + ip6_print(bp, len); + break; +#endif + case ETHERTYPE_MPLS: + mpls_print(bp, len); + break; + case ETHERTYPE_IPX: + ipx_print(bp, len); + break; + case ETHERTYPE_ATALK: + atalk_print(bp, len); + break; + case ETHERTYPE_GRE_ISO: + isoclns_print(bp, len, len); + break; + case ETHERTYPE_TEB: + ether_print(bp, len, len, NULL, NULL); break; - case GREPROTO_ISO: - isoclns_print(bp, len, len, NULL, NULL); - break; default: printf("gre-proto-0x%x", prot); } @@ -208,15 +247,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; @@ -224,22 +257,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; @@ -247,7 +264,7 @@ gre_print_1(const u_char *bp, u_int length) if (len < 4) goto trunc; k = EXTRACT_32BITS(bp); - printf("key=0x%x call=0x%x ", (k >> 16) & 0xffff, k & 0xffff); + printf(", call %d", k & 0xffff); len -= 4; bp += 4; } @@ -255,7 +272,7 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_SP) { if (len < 4) goto trunc; - printf("seq=0x%x ", EXTRACT_32BITS(bp)); + printf(", seq %u", EXTRACT_32BITS(bp)); bp += 4; len -= 4; } @@ -263,22 +280,35 @@ gre_print_1(const u_char *bp, u_int length) if (flags & GRE_AP) { if (len < 4) goto trunc; - printf("ack=0x%x ", 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 GREPROTO_PPP: - printf("gre-ppp-payload "); + case ETHERTYPE_PPP: + ppp_print(bp, len); break; default: - printf("gre-proto-0x%x ", prot); + printf("gre-proto-0x%x", prot); break; } return; @@ -293,17 +323,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 @@ -313,15 +343,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; } @@ -346,15 +376,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; }