/*
 * Copyright (C) 2002, 2003, 2004, 2005 Yokogawa Electric Corporation, 
 * INTAP(Interoperability Technology Association for Information 
 * Processing, Japan), IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 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 names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, 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.
 *
 * $TAHI: v6eval/lib/Pz/McInit.cc,v 1.92 2005/05/09 09:35:24 akisada Exp $
 */

#include "McSub.h"
#include "McNull.h"
#include "McEther.h"
#include "McIPv6.h"
#include "McICMPv6.h"
#include "McMobility.h"
#include "McRR.h"
#include "McIPv4.h"
#include "McICMPv4.h"
#include "McARP.h"
#include "McNoNext.h"
#include "McUDP.h"
#include "McTCP.h"
#include "McAlgorithm.h"
#include "McESP.h"
#include "McAH.h"
#include "McRIPng.h"
#include "McSIP.h"
#include "McDNS.h"
#include "McDHCPv6.h"
#include "McMLDv2.h"
#include "McIGMP.h"
#if !defined(NOT_USE_SNMP)
#include "McSNMP.h"
#endif // NOT_USE_SNMP
#include "McVRRP.h"
#include "McIKE.h"

#include "MmObject.h"
#include "MmChecksum.h"
#include "MmHeader.h"
#include "MmData.h"
#include "PvObject.h"
#include "PvOctets.h"
#include "PvAction.h"
#include "PvAutoItem.h"
#include "PControl.h"
#include "WObject.h"
#include <stdio.h>

#define	UN(n) PvNumber::unique(n)
#define	V6TN()PvV6Addr::TN()
#define	V6NUT()PvV6Addr::NUT()
#define	ETTN()PvEther::TN()
#define	ETNUT()PvEther::NUT()
#define	MUST()PvMUSTDEF::must()
#define EVALANY()	new PvANY()
#define EVALZERO()	new PvOctets(0, 0)
#define GENEHC(mc,cls,mem)	new PvHCgene(mc,(HCgenefunc)&cls::HCGENE(mem))
#define EVALHC(mc,cls,mem)	new PvHCeval(mc,(HCevalfunc)&cls::HCEVAL(mem))

#define ICVCONST()	0
#define ICVZERO()	new ICV_Zero()
#define ICVHC(mc,cls,mem)	new ICV_HC(mc,(METH_HC_OWICV)&cls::HC_OWICV(mem))
#define ICVOPTDATA(mc,cls)	ICVHC(mc,cls,OptExtData)

#define DEF_EVALSKIP	true
#define DEF_EVALGO	false
#define DEF_OPTCHKSUM	true
#define DEF_MUSTCHKSUM	false
#define DEF_NOPSEUDO	false
#define DEF_MUSTPSEUDO	true

McObject *
McObject::addCompound(McObject *mc)
{
	mc->confirmed();
	set_.add(mc);

	return(mc);
}

#define LEXADD(classname,lexname) addCompound(classname::create(lexname))
#define LEXADD2(classname,lexname,tophdrnm)		\
	addCompound(classname::create(lexname,tophdrnm))
#define LEXADD5(classname,lexname,tophdrnm0,tophdrnm1,tophdrnm2,tophdrnm3)	\
	addCompound(classname::create(lexname,tophdrnm0,tophdrnm1,tophdrnm2,tophdrnm3))
#define MCCR(classname,lexname) classname::create(lexname)

McObject *
McObject::initialize()
{
	static bool hasBeenHere = false;

	if(hasBeenHere) {
		return(0);
	}

	hasBeenHere = true;

	/* Payload */
	LEXADD(McPayload,	"Payload");

	/* DataLinkLayer */
	// Ether
	McObject *mc =
	LEXADD2(McFrame_Ether,	"Frame_Ether",	"Hdr_Ether");
	LEXADD2(McFrame_Null,	"Frame_Null",	"Hdr_Null");

/* NetworkLayer */
	// IPv6
	LEXADD2(McPacket_IPv6,			"Packet_IPv6", "Hdr_IPv6" );
	 
	LEXADD(McHdr_Ext_HopByHop,		"Hdr_HopByHop" );
	LEXADD(McHdr_Ext_Destination,		"Hdr_Destination" );
	LEXADD(McHdr_Ext_Routing,		"Hdr_Routing" );
	LEXADD(McHdr_Ext_Fragment,		"Hdr_Fragment" );
	 
	LEXADD(McOpt_Ext_ANY,			"Opt_ANY" );
	LEXADD(McOpt_Ext_Pad1,			"Opt_Pad1" );
	LEXADD(McOpt_Ext_PadN,			"Opt_PadN" );
	LEXADD(McOpt_Ext_JumboPayload,		"Opt_JumboPayload" );
	LEXADD(McOpt_Ext_RouterAlert,		"Opt_RouterAlert" );
	LEXADD(McOpt_Ext_TunnelEncap,		"Opt_TunnelEncapslation" );

	LEXADD(McOpt_Ext_HomeAddress,		"Opt_HomeAddress" );

	// IPsec
	LEXADD(McHdr_Ext_AH,			"Hdr_AH" );
	LEXADD(McAlgorithm_AH,			"AHAlgorithm" );
	LEXADD(McHdr_Ext_ESP,			"Hdr_ESP" );
	LEXADD(McAlgorithm_ESP,			"ESPAlgorithm" );

	// IPv4
	LEXADD2(McPacket_IPv4,			"Packet_IPv4","Hdr_IPv4" );
	McOpt_IPv4::create_options();

	//ARP
 	LEXADD2(McPacket_ARP,			"Packet_ARP","Hdr_ARP" );
	//RARP
	LEXADD2(McPacket_RARP,			"Packet_RARP","Hdr_RARP" );

/* UpperLayer */
	//NoNext
	LEXADD(McUpp_NoNext,			"Upp_NoNext" );

	// VRRP
	LEXADD(McUpp_VRRPvX,	"Upp_VRRPvX");
	LEXADD(McUpp_VRRPv2,	"Upp_VRRPv2");
	LEXADD(McUpp_VRRPv3,	"Upp_VRRPv3");

	//ICMPv6
	LEXADD(McUpp_ICMPv6_ANY,			"ICMPv6_ANY" );
	LEXADD(McUpp_ICMPv6_RS,				"ICMPv6_RS" );
	LEXADD(McUpp_ICMPv6_RA,				"ICMPv6_RA" );
	LEXADD(McUpp_ICMPv6_NS,				"ICMPv6_NS" );
	LEXADD(McUpp_ICMPv6_NA,				"ICMPv6_NA" );
	LEXADD(McUpp_ICMPv6_Redirect,			"ICMPv6_Redirect" );
	LEXADD(McUpp_ICMPv6_MLDQuery,			"ICMPv6_MLDQuery");
	LEXADD(McUpp_ICMPv6_MLDReport,			"ICMPv6_MLDReport");
	LEXADD(McUpp_ICMPv6_MLDDone,			"ICMPv6_MLDDone");
	LEXADD(McUpp_ICMPv6_MLDv2Report,		"ICMPv6_MLDv2Report");
	LEXADD(McUpp_ICMPv6_EchoRequest,		"ICMPv6_EchoRequest" );
	LEXADD(McUpp_ICMPv6_EchoReply,			"ICMPv6_EchoReply" );
	LEXADD(McUpp_ICMPv6_PacketTooBig,		"ICMPv6_PacketTooBig" );
	LEXADD(McUpp_ICMPv6_DestinationUnreachable,
		"ICMPv6_DestinationUnreachable");

	LEXADD(McUpp_ICMPv6_TimeExceeded,		"ICMPv6_TimeExceeded" );
	LEXADD(McUpp_ICMPv6_ParameterProblem,
		"ICMPv6_ParameterProblem");

	LEXADD(McUpp_ICMPv6_RouterRenumbering,
		"ICMPv6_RouterRenumbering");

//	LEXADD(McUpp_ICMPv6_NameLookups,		"ICMPv6_NameLookups" );

	LEXADD(McUpp_ICMPv6_HAADRequest,		"ICMPv6_HAADRequest");
	LEXADD(McUpp_ICMPv6_HAADReply,			"ICMPv6_HAADReply");
	LEXADD(McUpp_ICMPv6_MobilePrefixSolicit,
		"ICMPv6_MobilePrefixSol");

	LEXADD(McUpp_ICMPv6_MobilePrefixAdvertise,
		"ICMPv6_MobilePrefixAdvertise");
	
	LEXADD(McOpt_ICMPv6_ANY,		"Opt_ICMPv6_ANY" );
	LEXADD(McOpt_ICMPv6_SLL,		"Opt_ICMPv6_SLL" );
	LEXADD(McOpt_ICMPv6_TLL,		"Opt_ICMPv6_TLL" );
	LEXADD(McOpt_ICMPv6_Prefix,		"Opt_ICMPv6_Prefix" );
	LEXADD(McOpt_ICMPv6_Redirected,		"Opt_ICMPv6_Redirected" );
	LEXADD(McOpt_ICMPv6_MTU,		"Opt_ICMPv6_MTU" );
	LEXADD(McOpt_ICMPv6_AdvInterval,	"Opt_ICMPv6_AdvInterval");
	LEXADD(McOpt_ICMPv6_HomeAgentInfo,	"Opt_ICMPv6_HomeAgentInfo");
	LEXADD(McOpt_ICMPv6_RouteInfo,		"Opt_ICMPv6_RouteInfo");

	// Mobility Header
	LEXADD(McHdr_Ext_MH_ANY,	"Hdr_MH_ANY");
	LEXADD(McHdr_Ext_MH_BRR,	"Hdr_MH_BRR");
	LEXADD(McHdr_Ext_MH_HoTI,	"Hdr_MH_HoTI");
	LEXADD(McHdr_Ext_MH_CoTI,	"Hdr_MH_CoTI");
	LEXADD(McHdr_Ext_MH_HoT,	"Hdr_MH_HoT");
	LEXADD(McHdr_Ext_MH_CoT,	"Hdr_MH_CoT");
	LEXADD(McHdr_Ext_MH_BU,		"Hdr_MH_BU");
	LEXADD(McHdr_Ext_MH_BA,		"Hdr_MH_BA");
	LEXADD(McHdr_Ext_MH_BE,		"Hdr_MH_BE");

	// Mobility Options
	LEXADD(McOpt_MH_ANY,			"Opt_MH_ANY");
	LEXADD(McOpt_MH_Pad1,			"Opt_MH_Pad1");
	LEXADD(McOpt_MH_PadN,			"Opt_MH_PadN");
	LEXADD(McOpt_MH_BindingRefreshAdvice,	"Opt_MH_BindingRefreshAdvice");
	LEXADD(McOpt_MH_AlternateCoA,		"Opt_MH_AlternateCoA");
	LEXADD(McOpt_MH_NonceIndices,		"Opt_MH_NonceIndices");
	LEXADD(McOpt_MH_BindingAuthData,	"Opt_MH_BindingAuthData");
	LEXADD(McOpt_MH_MobNetworkPrefix,	"Opt_MH_MobNetworkPrefix");

	//ICMPv4
	LEXADD(McUpp_ICMPv4_ANY,			"ICMPv4_ANY" );
	LEXADD(McUpp_ICMPv4_DestinationUnreachable,
		"ICMPv4_DestinationUnreachable" );

	LEXADD(McUpp_ICMPv4_TimeExceeded,	"ICMPv4_TimeExceeded" );
	LEXADD(McUpp_ICMPv4_ParameterProblem,	"ICMPv4_ParameterProblem" );
	LEXADD(McUpp_ICMPv4_Redirect,	 	"ICMPv4_Redirect" );
	LEXADD(McUpp_ICMPv4_EchoRequest,	"ICMPv4_EchoRequest" );
	LEXADD(McUpp_ICMPv4_EchoReply,		"ICMPv4_EchoReply" );

	//IGMP
	LEXADD(McUpp_IGMP_ANY,			"IGMP_ANY" );
	LEXADD(McUpp_IGMP_IGMPQuery,		"IGMP_IGMPQuery" );
	LEXADD(McUpp_IGMP_IGMPv1Report,		"IGMP_IGMPv1Report" );
	LEXADD(McUpp_IGMP_IGMPv2Report,		"IGMP_IGMPv2Report" );
	LEXADD(McUpp_IGMP_IGMPv2LeaveGroup,	"IGMP_IGMPv2LeaveGroup" );
	LEXADD(McUpp_IGMP_IGMPv3Report,		"IGMP_IGMPv3Report" );

	//UDP
	LEXADD2(McUpp_UDP,			"Upp_UDP",	"Hdr_UDP");

	// RIPng
	LEXADD(McUdp_RIPng,			"Udp_RIPng");
	LEXADD(McRIPng_RTE,			"RIPng_RTE");

	// DNS
	LEXADD5(McUdp_DNS,			"Udp_DNS", "DNS_Question", "DNS_Answer", "DNS_Authority", "DNS_Additional");
	LEXADD(McDNS_QuestionEntry,		"DNS_QuestionEntry");
	LEXADD(McDNS_RR_ANY,			"DNS_RR_ANY");

	// RFC 1035 - Domain Implementation and Specification
	LEXADD(McDNS_RR_A,			"DNS_RR_A");
	LEXADD(McDNS_RR_NS,			"DNS_RR_NS");
	LEXADD(McDNS_RR_MD,			"DNS_RR_MD");
	LEXADD(McDNS_RR_MF,			"DNS_RR_MF");
	LEXADD(McDNS_RR_CNAME,			"DNS_RR_CNAME");
	LEXADD(McDNS_RR_SOA,			"DNS_RR_SOA");
	LEXADD(McDNS_RR_MB,			"DNS_RR_MB");
	LEXADD(McDNS_RR_MG,			"DNS_RR_MG");
	LEXADD(McDNS_RR_MR,			"DNS_RR_MR");
	LEXADD(McDNS_RR_NULL,			"DNS_RR_NULL");
	LEXADD(McDNS_RR_WKS,			"DNS_RR_WKS");
	LEXADD(McDNS_RR_PTR,			"DNS_RR_PTR");
	LEXADD(McDNS_RR_HINFO,			"DNS_RR_HINFO");
	LEXADD(McDNS_RR_MINFO,			"DNS_RR_MINFO");
	LEXADD(McDNS_RR_MX,			"DNS_RR_MX");
	LEXADD(McDNS_RR_TXT,			"DNS_RR_TXT");

	// RFC 1183 - New DNS RR Definitions
	LEXADD(McDNS_RR_RP,			"DNS_RR_RP");
	LEXADD(McDNS_RR_AFSDB,			"DNS_RR_AFSDB");
	LEXADD(McDNS_RR_X25,			"DNS_RR_X25");
	LEXADD(McDNS_RR_ISDN,			"DNS_RR_ISDN");
	LEXADD(McDNS_RR_RT,			"DNS_RR_RT");

	// RFC 1664 - Internet DNS for Mail Mapping Tables
	LEXADD(McDNS_RR_PX,			"DNS_RR_PX");

	// RFC 1886 - IPv6 DNS Extensions
	LEXADD(McDNS_RR_AAAA,			"DNS_RR_AAAA");

	// RFC 2782 - DNS SRV RR
	LEXADD(McDNS_RR_SRV,			"DNS_RR_SRV");

	// RFC 2915 - NAPTR DNS RR
	LEXADD(McDNS_RR_NAPTR,			"DNS_RR_NAPTR");

	// DHCPv6
	LEXADD(McUdp_DHCPv6_ANY,		"Udp_DHCPv6_ANY");
	LEXADD(McUdp_DHCPv6_Solicit,		"Udp_DHCPv6_Solicit");
	LEXADD(McUdp_DHCPv6_Advertise,		"Udp_DHCPv6_Advertise");
	LEXADD(McUdp_DHCPv6_Request,		"Udp_DHCPv6_Request");
	LEXADD(McUdp_DHCPv6_Confirm,		"Udp_DHCPv6_Confirm");
	LEXADD(McUdp_DHCPv6_Renew,		"Udp_DHCPv6_Renew");
	LEXADD(McUdp_DHCPv6_Rebind,		"Udp_DHCPv6_Rebind");
	LEXADD(McUdp_DHCPv6_Reply,		"Udp_DHCPv6_Reply");
	LEXADD(McUdp_DHCPv6_Release,		"Udp_DHCPv6_Release");
	LEXADD(McUdp_DHCPv6_Decline,		"Udp_DHCPv6_Decline");
	LEXADD(McUdp_DHCPv6_Reconfigure,	"Udp_DHCPv6_Reconfigure");
	LEXADD(McUdp_DHCPv6_InformationRequest,	"Udp_DHCPv6_InformationRequest");
	LEXADD(McUdp_DHCPv6_RelayForward,	"Udp_DHCPv6_RelayForward");
	LEXADD(McUdp_DHCPv6_RelayReply,		"Udp_DHCPv6_RelayReply");

	// DHCP options
	LEXADD(McOpt_DHCPv6_ANY,		"Opt_DHCPv6_ANY");
	LEXADD(McOpt_DHCPv6_CID,		"Opt_DHCPv6_CID");
	LEXADD(McOpt_DHCPv6_SID,		"Opt_DHCPv6_SID");
	LEXADD(McOpt_DHCPv6_IA_NA,		"Opt_DHCPv6_IA_NA");
	LEXADD(McOpt_DHCPv6_IA_TA,		"Opt_DHCPv6_IA_TA");
	LEXADD(McOpt_DHCPv6_IA_Address,		"Opt_DHCPv6_IA_Address");
	LEXADD(McOpt_DHCPv6_OptionRequest,	"Opt_DHCPv6_OptionRequest");
	LEXADD(McOpt_DHCPv6_Preference,		"Opt_DHCPv6_Preference");
	LEXADD(McOpt_DHCPv6_ElapsedTime,	"Opt_DHCPv6_ElapsedTime");
	LEXADD(McOpt_DHCPv6_RelayMessage,	"Opt_DHCPv6_RelayMessage");
	LEXADD(McOpt_DHCPv6_Authentication,	"Opt_DHCPv6_Authentication");
	LEXADD(McOpt_DHCPv6_ServerUnicast,	"Opt_DHCPv6_ServerUnicast");
	LEXADD(McOpt_DHCPv6_StatusCode,		"Opt_DHCPv6_StatusCode");
	LEXADD(McOpt_DHCPv6_RapidCommit,	"Opt_DHCPv6_RapidCommit");
	LEXADD(McOpt_DHCPv6_UserClass,		"Opt_DHCPv6_UserClass");
	LEXADD(McOpt_DHCPv6_VendorClass,	"Opt_DHCPv6_VendorClass");
	LEXADD(McOpt_DHCPv6_VendorSpecificInfo,
		"Opt_DHCPv6_VendorSpecificInfo");

	LEXADD(McOpt_DHCPv6_IID,		"Opt_DHCPv6_IID");
	LEXADD(McOpt_DHCPv6_ReconfigureMessage,
		"Opt_DHCPv6_ReconfigureMessage");

	LEXADD(McOpt_DHCPv6_ReconfigureAccept,	"Opt_DHCPv6_ReconfigureAccept");
	LEXADD(McOpt_DHCPv6_IA_PD,		"Opt_DHCPv6_IA_PD");
	LEXADD(McOpt_DHCPv6_IA_Prefix,		"Opt_DHCPv6_IA_Prefix");
	LEXADD(McOpt_DHCPv6_DNS_Servers,	"Opt_DHCPv6_DNS_Servers");
	LEXADD(McOpt_DHCPv6_DNS_SearchList,	"Opt_DHCPv6_DNS_SearchList");
	LEXADD(McOpt_DHCPv6_NTP_Servers,	"Opt_DHCPv6_NTP_Servers");
	LEXADD(McOpt_DHCPv6_NTP_Timezone,	"Opt_DHCPv6_NTP_Timezone");

	// DHCP unique identifier
	LEXADD(McDHCPv6_DUID_ANY,		"DHCPv6_DUID_ANY");
	LEXADD(McDHCPv6_DUID_LLT_ANY,		"DHCPv6_DUID_LLT_ANY");
	LEXADD(McDHCPv6_DUID_LLT_Ether,		"DHCPv6_DUID_LLT_Ether");
	LEXADD(McDHCPv6_DUID_EN,		"DHCPv6_DUID_EN");
	LEXADD(McDHCPv6_DUID_LL_ANY,		"DHCPv6_DUID_LL_ANY");
	LEXADD(McDHCPv6_DUID_LL_Ether,		"DHCPv6_DUID_LL_Ether");

	// user class data
	LEXADD(McDHCPv6_UserClassData,		"DHCPv6_UserClassData");

	// vendor class data
	LEXADD(McDHCPv6_VendorClassData,	"DHCPv6_VendorClassData");

	// option data
	LEXADD(McDHCPv6_OptionData,		"DHCPv6_OptionData");

	// Authentication of DHCP Messages
	LEXADD(McDHCPv6_Auth_ANY,		"DHCPv6_Auth_ANY");

	// Delayed Authentication Protocol
	LEXADD(McDHCPv6_Auth_Delayed,		"DHCPv6_Auth_Delayed");

	// Reconfigure Key Authentication Protocol
	LEXADD(McDHCPv6_Auth_ReconfigureKey,	"DHCPv6_Auth_ReconfigureKey");

	// SIP
	LEXADD(McUdp_SIP,			"Udp_SIP");

	// MLDv2 Address Record
	LEXADD(McMLDv2_AddrRecord,	"MLDv2_AddrRecord");
	
	// IGMPv3 Address Record
	LEXADD(McIGMPv3_AddrRecord,	"IGMPv3_AddrRecord");
	
#if !defined(NOT_USE_SNMP)
	// SNMP and SNMP PDUs
	LEXADD(McUdp_SNMP,		"Udp_SNMP");
	LEXADD(McUdp_SNMPTrap,		"Udp_SNMPTrap");
	LEXADD(McPdu_SNMP_Message,	"Pdu_SNMP_Message");
	LEXADD(McPdu_SNMP_Version,	"Pdu_SNMP_Version");
	LEXADD(McPdu_SNMP_Community,	"Pdu_SNMP_Community");
	LEXADD(McPdu_SNMP_GetRequest,	"Pdu_SNMP_GetRequest");
	LEXADD(McPdu_SNMP_GetNextRequest,	"Pdu_SNMP_GetNextRequest");
	LEXADD(McPdu_SNMP_SetRequest,	"Pdu_SNMP_SetRequest");
	LEXADD(McPdu_SNMP_GetResponse,	"Pdu_SNMP_GetResponse");
	LEXADD(McPdu_SNMP_Trap,	"Pdu_SNMP_Trap");
	LEXADD(McPdu_SNMP_GetBulk,	"Pdu_SNMP_GetBulk");
	LEXADD(McPdu_SNMP_Inform,	"Pdu_SNMP_Inform");
	LEXADD(McPdu_SNMP_Trap2,	"Pdu_SNMP_Trap2");
	LEXADD(McPdu_SNMP_Report,	"Pdu_SNMP_Report");
	LEXADD(McPdu_SNMP_RequestID,	"Pdu_SNMP_RequestID");
	LEXADD(McPdu_SNMP_ErrorStatus,	"Pdu_SNMP_ErrorStatus");
	LEXADD(McPdu_SNMP_ErrorIndex,	"Pdu_SNMP_ErrorIndex");
	LEXADD(McPdu_SNMP_GenericTrap,	"Pdu_SNMP_GenericTrap");
	LEXADD(McPdu_SNMP_SpecificTrap,	"Pdu_SNMP_SpecificTrap");
	LEXADD(McPdu_SNMP_VarBindList,	"Pdu_SNMP_VarBindList");
	LEXADD(McPdu_SNMP_VarBind,		"Pdu_SNMP_VarBind");
	LEXADD(McPdu_SNMP_ANY,	"Pdu_SNMP_ANY");
	LEXADD(McPdu_SNMP_Boolean,	"Pdu_SNMP_Boolean");
	LEXADD(McPdu_SNMP_Integer,	"Pdu_SNMP_Integer");
	LEXADD(McPdu_SNMP_BitString,	"Pdu_SNMP_BitString");
	LEXADD(McPdu_SNMP_OctString,	"Pdu_SNMP_OctString");
	LEXADD(McPdu_SNMP_Null,	"Pdu_SNMP_Null");
	LEXADD(McPdu_SNMP_ObjectID,	"Pdu_SNMP_ObjectID");
	LEXADD(McPdu_SNMP_Sequence,	"Pdu_SNMP_Sequence");
	LEXADD(McPdu_SNMP_Set,	"Pdu_SNMP_Set");
	LEXADD(McPdu_SNMP_Opaque,	"Pdu_SNMP_Opaque");
	LEXADD(McPdu_SNMP_IPAddress,	"Pdu_SNMP_IPAddress");
	LEXADD(McPdu_SNMP_Counter,	"Pdu_SNMPCounter");
	LEXADD(McPdu_SNMP_Gauge,	"Pdu_SNMP_Gauge");
	LEXADD(McPdu_SNMP_TimeTicks,	"Pdu_SNMP_TimeTicks");
#endif //NOT_USE_SNMP

	//TCP
	LEXADD2(McUpp_TCP,			"Upp_TCP","Hdr_TCP" );
	McOpt_TCP::create_options();

	// IKE
	LEXADD2(McUdp_ISAKMP,			"Udp_ISAKMP", "Hdr_ISAKMP");
	LEXADD(McISAKMP_Encryption,		"ISAKMP_Encryption");
	LEXADD(McISAKMP_Algorithm,		"ISAKMP_Algorithm" );
	LEXADD(McPld_ISAKMP_ANY,		"Pld_ISAKMP_ANY");
	LEXADD(McPld_ISAKMP_SA_ANY,		"Pld_ISAKMP_SA_ANY");
	LEXADD(McPld_ISAKMP_SA_IPsec_ANY,	"Pld_ISAKMP_SA_IPsec_ANY");
	LEXADD(McPld_ISAKMP_SA_IPsec_IDonly,	"Pld_ISAKMP_SA_IPsec_IDonly");
	LEXADD(McPld_ISAKMP_P,			"Pld_ISAKMP_P_ANY");
	LEXADD(McPld_ISAKMP_P_ISAKMP,		"Pld_ISAKMP_P_ISAKMP");
	LEXADD(McPld_ISAKMP_P_IPsec_AH,		"Pld_ISAKMP_P_IPsec_AH");
	LEXADD(McPld_ISAKMP_P_IPsec_ESP,	"Pld_ISAKMP_P_IPsec_ESP");
	LEXADD(McPld_ISAKMP_P_IPCOMP,		"Pld_ISAKMP_P_IPCOMP");
	LEXADD(McPld_ISAKMP_T,			"Pld_ISAKMP_T");
	LEXADD(McPld_ISAKMP_KE,			"Pld_ISAKMP_KE");
	LEXADD(McPld_ISAKMP_ID,			"Pld_ISAKMP_ID_ANY");
	LEXADD(McPld_ISAKMP_ID_IPV4_ADDR,	"Pld_ISAKMP_ID_IPV4_ADDR");
	LEXADD(McPld_ISAKMP_ID_FQDN,		"Pld_ISAKMP_ID_FQDN");
	LEXADD(McPld_ISAKMP_ID_USER_FQDN,	"Pld_ISAKMP_ID_USER_FQDN");
	LEXADD(McPld_ISAKMP_ID_IPV4_ADDR_SUBNET,
		"Pld_ISAKMP_ID_IPV4_ADDR_SUBNET");

	LEXADD(McPld_ISAKMP_ID_IPV6_ADDR,	"Pld_ISAKMP_ID_IPV6_ADDR");
	LEXADD(McPld_ISAKMP_ID_IPV6_ADDR_SUBNET,
		"Pld_ISAKMP_ID_IPV6_ADDR_SUBNET");

	LEXADD(McPld_ISAKMP_ID_IPV4_ADDR_RANGE,
		"Pld_ISAKMP_ID_IPV4_ADDR_RANGE");

	LEXADD(McPld_ISAKMP_ID_IPV6_ADDR_RANGE,
		"Pld_ISAKMP_ID_IPV6_ADDR_RANGE");

	LEXADD(McPld_ISAKMP_ID_DER_ASN1_DN,	"Pld_ISAKMP_ID_DER_ASN1_DN");
	LEXADD(McPld_ISAKMP_ID_DER_ASN1_GN,	"Pld_ISAKMP_ID_DER_ASN1_GN");
	LEXADD(McPld_ISAKMP_ID_KEY_ID,		"Pld_ISAKMP_ID_KEY_ID");
	LEXADD(McPld_ISAKMP_CERT,		"Pld_ISAKMP_CERT");
	LEXADD(McPld_ISAKMP_CR,			"Pld_ISAKMP_CR");
	LEXADD(McPld_ISAKMP_HASH,		"Pld_ISAKMP_HASH");
	LEXADD(McPld_ISAKMP_SIG,		"Pld_ISAKMP_SIG");
	LEXADD(McPld_ISAKMP_NONCE,		"Pld_ISAKMP_NONCE");
	LEXADD(McPld_ISAKMP_N_ANY,		"Pld_ISAKMP_N_ANY");
	LEXADD(McPld_ISAKMP_N_ISAKMP,		"Pld_ISAKMP_N_ISAKMP");
	LEXADD(McPld_ISAKMP_N_IPsec_ANY,	"Pld_ISAKMP_N_IPsec_ANY");
	LEXADD(McPld_ISAKMP_N_IPsec_ResponderLT,
		"Pld_ISAKMP_N_IPsec_ResponderLT");
	LEXADD(McPld_ISAKMP_N_IPsec_ReplayStat,
		"Pld_ISAKMP_N_IPsec_ReplayStat");
	LEXADD(McPld_ISAKMP_D,			"Pld_ISAKMP_D");
	LEXADD(McPld_ISAKMP_VID,		"Pld_ISAKMP_VID");

	LEXADD(McAttr_ISAKMP,			"Attr_ISAKMP_ANY");
	LEXADD(McAttr_ISAKMP_TLV,		"Attr_ISAKMP_TLV");
	LEXADD(McAttr_ISAKMP_TV,		"Attr_ISAKMP_TV");

	//
	return(mc);
}



