Ethereal-dev: [Ethereal-dev] RE: [Ethereal-users] Update of DHCPv6 protocol
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Tony Lindström (HF/EAB) <tony.lindstrom@xxxxxxxxxxxx>
Date: Mon, 18 Aug 2003 17:00:50 +0200
Hi, I have modified the code, not rewritten everything. I have added three files as attachments: two diff files (diff -u and diff -c) and the packet-dhcpv6.c file. I have been running Solaris 2.9 as OS. Regards, Tony -----Original Message----- From: Guy Harris [mailto:guy@xxxxxxxxxxxx] Sent: den 16 augusti 2003 03:40 To: Tony Lindström (HF/EAB) Cc: 'ethereal-users@xxxxxxxxxxxx' Subject: Re: [Ethereal-users] Update of DHCPv6 protocol On Thursday, August 14, 2003, at 2:17 AM, Tony Lindström (HF/EAB) wrote: > I have updated the DHCPv6 protocol and I think it's working good and > are even more aligned to the different existing drafts (not a standard > yet). To how/where should I send the code so everybody can use it. ethereal-dev@xxxxxxxxxxxx Unless you've completely rewritten the dissector, rather than just modifying it, please send it as a patch, using "diff -c" or "diff -u". (Send the patch as an attachment to your mail, if possible, rather than sending it in the body of your mail message; that makes it less likely that mail software will "helpfully" reformat it, making the patch not apply without undoing the reformatting.)
Attachment:
packet-dhcpv6.c
Description: Binary data
*** packet-dhcpv6.c Thu Aug 29 02:39:52 2002
--- /home/eratlim/ethereal/ethereal-0.9.9/packet-dhcpv6.c Mon Aug 18 16:40:24 2003
***************
*** 3,16 ****
* Jun-ichiro itojun Hagino <itojun@xxxxxxxxxx>
* IItom Tsutomu MIENO <iitom@xxxxxxxxxx>
* SHIRASAKI Yasuhiro <yasuhiro@xxxxxxxxxxx>
*
* $Id: packet-dhcpv6.c,v 1.7 2002/08/28 21:00:12 jmayer Exp $
*
* The information used comes from:
! * draft-ietf-dhc-dhcpv6-26.txt
! * draft-troan-dhcpv6-opt-prefix-delegation-01.txt
! * draft-ietf-dhc-dhcpv6-opt-dnsconfig-02.txt
! *
* Note that protocol constants are still subject to change, based on IANA
* assignment decisions.
*
--- 3,18 ----
* Jun-ichiro itojun Hagino <itojun@xxxxxxxxxx>
* IItom Tsutomu MIENO <iitom@xxxxxxxxxx>
* SHIRASAKI Yasuhiro <yasuhiro@xxxxxxxxxxx>
+ * Tony Lindstrom <tony.lindstrom@xxxxxxxxxxxx>
*
* $Id: packet-dhcpv6.c,v 1.7 2002/08/28 21:00:12 jmayer Exp $
*
* The information used comes from:
! * draft-ietf-dhc-dhcpv6-28.txt
! * draft-ietf-dhc-dhcpv6-opt-prefix-delegation-04.txt
! * draft-ietf-dhc-dhcpv6-opt-dnsconfig-03.txt
! * draft-ietf-dhc-dhcpv6-opt-nisconfig-02.txt
! * draft-ietf-dhc-dhcpv6-opt-timeconfig-02.txt
* Note that protocol constants are still subject to change, based on IANA
* assignment decisions.
*
***************
*** 70,76 ****
#define OPTION_CLIENTID 1
#define OPTION_SERVERID 2
! #define OPTION_IA 3
#define OPTION_IA_TA 4
#define OPTION_IAADDR 5
#define OPTION_ORO 6
--- 72,78 ----
#define OPTION_CLIENTID 1
#define OPTION_SERVERID 2
! #define OPTION_IA_NA 3
#define OPTION_IA_TA 4
#define OPTION_IAADDR 5
#define OPTION_ORO 6
***************
*** 87,99 ****
#define OPTION_VENDOR_OPTS 17
#define OPTION_INTERFACE_ID 18
#define OPTION_RECONF_MSG 19
! #define OPTION_RECONF_NONCE 20
! #define OPTION_DNS_SERVERS 25
! #define OPTION_DOMAIN_LIST 26
! #define OPTION_PREFIXDEL 30
! #define OPTION_PREFIX_INFO 31
! #define OPTION_PREFIXREQ 32
#define DUID_LLT 1
#define DUID_EN 2
--- 89,107 ----
#define OPTION_VENDOR_OPTS 17
#define OPTION_INTERFACE_ID 18
#define OPTION_RECONF_MSG 19
! #define OPTION_RECONF_ACCEPT 20
! #define OPTION_IA_PD 21
! #define OPTION_IAPREFIX 22
! #define OPTION_DNS_RESOLVERS 30
! #define OPTION_DOMAIN_LIST 31
! #define OPTION_NIS_SERVERS 35
! #define OPTION_NISP_SERVERS 36
! #define OPTION_NIS_DOMAIN_NAME 37
! #define OPTION_NISP_DOMAIN_NAME 38
! #define OPTION_NTP_SERVERS 40
! #define OPTION_TIME_ZONE 41
! /* define OPTION_DNS_SERVERS 50 */
#define DUID_LLT 1
#define DUID_EN 2
***************
*** 120,126 ****
static const value_string opttype_vals[] = {
{ OPTION_CLIENTID, "Client Identifier" },
{ OPTION_SERVERID, "Server Identifier" },
! { OPTION_IA, "Identify Association" },
{ OPTION_IA_TA, "Identify Association for Temporary Address" },
{ OPTION_IAADDR, "IA Address" },
{ OPTION_ORO, "Option Request" },
--- 128,134 ----
static const value_string opttype_vals[] = {
{ OPTION_CLIENTID, "Client Identifier" },
{ OPTION_SERVERID, "Server Identifier" },
! { OPTION_IA_NA, "Identify Association" },
{ OPTION_IA_TA, "Identify Association for Temporary Address" },
{ OPTION_IAADDR, "IA Address" },
{ OPTION_ORO, "Option Request" },
***************
*** 137,148 ****
{ OPTION_VENDOR_OPTS, "Vendor-specific Information" },
{ OPTION_INTERFACE_ID, "Interface-Id" },
{ OPTION_RECONF_MSG, "Reconfigure Message" },
! { OPTION_RECONF_NONCE, "Reconfigure Nonce" },
! { OPTION_DNS_SERVERS, "Domain Name Server" },
{ OPTION_DOMAIN_LIST, "Domain Search List" },
! { OPTION_PREFIXDEL, "Prefix Delegation" },
! { OPTION_PREFIX_INFO, "Prefix Information" },
! { OPTION_PREFIXREQ, "Prefix Request" },
{ 0, NULL }
};
--- 145,162 ----
{ OPTION_VENDOR_OPTS, "Vendor-specific Information" },
{ OPTION_INTERFACE_ID, "Interface-Id" },
{ OPTION_RECONF_MSG, "Reconfigure Message" },
! { OPTION_RECONF_ACCEPT, "Reconfigure Accept" },
! { OPTION_IA_PD, "Identify Association for Prefix Delegation" },
! { OPTION_IAPREFIX, "IA Prefix" },
! { OPTION_DNS_RESOLVERS, "DNS Resolver" },
{ OPTION_DOMAIN_LIST, "Domain Search List" },
! { OPTION_NIS_SERVERS, "Network Information Server" },
! { OPTION_NISP_SERVERS, "Network Information Server V2" },
! { OPTION_NIS_DOMAIN_NAME, "Network Information Server Domain Name" },
! { OPTION_NISP_DOMAIN_NAME,"Network Information Server V2 Domain Name" },
! { OPTION_NTP_SERVERS, "Network Time Protocol Server" },
! { OPTION_TIME_ZONE, "Time zone" },
! /* { OPTION_DNS_SERVERS, "Domain Name Server" }, */
{ 0, NULL }
};
***************
*** 150,162 ****
{
{0, "Success" },
{1, "UnspecFail" },
! {2, "AuthFailed" },
! {3, "AddrUnvail" },
! {4, "NoAddrAvail" },
! {5, "NoBinding" },
! {6, "ConfNoMatch" },
! {7, "NotOnLink" },
! {8, "UseMulticast" },
{0, NULL }
};
--- 164,174 ----
{
{0, "Success" },
{1, "UnspecFail" },
! {2, "NoAddrAvail" },
! {3, "NoBinding" },
! {4, "NotOnLink" },
! {5, "UseMulticast" },
! {6, "NoPrefixAvail" },
{0, NULL }
};
***************
*** 176,181 ****
--- 188,194 ----
{
guint16 opttype;
guint16 optlen;
+ guint16 temp_optlen = 0;
proto_item *ti;
proto_tree *subtree;
int i;
***************
*** 268,278 ****
break;
}
break;
! case OPTION_IA:
! if (optlen < 12) {
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IA: malformed option");
! break;
}
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
--- 281,296 ----
break;
}
break;
! case OPTION_IA_NA:
! case OPTION_IA_PD:
! if (optlen < 12) {
! if (opttype == OPTION_IA_NA)
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IA_NA: malformed option");
! else
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IA_PD: malformed option");
! break;
}
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
***************
*** 281,289 ****
"T1: %u", tvb_get_ntohl(tvb, off+4));
proto_tree_add_text(subtree, tvb, off+8, 4,
"T2: %u", tvb_get_ntohl(tvb, off+8));
! if (optlen > 12) {
! gboolean at_end_;
! dhcpv6_option(tvb, subtree, off+12, off + optlen - 12, &at_end_);
}
break;
case OPTION_IA_TA:
--- 299,309 ----
"T1: %u", tvb_get_ntohl(tvb, off+4));
proto_tree_add_text(subtree, tvb, off+8, 4,
"T2: %u", tvb_get_ntohl(tvb, off+8));
!
! temp_optlen = 12;
! while ((optlen - temp_optlen) > 0) {
! gboolean at_end_ = FALSE;
! temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
}
break;
case OPTION_IA_TA:
***************
*** 295,326 ****
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
tvb_get_ntohl(tvb, off));
! if (optlen > 4) {
gboolean at_end_;
! dhcpv6_option(tvb, subtree, off+4, off + optlen - 4, &at_end_);
}
break;
case OPTION_IAADDR:
! if (optlen < 24) {
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IAADDR: malformed option");
! break;
! }
! tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6));
! proto_tree_add_text(subtree, tvb, off,
! sizeof(in6), "IPv6 address: %s",
! ip6_to_str(&in6));
! proto_tree_add_text(subtree, tvb, off+16, 4,
! "preferred-lifetime: %u",
! tvb_get_ntohl(tvb, off+16));
! proto_tree_add_text(subtree, tvb, off+20, 4,
! "valid-lifetime: %u",
! tvb_get_ntohl(tvb, off+20));
! if (optlen > 24) {
! gboolean at_end_;
! dhcpv6_option(tvb, subtree, off+24, off + optlen - 24, &at_end_);
! }
! break;
case OPTION_ORO:
for (i = 0; i < optlen; i += 2) {
guint16 requested_opt_code;
--- 315,365 ----
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
tvb_get_ntohl(tvb, off));
! temp_optlen = 4;
! while ((optlen - temp_optlen) > 0) {
gboolean at_end_;
! temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
}
break;
case OPTION_IAADDR:
! {
! guint32 preferred_lifetime, valid_lifetime;
!
! if (optlen < 24) {
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IAADDR: malformed option");
! break;
! }
! tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6));
! proto_tree_add_text(subtree, tvb, off,
! sizeof(in6), "IPv6 address: %s",
! ip6_to_str(&in6));
!
! preferred_lifetime = tvb_get_ntohl(tvb, off + 16);
! valid_lifetime = tvb_get_ntohl(tvb, off + 20);
!
! if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
! proto_tree_add_text(subtree, tvb, off + 16, 4,
! "Preferred lifetime: infinity");
! } else {
! proto_tree_add_text(subtree, tvb, off + 16, 4,
! "Preferred lifetime: %u", preferred_lifetime);
! }
! if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
! proto_tree_add_text(subtree, tvb, off + 20, 4,
! "Valid lifetime: infinity");
! } else {
! proto_tree_add_text(subtree, tvb, off + 20, 4,
! "Valid lifetime: %u", valid_lifetime);
! }
!
! temp_optlen = 24;
! while ((optlen - temp_optlen) > 0) {
! gboolean at_end_;
! temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
! }
! }
! break;
case OPTION_ORO:
for (i = 0; i < optlen; i += 2) {
guint16 requested_opt_code;
***************
*** 361,367 ****
} else {
gboolean at_end_;
dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
! }
break;
case OPTION_AUTH:
if (optlen < 15) {
--- 400,406 ----
} else {
gboolean at_end_;
dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
! }
break;
case OPTION_AUTH:
if (optlen < 15) {
***************
*** 466,481 ****
msgtype_vals,
"Message Type %u"));
break;
! case OPTION_RECONF_NONCE:
! if (optlen != 8) {
! proto_tree_add_text(subtree, tvb, off,
! optlen, "RECONF_NONCE: malformed option");
! break;
! }
! proto_tree_add_text(subtree, tvb, off, optlen,
! "Reconfigure-nonce");
! break;
! case OPTION_DNS_SERVERS:
if (optlen % 16) {
proto_tree_add_text(subtree, tvb, off, optlen,
"DNS servers address: malformed option");
--- 505,511 ----
msgtype_vals,
"Message Type %u"));
break;
! /* case OPTION_DNS_SERVERS:
if (optlen % 16) {
proto_tree_add_text(subtree, tvb, off, optlen,
"DNS servers address: malformed option");
***************
*** 488,538 ****
ip6_to_str(&in6));
}
break;
case OPTION_DOMAIN_LIST:
if (optlen > 0) {
proto_tree_add_text(subtree, tvb, off, optlen, "Search String");
}
break;
! case OPTION_PREFIXDEL:
{
! gboolean at_end_;
! dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
! }
! break;
! case OPTION_PREFIX_INFO:
! {
! guint32 lease_duration;
guint8 prefix_length;
struct e_in6_addr in6;
! lease_duration = tvb_get_ntohl(tvb, off);
! prefix_length = tvb_get_guint8(tvb, off + 4);
! if ( lease_duration == DHCPV6_LEASEDURATION_INFINITY) {
proto_tree_add_text(subtree, tvb, off, 4,
! "Lease duration: infinity");
} else {
proto_tree_add_text(subtree, tvb, off, 4,
! "Lease duration: %u", lease_duration);
}
! proto_tree_add_text(subtree, tvb, off + 4, 1,
"Prefix length: %d", prefix_length);
! tvb_memcpy(tvb, (guint8 *)&in6, off + 5 , sizeof(in6));
! proto_tree_add_text(subtree, tvb, off + 5,
16, "Prefix address: %s",
ip6_to_str(&in6));
}
break;
- case OPTION_PREFIXREQ:
- {
- guint8 prefix_length;
- prefix_length = tvb_get_guint8(tvb, off);
- proto_tree_add_text(subtree, tvb, off, 1,
- "Prefix length: %d", prefix_length);
- }
- break;
}
-
return 4 + optlen;
}
--- 518,641 ----
ip6_to_str(&in6));
}
break;
+ */
+ case OPTION_DNS_RESOLVERS:
+ if (optlen % 16) {
+ proto_tree_add_text(subtree, tvb, off, optlen,
+ "DNS resolvers address: malformed option");
+ break;
+ }
+ for (i = 0; i < optlen; i += 16) {
+ tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + i,
+ sizeof(in6), "DNS resolvers address: %s",
+ ip6_to_str(&in6));
+ }
+ break;
case OPTION_DOMAIN_LIST:
if (optlen > 0) {
proto_tree_add_text(subtree, tvb, off, optlen, "Search String");
}
break;
! case OPTION_NIS_SERVERS:
! if (optlen % 16) {
! proto_tree_add_text(subtree, tvb, off, optlen,
! "NIS servers address: malformed option");
! break;
! }
! for (i = 0; i < optlen; i += 16) {
! tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
! proto_tree_add_text(subtree, tvb, off + i,
! sizeof(in6), "NIS servers address: %s",
! ip6_to_str(&in6));
! }
! break;
! case OPTION_NISP_SERVERS:
! if (optlen % 16) {
! proto_tree_add_text(subtree, tvb, off, optlen,
! "NISP servers address: malformed option");
! break;
! }
! for (i = 0; i < optlen; i += 16) {
! tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
! proto_tree_add_text(subtree, tvb, off + i,
! sizeof(in6), "NISP servers address: %s",
! ip6_to_str(&in6));
! }
! break;
! case OPTION_NIS_DOMAIN_NAME:
! if (optlen > 0) {
! proto_tree_add_text(subtree, tvb, off, optlen, "nis-domain-name");
! }
! break;
! case OPTION_NISP_DOMAIN_NAME:
! if (optlen > 0) {
! proto_tree_add_text(subtree, tvb, off, optlen, "nisp-domain-name");
! }
! break;
! case OPTION_NTP_SERVERS:
! if (optlen % 16) {
! proto_tree_add_text(subtree, tvb, off, optlen,
! "NTP servers address: malformed option");
! break;
! }
! for (i = 0; i < optlen; i += 16) {
! tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
! proto_tree_add_text(subtree, tvb, off + i,
! sizeof(in6), "NTP servers address: %s",
! ip6_to_str(&in6));
! }
! break;
! case OPTION_TIME_ZONE:
! if (optlen > 0) {
! proto_tree_add_text(subtree, tvb, off, optlen, "time-zone");
! }
! break;
! case OPTION_IAPREFIX:
{
! guint32 preferred_lifetime, valid_lifetime;
guint8 prefix_length;
struct e_in6_addr in6;
! if (optlen < 25) {
! proto_tree_add_text(subtree, tvb, off,
! optlen, "IAPREFIX: malformed option");
! break;
! }
!
! preferred_lifetime = tvb_get_ntohl(tvb, off);
! valid_lifetime = tvb_get_ntohl(tvb, off + 4);
! prefix_length = tvb_get_guint8(tvb, off + 8);
! if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
proto_tree_add_text(subtree, tvb, off, 4,
! "Preferred lifetime: infinity");
} else {
proto_tree_add_text(subtree, tvb, off, 4,
! "Preferred lifetime: %u", preferred_lifetime);
}
! if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
! proto_tree_add_text(subtree, tvb, off + 4, 4,
! "Valid lifetime: infinity");
! } else {
! proto_tree_add_text(subtree, tvb, off + 4, 4,
! "Valid lifetime: %u", valid_lifetime);
! }
! proto_tree_add_text(subtree, tvb, off + 8, 1,
"Prefix length: %d", prefix_length);
! tvb_memcpy(tvb, (guint8 *)&in6, off + 9 , sizeof(in6));
! proto_tree_add_text(subtree, tvb, off + 9,
16, "Prefix address: %s",
ip6_to_str(&in6));
+
+ temp_optlen = 25;
+ while ((optlen - temp_optlen) > 0) {
+ gboolean at_end_;
+ temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
+ }
}
break;
}
return 4 + optlen;
}
***************
*** 543,553 ****
{
proto_tree *bp_tree = NULL;
proto_item *ti;
! guint8 msgtype;
guint32 xid;
! int off, eoff;
gboolean at_end;
downstream = 0; /* feature reserved */
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DHCPv6");
--- 646,661 ----
{
proto_tree *bp_tree = NULL;
proto_item *ti;
! guint8 msgtype, hop_count ;
guint32 xid;
! int off = 0;
! int eoff;
! struct e_in6_addr in6;
gboolean at_end;
+ gboolean relay_msg_option = FALSE;
+ int length;
+ eoff = tvb_reported_length(tvb);
downstream = 0; /* feature reserved */
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DHCPv6");
***************
*** 554,579 ****
if (check_col(pinfo->cinfo, COL_INFO))
col_clear(pinfo->cinfo, COL_INFO);
! msgtype = tvb_get_guint8(tvb, 0);
- /* XXX relay agent messages have to be decoded differently */
-
- xid = tvb_get_ntohl(tvb, 0) & 0x00ffffff;
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_set_str(pinfo->cinfo, COL_INFO,
- val_to_str(msgtype,
- msgtype_vals,
- "Message Type %u"));
- }
-
if (tree) {
ti = proto_tree_add_item(tree, proto_dhcpv6, tvb, 0, -1, FALSE);
bp_tree = proto_item_add_subtree(ti, ett_dhcpv6);
! proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, 0, 1,
msgtype);
! proto_tree_add_text(bp_tree, tvb, 1, 3, "Transaction-ID: 0x%08x", xid);
#if 0
tvb_memcpy(tvb, (guint8 *)&in6, 4, sizeof(in6));
proto_tree_add_text(bp_tree, tvb, 4, sizeof(in6),
--- 662,734 ----
if (check_col(pinfo->cinfo, COL_INFO))
col_clear(pinfo->cinfo, COL_INFO);
! msgtype = tvb_get_guint8(tvb, off);
if (tree) {
ti = proto_tree_add_item(tree, proto_dhcpv6, tvb, 0, -1, FALSE);
bp_tree = proto_item_add_subtree(ti, ett_dhcpv6);
+ }
! while (msgtype == RELAY_FORW || msgtype == RELAY_REPL) {
!
! if (check_col(pinfo->cinfo, COL_INFO)) {
! col_set_str(pinfo->cinfo, COL_INFO,
! val_to_str(msgtype,
! msgtype_vals,
! "Message Type %u"));
! }
!
! proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1, msgtype);
!
! hop_count = tvb_get_guint8(tvb, off+1);
! proto_tree_add_text(bp_tree, tvb, off+1, 1, "Hop count: %d", hop_count);
!
! tvb_memcpy(tvb, (guint8 *)&in6, off+2, sizeof(in6));
! proto_tree_add_text(bp_tree, tvb, off+2, sizeof(in6),
! "Link-address: %s",ip6_to_str(&in6));
!
! tvb_memcpy(tvb, (guint8 *)&in6, off+18, sizeof(in6));
! proto_tree_add_text(bp_tree, tvb, off+18, sizeof(in6),
! "Peer-address: %s",ip6_to_str(&in6));
!
! off += 34;
! relay_msg_option = FALSE;
!
! while (!relay_msg_option && off < eoff) {
! length = dhcpv6_option(tvb, bp_tree, off, eoff, &at_end);
!
! if (tvb_get_ntohs(tvb, off) == OPTION_RELAY_MSG) {
! relay_msg_option = TRUE;
! off += 4;
! }
! else {
! if (length > 0)
! off += length;
! else {
! proto_tree_add_text(bp_tree, tvb, off, eoff, "Message: malformed");
! return;
! }
! }
! }
!
! msgtype = tvb_get_guint8(tvb, off);
! }
!
! xid = tvb_get_ntohl(tvb, off) & 0x00ffffff;
!
! if (!off) {
! if (check_col(pinfo->cinfo, COL_INFO)) {
! col_set_str(pinfo->cinfo, COL_INFO,
! val_to_str(msgtype,
! msgtype_vals,
! "Message Type %u"));
! }
! }
!
! if (tree) {
! proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1,
msgtype);
! proto_tree_add_text(bp_tree, tvb, off+1, 3, "Transaction-ID: 0x%08x", xid);
#if 0
tvb_memcpy(tvb, (guint8 *)&in6, 4, sizeof(in6));
proto_tree_add_text(bp_tree, tvb, 4, sizeof(in6),
***************
*** 581,588 ****
#endif
}
! off = 4;
! eoff = tvb_reported_length(tvb);
at_end = FALSE;
while (off < eoff && !at_end)
--- 736,742 ----
#endif
}
! off += 4;
at_end = FALSE;
while (off < eoff && !at_end)
--- packet-dhcpv6.c Thu Aug 29 02:39:52 2002
+++ /home/eratlim/ethereal/ethereal-0.9.9/packet-dhcpv6.c Mon Aug 18 16:40:24 2003
@@ -3,14 +3,16 @@
* Jun-ichiro itojun Hagino <itojun@xxxxxxxxxx>
* IItom Tsutomu MIENO <iitom@xxxxxxxxxx>
* SHIRASAKI Yasuhiro <yasuhiro@xxxxxxxxxxx>
+ * Tony Lindstrom <tony.lindstrom@xxxxxxxxxxxx>
*
* $Id: packet-dhcpv6.c,v 1.7 2002/08/28 21:00:12 jmayer Exp $
*
* The information used comes from:
- * draft-ietf-dhc-dhcpv6-26.txt
- * draft-troan-dhcpv6-opt-prefix-delegation-01.txt
- * draft-ietf-dhc-dhcpv6-opt-dnsconfig-02.txt
- *
+ * draft-ietf-dhc-dhcpv6-28.txt
+ * draft-ietf-dhc-dhcpv6-opt-prefix-delegation-04.txt
+ * draft-ietf-dhc-dhcpv6-opt-dnsconfig-03.txt
+ * draft-ietf-dhc-dhcpv6-opt-nisconfig-02.txt
+ * draft-ietf-dhc-dhcpv6-opt-timeconfig-02.txt
* Note that protocol constants are still subject to change, based on IANA
* assignment decisions.
*
@@ -70,7 +72,7 @@
#define OPTION_CLIENTID 1
#define OPTION_SERVERID 2
-#define OPTION_IA 3
+#define OPTION_IA_NA 3
#define OPTION_IA_TA 4
#define OPTION_IAADDR 5
#define OPTION_ORO 6
@@ -87,13 +89,19 @@
#define OPTION_VENDOR_OPTS 17
#define OPTION_INTERFACE_ID 18
#define OPTION_RECONF_MSG 19
-#define OPTION_RECONF_NONCE 20
+#define OPTION_RECONF_ACCEPT 20
-#define OPTION_DNS_SERVERS 25
-#define OPTION_DOMAIN_LIST 26
-#define OPTION_PREFIXDEL 30
-#define OPTION_PREFIX_INFO 31
-#define OPTION_PREFIXREQ 32
+#define OPTION_IA_PD 21
+#define OPTION_IAPREFIX 22
+#define OPTION_DNS_RESOLVERS 30
+#define OPTION_DOMAIN_LIST 31
+#define OPTION_NIS_SERVERS 35
+#define OPTION_NISP_SERVERS 36
+#define OPTION_NIS_DOMAIN_NAME 37
+#define OPTION_NISP_DOMAIN_NAME 38
+#define OPTION_NTP_SERVERS 40
+#define OPTION_TIME_ZONE 41
+/* define OPTION_DNS_SERVERS 50 */
#define DUID_LLT 1
#define DUID_EN 2
@@ -120,7 +128,7 @@
static const value_string opttype_vals[] = {
{ OPTION_CLIENTID, "Client Identifier" },
{ OPTION_SERVERID, "Server Identifier" },
- { OPTION_IA, "Identify Association" },
+ { OPTION_IA_NA, "Identify Association" },
{ OPTION_IA_TA, "Identify Association for Temporary Address" },
{ OPTION_IAADDR, "IA Address" },
{ OPTION_ORO, "Option Request" },
@@ -137,12 +145,18 @@
{ OPTION_VENDOR_OPTS, "Vendor-specific Information" },
{ OPTION_INTERFACE_ID, "Interface-Id" },
{ OPTION_RECONF_MSG, "Reconfigure Message" },
- { OPTION_RECONF_NONCE, "Reconfigure Nonce" },
- { OPTION_DNS_SERVERS, "Domain Name Server" },
+ { OPTION_RECONF_ACCEPT, "Reconfigure Accept" },
+ { OPTION_IA_PD, "Identify Association for Prefix Delegation" },
+ { OPTION_IAPREFIX, "IA Prefix" },
+ { OPTION_DNS_RESOLVERS, "DNS Resolver" },
{ OPTION_DOMAIN_LIST, "Domain Search List" },
- { OPTION_PREFIXDEL, "Prefix Delegation" },
- { OPTION_PREFIX_INFO, "Prefix Information" },
- { OPTION_PREFIXREQ, "Prefix Request" },
+ { OPTION_NIS_SERVERS, "Network Information Server" },
+ { OPTION_NISP_SERVERS, "Network Information Server V2" },
+ { OPTION_NIS_DOMAIN_NAME, "Network Information Server Domain Name" },
+ { OPTION_NISP_DOMAIN_NAME,"Network Information Server V2 Domain Name" },
+ { OPTION_NTP_SERVERS, "Network Time Protocol Server" },
+ { OPTION_TIME_ZONE, "Time zone" },
+/* { OPTION_DNS_SERVERS, "Domain Name Server" }, */
{ 0, NULL }
};
@@ -150,13 +164,11 @@
{
{0, "Success" },
{1, "UnspecFail" },
- {2, "AuthFailed" },
- {3, "AddrUnvail" },
- {4, "NoAddrAvail" },
- {5, "NoBinding" },
- {6, "ConfNoMatch" },
- {7, "NotOnLink" },
- {8, "UseMulticast" },
+ {2, "NoAddrAvail" },
+ {3, "NoBinding" },
+ {4, "NotOnLink" },
+ {5, "UseMulticast" },
+ {6, "NoPrefixAvail" },
{0, NULL }
};
@@ -176,6 +188,7 @@
{
guint16 opttype;
guint16 optlen;
+ guint16 temp_optlen = 0;
proto_item *ti;
proto_tree *subtree;
int i;
@@ -268,11 +281,16 @@
break;
}
break;
- case OPTION_IA:
- if (optlen < 12) {
- proto_tree_add_text(subtree, tvb, off,
- optlen, "IA: malformed option");
- break;
+ case OPTION_IA_NA:
+ case OPTION_IA_PD:
+ if (optlen < 12) {
+ if (opttype == OPTION_IA_NA)
+ proto_tree_add_text(subtree, tvb, off,
+ optlen, "IA_NA: malformed option");
+ else
+ proto_tree_add_text(subtree, tvb, off,
+ optlen, "IA_PD: malformed option");
+ break;
}
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
@@ -281,9 +299,11 @@
"T1: %u", tvb_get_ntohl(tvb, off+4));
proto_tree_add_text(subtree, tvb, off+8, 4,
"T2: %u", tvb_get_ntohl(tvb, off+8));
- if (optlen > 12) {
- gboolean at_end_;
- dhcpv6_option(tvb, subtree, off+12, off + optlen - 12, &at_end_);
+
+ temp_optlen = 12;
+ while ((optlen - temp_optlen) > 0) {
+ gboolean at_end_ = FALSE;
+ temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
}
break;
case OPTION_IA_TA:
@@ -295,32 +315,51 @@
proto_tree_add_text(subtree, tvb, off, 4,
"IAID: %u",
tvb_get_ntohl(tvb, off));
- if (optlen > 4) {
+ temp_optlen = 4;
+ while ((optlen - temp_optlen) > 0) {
gboolean at_end_;
- dhcpv6_option(tvb, subtree, off+4, off + optlen - 4, &at_end_);
+ temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
}
break;
case OPTION_IAADDR:
- if (optlen < 24) {
- proto_tree_add_text(subtree, tvb, off,
- optlen, "IAADDR: malformed option");
- break;
- }
- tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6));
- proto_tree_add_text(subtree, tvb, off,
- sizeof(in6), "IPv6 address: %s",
- ip6_to_str(&in6));
- proto_tree_add_text(subtree, tvb, off+16, 4,
- "preferred-lifetime: %u",
- tvb_get_ntohl(tvb, off+16));
- proto_tree_add_text(subtree, tvb, off+20, 4,
- "valid-lifetime: %u",
- tvb_get_ntohl(tvb, off+20));
- if (optlen > 24) {
- gboolean at_end_;
- dhcpv6_option(tvb, subtree, off+24, off + optlen - 24, &at_end_);
- }
- break;
+ {
+ guint32 preferred_lifetime, valid_lifetime;
+
+ if (optlen < 24) {
+ proto_tree_add_text(subtree, tvb, off,
+ optlen, "IAADDR: malformed option");
+ break;
+ }
+ tvb_memcpy(tvb, (guint8 *)&in6, off, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off,
+ sizeof(in6), "IPv6 address: %s",
+ ip6_to_str(&in6));
+
+ preferred_lifetime = tvb_get_ntohl(tvb, off + 16);
+ valid_lifetime = tvb_get_ntohl(tvb, off + 20);
+
+ if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
+ proto_tree_add_text(subtree, tvb, off + 16, 4,
+ "Preferred lifetime: infinity");
+ } else {
+ proto_tree_add_text(subtree, tvb, off + 16, 4,
+ "Preferred lifetime: %u", preferred_lifetime);
+ }
+ if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
+ proto_tree_add_text(subtree, tvb, off + 20, 4,
+ "Valid lifetime: infinity");
+ } else {
+ proto_tree_add_text(subtree, tvb, off + 20, 4,
+ "Valid lifetime: %u", valid_lifetime);
+ }
+
+ temp_optlen = 24;
+ while ((optlen - temp_optlen) > 0) {
+ gboolean at_end_;
+ temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
+ }
+ }
+ break;
case OPTION_ORO:
for (i = 0; i < optlen; i += 2) {
guint16 requested_opt_code;
@@ -361,7 +400,7 @@
} else {
gboolean at_end_;
dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
- }
+ }
break;
case OPTION_AUTH:
if (optlen < 15) {
@@ -466,16 +505,7 @@
msgtype_vals,
"Message Type %u"));
break;
- case OPTION_RECONF_NONCE:
- if (optlen != 8) {
- proto_tree_add_text(subtree, tvb, off,
- optlen, "RECONF_NONCE: malformed option");
- break;
- }
- proto_tree_add_text(subtree, tvb, off, optlen,
- "Reconfigure-nonce");
- break;
- case OPTION_DNS_SERVERS:
+/* case OPTION_DNS_SERVERS:
if (optlen % 16) {
proto_tree_add_text(subtree, tvb, off, optlen,
"DNS servers address: malformed option");
@@ -488,51 +518,124 @@
ip6_to_str(&in6));
}
break;
+*/
+ case OPTION_DNS_RESOLVERS:
+ if (optlen % 16) {
+ proto_tree_add_text(subtree, tvb, off, optlen,
+ "DNS resolvers address: malformed option");
+ break;
+ }
+ for (i = 0; i < optlen; i += 16) {
+ tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + i,
+ sizeof(in6), "DNS resolvers address: %s",
+ ip6_to_str(&in6));
+ }
+ break;
case OPTION_DOMAIN_LIST:
if (optlen > 0) {
proto_tree_add_text(subtree, tvb, off, optlen, "Search String");
}
break;
- case OPTION_PREFIXDEL:
+ case OPTION_NIS_SERVERS:
+ if (optlen % 16) {
+ proto_tree_add_text(subtree, tvb, off, optlen,
+ "NIS servers address: malformed option");
+ break;
+ }
+ for (i = 0; i < optlen; i += 16) {
+ tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + i,
+ sizeof(in6), "NIS servers address: %s",
+ ip6_to_str(&in6));
+ }
+ break;
+ case OPTION_NISP_SERVERS:
+ if (optlen % 16) {
+ proto_tree_add_text(subtree, tvb, off, optlen,
+ "NISP servers address: malformed option");
+ break;
+ }
+ for (i = 0; i < optlen; i += 16) {
+ tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + i,
+ sizeof(in6), "NISP servers address: %s",
+ ip6_to_str(&in6));
+ }
+ break;
+ case OPTION_NIS_DOMAIN_NAME:
+ if (optlen > 0) {
+ proto_tree_add_text(subtree, tvb, off, optlen, "nis-domain-name");
+ }
+ break;
+ case OPTION_NISP_DOMAIN_NAME:
+ if (optlen > 0) {
+ proto_tree_add_text(subtree, tvb, off, optlen, "nisp-domain-name");
+ }
+ break;
+ case OPTION_NTP_SERVERS:
+ if (optlen % 16) {
+ proto_tree_add_text(subtree, tvb, off, optlen,
+ "NTP servers address: malformed option");
+ break;
+ }
+ for (i = 0; i < optlen; i += 16) {
+ tvb_memcpy(tvb, (guint8 *)&in6, off + i, sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + i,
+ sizeof(in6), "NTP servers address: %s",
+ ip6_to_str(&in6));
+ }
+ break;
+ case OPTION_TIME_ZONE:
+ if (optlen > 0) {
+ proto_tree_add_text(subtree, tvb, off, optlen, "time-zone");
+ }
+ break;
+ case OPTION_IAPREFIX:
{
- gboolean at_end_;
- dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
- }
- break;
- case OPTION_PREFIX_INFO:
- {
- guint32 lease_duration;
+ guint32 preferred_lifetime, valid_lifetime;
guint8 prefix_length;
struct e_in6_addr in6;
- lease_duration = tvb_get_ntohl(tvb, off);
- prefix_length = tvb_get_guint8(tvb, off + 4);
- if ( lease_duration == DHCPV6_LEASEDURATION_INFINITY) {
+ if (optlen < 25) {
+ proto_tree_add_text(subtree, tvb, off,
+ optlen, "IAPREFIX: malformed option");
+ break;
+ }
+
+ preferred_lifetime = tvb_get_ntohl(tvb, off);
+ valid_lifetime = tvb_get_ntohl(tvb, off + 4);
+ prefix_length = tvb_get_guint8(tvb, off + 8);
+ if (preferred_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
proto_tree_add_text(subtree, tvb, off, 4,
- "Lease duration: infinity");
+ "Preferred lifetime: infinity");
} else {
proto_tree_add_text(subtree, tvb, off, 4,
- "Lease duration: %u", lease_duration);
+ "Preferred lifetime: %u", preferred_lifetime);
}
- proto_tree_add_text(subtree, tvb, off + 4, 1,
+ if (valid_lifetime == DHCPV6_LEASEDURATION_INFINITY) {
+ proto_tree_add_text(subtree, tvb, off + 4, 4,
+ "Valid lifetime: infinity");
+ } else {
+ proto_tree_add_text(subtree, tvb, off + 4, 4,
+ "Valid lifetime: %u", valid_lifetime);
+ }
+ proto_tree_add_text(subtree, tvb, off + 8, 1,
"Prefix length: %d", prefix_length);
- tvb_memcpy(tvb, (guint8 *)&in6, off + 5 , sizeof(in6));
- proto_tree_add_text(subtree, tvb, off + 5,
+ tvb_memcpy(tvb, (guint8 *)&in6, off + 9 , sizeof(in6));
+ proto_tree_add_text(subtree, tvb, off + 9,
16, "Prefix address: %s",
ip6_to_str(&in6));
+
+ temp_optlen = 25;
+ while ((optlen - temp_optlen) > 0) {
+ gboolean at_end_;
+ temp_optlen += dhcpv6_option(tvb, subtree, off+temp_optlen, off + optlen, &at_end_);
+ }
}
break;
- case OPTION_PREFIXREQ:
- {
- guint8 prefix_length;
- prefix_length = tvb_get_guint8(tvb, off);
- proto_tree_add_text(subtree, tvb, off, 1,
- "Prefix length: %d", prefix_length);
- }
- break;
}
-
return 4 + optlen;
}
@@ -543,11 +646,16 @@
{
proto_tree *bp_tree = NULL;
proto_item *ti;
- guint8 msgtype;
+ guint8 msgtype, hop_count ;
guint32 xid;
- int off, eoff;
+ int off = 0;
+ int eoff;
+ struct e_in6_addr in6;
gboolean at_end;
+ gboolean relay_msg_option = FALSE;
+ int length;
+ eoff = tvb_reported_length(tvb);
downstream = 0; /* feature reserved */
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DHCPv6");
@@ -554,26 +662,73 @@
if (check_col(pinfo->cinfo, COL_INFO))
col_clear(pinfo->cinfo, COL_INFO);
- msgtype = tvb_get_guint8(tvb, 0);
+ msgtype = tvb_get_guint8(tvb, off);
- /* XXX relay agent messages have to be decoded differently */
-
- xid = tvb_get_ntohl(tvb, 0) & 0x00ffffff;
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_set_str(pinfo->cinfo, COL_INFO,
- val_to_str(msgtype,
- msgtype_vals,
- "Message Type %u"));
- }
-
if (tree) {
ti = proto_tree_add_item(tree, proto_dhcpv6, tvb, 0, -1, FALSE);
bp_tree = proto_item_add_subtree(ti, ett_dhcpv6);
+ }
- proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, 0, 1,
+ while (msgtype == RELAY_FORW || msgtype == RELAY_REPL) {
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str(msgtype,
+ msgtype_vals,
+ "Message Type %u"));
+ }
+
+ proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1, msgtype);
+
+ hop_count = tvb_get_guint8(tvb, off+1);
+ proto_tree_add_text(bp_tree, tvb, off+1, 1, "Hop count: %d", hop_count);
+
+ tvb_memcpy(tvb, (guint8 *)&in6, off+2, sizeof(in6));
+ proto_tree_add_text(bp_tree, tvb, off+2, sizeof(in6),
+ "Link-address: %s",ip6_to_str(&in6));
+
+ tvb_memcpy(tvb, (guint8 *)&in6, off+18, sizeof(in6));
+ proto_tree_add_text(bp_tree, tvb, off+18, sizeof(in6),
+ "Peer-address: %s",ip6_to_str(&in6));
+
+ off += 34;
+ relay_msg_option = FALSE;
+
+ while (!relay_msg_option && off < eoff) {
+ length = dhcpv6_option(tvb, bp_tree, off, eoff, &at_end);
+
+ if (tvb_get_ntohs(tvb, off) == OPTION_RELAY_MSG) {
+ relay_msg_option = TRUE;
+ off += 4;
+ }
+ else {
+ if (length > 0)
+ off += length;
+ else {
+ proto_tree_add_text(bp_tree, tvb, off, eoff, "Message: malformed");
+ return;
+ }
+ }
+ }
+
+ msgtype = tvb_get_guint8(tvb, off);
+ }
+
+ xid = tvb_get_ntohl(tvb, off) & 0x00ffffff;
+
+ if (!off) {
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str(msgtype,
+ msgtype_vals,
+ "Message Type %u"));
+ }
+ }
+
+ if (tree) {
+ proto_tree_add_uint(bp_tree, hf_dhcpv6_msgtype, tvb, off, 1,
msgtype);
- proto_tree_add_text(bp_tree, tvb, 1, 3, "Transaction-ID: 0x%08x", xid);
+ proto_tree_add_text(bp_tree, tvb, off+1, 3, "Transaction-ID: 0x%08x", xid);
#if 0
tvb_memcpy(tvb, (guint8 *)&in6, 4, sizeof(in6));
proto_tree_add_text(bp_tree, tvb, 4, sizeof(in6),
@@ -581,8 +736,7 @@
#endif
}
- off = 4;
- eoff = tvb_reported_length(tvb);
+ off += 4;
at_end = FALSE;
while (off < eoff && !at_end)
- Follow-Ups:
- [Ethereal-dev] Re: [Ethereal-users] Update of DHCPv6 protocol
- From: Guy Harris
- [Ethereal-dev] Re: [Ethereal-users] Update of DHCPv6 protocol
- Prev by Date: Re: [Ethereal-dev] Patches for GIOP Dissection
- Next by Date: [Ethereal-dev] Updated SRVLOC
- Previous by thread: Re: [Ethereal-dev] Calling FreeBSD, NetBSD and OpenBSD users of Ethereal ...
- Next by thread: [Ethereal-dev] Re: [Ethereal-users] Update of DHCPv6 protocol
- Index(es):





