summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-dhcp6.c
diff options
context:
space:
mode:
authorrpaulo <rpaulo@FreeBSD.org>2010-10-28 19:06:17 +0000
committerrpaulo <rpaulo@FreeBSD.org>2010-10-28 19:06:17 +0000
commit1e8ad3bd802d66bed71b4c6405ff5d801a913e4a (patch)
treedf5e0d876c3ec2ff0e3d9c6795cb5c1e20b7d5c4 /contrib/tcpdump/print-dhcp6.c
parent7ab661360c2131496bd3c111b5b3b2462fe3d2be (diff)
parent5f4de8e61a87fc21b6ffecf7ef9444827c09ee69 (diff)
downloadFreeBSD-src-1e8ad3bd802d66bed71b4c6405ff5d801a913e4a.zip
FreeBSD-src-1e8ad3bd802d66bed71b4c6405ff5d801a913e4a.tar.gz
Merge tcpdump-4.1.1.
Diffstat (limited to 'contrib/tcpdump/print-dhcp6.c')
-rw-r--r--contrib/tcpdump/print-dhcp6.c266
1 files changed, 101 insertions, 165 deletions
diff --git a/contrib/tcpdump/print-dhcp6.c b/contrib/tcpdump/print-dhcp6.c
index ec0df76..26855cc 100644
--- a/contrib/tcpdump/print-dhcp6.c
+++ b/contrib/tcpdump/print-dhcp6.c
@@ -40,7 +40,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-dhcp6.c,v 1.36.2.1 2008-02-06 10:26:27 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-dhcp6.c,v 1.37 2008-02-06 10:26:09 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -177,54 +177,19 @@ struct dhcp6opt {
/* type-dependent data follows */
};
-struct dhcp6_ia {
- u_int16_t dh6opt_ia_type;
- u_int16_t dh6opt_ia_len;
- u_int32_t dh6opt_ia_iaid;
- u_int32_t dh6opt_ia_t1;
- u_int32_t dh6opt_ia_t2;
-};
-
-struct dhcp6_ia_addr {
- u_int16_t dh6opt_ia_addr_type;
- u_int16_t dh6opt_ia_addr_len;
- struct in6_addr dh6opt_ia_addr_addr;
- u_int32_t dh6opt_ia_addr_pltime;
- u_int32_t dh6opt_ia_addr_vltime;
-} __attribute__ ((__packed__));
-
-struct dhcp6_ia_prefix {
- u_int16_t dh6opt_ia_prefix_type;
- u_int16_t dh6opt_ia_prefix_len;
- u_int32_t dh6opt_ia_prefix_pltime;
- u_int32_t dh6opt_ia_prefix_vltime;
- u_int8_t dh6opt_ia_prefix_plen;
- struct in6_addr dh6opt_ia_prefix_addr;
-} __attribute__ ((__packed__));
-
-struct dhcp6_auth {
- u_int16_t dh6opt_auth_type;
- u_int16_t dh6opt_auth_len;
- u_int8_t dh6opt_auth_proto;
- u_int8_t dh6opt_auth_alg;
- u_int8_t dh6opt_auth_rdm;
- u_int8_t dh6opt_auth_rdinfo[8];
- /* authentication information follows */
-} __attribute__ ((__packed__));
-
static const char *
dhcp6opt_name(int type)
{
static char genstr[sizeof("opt_65535") + 1]; /* XXX thread unsafe */
if (type > 65535)
- return "INVALID option";
+ return "INVALID-option";
switch(type) {
case DH6OPT_CLIENTID:
- return "client ID";
+ return "client-ID";
case DH6OPT_SERVERID:
- return "server ID";
+ return "server-ID";
case DH6OPT_IA_NA:
return "IA_NA";
case DH6OPT_IA_TA:
@@ -232,87 +197,87 @@ dhcp6opt_name(int type)
case DH6OPT_IA_ADDR:
return "IA_ADDR";
case DH6OPT_ORO:
- return "option request";
+ return "option-request";
case DH6OPT_PREFERENCE:
return "preference";
case DH6OPT_ELAPSED_TIME:
- return "elapsed time";
+ return "elapsed-time";
case DH6OPT_RELAY_MSG:
- return "relay message";
+ return "relay-message";
case DH6OPT_AUTH:
return "authentication";
case DH6OPT_UNICAST:
- return "server unicast";
+ return "server-unicast";
case DH6OPT_STATUS_CODE:
- return "status code";
+ return "status-code";
case DH6OPT_RAPID_COMMIT:
- return "rapid commit";
+ return "rapid-commit";
case DH6OPT_USER_CLASS:
- return "user class";
+ return "user-class";
case DH6OPT_VENDOR_CLASS:
- return "vendor class";
+ return "vendor-class";
case DH6OPT_VENDOR_OPTS:
- return "vendor-specific info";
+ return "vendor-specific-info";
case DH6OPT_INTERFACE_ID:
- return "interface ID";
+ return "interface-ID";
case DH6OPT_RECONF_MSG:
- return "reconfigure message";
+ return "reconfigure-message";
case DH6OPT_RECONF_ACCEPT:
- return "reconfigure accept";
+ return "reconfigure-accept";
case DH6OPT_SIP_SERVER_D:
- return "SIP servers domain";
+ return "SIP-servers-domain";
case DH6OPT_SIP_SERVER_A:
- return "SIP servers address";
+ return "SIP-servers-address";
case DH6OPT_DNS:
return "DNS";
case DH6OPT_DNSNAME:
- return "DNS name";
+ return "DNS-name";
case DH6OPT_IA_PD:
return "IA_PD";
case DH6OPT_IA_PD_PREFIX:
- return "IA_PD prefix";
+ return "IA_PD-prefix";
case DH6OPT_NTP_SERVERS:
- return "NTP Server";
+ return "NTP-Server";
case DH6OPT_LIFETIME:
return "lifetime";
case DH6OPT_NIS_SERVERS:
- return "NIS server";
+ return "NIS-server";
case DH6OPT_NISP_SERVERS:
- return "NIS+ server";
+ return "NIS+-server";
case DH6OPT_NIS_NAME:
- return "NIS domain name";
+ return "NIS-domain-name";
case DH6OPT_NISP_NAME:
- return "NIS+ domain name";
+ return "NIS+-domain-name";
case DH6OPT_BCMCS_SERVER_D:
- return "BCMCS domain name";
+ return "BCMCS-domain-name";
case DH6OPT_BCMCS_SERVER_A:
- return "BCMCS server";
+ return "BCMCS-server";
case DH6OPT_GEOCONF_CIVIC:
- return "Geoconf Civic";
+ return "Geoconf-Civic";
case DH6OPT_REMOTE_ID:
- return "Remote ID";
+ return "Remote-ID";
case DH6OPT_SUBSCRIBER_ID:
- return "Subscriber ID";
+ return "Subscriber-ID";
case DH6OPT_CLIENT_FQDN:
- return "Client FQDN";
+ return "Client-FQDN";
case DH6OPT_PANA_AGENT:
- return "PANA agent";
+ return "PANA-agent";
case DH6OPT_NEW_POSIX_TIMEZONE:
- return "POSIX timezone";
+ return "POSIX-timezone";
case DH6OPT_NEW_TZDB_TIMEZONE:
- return "POSIX tz database";
+ return "POSIX-tz-database";
case DH6OPT_ERO:
- return "Echo request option";
+ return "Echo-request-option";
case DH6OPT_LQ_QUERY:
- return "Lease query";
+ return "Lease-query";
case DH6OPT_CLIENT_DATA:
- return "LQ client data";
+ return "LQ-client-data";
case DH6OPT_CLT_TIME:
- return "Clt time";
+ return "Clt-time";
case DH6OPT_LQ_RELAY_DATA:
- return "LQ relay data";
+ return "LQ-relay-data";
case DH6OPT_LQ_CLIENT_LINK:
- return "LQ client link";
+ return "LQ-client-link";
default:
snprintf(genstr, sizeof(genstr), "opt_%d", type);
return(genstr);
@@ -364,12 +329,7 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
size_t i;
u_int16_t opttype;
size_t optlen;
- u_int16_t val16;
- u_int32_t val32;
- struct dhcp6_ia ia;
- struct dhcp6_ia_prefix ia_prefix;
- struct dhcp6_ia_addr ia_addr;
- struct dhcp6_auth authopt;
+ u_int8_t auth_proto;
u_int authinfolen, authrealmlen;
if (cp == ep)
@@ -438,25 +398,19 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
}
break;
case DH6OPT_IA_ADDR:
- if (optlen < sizeof(ia_addr) - 4) {
+ if (optlen < 24) {
+ /*(*/
printf(" ?)");
break;
}
- memcpy(&ia_addr, (u_char *)dh6o, sizeof(ia_addr));
- printf(" %s",
- ip6addr_string(&ia_addr.dh6opt_ia_addr_addr));
- ia_addr.dh6opt_ia_addr_pltime =
- ntohl(ia_addr.dh6opt_ia_addr_pltime);
- ia_addr.dh6opt_ia_addr_vltime =
- ntohl(ia_addr.dh6opt_ia_addr_vltime);
- printf(" pltime:%lu vltime:%lu",
- (unsigned long)ia_addr.dh6opt_ia_addr_pltime,
- (unsigned long)ia_addr.dh6opt_ia_addr_vltime);
- if (optlen > sizeof(ia_addr) - 4) {
+ tp = (u_char *)(dh6o + 1);
+ printf(" %s", ip6addr_string(&tp[0]));
+ printf(" pltime:%u vltime:%u",
+ EXTRACT_32BITS(&tp[16]),
+ EXTRACT_32BITS(&tp[20]));
+ if (optlen > 24) {
/* there are sub-options */
- dhcp6opt_print((u_char *)dh6o +
- sizeof(ia_addr),
- (u_char *)(dh6o + 1) + optlen);
+ dhcp6opt_print(tp + 24, tp + 24 + optlen);
}
printf(")");
break;
@@ -468,10 +422,8 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
}
tp = (u_char *)(dh6o + 1);
for (i = 0; i < optlen; i += 2) {
- u_int16_t opt;
-
- memcpy(&opt, &tp[i], sizeof(opt));
- printf(" %s", dhcp6opt_name(ntohs(opt)));
+ printf(" %s",
+ dhcp6opt_name(EXTRACT_16BITS(&tp[i])));
}
printf(")");
break;
@@ -480,29 +432,31 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(" ?)");
break;
}
- printf(" %d)", *((u_char *)(dh6o + 1) + 1));
+ tp = (u_char *)(dh6o + 1);
+ printf(" %d)", *tp);
break;
case DH6OPT_ELAPSED_TIME:
if (optlen != 2) {
printf(" ?)");
break;
}
- memcpy(&val16, dh6o + 1, sizeof(val16));
- val16 = ntohs(val16);
- printf(" %d)", (int)val16);
+ tp = (u_char *)(dh6o + 1);
+ printf(" %d)", EXTRACT_16BITS(tp));
break;
case DH6OPT_RELAY_MSG:
printf(" (");
- dhcp6_print((const u_char *)(dh6o + 1), optlen);
+ tp = (u_char *)(dh6o + 1);
+ dhcp6_print(tp, optlen);
printf(")");
break;
case DH6OPT_AUTH:
- if (optlen < sizeof(authopt) - sizeof(*dh6o)) {
+ if (optlen < 11) {
printf(" ?)");
break;
}
- memcpy(&authopt, dh6o, sizeof(authopt));
- switch (authopt.dh6opt_auth_proto) {
+ tp = (u_char *)(dh6o + 1);
+ auth_proto = *tp;
+ switch (auth_proto) {
case DH6OPT_AUTHPROTO_DELAYED:
printf(" proto: delayed");
break;
@@ -510,37 +464,36 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(" proto: reconfigure");
break;
default:
- printf(" proto: %d",
- authopt.dh6opt_auth_proto);
+ printf(" proto: %d", auth_proto);
break;
}
- switch (authopt.dh6opt_auth_alg) {
+ tp++;
+ switch (*tp) {
case DH6OPT_AUTHALG_HMACMD5:
/* XXX: may depend on the protocol */
printf(", alg: HMAC-MD5");
break;
default:
- printf(", alg: %d", authopt.dh6opt_auth_alg);
+ printf(", alg: %d", *tp);
break;
}
- switch (authopt.dh6opt_auth_rdm) {
+ tp++;
+ switch (*tp) {
case DH6OPT_AUTHRDM_MONOCOUNTER:
printf(", RDM: mono");
break;
default:
- printf(", RDM: %d", authopt.dh6opt_auth_rdm);
+ printf(", RDM: %d", *tp);
break;
}
- tp = (u_char *)&authopt.dh6opt_auth_rdinfo;
+ tp++;
printf(", RD:");
- for (i = 0; i < 4; i++, tp += sizeof(val16))
+ for (i = 0; i < 4; i++, tp += 2)
printf(" %04x", EXTRACT_16BITS(tp));
/* protocol dependent part */
- tp = (u_char *)dh6o + sizeof(authopt);
- authinfolen =
- optlen + sizeof(*dh6o) - sizeof(authopt);
- switch (authopt.dh6opt_auth_proto) {
+ authinfolen = optlen - 11;
+ switch (auth_proto) {
case DH6OPT_AUTHPROTO_DELAYED:
if (authinfolen == 0)
break;
@@ -596,9 +549,10 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
* Since we cannot predict the encoding, print hex dump
* at most 10 characters.
*/
+ tp = (u_char *)(dh6o + 1);
printf(" ");
for (i = 0; i < optlen && i < 10; i++)
- printf("%02x", ((u_char *)(dh6o + 1))[i]);
+ printf("%02x", tp[i]);
printf("...)");
break;
case DH6OPT_RECONF_MSG:
@@ -640,28 +594,23 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(" ?)");
break;
}
- memcpy(&val16, (u_char *)(dh6o + 1), sizeof(val16));
- val16 = ntohs(val16);
- printf(" %s)", dhcp6stcode(val16));
+ tp = (u_char *)(dh6o + 1);
+ printf(" %s)", dhcp6stcode(EXTRACT_16BITS(&tp[0])));
break;
case DH6OPT_IA_NA:
case DH6OPT_IA_PD:
- if (optlen < sizeof(ia) - 4) {
+ if (optlen < 12) {
printf(" ?)");
break;
}
- memcpy(&ia, (u_char *)dh6o, sizeof(ia));
- ia.dh6opt_ia_iaid = ntohl(ia.dh6opt_ia_iaid);
- ia.dh6opt_ia_t1 = ntohl(ia.dh6opt_ia_t1);
- ia.dh6opt_ia_t2 = ntohl(ia.dh6opt_ia_t2);
- printf(" IAID:%lu T1:%lu T2:%lu",
- (unsigned long)ia.dh6opt_ia_iaid,
- (unsigned long)ia.dh6opt_ia_t1,
- (unsigned long)ia.dh6opt_ia_t2);
- if (optlen > sizeof(ia) - 4) {
+ tp = (u_char *)(dh6o + 1);
+ printf(" IAID:%u T1:%u T2:%u",
+ EXTRACT_32BITS(&tp[0]),
+ EXTRACT_32BITS(&tp[4]),
+ EXTRACT_32BITS(&tp[8]));
+ if (optlen > 12) {
/* there are sub-options */
- dhcp6opt_print((u_char *)dh6o + sizeof(ia),
- (u_char *)(dh6o + 1) + optlen);
+ dhcp6opt_print(tp + 12, tp + 12 + optlen);
}
printf(")");
break;
@@ -670,37 +619,27 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(" ?)");
break;
}
- memcpy(&val32, dh6o + 1, sizeof(val32));
- val32 = ntohl(val32);
- printf(" IAID:%lu", (unsigned long)val32);
+ tp = (u_char *)(dh6o + 1);
+ printf(" IAID:%u", EXTRACT_32BITS(tp));
if (optlen > 4) {
/* there are sub-options */
- dhcp6opt_print((u_char *)(dh6o + 1) + 4,
- (u_char *)(dh6o + 1) + optlen);
+ dhcp6opt_print(tp + 4, tp + 4 + optlen);
}
printf(")");
break;
case DH6OPT_IA_PD_PREFIX:
- if (optlen < sizeof(ia_prefix) - 4) {
+ if (optlen < 25) {
printf(" ?)");
break;
}
- memcpy(&ia_prefix, (u_char *)dh6o, sizeof(ia_prefix));
- printf(" %s/%d",
- ip6addr_string(&ia_prefix.dh6opt_ia_prefix_addr),
- ia_prefix.dh6opt_ia_prefix_plen);
- ia_prefix.dh6opt_ia_prefix_pltime =
- ntohl(ia_prefix.dh6opt_ia_prefix_pltime);
- ia_prefix.dh6opt_ia_prefix_vltime =
- ntohl(ia_prefix.dh6opt_ia_prefix_vltime);
- printf(" pltime:%lu vltime:%lu",
- (unsigned long)ia_prefix.dh6opt_ia_prefix_pltime,
- (unsigned long)ia_prefix.dh6opt_ia_prefix_vltime);
- if (optlen > sizeof(ia_prefix) - 4) {
+ tp = (u_char *)(dh6o + 1);
+ printf(" %s/%d", ip6addr_string(&tp[9]), tp[8]);
+ printf(" pltime:%u vltime:%u",
+ EXTRACT_32BITS(&tp[0]),
+ EXTRACT_32BITS(&tp[4]));
+ if (optlen > 25) {
/* there are sub-options */
- dhcp6opt_print((u_char *)dh6o +
- sizeof(ia_prefix),
- (u_char *)(dh6o + 1) + optlen);
+ dhcp6opt_print(tp + 25, tp + 25 + optlen);
}
printf(")");
break;
@@ -710,9 +649,8 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(" ?)");
break;
}
- memcpy(&val32, dh6o + 1, sizeof(val32));
- val32 = ntohl(val32);
- printf(" %d)", (int)val32);
+ tp = (u_char *)(dh6o + 1);
+ printf(" %d)", EXTRACT_32BITS(tp));
break;
case DH6OPT_REMOTE_ID:
if (optlen < 4) {
@@ -720,9 +658,7 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
break;
}
tp = (u_char *)(dh6o + 1);
- memcpy(&val32, &tp[0], sizeof(val32));
- val32 = ntohl(val32);
- printf(" %d ", (int)val32);
+ printf(" %d ", EXTRACT_32BITS(tp));
/*
* Print hex dump first 10 characters.
*/
@@ -755,10 +691,10 @@ dhcp6opt_print(const u_char *cp, const u_char *ep)
printf(")");
break;
case DH6OPT_CLIENT_DATA:
+ tp = (u_char *)(dh6o + 1);
if (optlen > 0) {
/* there are encapsulated options */
- dhcp6opt_print((u_char *)(dh6o + 1),
- (u_char *)(dh6o + 1) + optlen);
+ dhcp6opt_print(tp, tp + optlen);
}
printf(")");
break;
OpenPOWER on IntegriCloud