/////// Mc creater implementaion /////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
McPayload* McPayload::create(CSTR key){
	McPayload* mc = new McPayload(key);
	mc->member( new MmData(	"data" ) );
	// dict
	MmPayload::add_other(mc);		//payload=
	MmFrame::add_other(mc);			//frame=
	MmPacket_onEther::add_other(mc);	//Frame_Ether::packet=
	MmPacket_onNull::add_other(mc);		//Frame_Null::packet=
	MmUpper_onIP::add_other(mc);		//Packet_IP::upper=
	MmUpper_onUpper::add_other(mc);		// for forward compatibility
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McFrame_Ether* McFrame_Ether::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_Ether::create(tophdrkey));
	McFrame_Ether* mc = new McFrame_Ether(key);
	mc->member( new MmTopHdr(		"header",tophdr_ ) );
	mc->member( new MmPacket_onEther(	"packet" ) );
	// dict
	MmFrame::add(mc);			//frame=
	return mc;}

McTopHdr_Ether* McTopHdr_Ether::create(CSTR key){
	McTopHdr_Ether* mc = new McTopHdr_Ether(key);
	mc->member( new MmEther("DestinationAddress",	ETNUT(),ETTN()));
	mc->member( new MmEther("SourceAddress",	ETTN(),	ETNUT()));
	mc->nextType_member(
		    new MmUint(	"Type", 16, GENEHC(mc,McTopHdr_Ether,Type),EVALHC(mc,McTopHdr_Ether,Type) ) );
	// no dict
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McPacket_IPv6* McPacket_IPv6::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_IPv6::create(tophdrkey));
	McPacket_IPv6* mc = new McPacket_IPv6(key);
	mc->member( new MmTopHdr(	"header",tophdr_) );
	mc->member( new MmExtent_onIP(	"exthdr" ) );
	mc->member( new MmUpper_onIP(	"upper" ) );
	// dict
	MmPacket_onNull::add(mc);		//Frame_Null::packet=
	MmPacket_onEther::add(mc);		//Frame_Ether::packet=
	MmUpper_onIP::add(mc);			//Packet_IP::upper=(tunnel)
	return mc;}

McTopHdr_IPv6* McTopHdr_IPv6::create(CSTR key){
	McTopHdr_IPv6* mc = new McTopHdr_IPv6(key);
	mc->member( new MmUint( "Version",	4,
			UN(6),	UN(6),		ICVCONST() ) );
	mc->member( new MmUint( "TrafficClass",	8,
			UN(0),	EVALANY(),	ICVZERO() ) );
	mc->member( new MmUint( "FlowLabel",	20,
			UN(0),	EVALANY(),	ICVZERO() ) );
	mc->Layerlength_member(
		    new MmUint(	"PayloadLength",16,
			GENEHC(mc,McTopHdr_IPv6,PayloadLength),
			EVALANY(),		ICVCONST() ) );
	mc->nextType_member(
		    new MmUint( "NextHeader",	8,
			GENEHC(mc,McTopHdr_IPv6,NextHeader),
			EVALHC(mc,McTopHdr_IPv6,NextHeader),	ICVCONST() ) );
	mc->member( new MmUint( "HopLimit",	8,
			UN(64),	EVALANY(),	ICVZERO() ) );
	mc->member( new MmV6Addr( "SourceAddress",
			V6TN(),V6NUT(),		ICVHC(mc, McTopHdr_IPv6, SourceAddress),	// MIP6AH
			(METH_HC_ForIPinfo)&McTopHdr_IPv6::HC_ForIPinfo(SourceAddress) ) );
	mc->member( new MmV6Addr( "DestinationAddress",
			V6NUT(),V6TN(),		ICVHC(mc,McTopHdr_IPv6,DestinationAddress), 
			(METH_HC_ForIPinfo)&McTopHdr_IPv6::HC_ForIPinfo(DestinationAddress) ) );
	// no dict
	return mc;}


