X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/05bf602ef684d5b75c0ac71be04212d909c37834..47fc89d711eec0a073d9b3b293a1af901b5bd791:/print-dhcp6.c diff --git a/print-dhcp6.c b/print-dhcp6.c index 37c69dac..8a119ff5 100644 --- a/print-dhcp6.c +++ b/print-dhcp6.c @@ -28,7 +28,7 @@ */ /* * RFC3315: DHCPv6 - * supported DHCPv6 options: + * supported DHCPv6 options: * RFC3319: Session Initiation Protocol (SIP) Servers options, * RFC3633: IPv6 Prefix options, * RFC3646: DNS Configuration options, @@ -36,14 +36,10 @@ * RFC4075: Simple Network Time Protocol (SNTP) Configuration option, * RFC4242: Information Refresh Time option, * RFC4280: Broadcast and Multicast Control Servers options, + * RFC5908: Network Time Protocol (NTP) Server Option for DHCPv6 * RFC6334: Dual-Stack Lite option, */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-dhcp6.c,v 1.37 2008-02-06 10:26:09 guy Exp $"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -58,7 +54,7 @@ static const char rcsid[] _U_ = #include "extract.h" /* lease duration */ -#define DHCP6_DURATITION_INFINITE 0xffffffff +#define DHCP6_DURATION_INFINITE 0xffffffff /* Error Values */ #define DH6ERR_FAILURE 16 @@ -146,15 +142,15 @@ struct dhcp6_relay { #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_DNS_SERVERS 23 +#define DH6OPT_DOMAIN_LIST 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_SNTP_SERVERS 31 #define DH6OPT_LIFETIME 32 #define DH6OPT_BCMCS_SERVER_D 33 #define DH6OPT_BCMCS_SERVER_A 34 @@ -171,6 +167,10 @@ struct dhcp6_relay { #define DH6OPT_CLT_TIME 46 #define DH6OPT_LQ_RELAY_DATA 47 #define DH6OPT_LQ_CLIENT_LINK 48 +#define DH6OPT_NTP_SERVER 56 +# define DH6OPT_NTP_SUBOPTION_SRV_ADDR 1 +# define DH6OPT_NTP_SUBOPTION_MC_ADDR 2 +# define DH6OPT_NTP_SUBOPTION_SRV_FQDN 3 #define DH6OPT_AFTR_NAME 64 struct dhcp6opt { @@ -230,16 +230,16 @@ dhcp6opt_name(int type) return "SIP-servers-domain"; case DH6OPT_SIP_SERVER_A: return "SIP-servers-address"; - case DH6OPT_DNS: + case DH6OPT_DNS_SERVERS: return "DNS-server"; - case DH6OPT_DNSNAME: + case DH6OPT_DOMAIN_LIST: return "DNS-search-list"; 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_SNTP_SERVERS: + return "SNTP-servers"; case DH6OPT_LIFETIME: return "lifetime"; case DH6OPT_NIS_SERVERS: @@ -280,6 +280,8 @@ dhcp6opt_name(int type) return "LQ-relay-data"; case DH6OPT_LQ_CLIENT_LINK: return "LQ-client-link"; + case DH6OPT_NTP_SERVER: + return "NTP-server"; case DH6OPT_AFTR_NAME: return "AFTR-Name"; default: @@ -328,13 +330,17 @@ dhcp6stcode(int code) static void dhcp6opt_print(const u_char *cp, const u_char *ep) { - struct dhcp6opt *dh6o; - u_char *tp; + const struct dhcp6opt *dh6o; + const u_char *tp; size_t i; u_int16_t opttype; size_t optlen; u_int8_t auth_proto; u_int authinfolen, authrealmlen; + int remain_len; /* Length of remaining options */ + int label_len; /* Label length */ + u_int16_t subopt_code; + u_int16_t subopt_len; if (cp == ep) return; @@ -578,8 +584,8 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) printf(")"); break; case DH6OPT_SIP_SERVER_A: - case DH6OPT_DNS: - case DH6OPT_NTP_SERVERS: + case DH6OPT_DNS_SERVERS: + case DH6OPT_SNTP_SERVERS: case DH6OPT_NIS_SERVERS: case DH6OPT_NISP_SERVERS: case DH6OPT_BCMCS_SERVER_A: @@ -594,6 +600,16 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) printf(" %s", ip6addr_string(&tp[i])); printf(")"); 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) + goto trunc; + } + printf(")"); + break; case DH6OPT_STATUS_CODE: if (optlen < 2) { printf(" ?)"); @@ -717,16 +733,51 @@ dhcp6opt_print(const u_char *cp, const u_char *ep) printf("%02x", tp[i]); printf("...)"); break; + case DH6OPT_NTP_SERVER: + if (optlen < 4) { + printf(" ?)"); + break; + } + tp = (u_char *)(dh6o + 1); + while (tp < cp + sizeof(*dh6o) + optlen - 4) { + subopt_code = EXTRACT_16BITS(tp); + tp += 2; + subopt_len = EXTRACT_16BITS(tp); + tp += 2; + if (tp + subopt_len > cp + sizeof(*dh6o) + optlen) + goto trunc; + printf(" subopt:%d", subopt_code); + switch (subopt_code) { + case DH6OPT_NTP_SUBOPTION_SRV_ADDR: + case DH6OPT_NTP_SUBOPTION_MC_ADDR: + if (subopt_len != 16) { + printf(" ?"); + break; + } + printf(" %s", ip6addr_string(&tp[0])); + break; + case DH6OPT_NTP_SUBOPTION_SRV_FQDN: + putchar(' '); + if (ns_nprint(tp, tp + subopt_len) == NULL) + goto trunc; + break; + default: + printf(" ?"); + break; + } + tp += subopt_len; + } + printf(")"); + break; case DH6OPT_AFTR_NAME: if (optlen < 3) { printf(" ?)"); break; } tp = (u_char *)(dh6o + 1); - int remain_len = optlen; + remain_len = optlen; printf(" "); /* Encoding is described in section 3.1 of RFC 1035 */ - int label_len; /* Label length */ while (remain_len && *tp) { label_len = *tp++; if (label_len < remain_len - 1) {