summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-dhcp6.c
diff options
context:
space:
mode:
authorrpaulo <rpaulo@FreeBSD.org>2009-03-20 13:27:51 +0000
committerrpaulo <rpaulo@FreeBSD.org>2009-03-20 13:27:51 +0000
commit04b1d6babecbe3eed463c150b6e933a2b6d342a9 (patch)
tree36afae3dff76dde8d1cee5971ff7f1bc4922ad0f /contrib/tcpdump/print-dhcp6.c
parent3b74598d7ea581deadb14ec8ba1c77c14295a7c8 (diff)
downloadFreeBSD-src-04b1d6babecbe3eed463c150b6e933a2b6d342a9.zip
FreeBSD-src-04b1d6babecbe3eed463c150b6e933a2b6d342a9.tar.gz
Flatten vendor/tcpdump and remove keyword expansion.
Diffstat (limited to 'contrib/tcpdump/print-dhcp6.c')
-rw-r--r--contrib/tcpdump/print-dhcp6.c773
1 files changed, 0 insertions, 773 deletions
diff --git a/contrib/tcpdump/print-dhcp6.c b/contrib/tcpdump/print-dhcp6.c
deleted file mode 100644
index 9f4999d..0000000
--- a/contrib/tcpdump/print-dhcp6.c
+++ /dev/null
@@ -1,773 +0,0 @@
-/*
- * Copyright (C) 1998 and 1999 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * RFC3315: DHCPv6
- * supported DHCPv6 options:
- * RFC3319,
- * RFC3633,
- * RFC3646,
- * RFC3898,
- * RFC4075,
- * RFC4242,
- * RFC4280,
- */
-
-#ifndef lint
-static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-dhcp6.c,v 1.35.2.1 2006/10/25 22:04:36 guy Exp $";
-#endif
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <tcpdump-stdinc.h>
-
-#include <stdio.h>
-#include <string.h>
-
-#include "interface.h"
-#include "addrtoname.h"
-#include "extract.h"
-
-/* lease duration */
-#define DHCP6_DURATITION_INFINITE 0xffffffff
-
-/* Error Values */
-#define DH6ERR_FAILURE 16
-#define DH6ERR_AUTHFAIL 17
-#define DH6ERR_POORLYFORMED 18
-#define DH6ERR_UNAVAIL 19
-#define DH6ERR_OPTUNAVAIL 20
-
-/* Message type */
-#define DH6_SOLICIT 1
-#define DH6_ADVERTISE 2
-#define DH6_REQUEST 3
-#define DH6_CONFIRM 4
-#define DH6_RENEW 5
-#define DH6_REBIND 6
-#define DH6_REPLY 7
-#define DH6_RELEASE 8
-#define DH6_DECLINE 9
-#define DH6_RECONFIGURE 10
-#define DH6_INFORM_REQ 11
-#define DH6_RELAY_FORW 12
-#define DH6_RELAY_REPLY 13
-
-/* DHCP6 base packet format */
-struct dhcp6 {
- union {
- u_int8_t m;
- u_int32_t x;
- } dh6_msgtypexid;
- /* options follow */
-};
-#define dh6_msgtype dh6_msgtypexid.m
-#define dh6_xid dh6_msgtypexid.x
-#define DH6_XIDMASK 0x00ffffff
-
-/* DHCPv6 relay messages */
-struct dhcp6_relay {
- u_int8_t dh6relay_msgtype;
- u_int8_t dh6relay_hcnt;
- u_int8_t dh6relay_linkaddr[16]; /* XXX: badly aligned */
- u_int8_t dh6relay_peeraddr[16];
- /* options follow */
-};
-
-/* options */
-#define DH6OPT_CLIENTID 1
-#define DH6OPT_SERVERID 2
-#define DH6OPT_IA_NA 3
-#define DH6OPT_IA_TA 4
-#define DH6OPT_IA_ADDR 5
-#define DH6OPT_ORO 6
-#define DH6OPT_PREFERENCE 7
-# define DH6OPT_PREF_MAX 255
-#define DH6OPT_ELAPSED_TIME 8
-#define DH6OPT_RELAY_MSG 9
-/*#define DH6OPT_SERVER_MSG 10 deprecated */
-#define DH6OPT_AUTH 11
-# define DH6OPT_AUTHPROTO_DELAYED 2
-# define DH6OPT_AUTHPROTO_RECONFIG 3
-# define DH6OPT_AUTHALG_HMACMD5 1
-# define DH6OPT_AUTHRDM_MONOCOUNTER 0
-# define DH6OPT_AUTHRECONFIG_KEY 1
-# define DH6OPT_AUTHRECONFIG_HMACMD5 2
-#define DH6OPT_UNICAST 12
-#define DH6OPT_STATUS_CODE 13
-# define DH6OPT_STCODE_SUCCESS 0
-# define DH6OPT_STCODE_UNSPECFAIL 1
-# define DH6OPT_STCODE_NOADDRAVAIL 2
-# define DH6OPT_STCODE_NOBINDING 3
-# define DH6OPT_STCODE_NOTONLINK 4
-# define DH6OPT_STCODE_USEMULTICAST 5
-# define DH6OPT_STCODE_NOPREFIXAVAIL 6
-#define DH6OPT_RAPID_COMMIT 14
-#define DH6OPT_USER_CLASS 15
-#define DH6OPT_VENDOR_CLASS 16
-#define DH6OPT_VENDOR_OPTS 17
-#define DH6OPT_INTERFACE_ID 18
-#define DH6OPT_RECONF_MSG 19
-#define DH6OPT_RECONF_ACCEPT 20
-#define DH6OPT_SIP_SERVER_D 21
-#define DH6OPT_SIP_SERVER_A 22
-#define DH6OPT_DNS 23
-#define DH6OPT_DNSNAME 24
-#define DH6OPT_IA_PD 25
-#define DH6OPT_IA_PD_PREFIX 26
-#define DH6OPT_NIS_SERVERS 27
-#define DH6OPT_NISP_SERVERS 28
-#define DH6OPT_NIS_NAME 29
-#define DH6OPT_NISP_NAME 30
-#define DH6OPT_NTP_SERVERS 31
-#define DH6OPT_LIFETIME 32
-#define DH6OPT_BCMCS_SERVER_D 33
-#define DH6OPT_BCMCS_SERVER_A 34
-#define DH6OPT_GEOCONF_CIVIC 36
-#define DH6OPT_REMOTE_ID 37
-#define DH6OPT_SUBSCRIBER_ID 38
-#define DH6OPT_CLIENT_FQDN 39
-
-struct dhcp6opt {
- u_int16_t dh6opt_type;
- u_int16_t dh6opt_len;
- /* 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";
-
- switch(type) {
- case DH6OPT_CLIENTID:
- return "client ID";
- case DH6OPT_SERVERID:
- return "server ID";
- case DH6OPT_IA_NA:
- return "IA_NA";
- case DH6OPT_IA_TA:
- return "IA_TA";
- case DH6OPT_IA_ADDR:
- return "IA_ADDR";
- case DH6OPT_ORO:
- return "option request";
- case DH6OPT_PREFERENCE:
- return "preference";
- case DH6OPT_ELAPSED_TIME:
- return "elapsed time";
- case DH6OPT_RELAY_MSG:
- return "relay message";
- case DH6OPT_AUTH:
- return "authentication";
- case DH6OPT_UNICAST:
- return "server unicast";
- case DH6OPT_STATUS_CODE:
- return "status code";
- case DH6OPT_RAPID_COMMIT:
- return "rapid commit";
- case DH6OPT_USER_CLASS:
- return "user class";
- case DH6OPT_VENDOR_CLASS:
- return "vendor class";
- case DH6OPT_VENDOR_OPTS:
- return "vendor-specific info";
- case DH6OPT_INTERFACE_ID:
- return "interface ID";
- case DH6OPT_RECONF_MSG:
- return "reconfigure message";
- case DH6OPT_RECONF_ACCEPT:
- return "reconfigure accept";
- case DH6OPT_SIP_SERVER_D:
- return "SIP servers domain";
- case DH6OPT_SIP_SERVER_A:
- return "SIP servers address";
- case DH6OPT_DNS:
- return "DNS";
- case DH6OPT_DNSNAME:
- return "DNS name";
- case DH6OPT_IA_PD:
- return "IA_PD";
- case DH6OPT_IA_PD_PREFIX:
- return "IA_PD prefix";
- case DH6OPT_NTP_SERVERS:
- return "NTP Server";
- case DH6OPT_LIFETIME:
- return "lifetime";
- case DH6OPT_NIS_SERVERS:
- return "NIS server";
- case DH6OPT_NISP_SERVERS:
- return "NIS+ server";
- case DH6OPT_NIS_NAME:
- return "NIS domain name";
- case DH6OPT_NISP_NAME:
- return "NIS+ domain name";
- case DH6OPT_BCMCS_SERVER_D:
- return "BCMCS domain name";
- case DH6OPT_BCMCS_SERVER_A:
- return "BCMCS server";
- case DH6OPT_GEOCONF_CIVIC:
- return "Geoconf Civic";
- case DH6OPT_REMOTE_ID:
- return "Remote ID";
- case DH6OPT_SUBSCRIBER_ID:
- return "Subscriber ID";
- case DH6OPT_CLIENT_FQDN:
- return "Client FQDN";
- default:
- snprintf(genstr, sizeof(genstr), "opt_%d", type);
- return(genstr);
- }
-}
-
-static const char *
-dhcp6stcode(int code)
-{
- static char genstr[sizeof("code255") + 1]; /* XXX thread unsafe */
-
- if (code > 255)
- return "INVALID code";
-
- switch(code) {
- case DH6OPT_STCODE_SUCCESS:
- return "success";
- case DH6OPT_STCODE_UNSPECFAIL:
- return "unspec failure";
- case DH6OPT_STCODE_NOADDRAVAIL:
- return "no addresses";
- case DH6OPT_STCODE_NOBINDING:
- return "no binding";
- case DH6OPT_STCODE_NOTONLINK:
- return "not on-link";
- case DH6OPT_STCODE_USEMULTICAST:
- return "use multicast";
- case DH6OPT_STCODE_NOPREFIXAVAIL:
- return "no prefixes";
- default:
- snprintf(genstr, sizeof(genstr), "code%d", code);
- return(genstr);
- }
-}
-
-static void
-dhcp6opt_print(const u_char *cp, const u_char *ep)
-{
- struct dhcp6opt *dh6o;
- u_char *tp;
- 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_int authinfolen, authrealmlen;
-
- if (cp == ep)
- return;
- while (cp < ep) {
- if (ep < cp + sizeof(*dh6o))
- goto trunc;
- dh6o = (struct dhcp6opt *)cp;
- 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));
- switch (opttype) {
- case DH6OPT_CLIENTID:
- case DH6OPT_SERVERID:
- if (optlen < 2) {
- /*(*/
- printf(" ?)");
- break;
- }
- tp = (u_char *)(dh6o + 1);
- switch (EXTRACT_16BITS(tp)) {
- case 1:
- if (optlen >= 2 + 6) {
- printf(" hwaddr/time type %u time %u ",
- EXTRACT_16BITS(&tp[2]),
- EXTRACT_32BITS(&tp[4]));
- for (i = 8; i < optlen; i++)
- printf("%02x", tp[i]);
- /*(*/
- printf(")");
- } else {
- /*(*/
- printf(" ?)");
- }
- break;
- case 2:
- if (optlen >= 2 + 8) {
- printf(" vid ");
- for (i = 2; i < 2 + 8; i++)
- printf("%02x", tp[i]);
- /*(*/
- printf(")");
- } else {
- /*(*/
- printf(" ?)");
- }
- break;
- case 3:
- if (optlen >= 2 + 2) {
- printf(" hwaddr type %u ",
- EXTRACT_16BITS(&tp[2]));
- for (i = 4; i < optlen; i++)
- printf("%02x", tp[i]);
- /*(*/
- printf(")");
- } else {
- /*(*/
- printf(" ?)");
- }
- break;
- default:
- printf(" type %d)", EXTRACT_16BITS(tp));
- break;
- }
- break;
- case DH6OPT_IA_ADDR:
- if (optlen < sizeof(ia_addr) - 4) {
- 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) {
- /* there are sub-options */
- dhcp6opt_print((u_char *)dh6o +
- sizeof(ia_addr),
- (u_char *)(dh6o + 1) + optlen);
- }
- printf(")");
- break;
- case DH6OPT_ORO:
- if (optlen % 2) {
- printf(" ?)");
- break;
- }
- 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(")");
- break;
- case DH6OPT_PREFERENCE:
- if (optlen != 1) {
- printf(" ?)");
- break;
- }
- printf(" %d)", *((u_char *)(dh6o + 1) + 1));
- break;
- case DH6OPT_ELAPSED_TIME:
- if (optlen != 2) {
- printf(" ?)");
- break;
- }
- memcpy(&val16, dh6o + 1, sizeof(val16));
- val16 = ntohs(val16);
- printf(" %d)", (int)val16);
- break;
- case DH6OPT_RELAY_MSG:
- printf(" (");
- dhcp6_print((const u_char *)(dh6o + 1), optlen);
- printf(")");
- break;
- case DH6OPT_AUTH:
- if (optlen < sizeof(authopt) - sizeof(*dh6o)) {
- printf(" ?)");
- break;
- }
- memcpy(&authopt, dh6o, sizeof(authopt));
- switch (authopt.dh6opt_auth_proto) {
- case DH6OPT_AUTHPROTO_DELAYED:
- printf(" proto: delayed");
- break;
- case DH6OPT_AUTHPROTO_RECONFIG:
- printf(" proto: reconfigure");
- break;
- default:
- printf(" proto: %d",
- authopt.dh6opt_auth_proto);
- break;
- }
- switch (authopt.dh6opt_auth_alg) {
- case DH6OPT_AUTHALG_HMACMD5:
- /* XXX: may depend on the protocol */
- printf(", alg: HMAC-MD5");
- break;
- default:
- printf(", alg: %d", authopt.dh6opt_auth_alg);
- break;
- }
- switch (authopt.dh6opt_auth_rdm) {
- case DH6OPT_AUTHRDM_MONOCOUNTER:
- printf(", RDM: mono");
- break;
- default:
- printf(", RDM: %d", authopt.dh6opt_auth_rdm);
- break;
- }
- tp = (u_char *)&authopt.dh6opt_auth_rdinfo;
- printf(", RD:");
- for (i = 0; i < 4; i++, tp += sizeof(val16))
- 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) {
- case DH6OPT_AUTHPROTO_DELAYED:
- if (authinfolen == 0)
- break;
- if (authinfolen < 20) {
- printf(" ??");
- break;
- }
- authrealmlen = authinfolen - 20;
- if (authrealmlen > 0) {
- printf(", realm: ");
- }
- for (i = 0; i < authrealmlen; i++, tp++)
- printf("%02x", *tp);
- printf(", key ID: %08x", EXTRACT_32BITS(tp));
- tp += 4;
- printf(", HMAC-MD5:");
- for (i = 0; i < 4; i++, tp+= 4)
- printf(" %08x", EXTRACT_32BITS(tp));
- break;
- case DH6OPT_AUTHPROTO_RECONFIG:
- if (authinfolen != 17) {
- printf(" ??");
- break;
- }
- switch (*tp++) {
- case DH6OPT_AUTHRECONFIG_KEY:
- printf(" reconfig-key");
- break;
- case DH6OPT_AUTHRECONFIG_HMACMD5:
- printf(" type: HMAC-MD5");
- break;
- default:
- printf(" type: ??");
- break;
- }
- printf(" value:");
- for (i = 0; i < 4; i++, tp+= 4)
- printf(" %08x", EXTRACT_32BITS(tp));
- break;
- default:
- printf(" ??");
- break;
- }
-
- printf(")");
- break;
- case DH6OPT_RAPID_COMMIT: /* nothing todo */
- printf(")");
- break;
- case DH6OPT_INTERFACE_ID:
- /*
- * Since we cannot predict the encoding, print hex dump
- * at most 10 characters.
- */
- for (i = 0; i < optlen && i < 10; i++)
- printf("%02x", ((u_char *)(dh6o + 1))[i]);
- break;
- case DH6OPT_RECONF_MSG:
- tp = (u_char *)(dh6o + 1);
- switch (*tp) {
- case DH6_RENEW:
- printf(" for renew)");
- break;
- case DH6_INFORM_REQ:
- printf(" for inf-req)");
- break;
- default:
- printf(" for ?\?\?(%02x))", *tp);
- break;
- }
- break;
- case DH6OPT_RECONF_ACCEPT: /* nothing todo */
- printf(")");
- break;
- case DH6OPT_SIP_SERVER_A:
- case DH6OPT_DNS:
- case DH6OPT_NTP_SERVERS:
- case DH6OPT_NIS_SERVERS:
- case DH6OPT_NISP_SERVERS:
- case DH6OPT_BCMCS_SERVER_A:
- if (optlen % 16) {
- printf(" ?)");
- break;
- }
- tp = (u_char *)(dh6o + 1);
- for (i = 0; i < optlen; i += 16)
- printf(" %s", ip6addr_string(&tp[i]));
- printf(")");
- break;
- case DH6OPT_STATUS_CODE:
- if (optlen < 2) {
- printf(" ?)");
- break;
- }
- memcpy(&val16, (u_char *)(dh6o + 1), sizeof(val16));
- val16 = ntohs(val16);
- printf(" %s)", dhcp6stcode(val16));
- break;
- case DH6OPT_IA_NA:
- case DH6OPT_IA_PD:
- if (optlen < sizeof(ia) - 4) {
- 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) {
- /* there are sub-options */
- dhcp6opt_print((u_char *)dh6o + sizeof(ia),
- (u_char *)(dh6o + 1) + optlen);
- }
- printf(")");
- break;
- case DH6OPT_IA_PD_PREFIX:
- if (optlen < sizeof(ia_prefix) - 4) {
- 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) {
- /* there are sub-options */
- dhcp6opt_print((u_char *)dh6o +
- sizeof(ia_prefix),
- (u_char *)(dh6o + 1) + optlen);
- }
- printf(")");
- break;
- case DH6OPT_LIFETIME:
- if (optlen != 4) {
- printf(" ?)");
- break;
- }
- memcpy(&val32, dh6o + 1, sizeof(val32));
- val32 = ntohl(val32);
- printf(" %d)", (int)val32);
- break;
- default:
- printf(")");
- break;
- }
-
- cp += sizeof(*dh6o) + optlen;
- }
- return;
-
-trunc:
- printf("[|dhcp6ext]");
-}
-
-/*
- * Print dhcp6 packets
- */
-void
-dhcp6_print(const u_char *cp, u_int length)
-{
- struct dhcp6 *dh6;
- struct dhcp6_relay *dh6relay;
- const u_char *ep;
- u_char *extp;
- const char *name;
-
- printf("dhcp6");
-
- ep = (u_char *)snapend;
- if (cp + length < ep)
- ep = cp + length;
-
- dh6 = (struct dhcp6 *)cp;
- dh6relay = (struct dhcp6_relay *)cp;
- TCHECK(dh6->dh6_xid);
- switch (dh6->dh6_msgtype) {
- case DH6_SOLICIT:
- name = "solicit";
- break;
- case DH6_ADVERTISE:
- name = "advertise";
- break;
- case DH6_REQUEST:
- name = "request";
- break;
- case DH6_CONFIRM:
- name = "confirm";
- break;
- case DH6_RENEW:
- name = "renew";
- break;
- case DH6_REBIND:
- name = "rebind";
- break;
- case DH6_REPLY:
- name = "reply";
- break;
- case DH6_RELEASE:
- name = "release";
- break;
- case DH6_DECLINE:
- name = "decline";
- break;
- case DH6_RECONFIGURE:
- name = "reconfigure";
- break;
- case DH6_INFORM_REQ:
- name= "inf-req";
- break;
- case DH6_RELAY_FORW:
- name= "relay-fwd";
- break;
- case DH6_RELAY_REPLY:
- name= "relay-reply";
- break;
- default:
- name = NULL;
- break;
- }
-
- if (!vflag) {
- if (name)
- printf(" %s", name);
- else if (dh6->dh6_msgtype != DH6_RELAY_FORW &&
- dh6->dh6_msgtype != DH6_RELAY_REPLY) {
- printf(" msgtype-%u", dh6->dh6_msgtype);
- }
- return;
- }
-
- /* XXX relay agent messages have to be handled differently */
-
- if (name)
- printf(" %s (", name); /*)*/
- else
- printf(" 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);
- extp = (u_char *)(dh6 + 1);
- dhcp6opt_print(extp, ep);
- } else { /* relay messages */
- struct in6_addr addr6;
-
- TCHECK(dh6relay->dh6relay_peeraddr);
-
- memcpy(&addr6, dh6relay->dh6relay_linkaddr, sizeof (addr6));
- printf("linkaddr=%s", ip6addr_string(&addr6));
-
- memcpy(&addr6, dh6relay->dh6relay_peeraddr, sizeof (addr6));
- printf(" peeraddr=%s", ip6addr_string(&addr6));
-
- dhcp6opt_print((u_char *)(dh6relay + 1), ep);
- }
- /*(*/
- printf(")");
- return;
-
-trunc:
- printf("[|dhcp6]");
-}
OpenPOWER on IntegriCloud