diff options
author | hannes <hannes> | 2004-09-27 21:13:09 +0000 |
---|---|---|
committer | hannes <hannes> | 2004-09-27 21:13:09 +0000 |
commit | 5e6014ea380263ae6fe4511330aa9b1acacd2cec (patch) | |
tree | 15eac77b3d4d9cb914ac426349b3b208cfc2ea54 | |
parent | 3b97eb047bfcee083e490e19c72f11fec4bd7a02 (diff) | |
download | tcpdump-5e6014ea380263ae6fe4511330aa9b1acacd2cec.tar.gz |
clean up the ip options printer:
- make more use of tok2str()
- always display the option length
- move option defines into ip.h
-rw-r--r-- | ip.h | 3 | ||||
-rw-r--r-- | print-ip.c | 105 |
2 files changed, 49 insertions, 59 deletions
@@ -1,4 +1,4 @@ -/* @(#) $Header: /tcpdump/master/tcpdump/ip.h,v 1.10 2002-12-11 07:13:53 guy Exp $ (LBL) */ +/* @(#) $Header: /tcpdump/master/tcpdump/ip.h,v 1.11 2004-09-27 21:13:10 hannes Exp $ (LBL) */ /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. @@ -106,6 +106,7 @@ struct ip { #define IPOPT_LSRR 131 /* loose source route */ #define IPOPT_SATID 136 /* satnet id */ #define IPOPT_SSRR 137 /* strict source route */ +#define IPOPT_RA 148 /* router-alert, rfc2113 */ /* * Offsets to fields in options other than EOL and NOP. @@ -21,7 +21,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.143 2004-08-27 03:57:40 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.144 2004-09-27 21:13:09 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -41,11 +41,23 @@ static const char rcsid[] _U_ = #include "ip.h" #include "ipproto.h" +struct tok ip_option_values[] = { + { IPOPT_EOL, "EOL" }, + { IPOPT_NOP, "NOP" }, + { IPOPT_TS, "timestamp" }, + { IPOPT_SECURITY, "security" }, + { IPOPT_RR, "RR" }, + { IPOPT_SSRR, "SSRR" }, + { IPOPT_LSRR, "LSRR" }, + { IPOPT_RA, "RA" }, + { 0, NULL } +}; + /* * print the recorded route in an IP RR, LSRR or SSRR option. */ static void -ip_printroute(const char *type, register const u_char *cp, u_int length) +ip_printroute(register const u_char *cp, u_int length) { register u_int ptr; register u_int len; @@ -54,21 +66,17 @@ ip_printroute(const char *type, register const u_char *cp, u_int length) printf(" [bad length %u]", length); return; } - printf(" %s{", type); if ((length + 1) & 3) printf(" [bad length %u]", length); ptr = cp[2] - 1; if (ptr < 3 || ((ptr + 1) & 3) || ptr > length + 1) printf(" [bad ptr %u]", cp[2]); - type = ""; for (len = 3; len < length; len += 4) { - if (ptr == len) - type = "#"; - printf("%s%s", type, ipaddr_string(&cp[len])); - type = " "; + printf("%s", ipaddr_string(&cp[len])); + if (ptr > len) + printf (", "); } - printf("%s}", ptr == len? "#" : ""); } /* @@ -188,75 +196,56 @@ done: static void ip_optprint(register const u_char *cp, u_int length) { - register u_int len; + register u_int option_len; - for (; length > 0; cp += len, length -= len) { - int tt; + for (; length > 0; cp += option_len, length -= option_len) { + u_int option_code; TCHECK(*cp); - tt = *cp; - if (tt == IPOPT_NOP || tt == IPOPT_EOL) - len = 1; + option_code = *cp; + + if (option_code == IPOPT_NOP || + option_code == IPOPT_EOL) + option_len = 1; + else { TCHECK(cp[1]); - len = cp[1]; - if (len < 2) { - printf("[|ip op len %d]", len); - return; - } - TCHECK2(*cp, len); + option_len = cp[1]; } - switch (tt) { - case IPOPT_EOL: - printf(" EOL"); - if (length > 1) - printf("-%d", length - 1); - return; + printf("%s (%u) len %u", + tok2str(ip_option_values,"unknown",option_code), + option_code, + option_len); - case IPOPT_NOP: - printf(" NOP"); - break; + if (option_len < 2) + return; - case IPOPT_TS: - ip_printts(cp, len); - break; + TCHECK2(*cp, option_len); -#ifndef IPOPT_SECURITY -#define IPOPT_SECURITY 130 -#endif /* IPOPT_SECURITY */ - case IPOPT_SECURITY: - printf(" SECURITY{%d}", len); - break; + switch (option_code) { + case IPOPT_EOL: + return; - case IPOPT_RR: - ip_printroute("RR", cp, len); + case IPOPT_TS: + ip_printts(cp, option_len); break; + case IPOPT_RR: /* fall through */ case IPOPT_SSRR: - ip_printroute("SSRR", cp, len); - break; - case IPOPT_LSRR: - ip_printroute("LSRR", cp, len); + ip_printroute( cp, option_len); break; -#ifndef IPOPT_RA -#define IPOPT_RA 148 /* router alert */ -#endif case IPOPT_RA: - printf(" RA"); - if (len != 4) - printf("{%d}", len); - else { - TCHECK(cp[3]); - if (cp[2] || cp[3]) - printf("%d.%d", cp[2], cp[3]); - } + TCHECK(cp[3]); + if (EXTRACT_16BITS(&cp[2]) != 0) + printf("value %u", EXTRACT_16BITS(&cp[2])); break; + case IPOPT_NOP: /* nothing to print - fall through */ + case IPOPT_SECURITY: default: - printf(" IPOPT-%d{%d}", cp[0], len); break; } } @@ -461,7 +450,7 @@ ip_print(register const u_char *bp, register u_int length) (void)printf(", length: %u", EXTRACT_16BITS(&ip->ip_len)); if ((hlen - sizeof(struct ip)) > 0) { - (void)printf(", optlength: %u (", hlen - (u_int)sizeof(struct ip)); + printf(", options ( "); ip_optprint((u_char *)(ip + 1), hlen - sizeof(struct ip)); printf(" )"); } |