diff options
author | Denis Ovsienko <infrastation@yandex.ru> | 2014-03-25 15:05:59 +0400 |
---|---|---|
committer | Denis Ovsienko <infrastation@yandex.ru> | 2014-03-25 23:27:23 +0400 |
commit | 59690cf6b7ffce3cc86936cbe658909c6ec3a687 (patch) | |
tree | adf69cb3d387361ad0e0eade251e77d275b0eafd /print-dhcp6.c | |
parent | f979840e7b4f2f538ee7948e789899e0a51bf54d (diff) | |
download | tcpdump-59690cf6b7ffce3cc86936cbe658909c6ec3a687.tar.gz |
NDOize BOOTP, DHCPv6, DNS, PIM and sFlow decoders
Also add/remove tabs in a few involved functions to justify indentation.
Diffstat (limited to 'print-dhcp6.c')
-rw-r--r-- | print-dhcp6.c | 285 |
1 files changed, 144 insertions, 141 deletions
diff --git a/print-dhcp6.c b/print-dhcp6.c index 8a119ff5..70c0e15c 100644 --- a/print-dhcp6.c +++ b/print-dhcp6.c @@ -40,6 +40,7 @@ * RFC6334: Dual-Stack Lite option, */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -328,7 +329,8 @@ dhcp6stcode(int code) } static void -dhcp6opt_print(const u_char *cp, const u_char *ep) +dhcp6opt_print(netdissect_options *ndo, + const u_char *cp, const u_char *ep) { const struct dhcp6opt *dh6o; const u_char *tp; @@ -348,159 +350,159 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) if (ep < cp + sizeof(*dh6o)) goto trunc; dh6o = (struct dhcp6opt *)cp; - TCHECK(*dh6o); + ND_TCHECK(*dh6o); optlen = EXTRACT_16BITS(&dh6o->dh6opt_len); if (ep < cp + sizeof(*dh6o) + optlen) goto trunc; opttype = EXTRACT_16BITS(&dh6o->dh6opt_type); - printf(" (%s", dhcp6opt_name(opttype)); + ND_PRINT((ndo, " (%s", dhcp6opt_name(opttype))); switch (opttype) { case DH6OPT_CLIENTID: case DH6OPT_SERVERID: if (optlen < 2) { /*(*/ - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); switch (EXTRACT_16BITS(tp)) { case 1: if (optlen >= 2 + 6) { - printf(" hwaddr/time type %u time %u ", + ND_PRINT((ndo, " hwaddr/time type %u time %u ", EXTRACT_16BITS(&tp[2]), - EXTRACT_32BITS(&tp[4])); + EXTRACT_32BITS(&tp[4]))); for (i = 8; i < optlen; i++) - printf("%02x", tp[i]); + ND_PRINT((ndo, "%02x", tp[i])); /*(*/ - printf(")"); + ND_PRINT((ndo, ")")); } else { /*(*/ - printf(" ?)"); + ND_PRINT((ndo, " ?)")); } break; case 2: if (optlen >= 2 + 8) { - printf(" vid "); + ND_PRINT((ndo, " vid ")); for (i = 2; i < 2 + 8; i++) - printf("%02x", tp[i]); + ND_PRINT((ndo, "%02x", tp[i])); /*(*/ - printf(")"); + ND_PRINT((ndo, ")")); } else { /*(*/ - printf(" ?)"); + ND_PRINT((ndo, " ?)")); } break; case 3: if (optlen >= 2 + 2) { - printf(" hwaddr type %u ", - EXTRACT_16BITS(&tp[2])); + ND_PRINT((ndo, " hwaddr type %u ", + EXTRACT_16BITS(&tp[2]))); for (i = 4; i < optlen; i++) - printf("%02x", tp[i]); + ND_PRINT((ndo, "%02x", tp[i])); /*(*/ - printf(")"); + ND_PRINT((ndo, ")")); } else { /*(*/ - printf(" ?)"); + ND_PRINT((ndo, " ?)")); } break; default: - printf(" type %d)", EXTRACT_16BITS(tp)); + ND_PRINT((ndo, " type %d)", EXTRACT_16BITS(tp))); break; } break; case DH6OPT_IA_ADDR: if (optlen < 24) { /*(*/ - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %s", ip6addr_string(&tp[0])); - printf(" pltime:%u vltime:%u", + ND_PRINT((ndo, " %s", ip6addr_string(&tp[0]))); + ND_PRINT((ndo, " pltime:%u vltime:%u", EXTRACT_32BITS(&tp[16]), - EXTRACT_32BITS(&tp[20])); + EXTRACT_32BITS(&tp[20]))); if (optlen > 24) { /* there are sub-options */ - dhcp6opt_print(tp + 24, tp + optlen); + dhcp6opt_print(ndo, tp + 24, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_ORO: case DH6OPT_ERO: if (optlen % 2) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); for (i = 0; i < optlen; i += 2) { - printf(" %s", - dhcp6opt_name(EXTRACT_16BITS(&tp[i]))); + ND_PRINT((ndo, " %s", + dhcp6opt_name(EXTRACT_16BITS(&tp[i])))); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_PREFERENCE: if (optlen != 1) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %d)", *tp); + ND_PRINT((ndo, " %d)", *tp)); break; case DH6OPT_ELAPSED_TIME: if (optlen != 2) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %d)", EXTRACT_16BITS(tp)); + ND_PRINT((ndo, " %d)", EXTRACT_16BITS(tp))); break; case DH6OPT_RELAY_MSG: - printf(" ("); + ND_PRINT((ndo, " (")); tp = (u_char *)(dh6o + 1); - dhcp6_print(tp, optlen); - printf(")"); + dhcp6_print(ndo, tp, optlen); + ND_PRINT((ndo, ")")); break; case DH6OPT_AUTH: if (optlen < 11) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); auth_proto = *tp; switch (auth_proto) { case DH6OPT_AUTHPROTO_DELAYED: - printf(" proto: delayed"); + ND_PRINT((ndo, " proto: delayed")); break; case DH6OPT_AUTHPROTO_RECONFIG: - printf(" proto: reconfigure"); + ND_PRINT((ndo, " proto: reconfigure")); break; default: - printf(" proto: %d", auth_proto); + ND_PRINT((ndo, " proto: %d", auth_proto)); break; } tp++; switch (*tp) { case DH6OPT_AUTHALG_HMACMD5: /* XXX: may depend on the protocol */ - printf(", alg: HMAC-MD5"); + ND_PRINT((ndo, ", alg: HMAC-MD5")); break; default: - printf(", alg: %d", *tp); + ND_PRINT((ndo, ", alg: %d", *tp)); break; } tp++; switch (*tp) { case DH6OPT_AUTHRDM_MONOCOUNTER: - printf(", RDM: mono"); + ND_PRINT((ndo, ", RDM: mono")); break; default: - printf(", RDM: %d", *tp); + ND_PRINT((ndo, ", RDM: %d", *tp)); break; } tp++; - printf(", RD:"); + ND_PRINT((ndo, ", RD:")); for (i = 0; i < 4; i++, tp += 2) - printf(" %04x", EXTRACT_16BITS(tp)); + ND_PRINT((ndo, " %04x", EXTRACT_16BITS(tp))); /* protocol dependent part */ authinfolen = optlen - 11; @@ -509,50 +511,50 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) if (authinfolen == 0) break; if (authinfolen < 20) { - printf(" ??"); + ND_PRINT((ndo, " ??")); break; } authrealmlen = authinfolen - 20; if (authrealmlen > 0) { - printf(", realm: "); + ND_PRINT((ndo, ", realm: ")); } for (i = 0; i < authrealmlen; i++, tp++) - printf("%02x", *tp); - printf(", key ID: %08x", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, "%02x", *tp)); + ND_PRINT((ndo, ", key ID: %08x", EXTRACT_32BITS(tp))); tp += 4; - printf(", HMAC-MD5:"); + ND_PRINT((ndo, ", HMAC-MD5:")); for (i = 0; i < 4; i++, tp+= 4) - printf(" %08x", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, " %08x", EXTRACT_32BITS(tp))); break; case DH6OPT_AUTHPROTO_RECONFIG: if (authinfolen != 17) { - printf(" ??"); + ND_PRINT((ndo, " ??")); break; } switch (*tp++) { case DH6OPT_AUTHRECONFIG_KEY: - printf(" reconfig-key"); + ND_PRINT((ndo, " reconfig-key")); break; case DH6OPT_AUTHRECONFIG_HMACMD5: - printf(" type: HMAC-MD5"); + ND_PRINT((ndo, " type: HMAC-MD5")); break; default: - printf(" type: ??"); + ND_PRINT((ndo, " type: ??")); break; } - printf(" value:"); + ND_PRINT((ndo, " value:")); for (i = 0; i < 4; i++, tp+= 4) - printf(" %08x", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, " %08x", EXTRACT_32BITS(tp))); break; default: - printf(" ??"); + ND_PRINT((ndo, " ??")); break; } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_RAPID_COMMIT: /* nothing todo */ - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_INTERFACE_ID: case DH6OPT_SUBSCRIBER_ID: @@ -561,27 +563,27 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) * at most 10 characters. */ tp = (u_char *)(dh6o + 1); - printf(" "); + ND_PRINT((ndo, " ")); for (i = 0; i < optlen && i < 10; i++) - printf("%02x", tp[i]); - printf("...)"); + ND_PRINT((ndo, "%02x", tp[i])); + ND_PRINT((ndo, "...)")); break; case DH6OPT_RECONF_MSG: tp = (u_char *)(dh6o + 1); switch (*tp) { case DH6_RENEW: - printf(" for renew)"); + ND_PRINT((ndo, " for renew)")); break; case DH6_INFORM_REQ: - printf(" for inf-req)"); + ND_PRINT((ndo, " for inf-req)")); break; default: - printf(" for ?\?\?(%02x))", *tp); + ND_PRINT((ndo, " for ?\?\?(%02x))", *tp)); break; } break; case DH6OPT_RECONF_ACCEPT: /* nothing todo */ - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_SIP_SERVER_A: case DH6OPT_DNS_SERVERS: @@ -592,150 +594,150 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) case DH6OPT_PANA_AGENT: case DH6OPT_LQ_CLIENT_LINK: if (optlen % 16) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); for (i = 0; i < optlen; i += 16) - printf(" %s", ip6addr_string(&tp[i])); - printf(")"); + ND_PRINT((ndo, " %s", ip6addr_string(&tp[i]))); + ND_PRINT((ndo, ")")); break; case DH6OPT_SIP_SERVER_D: case DH6OPT_DOMAIN_LIST: tp = (u_char *)(dh6o + 1); while (tp < cp + sizeof(*dh6o) + optlen) { putchar(' '); - if ((tp = ns_nprint(tp, cp + sizeof(*dh6o) + optlen)) == NULL) + if ((tp = ns_nprint(ndo, tp, cp + sizeof(*dh6o) + optlen)) == NULL) goto trunc; } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_STATUS_CODE: if (optlen < 2) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %s)", dhcp6stcode(EXTRACT_16BITS(&tp[0]))); + ND_PRINT((ndo, " %s)", dhcp6stcode(EXTRACT_16BITS(&tp[0])))); break; case DH6OPT_IA_NA: case DH6OPT_IA_PD: if (optlen < 12) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" IAID:%u T1:%u T2:%u", + ND_PRINT((ndo, " IAID:%u T1:%u T2:%u", EXTRACT_32BITS(&tp[0]), EXTRACT_32BITS(&tp[4]), - EXTRACT_32BITS(&tp[8])); + EXTRACT_32BITS(&tp[8]))); if (optlen > 12) { /* there are sub-options */ - dhcp6opt_print(tp + 12, tp + optlen); + dhcp6opt_print(ndo, tp + 12, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_IA_TA: if (optlen < 4) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" IAID:%u", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, " IAID:%u", EXTRACT_32BITS(tp))); if (optlen > 4) { /* there are sub-options */ - dhcp6opt_print(tp + 4, tp + optlen); + dhcp6opt_print(ndo, tp + 4, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_IA_PD_PREFIX: if (optlen < 25) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %s/%d", ip6addr_string(&tp[9]), tp[8]); - printf(" pltime:%u vltime:%u", + ND_PRINT((ndo, " %s/%d", ip6addr_string(&tp[9]), tp[8])); + ND_PRINT((ndo, " pltime:%u vltime:%u", EXTRACT_32BITS(&tp[0]), - EXTRACT_32BITS(&tp[4])); + EXTRACT_32BITS(&tp[4]))); if (optlen > 25) { /* there are sub-options */ - dhcp6opt_print(tp + 25, tp + optlen); + dhcp6opt_print(ndo, tp + 25, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_LIFETIME: case DH6OPT_CLT_TIME: if (optlen != 4) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %d)", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, " %d)", EXTRACT_32BITS(tp))); break; case DH6OPT_REMOTE_ID: if (optlen < 4) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %d ", EXTRACT_32BITS(tp)); + ND_PRINT((ndo, " %d ", EXTRACT_32BITS(tp))); /* * Print hex dump first 10 characters. */ for (i = 4; i < optlen && i < 14; i++) - printf("%02x", tp[i]); - printf("...)"); + ND_PRINT((ndo, "%02x", tp[i])); + ND_PRINT((ndo, "...)")); break; case DH6OPT_LQ_QUERY: if (optlen < 17) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); switch (*tp) { case 1: - printf(" by-address"); + ND_PRINT((ndo, " by-address")); break; case 2: - printf(" by-clientID"); + ND_PRINT((ndo, " by-clientID")); break; default: - printf(" type_%d", (int)*tp); + ND_PRINT((ndo, " type_%d", (int)*tp)); break; } - printf(" %s", ip6addr_string(&tp[1])); + ND_PRINT((ndo, " %s", ip6addr_string(&tp[1]))); if (optlen > 17) { /* there are query-options */ - dhcp6opt_print(tp + 17, tp + optlen); + dhcp6opt_print(ndo, tp + 17, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_CLIENT_DATA: tp = (u_char *)(dh6o + 1); if (optlen > 0) { /* there are encapsulated options */ - dhcp6opt_print(tp, tp + optlen); + dhcp6opt_print(ndo, tp, tp + optlen); } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_LQ_RELAY_DATA: if (optlen < 16) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); - printf(" %s ", ip6addr_string(&tp[0])); + ND_PRINT((ndo, " %s ", ip6addr_string(&tp[0]))); /* * Print hex dump first 10 characters. */ for (i = 16; i < optlen && i < 26; i++) - printf("%02x", tp[i]); - printf("...)"); + ND_PRINT((ndo, "%02x", tp[i])); + ND_PRINT((ndo, "...)")); break; case DH6OPT_NTP_SERVER: if (optlen < 4) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); @@ -746,54 +748,54 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) tp += 2; if (tp + subopt_len > cp + sizeof(*dh6o) + optlen) goto trunc; - printf(" subopt:%d", subopt_code); + ND_PRINT((ndo, " subopt:%d", subopt_code)); switch (subopt_code) { case DH6OPT_NTP_SUBOPTION_SRV_ADDR: case DH6OPT_NTP_SUBOPTION_MC_ADDR: if (subopt_len != 16) { - printf(" ?"); + ND_PRINT((ndo, " ?")); break; } - printf(" %s", ip6addr_string(&tp[0])); + ND_PRINT((ndo, " %s", ip6addr_string(&tp[0]))); break; case DH6OPT_NTP_SUBOPTION_SRV_FQDN: putchar(' '); - if (ns_nprint(tp, tp + subopt_len) == NULL) + if (ns_nprint(ndo, tp, tp + subopt_len) == NULL) goto trunc; break; default: - printf(" ?"); + ND_PRINT((ndo, " ?")); break; } tp += subopt_len; } - printf(")"); + ND_PRINT((ndo, ")")); break; case DH6OPT_AFTR_NAME: if (optlen < 3) { - printf(" ?)"); + ND_PRINT((ndo, " ?)")); break; } tp = (u_char *)(dh6o + 1); remain_len = optlen; - printf(" "); + ND_PRINT((ndo, " ")); /* Encoding is described in section 3.1 of RFC 1035 */ while (remain_len && *tp) { label_len = *tp++; if (label_len < remain_len - 1) { - printf("%.*s", label_len, tp); + ND_PRINT((ndo, "%.*s", label_len, tp)); tp += label_len; remain_len -= (label_len + 1); - if(*tp) printf("."); + if(*tp) ND_PRINT((ndo, ".")); } else { - printf(" ?"); + ND_PRINT((ndo, " ?")); break; } } - printf(")"); + ND_PRINT((ndo, ")")); break; default: - printf(")"); + ND_PRINT((ndo, ")")); break; } @@ -802,14 +804,15 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) return; trunc: - printf("[|dhcp6ext]"); + ND_PRINT((ndo, "[|dhcp6ext]")); } /* * Print dhcp6 packets */ void -dhcp6_print(const u_char *cp, u_int length) +dhcp6_print(netdissect_options *ndo, + const u_char *cp, u_int length) { struct dhcp6 *dh6; struct dhcp6_relay *dh6relay; @@ -817,15 +820,15 @@ dhcp6_print(const u_char *cp, u_int length) u_char *extp; const char *name; - printf("dhcp6"); + ND_PRINT((ndo, "dhcp6")); - ep = (u_char *)snapend; + ep = (u_char *)ndo->ndo_snapend; if (cp + length < ep) ep = cp + length; dh6 = (struct dhcp6 *)cp; dh6relay = (struct dhcp6_relay *)cp; - TCHECK(dh6->dh6_xid); + ND_TCHECK(dh6->dh6_xid); switch (dh6->dh6_msgtype) { case DH6_SOLICIT: name = "solicit"; @@ -877,12 +880,12 @@ dhcp6_print(const u_char *cp, u_int length) break; } - if (!vflag) { + if (!ndo->ndo_vflag) { if (name) - printf(" %s", name); + ND_PRINT((ndo, " %s", name)); else if (dh6->dh6_msgtype != DH6_RELAY_FORW && dh6->dh6_msgtype != DH6_RELAY_REPLY) { - printf(" msgtype-%u", dh6->dh6_msgtype); + ND_PRINT((ndo, " msgtype-%u", dh6->dh6_msgtype)); } return; } @@ -890,31 +893,31 @@ dhcp6_print(const u_char *cp, u_int length) /* XXX relay agent messages have to be handled differently */ if (name) - printf(" %s (", name); /*)*/ + ND_PRINT((ndo, " %s (", name)); /*)*/ else - printf(" msgtype-%u (", dh6->dh6_msgtype); /*)*/ + ND_PRINT((ndo, " msgtype-%u (", dh6->dh6_msgtype)); /*)*/ if (dh6->dh6_msgtype != DH6_RELAY_FORW && dh6->dh6_msgtype != DH6_RELAY_REPLY) { - printf("xid=%x", EXTRACT_32BITS(&dh6->dh6_xid) & DH6_XIDMASK); + ND_PRINT((ndo, "xid=%x", EXTRACT_32BITS(&dh6->dh6_xid) & DH6_XIDMASK)); extp = (u_char *)(dh6 + 1); - dhcp6opt_print(extp, ep); + dhcp6opt_print(ndo, extp, ep); } else { /* relay messages */ struct in6_addr addr6; - TCHECK(dh6relay->dh6relay_peeraddr); + ND_TCHECK(dh6relay->dh6relay_peeraddr); memcpy(&addr6, dh6relay->dh6relay_linkaddr, sizeof (addr6)); - printf("linkaddr=%s", ip6addr_string(&addr6)); + ND_PRINT((ndo, "linkaddr=%s", ip6addr_string(&addr6))); memcpy(&addr6, dh6relay->dh6relay_peeraddr, sizeof (addr6)); - printf(" peeraddr=%s", ip6addr_string(&addr6)); + ND_PRINT((ndo, " peeraddr=%s", ip6addr_string(&addr6))); - dhcp6opt_print((u_char *)(dh6relay + 1), ep); + dhcp6opt_print(ndo, (u_char *)(dh6relay + 1), ep); } /*(*/ - printf(")"); + ND_PRINT((ndo, ")")); return; trunc: - printf("[|dhcp6]"); + ND_PRINT((ndo, "[|dhcp6]")); } |