aboutsummaryrefslogtreecommitdiff
path: root/print-dhcp6.c
diff options
context:
space:
mode:
authorRui Paulo <rpaulo@FreeBSD.org>2010-10-28 16:23:25 +0000
committerRui Paulo <rpaulo@FreeBSD.org>2010-10-28 16:23:25 +0000
commit6d59e2f382406def185ce5261b8723a174cd28a3 (patch)
tree554972ce0ce297205c6d41cc6fc9a8a393910a6f /print-dhcp6.c
parent0ea0e7ad03dff03bb5448f640640d7904c01c8d4 (diff)
downloadsrc-6d59e2f382406def185ce5261b8723a174cd28a3.tar.gz
src-6d59e2f382406def185ce5261b8723a174cd28a3.zip
Update tcpdump to 4.1.1.vendor/tcpdump/4.1.1
Changes: Thu. April 1, 2010. guy@alum.mit.edu. Summary for 4.1.1 tcpdump release Fix build on systems with PF, such as FreeBSD and OpenBSD. Don't blow up if a zero-length link-layer address is passed to linkaddr_string(). Thu. March 11, 2010. ken@netfunctional.ca/guy@alum.mit.edu. Summary for 4.1.0 tcpdump release Fix printing of MAC addresses for VLAN frames with a length field Add some additional bounds checks and use the EXTRACT_ macros more Add a -b flag to print the AS number in BGP packets in ASDOT notation rather than ASPLAIN notation Add ICMPv6 RFC 5006 support Decode the access flags in NFS access requests Handle the new DLT_ for memory-mapped USB captures on Linux Make the default snapshot (-s) the maximum Print name of device (when -L is used) Support for OpenSolaris (and SXCE build 125 and later) Print new TCP flags Add support for RPL DIO Add support for TCP User Timeout (UTO) Add support for non-standard Ethertypes used by 3com PPPoE gear Add support for 802.11n and 802.11s Add support for Transparent Ethernet Bridge ethertype in GRE Add 4 byte AS support for BGP printer Add support for the MDT SAFI 66 BG printer Add basic IPv6 support to print-olsr Add USB printer Add printer for ForCES Handle frames with an FCS Handle 802.11n Control Wrapper, Block Acq Req and Block Ack frames Fix TCP sequence number printing Report 802.2 packets as 802.2 instead of 802.3 Don't include -L/usr/lib in LDFLAGS On x86_64 Linux, look in lib64 directory too Lots of code clean ups Autoconf clean ups Update testcases to make output changes Fix compiling with/out smi (--with{,out}-smi) Fix compiling without IPv6 support (--disable-ipv6)
Notes
Notes: svn path=/vendor/tcpdump/dist/; revision=214456 svn path=/vendor/tcpdump/4.1.1/; revision=214468; tag=vendor/tcpdump/4.1.1
Diffstat (limited to 'print-dhcp6.c')
-rw-r--r--print-dhcp6.c266
1 files changed, 101 insertions, 165 deletions
diff --git a/print-dhcp6.c b/print-dhcp6.c
index ec0df763c0cf..26855ccbfb18 100644
--- a/print-dhcp6.c
+++ b/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;