//////////////////////////////////////////////////////////////////////////////
McHdr_Ext_HopByHop* McHdr_Ext_HopByHop::create(CSTR key){
	McHdr_Ext_HopByHop* mc = new McHdr_Ext_HopByHop(key);
	mc->nextType_member(
		    new MmUint( "NextHeader",	8,
			GENEHC(mc,McHdr_Ext_HopByHop,NextHeader),
			EVALHC(mc,McHdr_Ext_HopByHop,NextHeader),	ICVCONST() ) );
	mc->length_member(
		    new MmUint( "HeaderExtLength",8,
			GENEHC(mc,McHdr_Ext_HopByHop,HeaderExtLength),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmOption_onExt("option") );
	// dict
	MmExtent_onIP::add(mc);		//Packet_IP::exthdr=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McHdr_Ext_Destination* McHdr_Ext_Destination::create(CSTR key){
	McHdr_Ext_Destination* mc = new McHdr_Ext_Destination(key);
	mc->nextType_member(
		    new MmUint( "NextHeader",	8,
			GENEHC(mc,McHdr_Ext_Destination,NextHeader),
			EVALHC(mc,McHdr_Ext_Destination,NextHeader),	ICVCONST() ) );
	mc->length_member(
		    new MmUint( "HeaderExtLength",8,
			GENEHC(mc,McHdr_Ext_Destination,HeaderExtLength),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmOption_onExt("option") );
	// dict
	MmExtent_onIP::add(mc);		//Packet_IP::exthdr=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McHdr_Ext_Routing* McHdr_Ext_Routing::create(CSTR key){
	McHdr_Ext_Routing* mc = new McHdr_Ext_Routing(key);
	mc->nextType_member(
		    new MmUint( "NextHeader",	8,
			GENEHC(mc,McHdr_Ext_Routing,NextHeader),
			EVALHC(mc,McHdr_Ext_Routing,NextHeader),	ICVCONST() ) );
	mc->length_member(
		    new MmUint( "HeaderExtLength",8,
			GENEHC(mc,McHdr_Ext_Routing,HeaderExtLength),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmUint( "RoutingType",	8,
			UN(0),	UN(0),		ICVCONST() ) );
	mc->member( new MmUint( "SegmentsLeft",	8,
			UN(0),	UN(0),		ICVHC(mc,McHdr_Ext_Routing,SegmentsLeft) ,
			(METH_HC_ForIPinfo)&McHdr_Ext_Routing::HC_ForIPinfo(SegmentsLeft) ) );
	mc->member( new MmUint( "Reserved",	32,
			UN(0),	UN(0),		ICVCONST() ) );
	mc->member( new MmMultiple(
			new MmV6Addr( "Address",
				MUST(),MUST(),	ICVHC(mc,McHdr_Ext_Routing,Address), 
				(METH_HC_ForIPinfo)&McHdr_Ext_Routing::HC_ForIPinfo(Address) ),
			(METH_HC_MLC)&McHdr_Ext_Routing::HC_MLC(Address) ) );
	// dict
	MmExtent_onIP::add(mc);		//Packet_IP::exthdr=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McHdr_Ext_Fragment* McHdr_Ext_Fragment::create(CSTR key){
	McHdr_Ext_Fragment* mc = new McHdr_Ext_Fragment(key);
	mc->nextType_member(
		    new MmUint( "NextHeader",	8,	MUST(),	MUST() ) );
	mc->member( new MmUint( "Reserved1",	8,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "FragmentOffset",13,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved2",	2,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "MFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Identification",32,	UN(0),	UN(0) ) );
	// dict
	MmExtent_onIP::add(mc);		//Packet_IP::exthdr=
	return mc;}


//////////////////////////////////////////////////////////////////////////////
void McOpt_Ext::common_member(){
	int32_t Type = optionType();
	type_member(
		new MmUint( "OptionType",	8,
			UN(Type),UN(Type),	ICVCONST() ) );
	length_member(
		new MmUint( "OptDataLength",	8,
			GENEHC(this,McOpt_Ext,OptDataLength),
			EVALANY(),		ICVCONST() ) );
	}

McOpt_Ext_ANY* McOpt_Ext_ANY::create(CSTR key){
	McOpt_Ext_ANY* mc = new McOpt_Ext_ANY(key);
	mc->common_member();
	mc->member( new MmData( "data" ,DEF_EVALGO,	ICVOPTDATA(mc,McOpt_Ext_ANY) ) );
	// dict
	MmOption_onExt::add_other(mc);	//Hdr_Ext_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_Ext_Pad1* McOpt_Ext_Pad1::create(CSTR key){
	McOpt_Ext_Pad1* mc = new McOpt_Ext_Pad1(key);
	int32_t Type = mc->optionType();
	mc->type_member(
		new MmUint( "OptionType",	8,
			UN(Type),UN(Type),	ICVCONST() ) );
	// dict
	MmOption_onExt::add(mc);		//Hdr_Ext_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_Ext_PadN* McOpt_Ext_PadN::create(CSTR key){
	McOpt_Ext_PadN* mc = new McOpt_Ext_PadN(key);
	mc->common_member();
	mc->member( new MmData( "pad",	DEF_EVALSKIP,	ICVOPTDATA(mc,McOpt_Ext_PadN) ) );
	// dict
	MmOption_onExt::add(mc);		//Hdr_Ext_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_Ext_JumboPayload* McOpt_Ext_JumboPayload::create(CSTR key){
	McOpt_Ext_JumboPayload* mc = new McOpt_Ext_JumboPayload(key);
	mc->common_member();
	mc->member( new MmUint( "JumboPayloadLength",32,
			GENEHC(mc,McOpt_Ext_JumboPayload,JumboPayloadLength),
			EVALANY(),		ICVOPTDATA(mc,McOpt_Ext_JumboPayload) ) );
	// dict
	MmOption_onExt::add(mc);		//Hdr_Ext_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_Ext_RouterAlert* McOpt_Ext_RouterAlert::create(CSTR key){
	McOpt_Ext_RouterAlert* mc = new McOpt_Ext_RouterAlert(key);
	mc->common_member();
	mc->member( new MmUint( "Value",	16,
			MUST(),	MUST(),		ICVOPTDATA(mc,McOpt_Ext_RouterAlert) ) );
	// dict
	MmOption_onExt::add(mc);		//Hdr_Ext_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_Ext_TunnelEncap* McOpt_Ext_TunnelEncap::create(CSTR key){
	McOpt_Ext_TunnelEncap* mc = new McOpt_Ext_TunnelEncap(key);
	mc->common_member();
	mc->member( new MmUint( "Limit",	8,
			UN(0),	UN(0),		ICVOPTDATA(mc,McOpt_Ext_TunnelEncap) ) );
	// dict
	MmOption_onExt::add(mc);		//Hdr_Ext_XX::option=
	return mc;}



////////////////////////////////////////
//  Home Address Destination Option   //
////////////////////////////////////////
McOpt_Ext_HomeAddress *
McOpt_Ext_HomeAddress::create(CSTR key)
{
	McOpt_Ext_HomeAddress *mc = new McOpt_Ext_HomeAddress(key);

	mc->common_member();
	mc->member(
		new MmV6Addr(
			"HomeAddress",
			MUST(),
			MUST(),
			ICVHC(mc, McOpt_Ext_HomeAddress, HomeAddress),
			(METH_HC_ForIPinfo)&McOpt_Ext_HomeAddress::HC_ForIPinfo(
				HomeAddress
			)
		)
	);

	MmOption_onExt::add(mc);

	return(mc);
}

//////////////////////////////////////////////////////////////////////////////
McPacket_IPv4* McPacket_IPv4::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_IPv4::create(tophdrkey));
	McPacket_IPv4* mc = new McPacket_IPv4(key);
	mc->member( new MmTopHdr(	"header",tophdr_) );
	mc->member( new MmExtent_onIP(	"exthdr" ) );
	mc->member( new MmUpper_onIP(	"upper" ) );
	// dict
	MmPacket_onNull::add(mc);		//Frame_Null::packet=
	MmPacket_onEther::add(mc);		//Frame_Ether::packet=
	MmUpper_onIP::add(mc);			//Packet_IP::upper=(tunnel)
	return mc;}

McTopHdr_IPv4* McTopHdr_IPv4::create(CSTR key){
	McTopHdr_IPv4* mc = new McTopHdr_IPv4(key);
	mc->member( new MmUint( "Version",	4,
			UN(4),	UN(4),		ICVCONST() ) );
	mc->length_member(
		    new MmUint( "IHL",		4,
			GENEHC(mc,McTopHdr_IPv4,IHL),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmUint( "TypeOfService",8,
			UN(0),	EVALANY(),	ICVZERO() ) );
	mc->Layerlength_member(
		    new MmUint(	"TotalLength",	16,
			GENEHC(mc,McTopHdr_IPv4,TotalLength),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmUint( "Identifier",	16,
			UN(0),	EVALANY(),	ICVCONST() ) );
	mc->Flags_member(
		    new MmUint( "Reserved",	1,
			UN(0),	UN(0),		ICVZERO() ) );
	mc->Flags_member(
		    new MmUint( "DF",		1,
			UN(0),	EVALANY(),	ICVZERO() ) );
	mc->Flags_member(
		    new MmUint( "MF",		1,
 			UN(0),	UN(0),		ICVZERO() ) );
	mc->fragoffset_member(
		    new MmUint( "FragmentOffset",13,
			UN(0),	UN(0),		ICVZERO() ) );
	mc->member( new MmUint( "TTL",		8,
			UN(255),EVALANY(),	ICVZERO() ) );
	mc->nextType_member(
		    new MmUint( "Protocol",	8,
			GENEHC(mc,McTopHdr_IPv4,Protocol),
			EVALHC(mc,McTopHdr_IPv4,Protocol),	ICVCONST() ) );
	mc->member( new MmIPChecksum( "HeaderChecksum",16,
			DEF_MUSTCHKSUM, 	ICVZERO() ) );
	mc->member( new MmV4Addr( "SourceAddress",
			MUST(),MUST(),		ICVCONST(),
			(METH_HC_ForIPinfo)&McTopHdr_IPv4::HC_ForIPinfo(SourceAddress) ) );
	mc->member( new MmV4Addr( "DestinationAddress",
			MUST(),MUST(),		ICVHC(mc,McTopHdr_IPv4,DestinationAddress),
			(METH_HC_ForIPinfo)&McTopHdr_IPv4::HC_ForIPinfo(DestinationAddress) ) );
	mc->member( new MmOption_onIPv4( "option" ) );
	mc->member( new MmData(	"Padding",DEF_EVALSKIP,	ICVCONST() ) );
	// no dict
	return mc;}


//////////////////////////////////////////////////////////////////////////////
McUpp_NoNext* McUpp_NoNext::create(CSTR key){
	McUpp_NoNext* mc = new McUpp_NoNext(key);
	mc->member( new MmData(	"data" ) );
	// dict
	MmUpper_onIP::add(mc);			//Packet_IP::upper=
	return mc;}



//////////////////////////////////////////////////////////////////////////////
void
McUpp_VRRP::common_member()
{
	int32_t Version = vrrpVersion();

	version_member(new MmUint("Version",	4, UN(Version), UN(Version)));
	member(new MmUint("Type",		4, UN(1), UN(1)));
}

McUpp_VRRPvX *
McUpp_VRRPvX::create(CSTR key)
{
	McUpp_VRRPvX *mc = new McUpp_VRRPvX(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmHeader_onVRRP::add_other(mc);

	return(mc);
}

McUpp_VRRPv2 *
McUpp_VRRPv2::create(CSTR key)
{
	McUpp_VRRPv2 *mc = new McUpp_VRRPv2(key);

	mc->common_member();

	mc->member(new MmUint("ID",		8, UN(0), UN(0)));
	mc->member(new MmUint("Priority",	8, UN(0), UN(0)));
	mc->member(new MmUint("Count",		8, UN(0), UN(0)));
	mc->member(new MmUint("AuthType",	8, UN(0), UN(0)));
	mc->member(new MmUint("Interval",	8, UN(0), UN(0)));
	mc->member(new MmUppChecksum(
		"Checksum", 16, DEF_MUSTCHKSUM, DEF_NOPSEUDO));

	mc->member(
		new MmMultiple(
			new MmV4Addr(
				"Address",
				MUST(),
				MUST()
			),
			(METH_HC_MLC)&McUpp_VRRPv2::HC_MLC(Address)
		)
	);

	MmHeader_onVRRP::add(mc);

	return(mc);
}

McUpp_VRRPv3 *
McUpp_VRRPv3::create(CSTR key)
{
	McUpp_VRRPv3 *mc = new McUpp_VRRPv3(key);

	mc->common_member();

	mc->member(new MmUint("ID",		8, UN(0), UN(0)));
	mc->member(new MmUint("Priority",	8, UN(0), UN(0)));
	mc->member(new MmUint("Count",		8, UN(0), UN(0)));
	mc->member(new MmUint("Reserved",	4, UN(0), UN(0)));
	mc->member(new MmUint("Interval",	12, UN(0), UN(0)));
	mc->member(new MmUppChecksum(
		"Checksum", 16, DEF_MUSTCHKSUM, DEF_MUSTPSEUDO));

	mc->member(
		new MmMultiple(
			new MmV6Addr(
				"Address",
				MUST(),
				MUST()
			),
			(METH_HC_MLC)&McUpp_VRRPv3::HC_MLC(Address)
		)
	);

	MmHeader_onVRRP::add(mc);

	return(mc);
}



//////////////////////////////////////////////////////////////////////////////
void McUpp_ICMPv6::common_member(){
	int32_t Type = icmpv6Type();
	type_member(
		new MmUint( "Type",		8,	UN(Type),UN(Type) ) );
	Code_member(
		new MmUint( "Code",		8,	UN(0),	UN(0) ) );
	member( new MmUppChecksum( "Checksum",	16 ) );
	//isEqual(DEF_MUSTCHKSUM,DEF_MUSTPSEUDO,ICVCONST)
	}

McUpp_ICMPv6_ANY* McUpp_ICMPv6_ANY::create(CSTR key){
	McUpp_ICMPv6_ANY* mc = new McUpp_ICMPv6_ANY(key);
	mc->common_member();
	mc->member( new MmData( "data" ) );
	// dict
	MmHeader_onICMPv6::add_other(mc);	//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_RS* McUpp_ICMPv6_RS::create(CSTR key){
	McUpp_ICMPv6_RS* mc = new McUpp_ICMPv6_RS(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	32,	UN(0),	UN(0) ) );
	mc->member( new MmOption_onICMPv6( "option" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_RA *
McUpp_ICMPv6_RA::create(CSTR key)
{
	McUpp_ICMPv6_RA *mc = new McUpp_ICMPv6_RA(key);
	mc->common_member();
	mc->member(new MmUint("CurHopLimit",	8,	UN(0),	UN(0)));
	mc->member(new MmUint("MFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("OFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("HFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Preference",	2,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	3,	UN(0),	UN(0)));
	mc->member(new MmUint("LifeTime",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("ReachableTime",	32,	UN(0),	UN(0)));
	mc->member(new MmUint("RetransTimer",	32,	UN(0),	UN(0)));

	mc->member(new MmOption_onICMPv6("option"));
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)

	return(mc);
}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_NS* McUpp_ICMPv6_NS::create(CSTR key){
	McUpp_ICMPv6_NS* mc = new McUpp_ICMPv6_NS(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	32,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "TargetAddress",	V6NUT(),V6TN()));
	mc->member( new MmOption_onICMPv6( "option" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_NA* McUpp_ICMPv6_NA::create(CSTR key){
	McUpp_ICMPv6_NA* mc = new McUpp_ICMPv6_NA(key);
	mc->common_member();
	mc->member( new MmUint( "RFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "OFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved",	29,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "TargetAddress",	V6TN(),	V6NUT()));
	mc->member( new MmOption_onICMPv6( "option" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_Redirect* McUpp_ICMPv6_Redirect::create(CSTR key){
	McUpp_ICMPv6_Redirect* mc = new McUpp_ICMPv6_Redirect(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	32,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "TargetAddress",	MUST(),	MUST() ) );
	mc->member( new MmV6Addr( "DestinationAddress",	MUST(),	MUST() ) );
	mc->member( new MmOption_onICMPv6( "option" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_MLDReport *McUpp_ICMPv6_MLDReport::create(CSTR key) {
	McUpp_ICMPv6_MLDReport *mc = new McUpp_ICMPv6_MLDReport(key);
	mc->common_member();
	mc->member( new MmUint( "MaxResponseDelay",16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "MulticastAddress",	MUST(),	MUST() ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_MLDDone *McUpp_ICMPv6_MLDDone::create(CSTR key) {
	McUpp_ICMPv6_MLDDone *mc = new McUpp_ICMPv6_MLDDone(key);
	mc->common_member();
	mc->member( new MmUint( "MaxResponseDelay",16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "MulticastAddress",	MUST(),	MUST() ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_EchoRequest *McUpp_ICMPv6_EchoRequest::create(CSTR key) {
	McUpp_ICMPv6_EchoRequest *mc = new McUpp_ICMPv6_EchoRequest(key);
	mc->common_member();
	mc->member( new MmUint( "Identifier",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SequenceNumber",16,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_EchoReply *McUpp_ICMPv6_EchoReply::create(CSTR key) {
	McUpp_ICMPv6_EchoReply *mc = new McUpp_ICMPv6_EchoReply(key);
	mc->common_member();
	mc->member( new MmUint( "Identifier",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SequenceNumber",16,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_PacketTooBig* McUpp_ICMPv6_PacketTooBig::create(CSTR key){
	McUpp_ICMPv6_PacketTooBig* mc = new McUpp_ICMPv6_PacketTooBig(key);
	mc->common_member();
	mc->member( new MmUint( "MTU",		32,	MUST(),	MUST() ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_DestinationUnreachable* McUpp_ICMPv6_DestinationUnreachable::create(CSTR key){
	McUpp_ICMPv6_DestinationUnreachable* mc = new McUpp_ICMPv6_DestinationUnreachable(key);
	mc->common_member();
	mc->member( new MmUint( "Unused",	32,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_TimeExceeded* McUpp_ICMPv6_TimeExceeded::create(CSTR key){
	McUpp_ICMPv6_TimeExceeded* mc = new McUpp_ICMPv6_TimeExceeded(key);
	mc->common_member();
	mc->member( new MmUint( "Unused",	32,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_ParameterProblem* McUpp_ICMPv6_ParameterProblem::create(CSTR key){
	McUpp_ICMPv6_ParameterProblem* mc = new McUpp_ICMPv6_ParameterProblem(key);
	mc->common_member();
	mc->member( new MmUint( "Pointer",	32,	MUST(),	MUST() ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv6_RouterRenumbering* McUpp_ICMPv6_RouterRenumbering::create(CSTR key){
	McUpp_ICMPv6_RouterRenumbering* mc = new McUpp_ICMPv6_RouterRenumbering(key);
	mc->common_member();
	mc->member( new MmUint( "SequenceNumber",	32,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SegmentNumber",	8,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "TFlag",		1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "RFlag",		1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "AFlag",		1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SFlag",		1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "PFlag",		1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved1",		3,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "MaxDelay",		16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved2",		32,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmHeader_onICMPv6::add(mc);		//Upp_ICMPv6::header= (upper=)
	return mc;}



////////////////////////////////////////////////
//  Home Agent Address Discovery Request      //
////////////////////////////////////////////////
McUpp_ICMPv6_HAADRequest *
McUpp_ICMPv6_HAADRequest::create(CSTR key)
{
	McUpp_ICMPv6_HAADRequest *mc = new McUpp_ICMPv6_HAADRequest(key);

	mc->common_member();
	mc->member(new MmUint("Identifier",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("RFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	15,	UN(0),	UN(0)));

	MmHeader_onICMPv6::add(mc);

	return(mc);
}



////////////////////////////////////////////////
//  Home Agent Address Discovery Reply        //
////////////////////////////////////////////////
McUpp_ICMPv6_HAADReply *
McUpp_ICMPv6_HAADReply::create(CSTR key)
{
	McUpp_ICMPv6_HAADReply *mc = new McUpp_ICMPv6_HAADReply(key);

	mc->common_member();
	mc->member(new MmUint("Identifier",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("RFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	15,	UN(0),	UN(0)));
	mc->member(
		new MmMultiple(
			new MmV6Addr("Address", MUST(), MUST()),
			(METH_HC_MLC)&McUpp_ICMPv6_HAADReply::HC_MLC(Address)
		)
	);

	MmHeader_onICMPv6::add(mc);

	return(mc);
}



////////////////////////////////////////
//  Mobile Prefix Solicitation        //
////////////////////////////////////////
McUpp_ICMPv6_MobilePrefixSolicit *
McUpp_ICMPv6_MobilePrefixSolicit::create(CSTR key)
{
	McUpp_ICMPv6_MobilePrefixSolicit *mc =
		new McUpp_ICMPv6_MobilePrefixSolicit(key);

	mc->common_member();
	mc->member(new MmUint("Identifier",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	16,	UN(0),	UN(0)));

	MmHeader_onICMPv6::add(mc);

	return(mc);
}



////////////////////////////////////////
//  Mobile Prefix Advertisement       //
////////////////////////////////////////
McUpp_ICMPv6_MobilePrefixAdvertise *
McUpp_ICMPv6_MobilePrefixAdvertise::create(CSTR key)
{
	McUpp_ICMPv6_MobilePrefixAdvertise *mc =
		new McUpp_ICMPv6_MobilePrefixAdvertise(key);

	mc->common_member();
	mc->member(new MmUint("Identifier",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("MFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("OFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	14,	UN(0),	UN(0)));
	mc->member(new MmOption_onICMPv6("option"));

	MmHeader_onICMPv6::add(mc);

	return(mc);
}



//////////////////////////////////////////////////////////////////////////////

void McOpt_ICMPv6::common_member(){
	int32_t Type = optionType();
	type_member(
		new MmUint( "Type",	8, UN(Type),UN(Type) ) );
	length_member(
		new MmUint( "Length",	8, GENEHC(this,McOpt_ICMPv6,Length),EVALANY() ) );
	}

McOpt_ICMPv6_ANY* McOpt_ICMPv6_ANY::create(CSTR key){
	McOpt_ICMPv6_ANY* mc = new McOpt_ICMPv6_ANY(key);
	mc->common_member();
	mc->member( new MmData( "data" ) );
	// dict
	MmOption_onICMPv6::add_other(mc);	//Upp_ICMPv6_XX::option=
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McOpt_ICMPv6_SLL* McOpt_ICMPv6_SLL::create(CSTR key){
	McOpt_ICMPv6_SLL* mc = new McOpt_ICMPv6_SLL(key);
	mc->common_member();
	mc->member( new MmEther( "LinkLayerAddress",	ETNUT(),ETTN()));
	// dict
	MmOption_onICMPv6::add(mc);		//Upp_ICMPv6_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_ICMPv6_TLL* McOpt_ICMPv6_TLL::create(CSTR key){
	McOpt_ICMPv6_TLL* mc = new McOpt_ICMPv6_TLL(key);
	mc->common_member();
	mc->member( new MmEther( "LinkLayerAddress",	ETNUT(),ETTN()));
	// dict
	MmOption_onICMPv6::add(mc);		//Upp_ICMPv6_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_ICMPv6_Prefix* McOpt_ICMPv6_Prefix::create(CSTR key){
	McOpt_ICMPv6_Prefix* mc = new McOpt_ICMPv6_Prefix(key);
	mc->common_member();
	mc->member( new MmUint( "PrefixLength",	8,	UN(64),	UN(64) ) );
	mc->member( new MmUint( "LFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "AFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "RFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved1",	5,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "ValidLifetime",32,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "PreferredLifetime",32,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved2",	32,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "Prefix",		MUST(),	MUST() ) );
	// dict
	MmOption_onICMPv6::add(mc);		//Upp_ICMPv6_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_ICMPv6_MTU* McOpt_ICMPv6_MTU::create(CSTR key){
	McOpt_ICMPv6_MTU* mc = new McOpt_ICMPv6_MTU(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "MTU",		32,	UN(1500),UN(1500) ) );
	// dict
	MmOption_onICMPv6::add(mc);		//Upp_ICMPv6_XX::option=
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McOpt_ICMPv6_Redirected* McOpt_ICMPv6_Redirected::create(CSTR key){
	McOpt_ICMPv6_Redirected* mc = new McOpt_ICMPv6_Redirected(key);
	mc->common_member();
#ifdef YDC_YET_IMPL
	//request to define MmReserved
	mc->member( new MmReserved( "Reserved", OCTET6,
			new PvZERO(),
			new PvZERO() ) );
#else
	//Sorry devide two MmUint(16bits,32bits)
	mc->member( new MmUint( "Reserved1",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved2",	32,	UN(0),	UN(0) ) );
#endif
	mc->member( new MmPayload( "payload" ) );
	// dict
	MmOption_onICMPv6::add(mc);		//Upp_ICMPv6_XX::option=
	return mc;}



////////////////////////////////////////
//  Advertisement Interval Option     //
////////////////////////////////////////
McOpt_ICMPv6_AdvInterval *
McOpt_ICMPv6_AdvInterval::create(CSTR key)
{
	McOpt_ICMPv6_AdvInterval *mc = new McOpt_ICMPv6_AdvInterval(key);

	mc->common_member();
	mc->member(new MmUint("Reserved",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("Interval",	32,	UN(0),	UN(0)));

	MmOption_onICMPv6::add(mc);

	return(mc);
}



////////////////////////////////////////
//  Home Agent Information Option     //
////////////////////////////////////////
McOpt_ICMPv6_HomeAgentInfo *
McOpt_ICMPv6_HomeAgentInfo::create(CSTR key)
{
	McOpt_ICMPv6_HomeAgentInfo *mc = new McOpt_ICMPv6_HomeAgentInfo(key);

	mc->common_member();
	mc->member(new MmUint("RFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	15,	UN(0),	UN(0)));
	mc->member(new MmUint("Preference",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("Lifetime",	16,	UN(0),	UN(0)));

	MmOption_onICMPv6::add(mc);

	return(mc);
}



//
//  Route Information Option
//
////////////////////////////////////////

McOpt_ICMPv6_RouteInfo *McOpt_ICMPv6_RouteInfo::create(CSTR key) {
	McOpt_ICMPv6_RouteInfo *mc = new McOpt_ICMPv6_RouteInfo(key);

	mc->common_member();
	mc->member(new MmUint("PrefixLength",	8,	UN(64),	UN(64)));
	mc->member(new MmUint("Reserved1",	3,	UN(0),	UN(0)));
	mc->member(new MmUint("Preference",	2,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved2",	3,	UN(0),	UN(0)));
	mc->member(new MmUint("RouteLifetime",	32,	UN(0),	UN(0)));
	mc->member(new MmV6Addr("Prefix",	MUST(),	MUST()));

	MmOption_onICMPv6::add(mc);

	return(mc);
}



////////////////////////////////////////////////////////////////
//  Mobility Header                                           //
////////////////////////////////////////////////////////////////
void
McHdr_Ext_MH::common_member()
{
	nextType_member(new MmUint("NextHeader", 8,
			GENEHC(this, McHdr_Ext_MH, NextHeader),
			EVALHC(this, McHdr_Ext_MH, NextHeader),
			ICVCONST()));
	length_member(new MmUint("HeaderExtLength", 8,
			GENEHC(this, McHdr_Ext_MH, HeaderExtLength),
			EVALANY(),
			ICVCONST()));
	type_member(new MmUint("Type", 8,
			GENEHC(this, McHdr_Ext_MH, Type),
			EVALHC(this, McHdr_Ext_MH, Type)));
	member(new MmUint("Reserved1", 8, UN(0), UN(0)));
	member(new MmUppChecksum("Checksum", 16));

	return;
}

McHdr_Ext_MH_ANY *
McHdr_Ext_MH_ANY::create(CSTR key)
{
	McHdr_Ext_MH_ANY *mc = new McHdr_Ext_MH_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmHeader_onMH::add_other(mc);

	return(mc);
}



////////////////////////////////////////
//  Binding Refresh Request (BRR)     //
////////////////////////////////////////
McHdr_Ext_MH_BRR *
McHdr_Ext_MH_BRR::create(CSTR key)
{
	McHdr_Ext_MH_BRR *mc = new McHdr_Ext_MH_BRR(key);

	mc->common_member();
	mc->member(new MmUint("Reserved2", 16, UN(0), UN(0)));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Home Test Init (HoTI)     //
////////////////////////////////
McHdr_Ext_MH_HoTI *
McHdr_Ext_MH_HoTI::create(CSTR key)
{
	McHdr_Ext_MH_HoTI *mc = new McHdr_Ext_MH_HoTI(key);

	mc->common_member();
	mc->member(new MmUint("Reserved2", 16, UN(0), UN(0)));
	mc->member(new MmMH_Cookie64("InitCookie"));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Care-of Test Init (CoTI)  //
////////////////////////////////
McHdr_Ext_MH_CoTI *
McHdr_Ext_MH_CoTI::create(CSTR key)
{
	McHdr_Ext_MH_CoTI *mc = new McHdr_Ext_MH_CoTI(key);

	mc->common_member();
	mc->member(new MmUint("Reserved2", 16, UN(0), UN(0)));
	mc->member(new MmMH_Cookie64("InitCookie"));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Home Test (HoT)           //
////////////////////////////////
McHdr_Ext_MH_HoT *
McHdr_Ext_MH_HoT::create(CSTR key)
{
	McHdr_Ext_MH_HoT *mc = new McHdr_Ext_MH_HoT(key);

	mc->common_member();
	mc->member(new MmUint("Index", 16, UN(0), UN(0)));
	mc->member(new MmMH_Cookie64("InitCookie"));
	mc->member(new MmMH_Cookie64("KeygenToken"));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Care-of Test (CoT)        //
////////////////////////////////
McHdr_Ext_MH_CoT *
McHdr_Ext_MH_CoT::create(CSTR key)
{
	McHdr_Ext_MH_CoT *mc = new McHdr_Ext_MH_CoT(key);

	mc->common_member();
	mc->member(new MmUint("Index", 16, UN(0), UN(0)));
	mc->member(new MmMH_Cookie64("InitCookie"));
	mc->member(new MmMH_Cookie64("KeygenToken"));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Binding Update (BU)       //
////////////////////////////////
McHdr_Ext_MH_BU *
McHdr_Ext_MH_BU::create(CSTR key)
{
	McHdr_Ext_MH_BU *mc = new McHdr_Ext_MH_BU(key);

	mc->common_member();
	mc->member(new MmUint("SequenceNumber",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("AFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("HFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("LFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("KFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("MFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("RFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved2",	10,	UN(0),	UN(0)));
	mc->member(new MmUint("Lifetime",	16,	UN(0),	UN(0)));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////////////
//  Binding Acknowledgement (BA)      //
////////////////////////////////////////
McHdr_Ext_MH_BA *
McHdr_Ext_MH_BA::create(CSTR key)
{
	McHdr_Ext_MH_BA *mc = new McHdr_Ext_MH_BA(key);

	mc->common_member();
	mc->member(new MmBAstatus("Status",	8,	UN(0),	UN(0)));
	mc->member(new MmUint("KFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("RFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved2",	6,	UN(0),	UN(0)));
	mc->member(new MmUint("SequenceNumber",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("Lifetime",	16,	UN(0),	UN(0)));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Binding Error (BE)        //
////////////////////////////////
McHdr_Ext_MH_BE *
McHdr_Ext_MH_BE::create(CSTR key)
{
	McHdr_Ext_MH_BE *mc = new McHdr_Ext_MH_BE(key);

	mc->common_member();
	mc->member(new MmBEstatus("Status",	8,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved2",	8,	UN(0),	UN(0)));
	mc->member(new MmV6Addr("Address",	MUST(),	MUST()));
	mc->member(new MmOption_onMH("option"));

	MmHeader_onMH::add(mc);

	return(mc);
}



////////////////////////////////////////////////////////////////
//  Mobility Options                                          //
////////////////////////////////////////////////////////////////
void
McOpt_MH::common_member()
{
	type_member(new MmUint("Type",
		8, GENEHC(this, McOpt_MH, Type), EVALHC(this, McOpt_MH, Type)));
	length_member(new MmUint("Length",
		8, GENEHC(this, McOpt_MH, Length), EVALANY()));

	return;
}

McOpt_MH_ANY *
McOpt_MH_ANY::create(CSTR key)
{
	McOpt_MH_ANY *mc = new McOpt_MH_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmOption_onMH::add_other(mc);

	return(mc);
}



////////////////////////////////
//  Pad1                      //
////////////////////////////////
McOpt_MH_Pad1 *
McOpt_MH_Pad1::create(CSTR key)
{
	McOpt_MH_Pad1 *mc = new McOpt_MH_Pad1(key);

	int32_t Type = mc->optionType();

	mc->type_member(new MmUint("Type", 8, UN(Type), UN(Type)));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  PadN                      //
////////////////////////////////
McOpt_MH_PadN *
McOpt_MH_PadN::create(CSTR key)
{
	McOpt_MH_PadN *mc = new McOpt_MH_PadN(key);

	mc->common_member();
	mc->member(new MmData("pad"));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Binding Refresh Advice    //
////////////////////////////////
McOpt_MH_BindingRefreshAdvice *
McOpt_MH_BindingRefreshAdvice::create(CSTR key)
{
	McOpt_MH_BindingRefreshAdvice *mc =
		new McOpt_MH_BindingRefreshAdvice(key);

	mc->common_member();
	mc->member(new MmUint("Interval", 16, UN(0), UN(0)));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Alternate Care-of Address //
////////////////////////////////
McOpt_MH_AlternateCoA *
McOpt_MH_AlternateCoA::create(CSTR key)
{
	McOpt_MH_AlternateCoA *mc = new McOpt_MH_AlternateCoA(key);

	mc->common_member();
	mc->member(new MmV6Addr("Address", MUST(), MUST()));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Nonce Indices             //
////////////////////////////////
McOpt_MH_NonceIndices *
McOpt_MH_NonceIndices::create(CSTR key)
{
	McOpt_MH_NonceIndices *mc = new McOpt_MH_NonceIndices(key);

	mc->common_member();
	mc->member(new MmUint("HoNonceIndex", 16, UN(0), UN(0)));
	mc->member(new MmUint("CoNonceIndex", 16, UN(0), UN(0)));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////////////
//  Binding Authorization Data        //
////////////////////////////////////////
McOpt_MH_BindingAuthData *
McOpt_MH_BindingAuthData::create(CSTR key)
{
	McOpt_MH_BindingAuthData *mc = new McOpt_MH_BindingAuthData(key);

	mc->common_member();
	mc->member(new MmMH_Auth("Authenticator"));

	MmOption_onMH::add(mc);

	return(mc);
}



////////////////////////////////
//  Mobile Network Prefix     //
////////////////////////////////
McOpt_MH_MobNetworkPrefix *
McOpt_MH_MobNetworkPrefix::create(CSTR key) {
	McOpt_MH_MobNetworkPrefix *mc = new McOpt_MH_MobNetworkPrefix(key);

	mc->common_member();
	mc->member(new MmUint("Reserved", 8, UN(0), UN(0)));
	mc->member(new MmUint("PrefixLength", 8, UN(0), UN(0)));
	mc->member(new MmV6Addr("Prefix", MUST(), MUST()));

	MmOption_onMH::add(mc);

	return(mc);
}



//////////////////////////////////////////////////////////////////////////////
McUpp_UDP *McUpp_UDP::create(CSTR key, CSTR tophdrkey) {
	addCompound(tophdr_ = McTopHdr_UDP::create(tophdrkey));
	McUpp_UDP *mc = new McUpp_UDP(key);

	mc->member(new MmTopHdr("header", tophdr_));
	mc->member(new MmUpper_onUpper("payload", tophdr_));

	// dict
	MmUpper_onIP::add(mc);	// Packet_IP::upper=

	return(mc);
}

McTopHdr_UDP *McTopHdr_UDP::create(CSTR key) {
	McTopHdr_UDP *mc = new McTopHdr_UDP(key);

	mc->SrcPort_member(
		new MmUint(
			"SourcePort",
			16,
			GENEHC(mc, McTopHdr_UDP, SourcePort),
			EVALHC(mc, McTopHdr_UDP, SourcePort)
		)
	);
	mc->DstPort_member(
		new MmUint(
			"DestinationPort",
			16,
			GENEHC(mc, McTopHdr_UDP, DestinationPort),
			EVALHC(mc, McTopHdr_UDP, DestinationPort)
		)
	);
	mc->Layerlength_member(new MmUint("Length", 16, GENEHC(mc, McTopHdr_UDP, Length), EVALANY()));
	mc->member(new MmUppChecksum("Checksum", 16, DEF_OPTCHKSUM));

	// no dict
	return(mc);
}

//////////////////////////////////////////////////////////////////////////////
McUpp_TCP* McUpp_TCP::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_TCP::create(tophdrkey));
	McUpp_TCP* mc = new McUpp_TCP(key);
	mc->member( new MmTopHdr(	"header",tophdr_ ) );
	mc->member( new MmPayload(	"payload" ) );
	// dict
	MmUpper_onIP::add(mc);			//Packet_IP::upper=
	return mc;}

McTopHdr_TCP* McTopHdr_TCP::create(CSTR key){
	McTopHdr_TCP* mc = new McTopHdr_TCP(key);
	mc->member( new MmUint( "SourcePort",	16,	MUST(),	MUST() ) );
	mc->member( new MmUint( "DestinationPort",16,	MUST(),	MUST() ) );
	mc->member( new MmUint( "SequenceNumber",32,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "AcknowledgmentNumber",32,UN(0),UN(0) ) );
	mc->length_member(
		    new MmUint( "DataOffset",	4,
			GENEHC(mc,McTopHdr_TCP,DataOffset), EVALANY() ) );
	mc->member( new MmUint( "Reserverd",	6,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "URGFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "ACKFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "PSHFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "RSTFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SYNFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "FINFlag",	1,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Window",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUppChecksum( "Checksum",16) );
	mc->member( new MmUint( "UrgentPointer",16,	UN(0),	UN(0) ) );
	mc->member( new MmOption_onTCP( "option" ) );
	mc->member( new MmData( "Padding",DEF_EVALSKIP ) );
	// no dict
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McPacket_ARP* McPacket_ARP::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_ARP::create(tophdrkey));
	McPacket_ARP* mc = new McPacket_ARP(key);
	mc->member( new MmTopHdr(	"header",tophdr_) );
	// dict
	MmPacket_onEther::add(mc);		//Frame_Ether::packet=
	return mc;}

McTopHdr_ARP* McTopHdr_ARP::create(CSTR key){
	McTopHdr_ARP* mc = new McTopHdr_ARP(key);
	mc->member( new MmUint( "Hardware",	16,	UN(1),	UN(1) ) );
	mc->member( new MmUint( "Protocol",	16,	UN(2048),UN(2048) ) );
	mc->member( new MmUint( "HLEN",		8,	UN(6),	UN(6) ) );
	mc->member( new MmUint( "PLEN",		8,	UN(4),	UN(4) ) );
	mc->member( new MmUint( "Operation",	16,	UN(2),	UN(1) ) );
	mc->member( new MmEther("SenderHAddr",		ETTN(),	ETNUT()));
	mc->member( new MmV4Addr("SenderPAddr",		UN(0),	UN(0) ) );
	mc->member( new MmEther("TargetHAddr",		ETNUT(),ETTN()));
	mc->member( new MmV4Addr("TargetPAddr",		UN(0),	UN(0) ) );
	// no dict
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McPacket_RARP* McPacket_RARP::create(CSTR key,CSTR tophdrkey){
	addCompound(tophdr_ = McTopHdr_RARP::create(tophdrkey));
	McPacket_RARP* mc = new McPacket_RARP(key);
	mc->member( new MmTopHdr(	"header",tophdr_) );
	// dict
	MmPacket_onEther::add(mc);		//Frame_Ether::packet=
	return mc;}

McTopHdr_RARP* McTopHdr_RARP::create(CSTR key){
	McTopHdr_RARP* mc = new McTopHdr_RARP(key);
	mc->member( new MmUint( "Hardware",	16,	UN(1),	UN(1) ) );
	mc->member( new MmUint( "Protocol",	16,	UN(2048),UN(2048) ) );
	mc->member( new MmUint( "HLEN",		8,	UN(6),	UN(6) ) );
	mc->member( new MmUint( "PLEN",		8,	UN(4),	UN(4) ) );
	mc->member( new MmUint( "Operation",	16,	UN(3),	UN(4) ) );
	mc->member( new MmEther("SenderHAddr",		ETTN(),	ETNUT()));
	mc->member( new MmV4Addr("SenderPAddr",		UN(0),	UN(0) ) );
	mc->member( new MmEther("TargetHAddr",		ETNUT(),ETTN()));
	mc->member( new MmV4Addr("TargetPAddr",		UN(0),	UN(0) ) );
	// no dict
	return mc;}

//////////////////////////////////////////////////////////////////////////////
void McUpp_ICMPv4::common_member(){
	int32_t Type = icmpv4Type();
	type_member(
		new MmUint( "Type",		8,	UN(Type),UN(Type) ) );
	member( new MmUint( "Code",		8,	UN(0),	UN(0) ) );
	member( new MmUppChecksum( "Checksum",	16,
			DEF_MUSTCHKSUM, DEF_NOPSEUDO ) );
	}

McUpp_ICMPv4_ANY* McUpp_ICMPv4_ANY::create(CSTR key){
	McUpp_ICMPv4_ANY* mc = new McUpp_ICMPv4_ANY(key);
	mc->common_member();
	mc->member( new MmData( "data" ) );
	//dict
	MmHeader_onICMPv4::add_other(mc);	//Upp_ICMPv4::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv4_DestinationUnreachable* McUpp_ICMPv4_DestinationUnreachable::create(CSTR key){
	McUpp_ICMPv4_DestinationUnreachable* mc =
		new McUpp_ICMPv4_DestinationUnreachable(key);
	mc->common_member();
	mc->member( new MmUint( "Unused",	32,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv4_TimeExceeded* McUpp_ICMPv4_TimeExceeded::create(CSTR key){
	McUpp_ICMPv4_TimeExceeded* mc = new McUpp_ICMPv4_TimeExceeded(key);
	mc->common_member();
	mc->member( new MmUint( "Unused",	32,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv4_ParameterProblem* McUpp_ICMPv4_ParameterProblem::create(CSTR key){
	McUpp_ICMPv4_ParameterProblem* mc =
		new McUpp_ICMPv4_ParameterProblem(key);
	mc->common_member();
	mc->member( new MmUint( "Pointer",	8,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Unused",	24,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv4_Redirect* McUpp_ICMPv4_Redirect::create(CSTR key){
	McUpp_ICMPv4_Redirect* mc = new McUpp_ICMPv4_Redirect(key);
	mc->common_member();
	mc->member( new MmV4Addr("GatewayInternetAddress", MUST(), MUST() ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

//////////////////////////////////////////////////////////////////////////////
McUpp_ICMPv4_EchoRequest *McUpp_ICMPv4_EchoRequest::create(CSTR key) {
	McUpp_ICMPv4_EchoRequest *mc = new McUpp_ICMPv4_EchoRequest(key);
	mc->common_member();
	mc->member( new MmUint( "Identifier",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SequenceNumber",16,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

McUpp_ICMPv4_EchoReply *McUpp_ICMPv4_EchoReply::create(CSTR key) {
	McUpp_ICMPv4_EchoReply *mc = new McUpp_ICMPv4_EchoReply(key);
	mc->common_member();
	mc->member( new MmUint( "Identifier",	16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "SequenceNumber",16,	UN(0),	UN(0) ) );
	mc->member( new MmPayload( "payload" ) );
	//dict
	MmHeader_onICMPv4::add(mc);		//Upp_ICMPv4::header= (upper=)
	return mc;}

//
// RFC 2080
//
//     RIPng for IPv6
//
////////////////////////////////////////////////////////////////////////////////

McUdp_RIPng *McUdp_RIPng::create(CSTR key) {
	McUdp_RIPng *mc = new McUdp_RIPng(key);

	mc->member(new MmUint("Command", 8, UN(0), UN(0)));
	mc->member(new MmUint("Version", 8, UN(1), UN(1)));
	mc->member(new MmUint("Reserved", 16, UN(0), UN(0)));

	mc->member(new MmRTE_onRIPng("rte"));

	MmUpper_onUpper::add(mc);

	return(mc);
}

McRIPng_RTE *McRIPng_RTE::create(CSTR key) {
	McRIPng_RTE *mc = new McRIPng_RTE(key);

	mc->member(new MmV6Addr("Prefix",		MUST(),	MUST()));
	mc->member(new MmUint("RouteTag",	16,	UN(0),	UN(0)));
	mc->member(new MmUint("PrefixLength",	8,	UN(64),	UN(64)));
	mc->member(new MmUint("Metric",		8,	UN(0),	UN(0)));

	MmRTE_onRIPng::add_other(mc);

	return(mc);
}

//
// RFC 1035
//
//     Domain Implementation and Specification
//
////////////////////////////////////////////////////////////////////////////////

McUdp_DNS *McUdp_DNS::create(CSTR key0, CSTR key1, CSTR key2, CSTR key3, CSTR key4) {
	McUdp_DNS *mc = new McUdp_DNS(key0);

	addCompound(McDNS_Question::create(key1, mc));
	addCompound(McDNS_Answer::create(key2, mc));
	addCompound(McDNS_Authority::create(key3, mc));
	addCompound(McDNS_Additional::create(key4, mc));

	mc->member(new MmUint("Identifier", 16, UN(0), UN(0)));

	mc->member(new MmUint("QR", 1, UN(0), UN(0)));
	mc->member(new MmUint("Opcode", 4, UN(0), UN(0)));
	mc->member(new MmUint("AA", 1, UN(0), UN(0)));
	mc->member(new MmUint("TC", 1, UN(0), UN(0)));
	mc->member(new MmUint("RD", 1, UN(0), UN(0)));
	mc->member(new MmUint("RA", 1, UN(0), UN(0)));
	mc->member(new MmUint("Reserved", 3, UN(0), UN(0)));
	mc->member(new MmUint("RCode", 4, UN(0), UN(0)));
	mc->QDCount_member(new MmUint("QDCount", 16, GENEHC(mc, McUdp_DNS, QDCount), EVALANY()));
	mc->ANCount_member(new MmUint("ANCount", 16, GENEHC(mc, McUdp_DNS, ANCount), EVALANY()));
	mc->NSCount_member(new MmUint("NSCount", 16, GENEHC(mc, McUdp_DNS, NSCount), EVALANY()));
	mc->ARCount_member(new MmUint("ARCount", 16, GENEHC(mc, McUdp_DNS, ARCount), EVALANY()));

	mc->member(new MmQuestion_onDNS("question", mc));
	mc->member(new MmAnswer_onDNS("answer", mc));
	mc->member(new MmAuthority_onDNS("authority", mc));
	mc->member(new MmAdditional_onDNS("additional", mc));

	MmUpper_onUpper::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_Question *McDNS_Question::create(CSTR key, McUdp_DNS *dnshdr) {
	McDNS_Question *mc = new McDNS_Question(key);

	mc->McUdp_DNS_ = dnshdr;

	mc->member(new MmEntry_onQuestion("entry", dnshdr));

	MmQuestion_onDNS::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_Answer *McDNS_Answer::create(CSTR key, McUdp_DNS *dnshdr) {
	McDNS_Answer *mc = new McDNS_Answer(key);

	mc->McUdp_DNS_ = dnshdr;

	mc->member(new MmRR_onAnswer("rr", dnshdr));

	MmAnswer_onDNS::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_Authority *McDNS_Authority::create(CSTR key, McUdp_DNS *dnshdr) {
	McDNS_Authority *mc = new McDNS_Authority(key);

	mc->McUdp_DNS_ = dnshdr;

	mc->member(new MmRR_onAuthority("rr", dnshdr));

	MmAuthority_onDNS::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_Additional *McDNS_Additional::create(CSTR key, McUdp_DNS *dnshdr) {
	McDNS_Additional *mc = new McDNS_Additional(key);

	mc->McUdp_DNS_ = dnshdr;

	mc->member(new MmRR_onAdditional("rr", dnshdr));

	MmAdditional_onDNS::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_QuestionEntry *McDNS_QuestionEntry::create(CSTR key) {
	McDNS_QuestionEntry *mc = new McDNS_QuestionEntry(key);

	mc->member(new MmDNSName("Name", MUST(), MUST()));
	mc->member(new MmQType("Type", 16, UN(0), UN(0)));
	mc->member(new MmUint("Class", 16, UN(1), UN(1)));

	MmEntry_onQuestion::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
void McDNS_RR::common_member() {
	member(new MmDNSName("Name", MUST(), MUST()));
	type_member(new MmUint("Type", 16, GENEHC(this, McDNS_RR, Type), EVALHC(this, McDNS_RR, Type)));
	member(new MmUint("Class", 16, UN(1), UN(1)));
	member(new MmUint("TTL", 32, UN(0), UN(0)));
	length_member(new MmUint("Length", 16, GENEHC(this, McDNS_RR, Length), EVALANY()));
}

////////////////////////////////////////////////////////////////
McDNS_RR_ANY *McDNS_RR_ANY::create(CSTR key) {
	McDNS_RR_ANY *mc = new McDNS_RR_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmRR_onAnswer::add_other(mc);
	MmRR_onAuthority::add_other(mc);
	MmRR_onAdditional::add_other(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_A *McDNS_RR_A::create(CSTR key) {
	McDNS_RR_A *mc = new McDNS_RR_A(key);

	mc->common_member();
	mc->member(new MmV4Addr("Address", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_NS *McDNS_RR_NS::create(CSTR key) {
	McDNS_RR_NS *mc = new McDNS_RR_NS(key);

	mc->common_member();
	mc->member(new MmDNSName("NSDName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MD *McDNS_RR_MD::create(CSTR key) {
	McDNS_RR_MD *mc = new McDNS_RR_MD(key);

	mc->common_member();
	mc->member(new MmDNSName("MADName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MF *McDNS_RR_MF::create(CSTR key) {
	McDNS_RR_MF *mc = new McDNS_RR_MF(key);

	mc->common_member();
	mc->member(new MmDNSName("MADName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_CNAME *McDNS_RR_CNAME::create(CSTR key) {
	McDNS_RR_CNAME *mc = new McDNS_RR_CNAME(key);

	mc->common_member();
	mc->member(new MmDNSName("CName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_SOA *McDNS_RR_SOA::create(CSTR key) {
	McDNS_RR_SOA *mc = new McDNS_RR_SOA(key);

	mc->common_member();
	mc->member(new MmDNSName("MName", MUST(), MUST()));
	mc->member(new MmDNSName("RName", MUST(), MUST()));
	mc->member(new MmUint("Serial", 32, UN(0), UN(0)));
	mc->member(new MmUint("Refresh", 32, UN(0), UN(0)));
	mc->member(new MmUint("Retry", 32, UN(0), UN(0)));
	mc->member(new MmUint("Expire", 32, UN(0), UN(0)));
	mc->member(new MmUint("Minimum", 32, UN(0), UN(0)));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MB *McDNS_RR_MB::create(CSTR key) {
	McDNS_RR_MB *mc = new McDNS_RR_MB(key);

	mc->common_member();
	mc->member(new MmDNSName("MADName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MG *McDNS_RR_MG::create(CSTR key) {
	McDNS_RR_MG *mc = new McDNS_RR_MG(key);

	mc->common_member();
	mc->member(new MmDNSName("MGMName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MR *McDNS_RR_MR::create(CSTR key) {
	McDNS_RR_MR *mc = new McDNS_RR_MR(key);

	mc->common_member();
	mc->member(new MmDNSName("NewName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_NULL *McDNS_RR_NULL::create(CSTR key) {
	McDNS_RR_NULL *mc = new McDNS_RR_NULL(key);

	mc->common_member();
	mc->member(new MmVarOctets("data"));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_WKS *McDNS_RR_WKS::create(CSTR key) {
	McDNS_RR_WKS *mc = new McDNS_RR_WKS(key);

	mc->common_member();
	mc->member(new MmV4Addr("Address", MUST(), MUST()));
	mc->member(new MmUint("Protocol", 8, UN(0), UN(0)));
	mc->member(new MmVarOctets("BitMap"));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_PTR *McDNS_RR_PTR::create(CSTR key) {
	McDNS_RR_PTR *mc = new McDNS_RR_PTR(key);

	mc->common_member();
	mc->member(new MmDNSName("PTRDName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_HINFO *McDNS_RR_HINFO::create(CSTR key) {
	McDNS_RR_HINFO *mc = new McDNS_RR_HINFO(key);

	mc->common_member();
	mc->member(new MmDNSStr("CPU", MUST(), MUST()));
	mc->member(new MmDNSStr("OS", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MINFO *McDNS_RR_MINFO::create(CSTR key) {
	McDNS_RR_MINFO *mc = new McDNS_RR_MINFO(key);

	mc->common_member();
	mc->member(new MmDNSName("RMailbox", MUST(), MUST()));
	mc->member(new MmDNSName("EMailbox", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_MX *McDNS_RR_MX::create(CSTR key) {
	McDNS_RR_MX *mc = new McDNS_RR_MX(key);

	mc->common_member();
	mc->member(new MmUint("Preference", 16, UN(0), UN(0)));
	mc->member(new MmDNSName("Exchange", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_TXT *McDNS_RR_TXT::create(CSTR key) {
	McDNS_RR_TXT *mc = new McDNS_RR_TXT(key);

	mc->common_member();
	mc->member(
		new MmMultiple(
			new MmDNSStr(
				"TXT",
				MUST(),
				MUST()
			),
			(METH_HC_MLC)&McDNS_RR_TXT::HC_MLC(TXT)
		)
	);

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_RP *McDNS_RR_RP::create(CSTR key) {
	McDNS_RR_RP *mc = new McDNS_RR_RP(key);

	mc->common_member();
	mc->member(new MmDNSName("MailBox", MUST(), MUST()));
	mc->member(new MmDNSName("TXTDName", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_AFSDB *McDNS_RR_AFSDB::create(CSTR key) {
	McDNS_RR_AFSDB *mc = new McDNS_RR_AFSDB(key);

	mc->common_member();
	mc->member(new MmUint("Subtype", 16, UN(0), UN(0)));
	mc->member(new MmDNSName("Hostname", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_X25 *McDNS_RR_X25::create(CSTR key) {
	McDNS_RR_X25 *mc = new McDNS_RR_X25(key);

	mc->common_member();
	mc->member(new MmDNSStr("Address", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_ISDN *McDNS_RR_ISDN::create(CSTR key) {
	McDNS_RR_ISDN *mc = new McDNS_RR_ISDN(key);

	mc->common_member();
	mc->member(new MmDNSStr("Address", MUST(), MUST()));
	mc->member(new MmDNSStr("SubAddress", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_RT *McDNS_RR_RT::create(CSTR key) {
	McDNS_RR_RT *mc = new McDNS_RR_RT(key);

	mc->common_member();
	mc->member(new MmUint("Preference", 16, UN(0), UN(0)));
	mc->member(new MmDNSName("Intermediate", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_PX *McDNS_RR_PX::create(CSTR key) {
	McDNS_RR_PX *mc = new McDNS_RR_PX(key);

	mc->common_member();
	mc->member(new MmUint("Preference", 16, UN(0), UN(0)));
	mc->member(new MmDNSName("Map822", MUST(), MUST()));
	mc->member(new MmDNSName("MapX400", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_AAAA *McDNS_RR_AAAA::create(CSTR key) {
	McDNS_RR_AAAA *mc = new McDNS_RR_AAAA(key);

	mc->common_member();
	mc->member(new MmV6Addr("Address", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_SRV *McDNS_RR_SRV::create(CSTR key) {
	McDNS_RR_SRV *mc = new McDNS_RR_SRV(key);

	mc->common_member();
	mc->member(new MmUint("Priority", 16, UN(0), UN(0)));
	mc->member(new MmUint("Weight", 16, UN(0), UN(0)));
	mc->member(new MmUint("Port", 16, UN(0), UN(0)));
	mc->member(new MmDNSName("Target", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

////////////////////////////////////////////////////////////////
McDNS_RR_NAPTR *McDNS_RR_NAPTR::create(CSTR key) {
	McDNS_RR_NAPTR *mc = new McDNS_RR_NAPTR(key);

	mc->common_member();
	mc->member(new MmUint("Order", 16, UN(0), UN(0)));
	mc->member(new MmUint("Preference", 16, UN(0), UN(0)));
	mc->member(new MmDNSStr("Flags", MUST(), MUST()));
	mc->member(new MmDNSStr("Service", MUST(), MUST()));
	mc->member(new MmDNSStr("Regexp", MUST(), MUST()));
	mc->member(new MmDNSName("Replacement", MUST(), MUST()));

	MmRR_onAnswer::add(mc);
	MmRR_onAuthority::add(mc);
	MmRR_onAdditional::add(mc);

	return(mc);
}

//
// draft-ietf-dhc-dhcpv6-28.txt
//
//     DHCP for IPv6 (-28)
//
////////////////////////////////////////////////////////////////////////////////

void McUdp_DHCPv6::common_member() {
        type_member(new MmUint("Type", 8, GENEHC(this, McUdp_DHCPv6, Type), EVALHC(this, McUdp_DHCPv6, Type)));
	return;
}

McUdp_DHCPv6_ANY *McUdp_DHCPv6_ANY::create(CSTR key) {
	McUdp_DHCPv6_ANY *mc = new McUdp_DHCPv6_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmHeader_onDHCPv6::add_other(mc);

	return(mc);
}

McUdp_DHCPv6_Solicit *McUdp_DHCPv6_Solicit::create(CSTR key) {
	McUdp_DHCPv6_Solicit *mc = new McUdp_DHCPv6_Solicit(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Advertise *McUdp_DHCPv6_Advertise::create(CSTR key) {
	McUdp_DHCPv6_Advertise *mc = new McUdp_DHCPv6_Advertise(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Request *McUdp_DHCPv6_Request::create(CSTR key) {
	McUdp_DHCPv6_Request *mc = new McUdp_DHCPv6_Request(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Confirm *McUdp_DHCPv6_Confirm::create(CSTR key) {
	McUdp_DHCPv6_Confirm *mc = new McUdp_DHCPv6_Confirm(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Renew *McUdp_DHCPv6_Renew::create(CSTR key) {
	McUdp_DHCPv6_Renew *mc = new McUdp_DHCPv6_Renew(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Rebind *McUdp_DHCPv6_Rebind::create(CSTR key) {
	McUdp_DHCPv6_Rebind *mc = new McUdp_DHCPv6_Rebind(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Reply *McUdp_DHCPv6_Reply::create(CSTR key) {
	McUdp_DHCPv6_Reply *mc = new McUdp_DHCPv6_Reply(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Release *McUdp_DHCPv6_Release::create(CSTR key) {
	McUdp_DHCPv6_Release *mc = new McUdp_DHCPv6_Release(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Decline *McUdp_DHCPv6_Decline::create(CSTR key) {
	McUdp_DHCPv6_Decline *mc = new McUdp_DHCPv6_Decline(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_Reconfigure *McUdp_DHCPv6_Reconfigure::create(CSTR key) {
	McUdp_DHCPv6_Reconfigure *mc = new McUdp_DHCPv6_Reconfigure(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_InformationRequest *McUdp_DHCPv6_InformationRequest::create(CSTR key) {
	McUdp_DHCPv6_InformationRequest *mc = new McUdp_DHCPv6_InformationRequest(key);

	mc->common_member();
	mc->member(new MmUint("Identifier", 24, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_RelayForward *McUdp_DHCPv6_RelayForward::create(CSTR key) {
	McUdp_DHCPv6_RelayForward *mc = new McUdp_DHCPv6_RelayForward(key);

	mc->common_member();
	mc->member(new MmUint("HopCount", 8, UN(0), UN(0)));
	mc->member(new MmV6Addr("LinkAddr", MUST(), MUST()));
	mc->member(new MmV6Addr("PeerAddr", MUST(), MUST()));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

McUdp_DHCPv6_RelayReply *McUdp_DHCPv6_RelayReply::create(CSTR key) {
	McUdp_DHCPv6_RelayReply *mc = new McUdp_DHCPv6_RelayReply(key);

	mc->common_member();
	mc->member(new MmUint("HopCount", 8, UN(0), UN(0)));
	mc->member(new MmV6Addr("LinkAddr", MUST(), MUST()));
	mc->member(new MmV6Addr("PeerAddr", MUST(), MUST()));

	mc->member(new MmOption_onDHCPv6("option"));

	MmHeader_onDHCPv6::add(mc);

	return(mc);
}

//
// DHCP options
//
////////////////////////////////////////////////////////////////

void McOpt_DHCPv6::common_member() {
	code_member(new MmUint("Code", 16, GENEHC(this, McOpt_DHCPv6, Code), EVALHC(this, McOpt_DHCPv6, Code)));
	length_member(new MmUint("Length", 16, GENEHC(this, McOpt_DHCPv6, Length), EVALANY()));
}

McOpt_DHCPv6_ANY *McOpt_DHCPv6_ANY::create(CSTR key) {
	McOpt_DHCPv6_ANY *mc = new McOpt_DHCPv6_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmOption_onDHCPv6::add_other(mc);

	return(mc);
}

//
// Client Identifier option
//
////////////////////////////////

McOpt_DHCPv6_CID *McOpt_DHCPv6_CID::create(CSTR key) {
	McOpt_DHCPv6_CID *mc = new McOpt_DHCPv6_CID(key);

	mc->common_member();

	mc->member(new MmDUID_onOption("duid"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Server Identifier option
//
////////////////////////////////

McOpt_DHCPv6_SID *McOpt_DHCPv6_SID::create(CSTR key) {
	McOpt_DHCPv6_SID *mc = new McOpt_DHCPv6_SID(key);

	mc->common_member();

	mc->member(new MmDUID_onOption("duid"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Identity Association for Non-temporary Addresses Option
//
////////////////////////////////

McOpt_DHCPv6_IA_NA *McOpt_DHCPv6_IA_NA::create(CSTR key) {
	McOpt_DHCPv6_IA_NA *mc = new McOpt_DHCPv6_IA_NA(key);

	mc->common_member();

	mc->member(new MmUint("Identifier", 32, UN(0), UN(0)));
	mc->member(new MmUint("Time1", 32, UN(0), UN(0)));
	mc->member(new MmUint("Time2", 32, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Identity Association for Temporary Addresses option
//
////////////////////////////////

McOpt_DHCPv6_IA_TA *McOpt_DHCPv6_IA_TA::create(CSTR key) {
	McOpt_DHCPv6_IA_TA *mc = new McOpt_DHCPv6_IA_TA(key);

	mc->common_member();

	mc->member(new MmUint("Identifier", 32, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// IA Address option
//
////////////////////////////////

McOpt_DHCPv6_IA_Address *McOpt_DHCPv6_IA_Address::create(CSTR key) {
	McOpt_DHCPv6_IA_Address *mc = new McOpt_DHCPv6_IA_Address(key);

	mc->common_member();

	mc->member(new MmV6Addr("Address", MUST(), MUST()));
	mc->member(new MmUint("PreferredLifetime", 32, UN(0), UN(0)));
	mc->member(new MmUint("ValidLifetime", 32, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Option Request option
//
////////////////////////////////

McOpt_DHCPv6_OptionRequest *McOpt_DHCPv6_OptionRequest::create(CSTR key) {
	McOpt_DHCPv6_OptionRequest *mc = new McOpt_DHCPv6_OptionRequest(key);

	mc->common_member();
	mc->member(
		new MmMultiple(
			new MmUint("OptionCode", 16, UN(0), UN(0)),
			(METH_HC_MLC)&McOpt_DHCPv6_OptionRequest::HC_MLC(OptionCode)
		)
	);

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Preference option
//
////////////////////////////////

McOpt_DHCPv6_Preference *McOpt_DHCPv6_Preference::create(CSTR key) {
	McOpt_DHCPv6_Preference *mc = new McOpt_DHCPv6_Preference(key);

	mc->common_member();

	mc->member(new MmUint("Preference", 8, UN(0), UN(0)));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Elapsed Time option
//
////////////////////////////////

McOpt_DHCPv6_ElapsedTime *McOpt_DHCPv6_ElapsedTime::create(CSTR key) {
	McOpt_DHCPv6_ElapsedTime *mc = new McOpt_DHCPv6_ElapsedTime(key);

	mc->common_member();

	mc->member(new MmUint("Time", 16, UN(0), UN(0)));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Relay Message option
//
////////////////////////////////

McOpt_DHCPv6_RelayMessage *McOpt_DHCPv6_RelayMessage::create(CSTR key) {
	McOpt_DHCPv6_RelayMessage *mc = new McOpt_DHCPv6_RelayMessage(key);

	mc->common_member();

	mc->member(new MmHeader_onDHCPv6("relay"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Authentication option
//
////////////////////////////////

McOpt_DHCPv6_Authentication *McOpt_DHCPv6_Authentication::create(CSTR key) {
	McOpt_DHCPv6_Authentication *mc = new McOpt_DHCPv6_Authentication(key);

	mc->common_member();

	mc->proto_member(new MmUint(
		"Protocol",
		8,
		GENEHC(mc, McOpt_DHCPv6_Authentication, Protocol),
		EVALHC(mc, McOpt_DHCPv6_Authentication, Protocol)
	));

	mc->member(new MmUint("Algorithm", 8, UN(1), UN(1)));
	mc->member(new MmUint("RDM", 8, UN(0), UN(0)));
	mc->member(new MmMH_Cookie64("ReplayDetection"));

	mc->member(new MmProto_onAuth("auth", mc));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Server unicast option
//
////////////////////////////////

McOpt_DHCPv6_ServerUnicast *McOpt_DHCPv6_ServerUnicast::create(CSTR key) {
	McOpt_DHCPv6_ServerUnicast *mc = new McOpt_DHCPv6_ServerUnicast(key);

	mc->common_member();

	mc->member(new MmV6Addr("Address", MUST(), MUST()));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Status Code Option
//
////////////////////////////////

McOpt_DHCPv6_StatusCode *McOpt_DHCPv6_StatusCode::create(CSTR key) {
	McOpt_DHCPv6_StatusCode *mc = new McOpt_DHCPv6_StatusCode(key);

	mc->common_member();

	mc->member(new MmUint("StatusCode", 16, UN(0), UN(0)));

	mc->member(new MmData("Message"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Rapid Commit option
//
////////////////////////////////

McOpt_DHCPv6_RapidCommit *McOpt_DHCPv6_RapidCommit::create(CSTR key) {
	McOpt_DHCPv6_RapidCommit *mc = new McOpt_DHCPv6_RapidCommit(key);

	mc->common_member();

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// User Class option
//
////////////////////////////////

McOpt_DHCPv6_UserClass *McOpt_DHCPv6_UserClass::create(CSTR key) {
	McOpt_DHCPv6_UserClass *mc = new McOpt_DHCPv6_UserClass(key);

	mc->common_member();

	mc->member(new MmUserClass_onOption("data"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

McDHCPv6_UserClassData *McDHCPv6_UserClassData::create(CSTR key) {
	McDHCPv6_UserClassData *mc = new McDHCPv6_UserClassData(key);

	mc->length_member(new MmUint("Length", 16, GENEHC(mc, McDHCPv6_UserClassData, Length), EVALANY()));
	mc->member(new MmData("data"));

	MmUserClass_onOption::add_other(mc);

	return(mc);
}

//
// Vendor Class Option
//
////////////////////////////////

McOpt_DHCPv6_VendorClass *McOpt_DHCPv6_VendorClass::create(CSTR key) {
	McOpt_DHCPv6_VendorClass *mc = new McOpt_DHCPv6_VendorClass(key);

	mc->common_member();

	mc->member(new MmUint("EnterpriseNumber", 32, UN(0), UN(0)));

	mc->member(new MmVendorClass_onOption("data"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

McDHCPv6_VendorClassData *McDHCPv6_VendorClassData::create(CSTR key) {
	McDHCPv6_VendorClassData *mc = new McDHCPv6_VendorClassData(key);

	mc->length_member(new MmUint("Length", 16, GENEHC(mc, McDHCPv6_VendorClassData, Length), EVALANY()));
	mc->member(new MmData("data"));

	MmVendorClass_onOption::add_other(mc);

	return(mc);
}

//
// Vendor-specific Information option
//
////////////////////////////////

McOpt_DHCPv6_VendorSpecificInfo *McOpt_DHCPv6_VendorSpecificInfo::create(CSTR key) {
	McOpt_DHCPv6_VendorSpecificInfo *mc = new McOpt_DHCPv6_VendorSpecificInfo(key);

	mc->common_member();

	mc->member(new MmUint("EnterpriseNumber", 32, UN(0), UN(0)));

	mc->member(new MmOptionData_onOption("data"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

McDHCPv6_OptionData *McDHCPv6_OptionData::create(CSTR key) {
	McDHCPv6_OptionData *mc = new McDHCPv6_OptionData(key);

	mc->member(new MmUint("Code", 16, UN(0), UN(0)));
	mc->length_member(new MmUint("Length", 16, GENEHC(mc, McDHCPv6_OptionData, Length), EVALANY()));
	mc->member(new MmData("data"));

	MmOptionData_onOption::add_other(mc);

	return(mc);
}

//
// Interface-Id Option
//
////////////////////////////////

McOpt_DHCPv6_IID *McOpt_DHCPv6_IID::create(CSTR key) {
	McOpt_DHCPv6_IID *mc = new McOpt_DHCPv6_IID(key);

	mc->common_member();

	mc->member(new MmData("Identifier"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Reconfigure Message option
//
////////////////////////////////

McOpt_DHCPv6_ReconfigureMessage *McOpt_DHCPv6_ReconfigureMessage::create(CSTR key) {
	McOpt_DHCPv6_ReconfigureMessage *mc = new McOpt_DHCPv6_ReconfigureMessage(key);

	mc->common_member();

	mc->member(new MmUint("Type", 8, UN(0), UN(0)));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Reconfigure Accept option
//
////////////////////////////////

McOpt_DHCPv6_ReconfigureAccept *McOpt_DHCPv6_ReconfigureAccept::create(CSTR key) {
	McOpt_DHCPv6_ReconfigureAccept *mc = new McOpt_DHCPv6_ReconfigureAccept(key);

	mc->common_member();

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Identity Association for Prefix Delegation Option
//
////////////////////////////////

McOpt_DHCPv6_IA_PD *McOpt_DHCPv6_IA_PD::create(CSTR key) {
	McOpt_DHCPv6_IA_PD *mc = new McOpt_DHCPv6_IA_PD(key);

	mc->common_member();

	mc->member(new MmUint("Identifier", 32, UN(0), UN(0)));
	mc->member(new MmUint("Time1", 32, UN(0), UN(0)));
	mc->member(new MmUint("Time2", 32, UN(0), UN(0)));

	mc->member(new MmOption_onDHCPv6("option"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// IA_PD Prefix option
//
////////////////////////////////

McOpt_DHCPv6_IA_Prefix *McOpt_DHCPv6_IA_Prefix::create(CSTR key) {
	McOpt_DHCPv6_IA_Prefix *mc = new McOpt_DHCPv6_IA_Prefix(key);

	mc->common_member();

	mc->member(new MmUint("PreferredLifetime", 32, UN(0), UN(0)));
	mc->member(new MmUint("ValidLifetime", 32, UN(0), UN(0)));
	mc->member(new MmUint("PrefixLength", 8, UN(0), UN(0)));
	mc->member(new MmV6Addr("Prefix", MUST(), MUST()));

	mc->member(new MmOption_onDHCPv6("option"));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Domain Name Server option
//
////////////////////////////////

McOpt_DHCPv6_DNS_Servers *McOpt_DHCPv6_DNS_Servers::create(CSTR key) {
	McOpt_DHCPv6_DNS_Servers *mc = new McOpt_DHCPv6_DNS_Servers(key);

	mc->common_member();
	mc->member(
		new MmMultiple(
			new MmV6Addr("Address", MUST(), MUST()),
			(METH_HC_MLC)&McOpt_DHCPv6_DNS_Servers::HC_MLC(Address)
		)
	);

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Domain Search List option
//
////////////////////////////////

McOpt_DHCPv6_DNS_SearchList *McOpt_DHCPv6_DNS_SearchList::create(CSTR key) {
	McOpt_DHCPv6_DNS_SearchList *mc = new McOpt_DHCPv6_DNS_SearchList(key);

	mc->common_member();
	mc->member(new MmDNSName("SearchString", MUST(), MUST()));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// Network Time Protocol (NTP) Servers option
//
////////////////////////////////

McOpt_DHCPv6_NTP_Servers *McOpt_DHCPv6_NTP_Servers::create(CSTR key) {
	McOpt_DHCPv6_NTP_Servers *mc = new McOpt_DHCPv6_NTP_Servers(key);

	mc->common_member();
	mc->member(
		new MmMultiple(
			new MmV6Addr("Address", MUST(), MUST()),
			(METH_HC_MLC)&McOpt_DHCPv6_NTP_Servers::HC_MLC(Address)
		)
	);

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// IEEE 1003.1 POSIX Timezone option
//
////////////////////////////////

McOpt_DHCPv6_NTP_Timezone *McOpt_DHCPv6_NTP_Timezone::create(CSTR key) {
	McOpt_DHCPv6_NTP_Timezone *mc = new McOpt_DHCPv6_NTP_Timezone(key);

	mc->common_member();
	mc->member(new MmTimezone("Timezone", MUST(), MUST()));

	MmOption_onDHCPv6::add(mc);

	return(mc);
}

//
// DHCP unique identifier (DUID)
//
////////////////////////////////////////////////////////////////

void McDHCPv6_DUID::common_member() {
	type_member(new MmUint("Type", 16, GENEHC(this, McDHCPv6_DUID, Type), EVALHC(this, McDHCPv6_DUID, Type)));
	return;
}

McDHCPv6_DUID_ANY *McDHCPv6_DUID_ANY::create(CSTR key) {
	McDHCPv6_DUID_ANY *mc = new McDHCPv6_DUID_ANY(key);

	mc->common_member();
	mc->member(new MmData("data"));

	MmDUID_onOption::add_other(mc);

	return(mc);
}

//
// DUID based on link-layer address plus time [DUID-LLT]
//
////////////////////////////////

McDHCPv6_DUID_LLT_ANY *McDHCPv6_DUID_LLT_ANY::create(CSTR key) {
	McDHCPv6_DUID_LLT_ANY *mc = new McDHCPv6_DUID_LLT_ANY(key);

	mc->common_member();

	mc->hwtype_member(
		new MmUint(
			"HardwareType",
			16,
			GENEHC(mc, McDHCPv6_DUID_LLT, HardwareType),
			EVALHC(mc, McDHCPv6_DUID_LLT, HardwareType)
		)
	);
	mc->member(new MmUint("Time", 32, UN(0), UN(0)));
	mc->member(new MmData("LinkLayerAddress"));

	MmLLT_onDUID::add_other(mc);

	return(mc);
}

McDHCPv6_DUID_LLT_Ether *McDHCPv6_DUID_LLT_Ether::create(CSTR key) {
	McDHCPv6_DUID_LLT_Ether *mc = new McDHCPv6_DUID_LLT_Ether(key);

	mc->common_member();

	mc->hwtype_member(
		new MmUint(
			"HardwareType",
			16,
			GENEHC(mc, McDHCPv6_DUID_LLT, HardwareType),
			EVALHC(mc, McDHCPv6_DUID_LLT, HardwareType)
		)
	);
	mc->member(new MmUint("Time", 32, UN(0), UN(0)));
	mc->member(new MmEther("LinkLayerAddress", MUST(), MUST()));

	MmLLT_onDUID::add(mc);

	return(mc);
}

//
// DUID assigned by vendor based on Enterprise number [DUID-EN]
//
////////////////////////////////

McDHCPv6_DUID_EN *McDHCPv6_DUID_EN::create(CSTR key) {
	McDHCPv6_DUID_EN *mc = new McDHCPv6_DUID_EN(key);

	mc->common_member();

	mc->member(new MmUint("EnterpriseNumber", 32, UN(0), UN(0)));
	mc->member(new MmData("Identifier"));

	MmDUID_onOption::add(mc);

	return(mc);
}

//
// DUID based on link-layer address [DUID-LL]
//
////////////////////////////////

McDHCPv6_DUID_LL_ANY *McDHCPv6_DUID_LL_ANY::create(CSTR key) {
	McDHCPv6_DUID_LL_ANY *mc = new McDHCPv6_DUID_LL_ANY(key);

	mc->common_member();

	mc->hwtype_member(
		new MmUint(
			"HardwareType",
			16,
			GENEHC(mc, McDHCPv6_DUID_LL, HardwareType),
			EVALHC(mc, McDHCPv6_DUID_LL, HardwareType)
		)
	);
	mc->member(new MmData("LinkLayerAddress"));

	MmLL_onDUID::add_other(mc);

	return(mc);
}

McDHCPv6_DUID_LL_Ether *McDHCPv6_DUID_LL_Ether::create(CSTR key) {
	McDHCPv6_DUID_LL_Ether *mc = new McDHCPv6_DUID_LL_Ether(key);

	mc->common_member();

	mc->hwtype_member(
		new MmUint(
			"HardwareType",
			16,
			GENEHC(mc, McDHCPv6_DUID_LL, HardwareType),
			EVALHC(mc, McDHCPv6_DUID_LL, HardwareType)
		)
	);
	mc->member(new MmEther("LinkLayerAddress", MUST(), MUST()));

	MmLL_onDUID::add(mc);

	return(mc);
}

//
// Authentication of DHCP Messages
//
////////////////////////////////////////////////////////////////

McDHCPv6_Auth_ANY *McDHCPv6_Auth_ANY::create(CSTR key) {
	McDHCPv6_Auth_ANY *mc = new McDHCPv6_Auth_ANY(key);

	mc->member(new MmData("data"));

	MmProto_onAuth::add_other(mc);

	return(mc);
}

McDHCPv6_Auth_Delayed *McDHCPv6_Auth_Delayed::create(CSTR key) {
	McDHCPv6_Auth_Delayed *mc = new McDHCPv6_Auth_Delayed(key);

	mc->member(new MmDHCPRealm("Realm", MUST(), MUST()));
	mc->member(new MmUint("Identifier", 32, UN(0), UN(0)));
	mc->member(new MmDHCPAuth("Authenticator"));

	MmProto_onAuth::add(mc);

	return(mc);
}

McDHCPv6_Auth_ReconfigureKey *McDHCPv6_Auth_ReconfigureKey::create(CSTR key) {
	McDHCPv6_Auth_ReconfigureKey *mc = new McDHCPv6_Auth_ReconfigureKey(key);

	mc->member(new MmUint("Type", 8, UN(0), UN(0)));
	mc->member(new MmDHCPAuth("data"));

	MmProto_onAuth::add(mc);

	return(mc);
}

//
// RFC 1112/2236/3376
//
//     IGMPv1/IGMPv2/IGMPv3
//
////////////////////////////////////////////////////////////////////////////////

void McUpp_IGMP::common_member(){
	int32_t Type = igmpType();
	type_member(
		new MmUint( "Type",		8,	UN(Type),UN(Type) ) );
	member( new MmUint( "MaxRespTime",		8,	UN(0),	UN(0) ) );
	member( new MmUppChecksum( "Checksum",	16,
			DEF_MUSTCHKSUM, DEF_NOPSEUDO ) );
	}
///////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_ANY* McUpp_IGMP_ANY::create(CSTR key){
	McUpp_IGMP_ANY* mc = new McUpp_IGMP_ANY(key);
	mc->common_member();
	mc->member( new MmData( "data" ) );
	//dict
	MmHeader_onIGMP::add_other(mc);	//Upp_IGMP::header= (upper=)
	return mc;}
////////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_IGMPv3Report* McUpp_IGMP_IGMPv3Report::create(CSTR key){
	McUpp_IGMP_IGMPv3Report* mc = new McUpp_IGMP_IGMPv3Report(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member(
		new MmUint( "NumOfGroupAddrRecords",	16,
			GENEHC(mc,McUpp_IGMP_IGMPv3Report,NumOfGroupAddrRecords),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmIGMPv3AddrRecord_onIGMP("IGMPv3_AddrRecord"));
	//dict
	MmHeader_onIGMP::add(mc);	//Upp_IGMP::header= (upper=)
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_IGMPQuery* McUpp_IGMP_IGMPQuery::create(CSTR key){
	McUpp_IGMP_IGMPQuery* mc = new McUpp_IGMP_IGMPQuery(key);
	mc->common_member();
	mc->member( new MmV4Addr( "GroupAddress",	MUST(),	MUST() ) );
	// ICMPv1 and IGMPv2 Query only have GroupAddress
#ifndef NOT_USE_IGMPV3_QUERY
	mc->member(new MmUint("Resv",		4,	UN(0),	UN(0)));
	mc->member(new MmUint("SFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("QRV",		3,	UN(0),	UN(0)));
	mc->member(new MmUint("QQIC",		8,	UN(0),	UN(0)));
	mc->member(
 		new MmUint( "NumOfSources",	16,
			GENEHC(mc,McUpp_IGMP_IGMPQuery,NumOfSources),
 			EVALANY(),		ICVCONST() ) );
	mc->member(
		new MmMultiple(
			new MmV4Addr("SourceAddress", MUST(), MUST()),
			(METH_HC_MLC)&McUpp_IGMP_IGMPQuery::HC_MLC(SourceAddress)
		)
	);
#endif	// NOT_USE_IGMPV3_QUERY
	//dict
	MmHeader_onIGMP::add(mc);		//Upp_IGMP::header= (upper=)
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_IGMPv1Report* McUpp_IGMP_IGMPv1Report::create(CSTR key){
	McUpp_IGMP_IGMPv1Report* mc = new McUpp_IGMP_IGMPv1Report(key);
	mc->common_member();
	mc->member( new MmV4Addr( "GroupAddress",	MUST(),	MUST() ) );
	//dict
	MmHeader_onIGMP::add(mc);	//Upp_IGMP::header= (upper=)
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_IGMPv2Report* McUpp_IGMP_IGMPv2Report::create(CSTR key){
	McUpp_IGMP_IGMPv2Report* mc = new McUpp_IGMP_IGMPv2Report(key);
	mc->common_member();
	mc->member( new MmV4Addr( "GroupAddress",	MUST(),	MUST() ) );
	//dict
	MmHeader_onIGMP::add(mc);	//Upp_IGMP::header= (upper=)
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McUpp_IGMP_IGMPv2LeaveGroup* McUpp_IGMP_IGMPv2LeaveGroup::create(CSTR key){
	McUpp_IGMP_IGMPv2LeaveGroup* mc = new McUpp_IGMP_IGMPv2LeaveGroup(key);
	mc->common_member();
	mc->member( new MmV4Addr( "GroupAddress",	MUST(),	MUST() ) );
	//dict
	MmHeader_onIGMP::add(mc);	//Upp_IGMP::header= (upper=)
	return mc;}
//////////////////////////////////////////////////////////////////////////////
McIGMPv3_AddrRecord *McIGMPv3_AddrRecord::create(CSTR key) {	
	McIGMPv3_AddrRecord *mc = new McIGMPv3_AddrRecord(key);
	mc->type_member(new MmUint("Type", 8, UN(0), UN(0)));
	mc->auxdatalen_member(new MmUint("AuxDataLen", 8, UN(0), UN(0)));
	mc->numofsrc_member(
		new MmUint( "NumOfSources",	16,
			GENEHC(mc,McIGMPv3_AddrRecord,NumOfSources),
			EVALANY(),		ICVCONST() ) );
	mc->mcastaddr_member(new MmV4Addr("GroupAddress", MUST(), MUST()));
	mc->member(
		new MmMultiple(
			new MmV4Addr("SourceAddress", MUST(), MUST()),
			(METH_HC_MLC)&McIGMPv3_AddrRecord::HC_MLC(SourceAddress)
 		)
 	);
	mc->member( new MmData( "AuxData"));
 	// dict
	MmIGMPv3AddrRecord_onIGMP::add(mc);
	return(mc);
}

//
// ICMPv6 MLDv2 Messages
//
////////////////////////////////////////////////////////////////
McUpp_ICMPv6_MLDv2Report *McUpp_ICMPv6_MLDv2Report::create(CSTR key) {
	McUpp_ICMPv6_MLDv2Report *mc = new McUpp_ICMPv6_MLDv2Report(key);
	mc->common_member();
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member(
		new MmUint( "NumOfMcastAddrRecords",	16,
			GENEHC(mc,McUpp_ICMPv6_MLDv2Report,NumOfMcastAddrRecords),
			EVALANY(),		ICVCONST() ) );
	mc->member( new MmMLDv2AddrRecord_onICMPv6( "MLDv2_AddrRecord"));
	// dict
	MmHeader_onICMPv6::add(mc);
	return(mc);
}

McUpp_ICMPv6_MLDQuery *McUpp_ICMPv6_MLDQuery::create(CSTR key) {
	McUpp_ICMPv6_MLDQuery *mc = new McUpp_ICMPv6_MLDQuery(key);
	mc->common_member();
	mc->member( new MmUint( "MaxResponseDelay",16,	UN(0),	UN(0) ) );
	mc->member( new MmUint( "Reserved",	16,	UN(0),	UN(0) ) );
	mc->member( new MmV6Addr( "MulticastAddress",	MUST(),	MUST() ) );
#ifdef USE_MLDV2_QUERY
	mc->member(new MmUint("Resv",		4,	UN(0),	UN(0)));
	mc->member(new MmUint("SFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("QRV",		3,	UN(0),	UN(0)));
	mc->member(new MmUint("QQIC",		8,	UN(0),	UN(0)));
	mc->member(
		new MmUint( "NumOfSources",	16,
			GENEHC(mc,McUpp_ICMPv6_MLDQuery,NumOfSources),
			EVALANY(),		ICVCONST() ) );
	
	mc->member(
		new MmMultiple(
			new MmV6Addr("SourceAddress", MUST(), MUST()),
			(METH_HC_MLC)&McUpp_ICMPv6_MLDQuery::HC_MLC(SourceAddress)
		)
	);
#endif	// USE_MLDV2_QUERY
	// dict
	MmHeader_onICMPv6::add(mc);
	return mc;
}
McMLDv2_AddrRecord *McMLDv2_AddrRecord::create(CSTR key) {	
	McMLDv2_AddrRecord *mc = new McMLDv2_AddrRecord(key);
	mc->type_member(new MmUint("Type", 8, UN(0), UN(0)));
	mc->auxdatalen_member(new MmUint("AuxDataLen", 8, UN(0), UN(0)));
	mc->numofsrc_member(
		new MmUint( "NumOfSources",	16,
			GENEHC(mc,McMLDv2_AddrRecord,NumOfSources),
			EVALANY(),		ICVCONST() ) );
	mc->mcastaddr_member(new MmV6Addr("MulticastAddress", MUST(), MUST()));
	mc->member(
		new MmMultiple(
			new MmV6Addr("SourceAddress", MUST(), MUST()),
			(METH_HC_MLC)&McMLDv2_AddrRecord::HC_MLC(SourceAddress)
		)
	);
	mc->member( new MmData( "AuxData"));
	// dict
	MmMLDv2AddrRecord_onICMPv6::add(mc);
	return(mc);
}



////////////////////////////////////////////////////////////////
// RFC 3261 - SIP: Session Initiation Protocol                //
////////////////////////////////////////////////////////////////

McUdp_SIP *McUdp_SIP::create(CSTR key) {
	McUdp_SIP *mc = new McUdp_SIP(key);

//	mc->member(new MmData("data"));
	mc->member(new MmSIPMsg("message", MUST(), MUST()));

	MmUpper_onUpper::add(mc);

	return(mc);
}

#if !defined(NOT_USE_SNMP)
////////////////////////////////////////////////////////////////////////////////
//     SNMP
////////////////////////////////////////////////////////////////////////////////
McUdp_SNMP *McUdp_SNMP::create(CSTR key) {
	McUdp_SNMP *mc = new McUdp_SNMP(key);

	mc->member(new MmPdu_SNMP_onSNMP("snmpmsg"));

	MmUpper_onUpper::add(mc);

	return(mc);
}
McUdp_SNMPTrap *McUdp_SNMPTrap::create(CSTR key) {
	McUdp_SNMPTrap *mc = new McUdp_SNMPTrap(key);

	mc->member(new MmPdu_SNMP_onSNMP("snmpmsg"));

	MmUpper_onUpper::add(mc);

	return(mc);
}
////////////////////////////////////////////////////////////////////////////////
// SNMP PDU
////////////////////////////////////////////////////////////////////////////////
void McPdu_SNMP::common_member() {
	type_member(new MmUint("Type", 8, GENEHC(this, McPdu_SNMP, Type), EVALHC(this, McPdu_SNMP, Type)));
	length_member(new MmUint("Length", 8, GENEHC(this, McPdu_SNMP, Length), EVALANY()));
}
////////////////////////////////
McPdu_SNMP_ANY *McPdu_SNMP_ANY::create(CSTR key) {
	McPdu_SNMP_ANY *mc = new McPdu_SNMP_ANY(key);
	mc->common_member();
	mc->member(new MmData("data"));
	MmPdu_SNMP_onSNMP::add_other(mc);
	MmPdu_SNMP_onPDU::add_other(mc);
	MmSNMP_Version_onSNMP_Message::add_other(mc);
	MmSNMP_Community_onSNMP_Message::add_other(mc);
	MmSNMP_RequestID_onSNMP_Message::add_other(mc);
	MmSNMP_ErrorStatus_onSNMP_Message::add_other(mc);
	MmSNMP_ErrorIndex_onSNMP_Message::add_other(mc);

	MmSNMP_IPAddress_onTrap_Message::add_other(mc);
	MmSNMP_GenericTrap_onTrap_Message::add_other(mc);
	MmSNMP_SpecificTrap_onTrap_Message::add_other(mc);
	MmSNMP_TimeStamp_onTrap_Message::add_other(mc);
	MmSNMP_ObjectID_onTrap_Message::add_other(mc);

	MmSNMP_VarBindList_onPDU::add_other(mc);
	MmSNMP_VarBind_onPDU::add_other(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Message *McPdu_SNMP_Message::create(CSTR key) {
	McPdu_SNMP_Message *mc = new McPdu_SNMP_Message(key);
	mc->common_member();
	mc->member(new MmSNMP_Version_onSNMP_Message("version"));
	mc->member(new MmSNMP_Community_onSNMP_Message("community"));
	mc->member(new MmPdu_SNMP_onSNMP("pdumsg"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Version *McPdu_SNMP_Version::create(CSTR key) {
	McPdu_SNMP_Version *mc = new McPdu_SNMP_Version(key);
	mc->common_member();
	// mc->member(new MmUint( "Version", 8, UN(0), UN(0)));
	mc->member(new MmSNMPVersion( "Version", 8, UN(0), UN(0)));
	MmSNMP_Version_onSNMP_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Community *McPdu_SNMP_Community::create(CSTR key) {
	McPdu_SNMP_Community *mc = new McPdu_SNMP_Community(key);
	mc->common_member();
	mc->member(new MmSNMPString("Community", MUST(), MUST()));
	MmSNMP_Community_onSNMP_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_GetRequest *McPdu_SNMP_GetRequest::create(CSTR key) {
	McPdu_SNMP_GetRequest *mc = new McPdu_SNMP_GetRequest(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_GetNextRequest *McPdu_SNMP_GetNextRequest::create(CSTR key) {
	McPdu_SNMP_GetNextRequest *mc = new McPdu_SNMP_GetNextRequest(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_SetRequest *McPdu_SNMP_SetRequest::create(CSTR key) {
	McPdu_SNMP_SetRequest *mc = new McPdu_SNMP_SetRequest(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_GetResponse *McPdu_SNMP_GetResponse::create(CSTR key) {
	McPdu_SNMP_GetResponse *mc = new McPdu_SNMP_GetResponse(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Trap *McPdu_SNMP_Trap::create(CSTR key) {
	McPdu_SNMP_Trap *mc = new McPdu_SNMP_Trap(key);
	mc->common_member();
	mc->member(new MmSNMP_ObjectID_onTrap_Message("pdu_enterpriseoid"));
	mc->member(new MmSNMP_IPAddress_onTrap_Message("pdu_ipaddress"));
	mc->member(new MmSNMP_GenericTrap_onTrap_Message("pdu_generictrap"));
	mc->member(new MmSNMP_SpecificTrap_onTrap_Message("pdu_specifictrap"));
	mc->member(new MmSNMP_TimeStamp_onTrap_Message("pdu_timestamp"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_GetBulk *McPdu_SNMP_GetBulk::create(CSTR key) {
	McPdu_SNMP_GetBulk *mc = new McPdu_SNMP_GetBulk(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Inform *McPdu_SNMP_Inform::create(CSTR key) {
	McPdu_SNMP_Inform *mc = new McPdu_SNMP_Inform(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Trap2 *McPdu_SNMP_Trap2::create(CSTR key) {
	McPdu_SNMP_Trap2 *mc = new McPdu_SNMP_Trap2(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Report *McPdu_SNMP_Report::create(CSTR key) {
	McPdu_SNMP_Report *mc = new McPdu_SNMP_Report(key);
	mc->common_member();
	mc->member(new MmSNMP_RequestID_onSNMP_Message("pdu_requestid"));
	mc->member(new MmSNMP_ErrorStatus_onSNMP_Message("pdu_errorstatus"));
	mc->member(new MmSNMP_ErrorIndex_onSNMP_Message("pdu_errorindex"));
	mc->member(new MmSNMP_VarBindList_onPDU("pdu_varbindlist"));
	MmPdu_SNMP_onSNMP::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_RequestID *McPdu_SNMP_RequestID::create(CSTR key) {
	McPdu_SNMP_RequestID *mc = new McPdu_SNMP_RequestID(key);
	mc->common_member();
	mc->member(new MmUint( "RequestID", 32, UN(0), UN(0)));
	MmSNMP_RequestID_onSNMP_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_ErrorStatus *McPdu_SNMP_ErrorStatus::create(CSTR key) {
	McPdu_SNMP_ErrorStatus *mc = new McPdu_SNMP_ErrorStatus(key);
	mc->common_member();
	mc->member(new MmErrorStatus( "ErrorStatus", 8, UN(0), UN(0)));
	MmSNMP_ErrorStatus_onSNMP_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_ErrorIndex *McPdu_SNMP_ErrorIndex::create(CSTR key) {
	McPdu_SNMP_ErrorIndex *mc = new McPdu_SNMP_ErrorIndex(key);
	mc->common_member();
	mc->member(new MmUint( "ErrorIndex", 8, UN(0), UN(0)));
	MmSNMP_ErrorIndex_onSNMP_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_GenericTrap *McPdu_SNMP_GenericTrap::create(CSTR key) {
	McPdu_SNMP_GenericTrap *mc = new McPdu_SNMP_GenericTrap(key);
	mc->common_member();
	mc->member(new MmUint( "GenericTrap", 8, UN(0), UN(0)));
	MmSNMP_GenericTrap_onTrap_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_SpecificTrap *McPdu_SNMP_SpecificTrap::create(CSTR key) {
	McPdu_SNMP_SpecificTrap *mc = new McPdu_SNMP_SpecificTrap(key);
	mc->common_member();
	mc->member(new MmUint( "SpecificTrap", 8, UN(0), UN(0)));
	MmSNMP_SpecificTrap_onTrap_Message::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_VarBindList *McPdu_SNMP_VarBindList::create(CSTR key) {
	McPdu_SNMP_VarBindList *mc = new McPdu_SNMP_VarBindList(key);
	mc->common_member();
	mc->member(new MmSNMP_VarBind_onPDU("pdu"));
	MmSNMP_VarBindList_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_VarBind *McPdu_SNMP_VarBind::create(CSTR key) {
	McPdu_SNMP_VarBind *mc = new McPdu_SNMP_VarBind(key);
	mc->common_member();
	mc->member(new MmPdu_SNMP_onPDU("pdu"));
	MmSNMP_VarBind_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Boolean *McPdu_SNMP_Boolean::create(CSTR key) {
	McPdu_SNMP_Boolean *mc = new McPdu_SNMP_Boolean(key);
	mc->common_member();
	mc->member(new MmData("data")); // XXXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Integer *McPdu_SNMP_Integer::create(CSTR key) {
	McPdu_SNMP_Integer *mc = new McPdu_SNMP_Integer(key);
	mc->common_member();
	mc->member(new MmData("data")); // XXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_BitString *McPdu_SNMP_BitString::create(CSTR key) {
	McPdu_SNMP_BitString *mc = new McPdu_SNMP_BitString(key);
	mc->common_member();
	mc->member(new MmData("data")); // XXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_OctString *McPdu_SNMP_OctString::create(CSTR key) {
	McPdu_SNMP_OctString *mc = new McPdu_SNMP_OctString(key);
	mc->common_member();
	mc->member(new MmSNMPString("OctString", MUST(), MUST()));
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Null *McPdu_SNMP_Null::create(CSTR key) {
	McPdu_SNMP_Null *mc = new McPdu_SNMP_Null(key);
	mc->common_member();
	mc->member(new MmData("data"));
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_ObjectID *McPdu_SNMP_ObjectID::create(CSTR key) {
	McPdu_SNMP_ObjectID *mc = new McPdu_SNMP_ObjectID(key);
	mc->common_member();
	mc->member(new MmObjectID("ObjectID", MUST(), MUST())); // XXXX
	MmSNMP_ObjectID_onTrap_Message::add(mc);
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Sequence *McPdu_SNMP_Sequence::create(CSTR key) {
	McPdu_SNMP_Sequence *mc = new McPdu_SNMP_Sequence(key);
	mc->common_member();
	mc->member(new MmData("data")); // XXXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Set *McPdu_SNMP_Set::create(CSTR key) {
	McPdu_SNMP_Set *mc = new McPdu_SNMP_Set(key);
	mc->common_member();
	mc->member(new MmData("data")); // XXXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Opaque *McPdu_SNMP_Opaque::create(CSTR key) {
	McPdu_SNMP_Opaque *mc = new McPdu_SNMP_Opaque(key);
	mc->common_member();
	mc->member(new MmPdu_SNMP_onPDU("pdu"));
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_IPAddress *McPdu_SNMP_IPAddress::create(CSTR key) {
	McPdu_SNMP_IPAddress *mc = new McPdu_SNMP_IPAddress(key);
	mc->common_member();
	mc->member(new MmV4Addr("IPAddress"));
	MmSNMP_IPAddress_onTrap_Message::add(mc);
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Counter *McPdu_SNMP_Counter::create(CSTR key) {
	McPdu_SNMP_Counter *mc = new McPdu_SNMP_Counter(key);
	mc->common_member();
	mc->member(new MmData("Counter")); // XXXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_Gauge *McPdu_SNMP_Gauge::create(CSTR key) {
	McPdu_SNMP_Gauge *mc = new McPdu_SNMP_Gauge(key);
	mc->common_member();
	mc->member(new MmData("Gauge")); // XXXX
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
////////////////////////////////
McPdu_SNMP_TimeTicks *McPdu_SNMP_TimeTicks::create(CSTR key) {
	McPdu_SNMP_TimeTicks *mc = new McPdu_SNMP_TimeTicks(key);
	mc->common_member();
	mc->member(new MmData("TimeTicks")); // XXXX
	MmSNMP_TimeStamp_onTrap_Message::add(mc);
	MmPdu_SNMP_onPDU::add(mc);
	return(mc);
}
#endif //NOT_USE_SNMP



////////////////////////////////////////////////////////////////
// RFC 2408 - ISAKMP                                          //
////////////////////////////////////////////////////////////////
McUdp_ISAKMP *
McUdp_ISAKMP::create(CSTR key, CSTR tophdrkey)
{
	addCompound(tophdr_ = McHdr_ISAKMP::create(tophdrkey));
	McUdp_ISAKMP *mc = new McUdp_ISAKMP(key);

	mc->member(new MmTopHdr("header", tophdr_));
	mc->member(new MmEncrypt_onISAKMP("encrypt", tophdr_));
	mc->member(new MmPayload_onISAKMP("payload"));

	MmUpper_onUpper::add(mc);

	return(mc);
}



////////////////////////////////
// ISAKMP Header              //
////////////////////////////////
McHdr_ISAKMP *
McHdr_ISAKMP::create(CSTR key)
{
	McHdr_ISAKMP *mc = new McHdr_ISAKMP(key);

	mc->member(new MmMH_Cookie64("InitiatorCookie"));
	mc->member(new MmMH_Cookie64("ResponderCookie"));

	mc->nextType_member(
		new MmUint(
			"NextPayload",
			8,
			GENEHC(mc, McHdr_ISAKMP, NextPayload),
			EVALHC(mc, McHdr_ISAKMP, NextPayload)
		)
	);

	mc->member(new MmUint("MjVer",		4,	UN(1),	UN(1)));
	mc->member(new MmUint("MnVer",		4,	UN(0),	UN(0)));
	mc->member(new MmUint("ExchangeType",	8,	UN(0),	UN(0)));
	mc->member(new MmUint("Reserved",	5,	UN(0),	UN(0)));
	mc->member(new MmUint("AFlag",		1,	UN(0),	UN(0)));
	mc->member(new MmUint("CFlag",		1,	UN(0),	UN(0)));
	mc->EFlag_member(
		new MmUint(
			"EFlag",
			1,
			GENEHC(mc, McHdr_ISAKMP, EFlag),
			EVALHC(mc, McHdr_ISAKMP, EFlag)
		)
	);

	mc->MIDmember(
		new MmISAKMP_MessageID("MessageID",	32,	UN(0),	UN(0)));

	mc->Layerlength_member(
		new MmUint(
			"Length",
			32,
			GENEHC(mc, McHdr_ISAKMP, Length), 
			EVALANY()
		)
	);

	return(mc);
}



////////////////////////////////
// ISAKMP Generic Payload     //
////////////////////////////////
void
McPld_ISAKMP::common_member()
{
	nextType_member(
		new MmUint(
			"NextPayload",
			8,
			GENEHC(this, McPld_ISAKMP, NextPayload),
			EVALHC(this, McPld_ISAKMP, NextPayload)
		)
	);

	member(new MmUint("Reserved1",	8, UN(0), UN(0)));

	Layerlength_member(
		new MmUint(
			"PayloadLength",
			16,
			GENEHC(this, McPld_ISAKMP, PayloadLength),
			EVALANY()
		)
	);

	return;
}



McPld_ISAKMP_ANY *
McPld_ISAKMP_ANY::create(CSTR key)
{
	McPld_ISAKMP_ANY *mc = new McPld_ISAKMP_ANY(key);

	mc->common_member();
	mc->member(new MmVarOctets("data", 0, EVALZERO()));

	MmPayload_onISAKMP::add_other(mc);
	MmISAKMP_PonSA::add_other(mc);
	MmISAKMP_TonP::add_other(mc);

	return(mc);
}



////////////////////////////////////////
// Security Association Payload       //
////////////////////////////////////////
void
McPld_ISAKMP_SA::common_member()
{
	McPld_ISAKMP::common_member();
	DOImember(
		new MmUint(
			"DOI",
			32,
			GENEHC(this, McPld_ISAKMP_SA, DOI),
			EVALHC(this, McPld_ISAKMP_SA, DOI)
		)
	);

	return;
}

McPld_ISAKMP_SA_ANY *
McPld_ISAKMP_SA_ANY::create(CSTR key)
{
	McPld_ISAKMP_SA_ANY *mc = new McPld_ISAKMP_SA_ANY(key);

	mc->common_member();
	mc->member(new MmVarOctets("Situation", 0, EVALZERO()));

	MmDOIonSA::add_other(mc);

	return(mc);
}

void
McPld_ISAKMP_SA_IPsec::common_member()
{
	McPld_ISAKMP_SA::common_member();
	SITmember(
		new MmUint(
			"Situation",
			32,
			GENEHC(this, McPld_ISAKMP_SA_IPsec, Situation),
			EVALHC(this, McPld_ISAKMP_SA_IPsec, Situation)
		)
	);
}

McPld_ISAKMP_SA_IPsec_ANY *
McPld_ISAKMP_SA_IPsec_ANY::create(CSTR key)
{
	McPld_ISAKMP_SA_IPsec_ANY *mc = new McPld_ISAKMP_SA_IPsec_ANY(key);

	mc->common_member();
	mc->member(new MmVarOctets("data", 0, EVALZERO()));

	MmSIT_onSA_IPsec::add_other(mc);

	return(mc);
}

McPld_ISAKMP_SA_IPsec_IDonly *
McPld_ISAKMP_SA_IPsec_IDonly::create(CSTR key)
{
	McPld_ISAKMP_SA_IPsec_IDonly *mc
		= new McPld_ISAKMP_SA_IPsec_IDonly(key);

	mc->common_member();

	mc->member(new MmISAKMP_PonSA("proposal"));

	MmSIT_onSA_IPsec::add(mc);

	return(mc);
}



////////////////////////////////
// Proposal Payload           //
////////////////////////////////
void
McPld_ISAKMP_P::common_member()
{
	McPld_ISAKMP::common_member();

	member(new MmUint("ProposalNumber",	8, UN(0), UN(0)));

	ProtocolIDmember(
		new MmUint(
			"ProtocolID",
			8,
			GENEHC(this, McPld_ISAKMP_P, ProtocolID),
			EVALHC(this, McPld_ISAKMP_P, ProtocolID)
		)
	);

	return;
}

void
McPld_ISAKMP_P::spisize_member()
{
	SPIsize_member(
		new MmUint(
			"SPIsize",
			8,
			GENEHC(this, McPld_ISAKMP_P, SPIsize),
			EVALANY()
		)
	);

	return;
}

void
McPld_ISAKMP_P::transnum_member()
{
	member(
		new MmUint(
			"NumOfTransforms",
			8,
			GENEHC(this, McPld_ISAKMP_P, NumOfTransforms),
			EVALHC(this, McPld_ISAKMP_P, NumOfTransforms)
		)
	);

	return;
}

McPld_ISAKMP_P *
McPld_ISAKMP_P::create(CSTR key)
{
	McPld_ISAKMP_P *mc = new McPld_ISAKMP_P(key);

	mc->common_member();
	mc->spisize_member();
	mc->transnum_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmISAKMP_TonP(mc, "transform"));

	MmProtocolIDonP::add_other(mc);

	return(mc);
}

McPld_ISAKMP_P_ISAKMP *
McPld_ISAKMP_P_ISAKMP::create(CSTR key)
{
	McPld_ISAKMP_P_ISAKMP *mc = new McPld_ISAKMP_P_ISAKMP(key);

	mc->common_member();
	mc->spisize_member();
	mc->transnum_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmISAKMP_TonP(mc, "transform"));

	MmProtocolIDonP::add(mc);

	return(mc);
}

McPld_ISAKMP_P_IPsec_AH *
McPld_ISAKMP_P_IPsec_AH::create(CSTR key)
{
	McPld_ISAKMP_P_IPsec_AH *mc = new McPld_ISAKMP_P_IPsec_AH(key);

	mc->common_member();
	mc->member(new MmUint("SPIsize", 8, UN(4), UN(4)));
	mc->transnum_member();
	mc->member(new MmUint("SPI", 32, UN(0), UN(0)));

	mc->member(new MmISAKMP_TonP(mc, "transform"));

	MmProtocolIDonP::add(mc);

	return(mc);
}

McPld_ISAKMP_P_IPsec_ESP *
McPld_ISAKMP_P_IPsec_ESP::create(CSTR key)
{
	McPld_ISAKMP_P_IPsec_ESP *mc = new McPld_ISAKMP_P_IPsec_ESP(key);

	mc->common_member();
	mc->member(new MmUint("SPIsize", 8, UN(4), UN(4)));
	mc->transnum_member();
	mc->member(new MmUint("SPI", 32, UN(0), UN(0)));

	mc->member(new MmISAKMP_TonP(mc, "transform"));

	MmProtocolIDonP::add(mc);

	return(mc);
}

McPld_ISAKMP_P_IPCOMP *
McPld_ISAKMP_P_IPCOMP::create(CSTR key)
{
	McPld_ISAKMP_P_IPCOMP *mc = new McPld_ISAKMP_P_IPCOMP(key);

	mc->common_member();
	mc->spisize_member();
	mc->transnum_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmISAKMP_TonP(mc, "transform"));

	MmProtocolIDonP::add(mc);

	return(mc);
}



////////////////////////////////
// Transform Payload          //
////////////////////////////////
McPld_ISAKMP_T *
McPld_ISAKMP_T::create(CSTR key)
{
	McPld_ISAKMP_T *mc = new McPld_ISAKMP_T(key);

	mc->common_member();
	mc->member(new MmUint("TransformNumber",  8, UN(0), UN(0)));
	mc->member(new MmUint("TransformID",      8, UN(0), UN(0)));
	mc->member(new MmUint("Reserved2",       16, UN(0), UN(0)));

	mc->member(new MmAttr_onT("attribute"));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Key Exchange Payload       //
////////////////////////////////
McPld_ISAKMP_KE *
McPld_ISAKMP_KE::create(CSTR key)
{
	McPld_ISAKMP_KE *mc = new McPld_ISAKMP_KE(key);

	mc->common_member();
	mc->member(new MmVarOctets("KeyExchangeData", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Identification Payload     //
////////////////////////////////
void
McPld_ISAKMP_ID::common_member()
{
	McPld_ISAKMP::common_member();

	IDtype_member(
		new MmUint(
			"IDtype",
			8,
			GENEHC(this, McPld_ISAKMP_ID, IDtype),
			EVALHC(this, McPld_ISAKMP_ID, IDtype)
		)
	);
#if 0
	member(new MmUint("DOIspecificIDdata", 24, UN(0), UN(0)));
#else
	member(new MmUint("ProtoclID",          8, UN(0), UN(0)));
	member(new MmUint("Port",              16, UN(0), UN(0)));
#endif
	return;
}

McPld_ISAKMP_ID *
McPld_ISAKMP_ID::create(CSTR key)
{
	McPld_ISAKMP_ID *mc = new McPld_ISAKMP_ID(key);

	mc->common_member();
	mc->member(new MmVarOctets("ID", 0, EVALZERO()));

	MmIDtype_onID::add_other(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV4_ADDR *
McPld_ISAKMP_ID_IPV4_ADDR::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV4_ADDR *mc = new McPld_ISAKMP_ID_IPV4_ADDR(key);

	mc->common_member();
	mc->member(new MmV4Addr("ID", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_FQDN *
McPld_ISAKMP_ID_FQDN::create(CSTR key)
{
	McPld_ISAKMP_ID_FQDN *mc = new McPld_ISAKMP_ID_FQDN(key);

	mc->common_member();
	mc->member(new MmAsciiString("ID", 0, EVALZERO()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_USER_FQDN *
McPld_ISAKMP_ID_USER_FQDN::create(CSTR key)
{
	McPld_ISAKMP_ID_USER_FQDN *mc = new McPld_ISAKMP_ID_USER_FQDN(key);

	mc->common_member();
	mc->member(new MmAsciiString("ID", 0, EVALZERO()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV4_ADDR_SUBNET *
McPld_ISAKMP_ID_IPV4_ADDR_SUBNET::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV4_ADDR_SUBNET *mc =
		new McPld_ISAKMP_ID_IPV4_ADDR_SUBNET(key);

	mc->common_member();
	mc->member(new MmV4Addr("ID1", MUST(), MUST()));
	mc->member(new MmV4Addr("ID2", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV6_ADDR *
McPld_ISAKMP_ID_IPV6_ADDR::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV6_ADDR *mc = new McPld_ISAKMP_ID_IPV6_ADDR(key);

	mc->common_member();
	mc->member(new MmV6Addr("ID", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV6_ADDR_SUBNET *
McPld_ISAKMP_ID_IPV6_ADDR_SUBNET::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV6_ADDR_SUBNET *mc =
		new McPld_ISAKMP_ID_IPV6_ADDR_SUBNET(key);

	mc->common_member();
	mc->member(new MmV6Addr("ID1", MUST(), MUST()));
	mc->member(new MmV6Addr("ID2", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV4_ADDR_RANGE *
McPld_ISAKMP_ID_IPV4_ADDR_RANGE::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV4_ADDR_RANGE *mc =
		new McPld_ISAKMP_ID_IPV4_ADDR_RANGE(key);

	mc->common_member();
	mc->member(new MmV4Addr("ID1", MUST(), MUST()));
	mc->member(new MmV4Addr("ID2", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_IPV6_ADDR_RANGE *
McPld_ISAKMP_ID_IPV6_ADDR_RANGE::create(CSTR key)
{
	McPld_ISAKMP_ID_IPV6_ADDR_RANGE *mc =
		new McPld_ISAKMP_ID_IPV6_ADDR_RANGE(key);

	mc->common_member();
	mc->member(new MmV6Addr("ID1", MUST(), MUST()));
	mc->member(new MmV6Addr("ID2", MUST(), MUST()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_DER_ASN1_DN *
McPld_ISAKMP_ID_DER_ASN1_DN::create(CSTR key)
{
	McPld_ISAKMP_ID_DER_ASN1_DN *mc =
		new McPld_ISAKMP_ID_DER_ASN1_DN(key);

	mc->common_member();
	mc->member(new MmVarOctets("ID", 0, EVALZERO()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_DER_ASN1_GN *
McPld_ISAKMP_ID_DER_ASN1_GN::create(CSTR key)
{
	McPld_ISAKMP_ID_DER_ASN1_GN *mc = new McPld_ISAKMP_ID_DER_ASN1_GN(key);

	mc->common_member();
	mc->member(new MmVarOctets("ID", 0, EVALZERO()));

	MmIDtype_onID::add(mc);

	return(mc);
}

McPld_ISAKMP_ID_KEY_ID *
McPld_ISAKMP_ID_KEY_ID::create(CSTR key)
{
	McPld_ISAKMP_ID_KEY_ID *mc = new McPld_ISAKMP_ID_KEY_ID(key);

	mc->common_member();
	mc->member(new MmVarOctets("ID", 0, EVALZERO()));

	MmIDtype_onID::add(mc);

	return(mc);
}



////////////////////////////////
// Certificate Payload        //
////////////////////////////////
McPld_ISAKMP_CERT *
McPld_ISAKMP_CERT::create(CSTR key)
{
	McPld_ISAKMP_CERT *mc = new McPld_ISAKMP_CERT(key);

	mc->common_member();
	mc->member(new MmUint("CertEncoding", 8, UN(0), UN(0)));
	mc->member(new MmVarOctets("CertData", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////////////
// Certificate Request Payload        //
////////////////////////////////////////
McPld_ISAKMP_CR *
McPld_ISAKMP_CR::create(CSTR key)
{
	McPld_ISAKMP_CR *mc = new McPld_ISAKMP_CR(key);

	mc->common_member();
	mc->member(new MmUint("CertType", 8, UN(0), UN(0)));
	mc->member(new MmVarOctets("CertAuthority", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Hash Payload               //
////////////////////////////////
McPld_ISAKMP_HASH *
McPld_ISAKMP_HASH::create(CSTR key)
{
	McPld_ISAKMP_HASH *mc = new McPld_ISAKMP_HASH(key);

	mc->common_member();
	mc->member(new MmP2_HASH_2("HashData", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Signature Payload          //
////////////////////////////////
McPld_ISAKMP_SIG *
McPld_ISAKMP_SIG::create(CSTR key)
{
	McPld_ISAKMP_SIG *mc = new McPld_ISAKMP_SIG(key);

	mc->common_member();
	mc->member(new MmVarOctets("SignatureData", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Nonce Payload              //
////////////////////////////////
McPld_ISAKMP_NONCE *
McPld_ISAKMP_NONCE::create(CSTR key)
{
	McPld_ISAKMP_NONCE *mc = new McPld_ISAKMP_NONCE(key);

	mc->common_member();
	mc->member(new MmVarOctets("NonceData", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Notification Payload       //
////////////////////////////////
void
McPld_ISAKMP_N::common_member()
{
	McPld_ISAKMP::common_member();
	DOImember(
		new MmUint(
			"DOI",
			32,
			GENEHC(this, McPld_ISAKMP_N, DOI),
			EVALHC(this, McPld_ISAKMP_N, DOI)
		)
	);
	member(new MmUint("ProtocolID", 8, UN(0), UN(0)));

	SPIsize_member(
		new MmUint(
			"SPIsize",
			8,
			GENEHC(this, McPld_ISAKMP_N, SPIsize),
			EVALANY()
		)
	);

	NotifyMessageType_member(
		new MmUint(
			"NotifyMessageType",
			16,
			GENEHC(this, McPld_ISAKMP_N, NotifyMessageType),
			EVALHC(this, McPld_ISAKMP_N, NotifyMessageType)
		)
	);

	return;
}



McPld_ISAKMP_N_ANY *
McPld_ISAKMP_N_ANY::create(CSTR key)
{
	McPld_ISAKMP_N_ANY *mc = new McPld_ISAKMP_N_ANY(key);

	mc->common_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmVarOctets("NotificationData", 0, EVALZERO()));

	MmDOIonN::add_other(mc);

	return(mc);
}



McPld_ISAKMP_N_ISAKMP *
McPld_ISAKMP_N_ISAKMP::create(CSTR key)
{
	McPld_ISAKMP_N_ISAKMP *mc = new McPld_ISAKMP_N_ISAKMP(key);

	mc->common_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmVarOctets("NotificationData", 0, EVALZERO()));

	MmDOIonN::add(mc);

	return(mc);
}



McPld_ISAKMP_N_IPsec_ANY *
McPld_ISAKMP_N_IPsec_ANY::create(CSTR key)
{
	McPld_ISAKMP_N_IPsec_ANY *mc = new McPld_ISAKMP_N_IPsec_ANY(key);

	mc->common_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmVarOctets("NotificationData", 0, EVALZERO()));

	MmType_onN_IPsec::add_other(mc);

	return(mc);
}



McPld_ISAKMP_N_IPsec_ResponderLT *
McPld_ISAKMP_N_IPsec_ResponderLT::create(CSTR key)
{
	McPld_ISAKMP_N_IPsec_ResponderLT *mc =
		new McPld_ISAKMP_N_IPsec_ResponderLT(key);

	mc->common_member();
	mc->SPImember(new MmISAKMP_SPI("SPI", 0, EVALZERO()));

	mc->member(new MmAttr_onT("attribute"));

	MmType_onN_IPsec::add(mc);

	return(mc);
}



McPld_ISAKMP_N_IPsec_ReplayStat *
McPld_ISAKMP_N_IPsec_ReplayStat::create(CSTR key)
{
	McPld_ISAKMP_N_IPsec_ReplayStat *mc =
		new McPld_ISAKMP_N_IPsec_ReplayStat(key);

	mc->common_member();
	mc->SPImember(new MmISAKMP_SPI_ReplayStat("SPI", 0, EVALZERO()));

	mc->member(new MmUint("NotificationData", 32, UN(0), UN(0)));

	MmType_onN_IPsec::add(mc);

	return(mc);
}



////////////////////////////////
// Delete Payload             //
////////////////////////////////
McPld_ISAKMP_D *
McPld_ISAKMP_D::create(CSTR key)
{
	McPld_ISAKMP_D *mc = new McPld_ISAKMP_D(key);

	mc->common_member();

	mc->member(new MmUint("DOI",               32, UN(0), UN(0)));
	mc->member(new MmUint("ProtocolID",         8, UN(0), UN(0)));

	mc->SPIsize_member(
		new MmSPIsize(
			mc,
			"SPIsize",
			8,
			GENEHC(mc, McPld_ISAKMP_D, SPIsize),
			EVALANY()
		)
	);

	mc->NumberOfSPI_member(
		new MmNumberOfSPI(
			mc,
			"NumberOfSPI",
			16,
			GENEHC(mc, McPld_ISAKMP_D, NumberOfSPI),
			EVALANY()
		)
	);

	mc->member(
		new MmMultiple(
			new MmSPI_onD(mc, "SPI", 0, EVALZERO()),
			(METH_HC_MLC)&McPld_ISAKMP_D::HC_MLC(SPI)
		)
	);

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Vendor ID Payload          //
////////////////////////////////
McPld_ISAKMP_VID *
McPld_ISAKMP_VID::create(CSTR key)
{
	McPld_ISAKMP_VID *mc = new McPld_ISAKMP_VID(key);

	mc->common_member();
	mc->member(new MmVarOctets("VID", 0, EVALZERO()));

	MmPayload_onISAKMP::add(mc);
	MmISAKMP_PonSA::add(mc);
	MmISAKMP_TonP::add(mc);

	return(mc);
}



////////////////////////////////
// Data Attributes            //
////////////////////////////////
void
McAttr_ISAKMP::common_member()
{
	Attr_member(
		new MmUint(
			"AF",
			1,
			GENEHC(this, McAttr_ISAKMP, AF),
			EVALHC(this, McAttr_ISAKMP, AF)
		)
	);

	member(new MmUint("Type", 15, UN(0), UN(0)));
}



McAttr_ISAKMP *
McAttr_ISAKMP::create(CSTR key)
{
	McAttr_ISAKMP *mc = new McAttr_ISAKMP(key);

	mc->common_member();

	mc->member(new MmVarOctets("data", 0, EVALZERO()));

	MmAttr_onT::add_other(mc);

	return(mc);
}



McAttr_ISAKMP_TLV *
McAttr_ISAKMP_TLV::create(CSTR key)
{
	McAttr_ISAKMP_TLV *mc = new McAttr_ISAKMP_TLV(key);

	mc->common_member();

	mc->Length_member(
		new MmUint(
			"Length",
			16,
			GENEHC(mc, McAttr_ISAKMP_TLV, Length),
			EVALANY()
		)
	);

	mc->member(new MmVarOctets("Value", 0, EVALZERO()));

	MmAttr_onT::add(mc);

	return(mc);
}



McAttr_ISAKMP_TV *
McAttr_ISAKMP_TV::create(CSTR key)
{
	McAttr_ISAKMP_TV *mc = new McAttr_ISAKMP_TV(key);

	mc->common_member();

	mc->member(new MmUint("Value", 16, UN(0), UN(0)));

	MmAttr_onT::add(mc);

	return(mc);
}


syntax highlighted by Code2HTML, v. 0.9.1