Ethereal-dev: [Ethereal-dev] DHCPv6 updates patch

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Tsutomu MIENO <iitom@xxxxxxxxxx>
Date: Wed, 26 Jun 2002 06:03:05 +0900 (JST)
Hi all.

Attached a patch to packet-dhcpv6.c.
To update the DHCPv6 support to match the following latest drafts.
  o draft-ietf-dhc-dhcpv6-26.txt
  o draft-troan-dhcpv6-opt-prefix-delegation-01.txt
  o draft-ietf-dhc-dhcpv6-opt-dnsconfig-02.txt

Best regards.
-- 
IItom Tsutomu MIENO  iitom@xxxxxxxxxx  http://www.utouto.com/
Index: packet-dhcpv6.c
===================================================================
RCS file: /cvsroot/ethereal/packet-dhcpv6.c,v
retrieving revision 1.4
diff -r1.4 packet-dhcpv6.c
3a4,5
>  * IItom Tsutomu MIENO <iitom@xxxxxxxxxx>
>  * SHIRASAKI Yasuhiro <yasuhiro@xxxxxxxxxxx>
8c10,13
<  * draft-ietf-dhc-dhcpv6-22.txt
---
>  * draft-ietf-dhc-dhcpv6-26.txt
>  * draft-troan-dhcpv6-opt-prefix-delegation-01.txt
>  * draft-ietf-dhc-dhcpv6-opt-dnsconfig-02.txt
>  *
53a59,106
> #define DHCPV6_LEASEDURATION_INFINITY	0xffffffff
> 
> #define	SOLICIT			1
> #define	ADVERTISE		2
> #define	REQUEST			3
> #define	CONFIRM			4
> #define	RENEW			5
> #define	REBIND			6
> #define	REPLY			7
> #define	RELEASE			8
> #define	DECLINE			9
> #define	RECONFIGURE		10
> #define	INFORMATION_REQUEST	11
> #define	RELAY_FORW		12
> #define	RELAY_REPL		13
> 
> #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
> #define	OPTION_PREFERENCE	7
> #define	OPTION_ELAPSED_TIME	8
> #define	OPTION_RELAY_MSG	9
> /* #define	OPTION_SERVER_MSG	10 */
> #define	OPTION_AUTH		11
> #define	OPTION_UNICAST		12
> #define	OPTION_STATUS_CODE	13
> #define	OPTION_RAPID_COMMIT	14
> #define	OPTION_USER_CLASS	15
> #define	OPTION_VENDOR_CLASS	16
> #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
> #define	DUID_LL			3
> #define	DUID_LL_OLD		4
> 
55,57c108,121
< 	{ 7,	"Reply" },
< 	{ 11,	"Information request" },
< 	{ 0,	NULL }
---
> 	{ SOLICIT,	"Solicit" },
> 	{ ADVERTISE,	"Advertise" },
> 	{ REQUEST,	"Request" }, 
> 	{ CONFIRM,	"Confirm" },
> 	{ RENEW,	"Renew" },
> 	{ REBIND,	"Rebind" },
> 	{ REPLY,	"Reply" },
> 	{ RELEASE,	"Release" },
> 	{ DECLINE,	"Decline" },
> 	{ RECONFIGURE,	"Reconfigure" },
> 	{ INFORMATION_REQUEST,	"Information-request" },
> 	{ RELAY_FORW,	"Relay-forw" },
> 	{ RELAY_REPL,	"Relay-repl" },
> 	{ 0, NULL }
61,62c125,149
< 	{ 1,	"DUID" },
< 	{ 11,	"DNS servers address" },
---
> 	{ 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" },
> 	{ OPTION_PREFERENCE,	"Preference" },
> 	{ OPTION_ELAPSED_TIME,	"Elapsed time" },
> 	{ OPTION_RELAY_MSG,	"Relay Message" },
> /*	{ OPTION_SERVER_MSG,	"Server message" }, */
> 	{ OPTION_AUTH,		"Authentication" },
> 	{ OPTION_UNICAST,	"Server unicast" },
> 	{ OPTION_STATUS_CODE,	"Status code" },
> 	{ OPTION_RAPID_COMMIT,	"Rapid Commit" },
> 	{ OPTION_USER_CLASS,	"User Class" },
> 	{ OPTION_VENDOR_CLASS,	"Vendor Class" },
> 	{ 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" },
65a153,175
> static const value_string statuscode_vals[] =
> {
> 	{0, "Success" },
> 	{1, "UnspecFail" },
> 	{2, "AuthFailed" },
> 	{3, "AddrUnvail" },
> 	{4, "NoAddrAvail" },
> 	{5, "NoBinding" },
> 	{6, "ConfNoMatch" },
> 	{7, "NotOnLink" },
> 	{8, "UseMulticast" },
> 	{0, NULL }
> };
> 
> static const value_string duidtype_vals[] =
> {
> 	{ DUID_LLT,	"link-layer address plus time" },
> 	{ DUID_EN,	"assigned by vendor based on Enterprise number" },
> 	{ DUID_LL,	"link-layer address" },
> 	{ DUID_LL_OLD,	"link-layer address (old)" },
> 	{ 0, NULL }
> };
> 
104c214,215
< 	case 1:	/* DUID */
---
> 	case OPTION_CLIENTID:
> 	case OPTION_SERVERID:
112c223,226
< 			"DUID type: %u", duidtype);
---
> 			"DUID type: %s (%u)", 
> 				    val_to_str(duidtype, 
> 					       duidtype_vals, "Unknown"),
> 				    duidtype);
114c228
< 		case 1:
---
> 		case DUID_LLT:
121,123c235
< 			proto_tree_add_text(subtree, tvb, off + 2, 4,
< 				"Time: %u", tvb_get_ntohl(tvb, off + 6));
< 			proto_tree_add_text(subtree, tvb, off + 6, 2,
---
> 			proto_tree_add_text(subtree, tvb, off + 2, 2,
125c237,239
< 				tvb_get_ntohs(tvb, off + 6));
---
> 				tvb_get_ntohs(tvb, off + 2));
> 			proto_tree_add_text(subtree, tvb, off + 4, 4,
> 				"Time: %u", tvb_get_ntohl(tvb, off + 4));
131,132c245,246
< 		case 2:
< 			if (optlen < 10) {
---
> 		case DUID_EN:
> 			if (optlen < 6) {
137,140c251,255
< 			proto_tree_add_text(subtree, tvb, off + 2, 8, "VUID");
< 			if (optlen > 10) {
< 				proto_tree_add_text(subtree, tvb, off + 10,
< 					optlen - 10, "Domain name");
---
> 			proto_tree_add_text(subtree, tvb, off + 2, 4,
> 					    "enterprise-number");
> 			if (optlen > 6) {
> 				proto_tree_add_text(subtree, tvb, off + 6,
> 					optlen - 6, "identifier");
143c258,259
< 		case 3:
---
> 		case DUID_LL:
> 		case DUID_LL_OLD:
151c267
< 				tvb_get_ntohs(tvb, off + 10));
---
> 				tvb_get_ntohs(tvb, off + 2));
159c275,482
< 	case 11:	/* DNS servers address */
---
> 	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",
> 			      tvb_get_ntohl(tvb, off));
> 	  proto_tree_add_text(subtree, tvb, off+4, 4,
> 			      "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:
> 	  if (optlen < 4) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "IA_TA: malformed option");
> 	    break;
> 	  }
> 	  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;
> 		    requested_opt_code = tvb_get_ntohs(tvb, off + i);
> 		    proto_tree_add_text(subtree, tvb, off + i,
> 			    2, "Requested Option code: %s (%d)", 
> 					    val_to_str(requested_opt_code,
> 						       opttype_vals,
> 						       "Unknown"),
> 					    requested_opt_code);
> 		}
> 		break;
> 	case OPTION_PREFERENCE:
> 	  if (optlen != 1) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "PREFERENCE: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, 1,
> 			      "pref-value: %d",
> 			      (guint32)tvb_get_guint8(tvb, off));
> 	  break;
> 	case OPTION_ELAPSED_TIME:
> 	  if (optlen != 2) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "ELAPSED-TIME: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, 2,
> 			      "elapsed-time: %d sec",
> 			      (guint32)tvb_get_ntohs(tvb, off));
> 	  break;
> 	case OPTION_RELAY_MSG:
> 	  if (optlen == 0) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "RELAY-MSG: malformed option");
> 	    break;
> 	  } else {
> 	    gboolean at_end_;
> 	    dhcpv6_option(tvb, subtree, off, off + optlen, &at_end_);
> 	  }
> 	  break;
> 	case OPTION_AUTH:
> 	  if (optlen < 15) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "AUTH: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, 1,
> 			      "Protocol: %d",
> 			      (guint32)tvb_get_guint8(tvb, off));
> 	  proto_tree_add_text(subtree, tvb, off+1, 1,
> 			      "Algorithm: %d",
> 			      (guint32)tvb_get_guint8(tvb, off+1));
> 	  proto_tree_add_text(subtree, tvb, off+2, 1,
> 			      "RDM: %d",
> 			      (guint32)tvb_get_guint8(tvb, off+2));
> 	  proto_tree_add_text(subtree, tvb, off+3, 8,
> 			      "Reply Detection");
> 	  proto_tree_add_text(subtree, tvb, off+11, optlen-11,
> 			      "Authentication Information");
> 	  break;
> 	case OPTION_UNICAST:
> 	  if (optlen != 16) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "UNICAST: 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));
> 	  break;
> 	case OPTION_STATUS_CODE:
> 	    {
> 		guint16 status_code;
> 		char *status_message = 0;
> 		status_code = tvb_get_ntohs(tvb, off);
> 		proto_tree_add_text(subtree, tvb, off, 2, 
> 				    "Status Code: %s (%d)",
> 				    val_to_str(status_code, statuscode_vals, 
> 					       "Unknown"),
> 				    status_code);
> 
> 		if (optlen - 2 > 0)
> 		    status_message = g_malloc(optlen - 2 + 1);
> 		if (status_message != 0){
> 		    memset(status_message, 0, optlen - 2 + 1);
> 		    status_message = tvb_memcpy(tvb, status_message, off + 2, 
> 						optlen - 2);
> 		    proto_tree_add_text(subtree, tvb, off + 2, optlen - 2,
> 					"Status Message: %s",
> 					status_message);
> 		    g_free(status_message);
> 		}
> 	    }
> 	    break;
> 	case OPTION_VENDOR_CLASS:
> 	  if (optlen < 4) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "VENDOR_CLASS: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, 4,
> 			      "enterprise-number: %u",
> 			      tvb_get_ntohl(tvb, off));
> 	  if (optlen > 4) {
> 	    proto_tree_add_text(subtree, tvb, off+4, optlen-4,
> 				"vendor-class-data");
> 	  }
> 	  break;
> 	case OPTION_VENDOR_OPTS:
> 	  if (optlen < 4) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "VENDOR_OPTS: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, 4,
> 			      "enterprise-number: %u",
> 			      tvb_get_ntohl(tvb, off));
> 	  if (optlen > 4) {
> 	    proto_tree_add_text(subtree, tvb, off+4, optlen-4,
> 				"option-data");
> 	  }
> 	  break;
> 	case OPTION_INTERFACE_ID:
> 	  if (optlen == 0) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "INTERFACE_ID: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, optlen, "Interface-ID");
> 	  break;
> 	case OPTION_RECONF_MSG:
> 	  if (optlen != 1) {
> 	    proto_tree_add_text(subtree, tvb, off,
> 				optlen, "RECONF_MSG: malformed option");
> 	    break;
> 	  }
> 	  proto_tree_add_text(subtree, tvb, off, optlen,
> 			      "Reconfigure-type: %s",
> 			      val_to_str(tvb_get_guint8(tvb, off),
> 					 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:
171a495,536
> 	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;
173a539
> 
176a543
> 
185d551
< 	struct e_in6_addr in6;
188a555
> 	downstream = 0; /* feature reserved */
202c569,571
< 			downstream ? "DHCPv6 reply" : "DHCPv6 request");
---
> 			    val_to_str(msgtype,
> 				       msgtype_vals,
> 				       "Message Type %u"));
211c580,581
< 		proto_tree_add_text(bp_tree, tvb, 1, 3, "XID: 0x%08x", xid);
---
> 		proto_tree_add_text(bp_tree, tvb, 1, 3, "Transaction-ID: 0x%08x", xid);
> #if 0
214a585
> #endif
217c588
< 	off = 20;
---
> 	off = 4;