//
// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
// YDC Corporation, 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/McIKE.h,v 1.2 2005/05/09 09:35:23 akisada Exp $
//

////////////////////////////////////////////////////////////////
// RFC 2407 - IP Security Domain of Interpretation            //
// RFC 2408 - ISAKMP                                          //
////////////////////////////////////////////////////////////////

#ifndef __McIKE_h__
#define __McIKE_h__

#include "PvOctets.h"
#include "McSub.h"
#include "MmObject.h"
#include "McUDP.h"
#include "McESP.h"
#include "PAlgorithm.h"



extern uint32_t ISAKMP_Message_ID;



// RFC 2408 - ISAKMP
// 3.1 ISAKMP Header Format
// Next Payload
const int32_t TP_ISAKMP_NPTYPE_NONE	= 0;
const int32_t TP_ISAKMP_NPTYPE_SA	= 1;
const int32_t TP_ISAKMP_NPTYPE_P	= 2;
const int32_t TP_ISAKMP_NPTYPE_T	= 3;
const int32_t TP_ISAKMP_NPTYPE_KE	= 4;
const int32_t TP_ISAKMP_NPTYPE_ID	= 5;
const int32_t TP_ISAKMP_NPTYPE_CERT	= 6; 
const int32_t TP_ISAKMP_NPTYPE_CR	= 7;
const int32_t TP_ISAKMP_NPTYPE_HASH	= 8;
const int32_t TP_ISAKMP_NPTYPE_SIG	= 9;
const int32_t TP_ISAKMP_NPTYPE_NONCE	= 10;
const int32_t TP_ISAKMP_NPTYPE_N	= 11;
const int32_t TP_ISAKMP_NPTYPE_D	= 12;
const int32_t TP_ISAKMP_NPTYPE_VID	= 13;



// RFC 2408 - ISAKMP
// A.2 Internet IP Security DOI Assigned Value
const int32_t TP_ISAKMP_IPDOI	= 1;



// RFC 2407 - IP Security Domain of Interpretation
// 4.2 IPSEC Situation Definition
// Situation
const int32_t TP_IPSECDOI_SIT_IDENTITY_ONLY	= 0x01;
#if 0
const int32_t TP_IPSECDOI_SIT_SECRECY		= 0x02;
const int32_t TP_IPSECDOI_SIT_INTEGRITY		= 0x04;
#endif



// RFC 2407 - IP Security Domain of Interpretation
// 4.4.1 IPSEC Security Protocol Identifier
const int32_t TP_IPSECDOI_PROTO_ISAKMP		= 1;
const int32_t TP_IPSECDOI_PROTO_AH		= 2;
const int32_t TP_IPSECDOI_PROTO_ESP		= 3;
const int32_t TP_IPSECDOI_PROTO_IPCOMP		= 4;



// RFC 2407 - IP Security Domain of Interpretation
// 4.6.2.1 Identification Type Values
const int32_t TP_IPSECDOI_ID_IPV4_ADDR		= 1;
const int32_t TP_IPSECDOI_ID_FQDN		= 2;
const int32_t TP_IPSECDOI_ID_USER_FQDN		= 3;
const int32_t TP_IPSECDOI_ID_IPV4_ADDR_SUBNET	= 4;
const int32_t TP_IPSECDOI_ID_IPV6_ADDR		= 5;
const int32_t TP_IPSECDOI_ID_IPV6_ADDR_SUBNET	= 6;
const int32_t TP_IPSECDOI_ID_IPV4_ADDR_RANGE	= 7;
const int32_t TP_IPSECDOI_ID_IPV6_ADDR_RANGE	= 8;
const int32_t TP_IPSECDOI_ID_DER_ASN1_DN	= 9;
const int32_t TP_IPSECDOI_ID_DER_ASN1_GN	= 10;
const int32_t TP_IPSECDOI_ID_KEY_ID		= 11;



// RFC 2407 - IP Security Domain of Interpretation
// 4.6.3 IPSEC Notify Message Types
const int32_t TP_ISAKMP_NTYPE_RESPONDER_LIFETIME	= 24576;
const int32_t TP_ISAKMP_NTYPE_REPLAY_STATUS		= 24577;
#if 0
const int32_t TP_ISAKMP_NTYPE_INITIAL_CONTACT		= 24578;
#endif



//
// ISAKMP
//
////////////////////////////////

class McUdp_ISAKMP: public McUpper {
	static McUdp_ISAKMP *instance_;
	static class McHdr_ISAKMP *tophdr_;

	McUdp_ISAKMP(CSTR);

	public:
		virtual ~McUdp_ISAKMP();
		static McUdp_ISAKMP *create(CSTR, CSTR);
		static McUdp_ISAKMP *instance() { return(instance_); }
		int32_t upperPort() const { return(TP_Udp_ISAKMP); }
		virtual uint32_t length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
		virtual int32_t token() const {
			return(metaToken(tkn_isakmp_upper_)); };
};



//
// ISAKMP Header
//
////////////////////////////////

class EFlagValueCtrl {
	uint32_t e;

	public:
		EFlagValueCtrl();
		virtual ~EFlagValueCtrl();

		void set_e(uint32_t E) { e = E; return; }
		uint32_t get_e(void) const { return(e); }
};



class McHdr_ISAKMP: public McHeader {
	McHdr_ISAKMP(CSTR);
	MmUint *Layerlength_;
	MmUint *EFlag_;
	EFlagValueCtrl *ectrl_;
	MmUint *MID_;

	void
	Layerlength_member(MmUint *meta)
	{
		Layerlength_ = meta;
		member(meta);
	}

	void
	EFlag_member(MmUint *meta)
	{
		EFlag_ = meta;
		member(meta);
	}

	void MIDmember(MmUint *);

	DEC_HCGENE(Length);
	DEC_HCGENE(NextPayload);
	DEC_HCEVAL(NextPayload);
	DEC_HCGENE(EFlag);
	DEC_HCEVAL(EFlag);

	int32_t get_next_headerType(WObject *) const;
	bool need_ISAKMP_encryption(WObject *) const;

	public:
		virtual ~McHdr_ISAKMP();
		static McHdr_ISAKMP *create(CSTR);

		virtual uint32_t Layerlength_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;

		EFlagValueCtrl *get_ectrl(void) const { return(ectrl_); }
};

class MmISAKMP_MessageID: public MmUint {
	public:
		MmISAKMP_MessageID(CSTR, uint16_t, const PObject * = 0,
			const PObject * = 0, const ICVoverwriter * = 0,
			METH_HC_ForIPinfo = 0);
		virtual ~MmISAKMP_MessageID();
		virtual bool generate(WControl &, WObject *, OCTBUF &) const;
};



//
// ISAKMP encryption
//
////////////////////////////////

class McISAKMP_Encryption: public McHeader {
	protected:
		McISAKMP_Encryption(CSTR);
	public:
		virtual ~McISAKMP_Encryption();
		static McISAKMP_Encryption *create(CSTR);
		virtual uint32_t length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
		bool ISAKMP_encryption() const { return(true); }

		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;

		virtual RObject *reverseRc(RControl &,
			RObject *, const ItPosition &, PvObject *) const;

		virtual WObject *compose(WControl &,
			WObject *, const PObject *) const;

		virtual WObject *composeWc(WControl &,
			WObject *, const PObject *) const;
};

struct isakmp_gen {
	uint8_t		np;
	uint8_t		reserved;
	uint16_t	len;
} __attribute__((__packed__));

class McISAKMP_Decrypted: public McObject {
	friend class MmISAKMP_Crypted;
#if 0
	MmUint *PadLength_;
#endif
	McISAKMP_Decrypted(CSTR str);
	static  McISAKMP_Decrypted *create(CSTR);
	virtual ~McISAKMP_Decrypted();

	RObject *Self_reverse(RControl &, OCTBUF *) const;
	WObject *Self_composeList(WControl &, const PObjectList &) const;
#if 0
	DEC_HCGENE(PadLength);
#endif
	uint32_t calc_padlen(RControl &, OCTSTR, uint32_t, bool &) const;
};

class MmISAKMP_Crypted: public MmVarOctets {
	class McISAKMP_Decrypted *mDecrypted_;

	public:
		MmISAKMP_Crypted(CSTR str);
		virtual ~MmISAKMP_Crypted();
		virtual MObject *findMember(CSTR str) const;

		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;

		virtual RObject *reverseRm(RControl &,
			RObject *, const ItPosition &, const ItPosition &,
			PvObject *) const;

		virtual void composeList(WControl &, WObject *,
			const PObjectList &)const;
};



class MmAlgorithm_onISAKMP: public MmReference_Must1 {
	public:
		MmAlgorithm_onISAKMP(CSTR);
		virtual ~MmAlgorithm_onISAKMP();
		int32_t token() const { return(metaToken(tkn_algorithm_ref_)); }

		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;

		virtual bool disused() const;
};

class MmIVEC_onISAKMP: public MmVarOctets {
	public:
		MmIVEC_onISAKMP(CSTR key): MmVarOctets(key) {}
		virtual ~MmIVEC_onISAKMP() {}

		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;

		virtual int32_t token() const {
			return(metaToken(tkn_dummy_)); };

		virtual bool disused() const;

		virtual RObject *reverseRm(RControl &, RObject *,
			const ItPosition &, const ItPosition &,
			PvObject *) const;

//		virtual uint32_t objectLength(const PObject * = 0,
//			const WObject * = 0) const;
};



#include "McAlgorithm.h"
class McISAKMP_Algorithm: public McAlgorithm {
	protected:
		McISAKMP_Algorithm(CSTR);

	public:
		virtual ~McISAKMP_Algorithm();
		static  McISAKMP_Algorithm *create(CSTR);
		virtual PObject *tokenObject(int, CSTR) const;
};



class McISAKMP_PlainText: public McObject {
	friend class McISAKMP_Decrypted;

	McISAKMP_PlainText(CSTR str);
	virtual ~McISAKMP_PlainText();

	static McISAKMP_PlainText *create(CSTR);

	virtual uint32_t length_for_reverse(RControl &,
		ItPosition &, OCTBUF &)const;

	virtual RObject *reverse(RControl &,
		RObject *, ItPosition &, OCTBUF &) const;

	virtual bool generate(WControl &, WObject *, OCTBUF &) const;
	virtual void composeList(WControl &,
		WObject *, const PObjectList &) const;
};



class MmISAKMP_Padding: public MmESP_Padding {
	public:
		MmISAKMP_Padding(CSTR key): MmESP_Padding(key) {}
		virtual ~MmISAKMP_Padding() {}

		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
		virtual WObject *composeWm(WControl &,
			WObject *, const PObject *) const;
};

class WmISAKMP_Padding: public WmObject {
	const PaObject* sa_;

	public:
		WmISAKMP_Padding(WObject *, const MObject *, const PaObject *);
		virtual ~WmISAKMP_Padding();
		virtual void internalGeneratePrologue(ItPosition &);
};



class PaISAKMP: public PaESP {
	public:
		PaISAKMP::PaISAKMP(const MObject *m, CSTR st, int l):
			PaESP(m, st, l) {};
		virtual ~PaISAKMP() {}

		virtual uint32_t Crypted_Length(uint32_t) const;
		virtual OCTBUF *Padding_Octets(uint32_t) const;
};



//
// Generic Payload
//
////////////////////////////////

class McPld_ISAKMP: public McHeader {
	MmUint *Layerlength_;

	void
	Layerlength_member(MmUint *meta)
	{
		Layerlength_ = meta;
		member(meta);
	}

	int32_t get_next_headerType(WObject *) const;

	protected:
		McPld_ISAKMP(CSTR);
		void common_member();
	public:
		virtual ~McPld_ISAKMP();

		virtual uint32_t length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;

		DEC_HCGENE(PayloadLength);
		DEC_HCGENE(NextPayload);
		DEC_HCEVAL(NextPayload);
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_ANY: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_ANY(CSTR);
	public:
		virtual ~McPld_ISAKMP_ANY();
		static McPld_ISAKMP_ANY *create(CSTR);
};



//
// Security Association Payload
//
////////////////////////////////

class McPld_ISAKMP_SA_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_SA_ONE *instance_;
		McPld_ISAKMP_SA_ONE(CSTR);
	public:
		static McPld_ISAKMP_SA_ONE *instance();
		virtual ~McPld_ISAKMP_SA_ONE();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_SA); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_SA: public McPld_ISAKMP {
	MmUint *DOI_;

	void
	DOImember(MmUint *meta)
	{
		DOI_ = meta;
		member(meta);
	}

	DEC_HCGENE(DOI);
	DEC_HCEVAL(DOI);
	int32_t get_DOIvalue(WObject *) const;

	protected:
		McPld_ISAKMP_SA(CSTR);
	public:
		virtual ~McPld_ISAKMP_SA();
		void common_member();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_SA); }
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_SA_ANY: public McPld_ISAKMP_SA {
	protected:
		McPld_ISAKMP_SA_ANY(CSTR);
	public:
		virtual ~McPld_ISAKMP_SA_ANY();
		static McPld_ISAKMP_SA_ANY *create(CSTR);
};

class McPld_ISAKMP_SA_IPsec_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_SA_IPsec_ONE *instance_;
		McPld_ISAKMP_SA_IPsec_ONE(CSTR);
	public:
		static McPld_ISAKMP_SA_IPsec_ONE *instance();
		virtual ~McPld_ISAKMP_SA_IPsec_ONE();
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_SA_IPsec: public McPld_ISAKMP_SA {
	MmUint *SIT_;

	void
	SITmember(MmUint *meta)
	{
		SIT_ = meta;
		member(meta);
	}

	DEC_HCGENE(Situation);
	DEC_HCEVAL(Situation);
	int32_t get_SITvalue(WObject *) const;

	protected:
		McPld_ISAKMP_SA_IPsec(CSTR);
	public:
		virtual ~McPld_ISAKMP_SA_IPsec();
		void common_member();
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_SA_IPsec_ANY: public McPld_ISAKMP_SA_IPsec {
	protected:
		McPld_ISAKMP_SA_IPsec_ANY(CSTR);
	public:
		virtual ~McPld_ISAKMP_SA_IPsec_ANY();
		static McPld_ISAKMP_SA_IPsec_ANY *create(CSTR);
};

class McPld_ISAKMP_SA_IPsec_IDonly: public McPld_ISAKMP_SA_IPsec {
	protected:
		McPld_ISAKMP_SA_IPsec_IDonly(CSTR);
	public:
		virtual ~McPld_ISAKMP_SA_IPsec_IDonly();
		static McPld_ISAKMP_SA_IPsec_IDonly *create(CSTR);
		int32_t SITvalue() const {
			return(TP_IPSECDOI_SIT_IDENTITY_ONLY); }
};



//
// Proposal Payload
//
////////////////////////////////

class McPld_ISAKMP_P_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_P_ONE *instance_;
		McPld_ISAKMP_P_ONE(CSTR);
	public:
		static McPld_ISAKMP_P_ONE *instance();
		virtual ~McPld_ISAKMP_P_ONE();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_P); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class Tcounter {
	int32_t transforms_;

	public:
		Tcounter(): transforms_(0) {}
		virtual ~Tcounter() {}
		void inc_trans() { transforms_ ++; return; }
		int32_t get_trans() { return(transforms_); }
		void set_trans(int32_t d) { transforms_ = d; return; }
};

class McPld_ISAKMP_P: public McPld_ISAKMP {
	MmUint *ProtocolID_;
	MmUint *SPIsize_;
	MObject *SPI_;

	class Tcounter *Tcounter_;

	void
	ProtocolIDmember(MmUint *meta)
	{
		ProtocolID_	= meta;
		member(meta);
	}

	DEC_HCGENE(ProtocolID);
	DEC_HCEVAL(ProtocolID);
	DEC_HCGENE(SPIsize);
	DEC_HCGENE(NumOfTransforms);
	DEC_HCEVAL(NumOfTransforms);

	int32_t get_ProtocolID(WObject *) const;

	protected:
		McPld_ISAKMP_P(CSTR);
		void common_member();
		void spisize_member();
		void transnum_member();

		void
		SPIsize_member(MmUint *meta)
		{
			SPIsize_	= meta;
			member(meta);
		}

		void
		SPImember(MObject *meta)
		{
			SPI_	= meta;
			member(meta);
		}
	public:
		virtual ~McPld_ISAKMP_P();
		static McPld_ISAKMP_P *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_P); }
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;

		void increase_transforms() {
			if(Tcounter_) { Tcounter_->inc_trans(); } return; }
		const int32_t get_transforms() const {
			return(Tcounter_? Tcounter_->get_trans(): 0); }
		void set_transforms(int32_t d) const {
			if(Tcounter_) { Tcounter_->set_trans(d); } return; }
#if 0
		virtual bool generate(WControl &, WObject *, OCTBUF &) const;
#else
		virtual WObject *composeWc(WControl &,
			WObject *, const PObject *) const;
#endif
};

class McPld_ISAKMP_P_ISAKMP: public McPld_ISAKMP_P {
	protected:
		McPld_ISAKMP_P_ISAKMP(CSTR);
	public:
		virtual ~McPld_ISAKMP_P_ISAKMP();
		static McPld_ISAKMP_P_ISAKMP *create(CSTR);
		int32_t ProtocolID() const { return(TP_IPSECDOI_PROTO_ISAKMP); }
};

class McPld_ISAKMP_P_IPsec_AH: public McPld_ISAKMP_P {
	protected:
		McPld_ISAKMP_P_IPsec_AH(CSTR);
	public:
		virtual ~McPld_ISAKMP_P_IPsec_AH();
		static McPld_ISAKMP_P_IPsec_AH *create(CSTR);
		int32_t ProtocolID() const { return(TP_IPSECDOI_PROTO_AH); }
};

class McPld_ISAKMP_P_IPsec_ESP: public McPld_ISAKMP_P {
	protected:
		McPld_ISAKMP_P_IPsec_ESP(CSTR);
	public:
		virtual ~McPld_ISAKMP_P_IPsec_ESP();
		static McPld_ISAKMP_P_IPsec_ESP *create(CSTR);
		int32_t ProtocolID() const { return(TP_IPSECDOI_PROTO_ESP); }
};

class McPld_ISAKMP_P_IPCOMP: public McPld_ISAKMP_P {
	protected:
		McPld_ISAKMP_P_IPCOMP(CSTR);
	public:
		virtual ~McPld_ISAKMP_P_IPCOMP();
		static McPld_ISAKMP_P_IPCOMP *create(CSTR);
		int32_t ProtocolID() const { return(TP_IPSECDOI_PROTO_IPCOMP); }
};



//
// Transform Payload
//
////////////////////////////////

class McPld_ISAKMP_T: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_T(CSTR);
	public:
		virtual ~McPld_ISAKMP_T();
		static McPld_ISAKMP_T *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_T); }
};



//
// Key Exchange Payload
//
////////////////////////////////

class McPld_ISAKMP_KE: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_KE(CSTR);
	public:
		virtual ~McPld_ISAKMP_KE();
		static McPld_ISAKMP_KE *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_KE); }
};



//
// Identification Payload
//
////////////////////////////////

class McPld_ISAKMP_ID_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_ID_ONE *instance_;
		McPld_ISAKMP_ID_ONE(CSTR);
	public:
		static McPld_ISAKMP_ID_ONE *instance();
		virtual ~McPld_ISAKMP_ID_ONE();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_ID); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_ID: public McPld_ISAKMP {
	MmUint *IDtype_;

	void
	IDtype_member(MmUint *meta)
	{
		IDtype_	= meta;
		member(meta);
	}

	DEC_HCGENE(IDtype);
	DEC_HCEVAL(IDtype);
	int32_t get_IDtype(WObject *) const;

	protected:
		McPld_ISAKMP_ID(CSTR);
		void common_member();
	public:
		virtual ~McPld_ISAKMP_ID();
		static McPld_ISAKMP_ID *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_ID); }
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_ID_IPV4_ADDR: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV4_ADDR(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV4_ADDR();
		static McPld_ISAKMP_ID_IPV4_ADDR *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_IPV4_ADDR); }
};

class McPld_ISAKMP_ID_FQDN: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_FQDN(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_FQDN();
		static McPld_ISAKMP_ID_FQDN *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_FQDN); }
};

class McPld_ISAKMP_ID_USER_FQDN: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_USER_FQDN(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_USER_FQDN();
		static McPld_ISAKMP_ID_USER_FQDN *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_USER_FQDN); }
};

class McPld_ISAKMP_ID_IPV4_ADDR_SUBNET: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV4_ADDR_SUBNET(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV4_ADDR_SUBNET();
		static McPld_ISAKMP_ID_IPV4_ADDR_SUBNET *create(CSTR);

		int32_t
		IDtype() const
		{
			return(TP_IPSECDOI_ID_IPV4_ADDR_SUBNET);
		}
};

class McPld_ISAKMP_ID_IPV6_ADDR: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV6_ADDR(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV6_ADDR();
		static McPld_ISAKMP_ID_IPV6_ADDR *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_IPV6_ADDR); }
};

class McPld_ISAKMP_ID_IPV6_ADDR_SUBNET: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV6_ADDR_SUBNET(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV6_ADDR_SUBNET();
		static McPld_ISAKMP_ID_IPV6_ADDR_SUBNET *create(CSTR);

		int32_t
		IDtype() const
		{
			return(TP_IPSECDOI_ID_IPV6_ADDR_SUBNET);
		}
};

class McPld_ISAKMP_ID_IPV4_ADDR_RANGE: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV4_ADDR_RANGE(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV4_ADDR_RANGE();
		static McPld_ISAKMP_ID_IPV4_ADDR_RANGE *create(CSTR);

		int32_t
		IDtype() const
		{
			return(TP_IPSECDOI_ID_IPV4_ADDR_RANGE);
		}
};

class McPld_ISAKMP_ID_IPV6_ADDR_RANGE: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_IPV6_ADDR_RANGE(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_IPV6_ADDR_RANGE();
		static McPld_ISAKMP_ID_IPV6_ADDR_RANGE *create(CSTR);

		int32_t
		IDtype() const
		{
			return(TP_IPSECDOI_ID_IPV6_ADDR_RANGE);
		}
};

class McPld_ISAKMP_ID_DER_ASN1_DN: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_DER_ASN1_DN(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_DER_ASN1_DN();
		static McPld_ISAKMP_ID_DER_ASN1_DN *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_DER_ASN1_DN); }
};

class McPld_ISAKMP_ID_DER_ASN1_GN: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_DER_ASN1_GN(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_DER_ASN1_GN();
		static McPld_ISAKMP_ID_DER_ASN1_GN *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_DER_ASN1_GN); }
};

class McPld_ISAKMP_ID_KEY_ID: public McPld_ISAKMP_ID {
	protected:
		McPld_ISAKMP_ID_KEY_ID(CSTR);
	public:
		virtual ~McPld_ISAKMP_ID_KEY_ID();
		static McPld_ISAKMP_ID_KEY_ID *create(CSTR);
		int32_t IDtype() const { return(TP_IPSECDOI_ID_KEY_ID); }
};



//
// Certificate Payload
//
////////////////////////////////

class McPld_ISAKMP_CERT: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_CERT(CSTR);
	public:
		virtual ~McPld_ISAKMP_CERT();
		static McPld_ISAKMP_CERT *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_CERT); }
};



//
// Certificate Request Payload
//
////////////////////////////////

class McPld_ISAKMP_CR: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_CR(CSTR);
	public:
		virtual ~McPld_ISAKMP_CR();
		static McPld_ISAKMP_CR *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_CR); }
};



//
// Hash Payload
//
////////////////////////////////

class McPld_ISAKMP_HASH: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_HASH(CSTR);
	public:
		virtual ~McPld_ISAKMP_HASH();
		static McPld_ISAKMP_HASH *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_HASH); }
		virtual PObject *tokenObject(int, CSTR) const;
};

class PfP2_HASH_2: public PvFunction {
	private:
		const MvP2_HASH_2 *meta_;
		OCTSTR context_;
	public:
		PfP2_HASH_2(const MvP2_HASH_2 *, CSTR, int);
		virtual ~PfP2_HASH_2();
		const MvP2_HASH_2 *metaClass() const;
		virtual const MObject *meta() const;
		void init();
		void update(const OCTBUF &);
		PvOctets *result();
};

inline const MvP2_HASH_2 *PfP2_HASH_2::metaClass() const { return(meta_); }

class PaP2_HASH_2: public PcObject {
	private:
		PfP2_HASH_2 *p2_hash_2_;
	public:
		PaP2_HASH_2(const MObject*, CSTR, int);
		virtual ~PaP2_HASH_2();

		virtual PObject *ike_p2_hash_member(PObject *);

		virtual OCTBUF *P2_HASH_2_Calculate(const OCTBUF &) const;
		virtual WObject *selfCompose(WControl &, WObject *) const;
};

interfaceCmList(P2_HASH_2List, PaP2_HASH_2);

class KeepP2_HASH_2 {
	private:
		P2_HASH_2List *p2_hash_2_;
		uint32_t current_;
	public:
		KeepP2_HASH_2();
		virtual ~KeepP2_HASH_2();

		const PaP2_HASH_2 *GetP2_HASH_2(void);
		void SetP2_HASH_2(const PaP2_HASH_2 *);
//		void KeepP2_HASH_2::ResetCounter(void);
};

class MmP2_HASH_2: public MmVarOctets {
	private:
		KeepP2_HASH_2 *keephash_;
	public:
		MmP2_HASH_2(CSTR, const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);
		virtual ~MmP2_HASH_2();

		virtual RObject *reverseRm(RControl &, RObject *,
			const ItPosition &, const ItPosition &,
			PvObject *) const;
		virtual WObject *composeWm(WControl &, WObject *,
			const PObject *) const;
		virtual RObject *reverse(RControl &, RObject *, ItPosition &,
			OCTBUF &) const;
		virtual bool generate(WControl &, WObject *, OCTBUF &) const;
};



class RmP2_HASH_2: public RmObject {
	const PaP2_HASH_2 *hash_;
	PvObject *calc_pvalue_;

	public:
		RmP2_HASH_2(RObject *, const MObject *, const ItPosition &,
			const ItPosition &, PvObject *, const PaP2_HASH_2 *);

		virtual ~RmP2_HASH_2();
		void set_calc_pvalue(PvObject *);
		PvObject *calc_pvalue() const { return(calc_pvalue_); }
		virtual void post_reverse(Con_IPinfo &, RControl &, RObject *);
};



class WmP2_HASH_2: public WmObject {
	const PaP2_HASH_2 *hash_;

	public:
		WmP2_HASH_2(WObject *, const MObject *, const PObject *,
			const PaP2_HASH_2 *);
		virtual ~WmP2_HASH_2();
		virtual void post_generate(Con_IPinfo &, WControl &, OCTBUF &,
			WObject *);
		virtual bool doEvaluate(WControl &, RObject &);
};



//
// Signature Payload
//
////////////////////////////////

class McPld_ISAKMP_SIG: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_SIG(CSTR);
	public:
		virtual ~McPld_ISAKMP_SIG();
		static McPld_ISAKMP_SIG *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_SIG); }
};



//
// Nonce Payload
//
////////////////////////////////

class McPld_ISAKMP_NONCE: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_NONCE(CSTR);
	public:
		virtual ~McPld_ISAKMP_NONCE();
		static McPld_ISAKMP_NONCE *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_NONCE); }
};



//
// Notification Payload
//
////////////////////////////////

class McPld_ISAKMP_N_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_N_ONE *instance_;
		McPld_ISAKMP_N_ONE(CSTR);
	public:
		static McPld_ISAKMP_N_ONE *instance();
		virtual ~McPld_ISAKMP_N_ONE();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_N); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_N: public McPld_ISAKMP {
	MmUint *DOI_;
	MmUint *SPIsize_;
	MObject *SPI_;

	void
	DOImember(MmUint *meta)
	{
		DOI_	= meta;
		member(meta);
	}

	void
	SPIsize_member(MmUint *meta)
	{
		SPIsize_	= meta;
		member(meta);
	}

	void
	NotifyMessageType_member(MmUint *meta)
	{
		NotifyMessageType_	= meta;
		member(meta);
	}

	DEC_HCGENE(DOI);
	DEC_HCEVAL(DOI);
	int32_t get_DOIvalue(WObject *) const;

	DEC_HCGENE(NotifyMessageType);
	DEC_HCEVAL(NotifyMessageType);
	int32_t get_NotifyMessageType_value(WObject *) const;

	DEC_HCGENE(SPIsize);

	protected:
		MmUint *NotifyMessageType_;
		McPld_ISAKMP_N(CSTR);
		void
		SPImember(MObject *meta)
		{
			SPI_	= meta;
			member(meta);
		}

	public:
		virtual ~McPld_ISAKMP_N();
		void common_member();
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_N); }
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_N_ANY: public McPld_ISAKMP_N {
	protected:
		McPld_ISAKMP_N_ANY(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_ANY();
		static McPld_ISAKMP_N_ANY *create(CSTR);
		int32_t notify_value() const { return(0); }
};

class McPld_ISAKMP_N_ISAKMP: public McPld_ISAKMP_N {
	protected:
		McPld_ISAKMP_N_ISAKMP(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_ISAKMP();
		static McPld_ISAKMP_N_ISAKMP *create(CSTR);
		int32_t DOIvalue() const { return(0); }
		int32_t notify_value() const { return(0); }
};

class McPld_ISAKMP_N_IPsec_ONE: public McPld_ISAKMP {
	private:
		static McPld_ISAKMP_N_IPsec_ONE *instance_;
		McPld_ISAKMP_N_IPsec_ONE(CSTR);
	public:
		static McPld_ISAKMP_N_IPsec_ONE *instance();
		virtual ~McPld_ISAKMP_N_IPsec_ONE();
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }

		bool containsMc(const MObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_N_IPsec: public McPld_ISAKMP_N {
	protected:
		McPld_ISAKMP_N_IPsec(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_IPsec();
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McPld_ISAKMP_N_IPsec_ANY: public McPld_ISAKMP_N_IPsec {
	protected:
		McPld_ISAKMP_N_IPsec_ANY(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_IPsec_ANY();
		static McPld_ISAKMP_N_IPsec_ANY *create(CSTR);
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }
};

class McPld_ISAKMP_N_IPsec_ResponderLT: public McPld_ISAKMP_N_IPsec {
	protected:
		McPld_ISAKMP_N_IPsec_ResponderLT(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_IPsec_ResponderLT();
		static McPld_ISAKMP_N_IPsec_ResponderLT *create(CSTR);
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }

		int32_t
		notify_value() const
		{
			return(TP_ISAKMP_NTYPE_RESPONDER_LIFETIME);
		}
};

class McPld_ISAKMP_N_IPsec_ReplayStat: public McPld_ISAKMP_N_IPsec {
	protected:
		McPld_ISAKMP_N_IPsec_ReplayStat(CSTR);
	public:
		virtual ~McPld_ISAKMP_N_IPsec_ReplayStat();
		static McPld_ISAKMP_N_IPsec_ReplayStat *create(CSTR);
		int32_t DOIvalue() const { return(TP_ISAKMP_IPDOI); }

		int32_t
		notify_value() const
		{
			return(TP_ISAKMP_NTYPE_REPLAY_STATUS);
		}
#if 0
		virtual uint32_t length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
#endif
};



//
// Delete Payload
//
////////////////////////////////

class SPIcontrol_onD {
	uint32_t size_;
	uint32_t num_;

	public:
		SPIcontrol_onD();
		virtual ~SPIcontrol_onD();

		void set_size(uint32_t size) { size_ = size; return; }
		uint32_t get_size(void) const { return(size_); }

		void set_num(uint32_t num) { num_ = num; return; }
		uint32_t get_num(void) const { return(num_); }
};

class McPld_ISAKMP_D: public McPld_ISAKMP {
	MmUint *SPIsize_;
	MmUint *NumberOfSPI_;
	SPIcontrol_onD *spi_;

	void
	SPIsize_member(MmUint *meta)
	{
		SPIsize_ = meta;
		member(meta);
	}

	void
	NumberOfSPI_member(MmUint *meta)
	{
		NumberOfSPI_ = meta;
		member(meta);
	}

	protected:
		McPld_ISAKMP_D(CSTR);
	public:
		virtual ~McPld_ISAKMP_D();
		static McPld_ISAKMP_D *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_D); }

		DEC_HCGENE(SPIsize);
		DEC_HCGENE(NumberOfSPI);
		DEC_HC_MLC(SPI);

//		virtual RObject *reverse(RControl &,
//			RObject *, ItPosition &, OCTBUF &) const;

		void set_size(uint32_t size) {
			if(spi_) { spi_->set_size(size); } return; }

		uint32_t get_size(void) const {
			return(spi_? spi_->get_size(): 0); }

		void set_num(uint32_t num) {
			if(spi_) { spi_->set_num(num); } return; }

		uint32_t get_num(void) const {
			return(spi_? spi_->get_num(): 0); }

		virtual WObject *composeWc(WControl &,
			WObject *, const PObject *) const;
};

class MmSPIsize: public MmUint {
	McPld_ISAKMP_D *delete_;

	public:
		MmSPIsize(McPld_ISAKMP_D *, CSTR, uint16_t,
			const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);
		virtual ~MmSPIsize();
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class MmNumberOfSPI: public MmUint {
	McPld_ISAKMP_D *delete_;

	public:
		MmNumberOfSPI(McPld_ISAKMP_D *, CSTR, uint16_t,
			const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);
		virtual ~MmNumberOfSPI();
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};

class MmSPI_onD: public MmVarOctets {
	McPld_ISAKMP_D *delete_;

	public:
		MmSPI_onD(McPld_ISAKMP_D *, CSTR,
			const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);
		virtual ~MmSPI_onD();
		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;

		virtual WObject *composeWm(WControl &,
			WObject *, const PObject *) const;
};



//
// Vendor ID Payload
//
////////////////////////////////

class McPld_ISAKMP_VID: public McPld_ISAKMP {
	protected:
		McPld_ISAKMP_VID(CSTR);
	public:
		virtual ~McPld_ISAKMP_VID();
		static McPld_ISAKMP_VID *create(CSTR);
		int32_t headerType() const { return(TP_ISAKMP_NPTYPE_VID); }
};



//
// Data Attributes
//
////////////////////////////////

class McAttr_ISAKMP: public McOption {
	MmUint *Attr_;

	void
	Attr_member(MmUint *meta)
	{
		Attr_	= meta;
		member(meta);
	}

	protected:
		McAttr_ISAKMP(CSTR);
		void common_member();
	public:
		virtual ~McAttr_ISAKMP();
		static McAttr_ISAKMP *create(CSTR);
		DEC_HCGENE(AF);
		DEC_HCEVAL(AF);
		int32_t get_attr_format(WObject *) const;
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McAttr_ISAKMP_TLV: public McAttr_ISAKMP {
	MmUint *Length_;

	void
	Length_member(MmUint *meta)
	{
		Length_	= meta;
		member(meta);
	}

	protected:
		McAttr_ISAKMP_TLV(CSTR);
	public:
		virtual ~McAttr_ISAKMP_TLV();
		static McAttr_ISAKMP_TLV *create(CSTR);
		int32_t headerType() const { return(0); }
		DEC_HCGENE(Length);
		virtual uint32_t length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
};

class McAttr_ISAKMP_TV: public McAttr_ISAKMP {
	protected:
		McAttr_ISAKMP_TV(CSTR);
	public:
		virtual ~McAttr_ISAKMP_TV();
		static McAttr_ISAKMP_TV *create(CSTR);
		int32_t headerType() const { return(1); }
};



//
// SPI (P, N)
//
////////////////////////////////

class SPIsizeCtrl {
	bool		init_;
	uint32_t	length_;

	public:
		SPIsizeCtrl();
		virtual ~SPIsizeCtrl();

		bool get_init() { return(init_); }
		uint32_t get_length() { return(length_); }
		void set_init(bool d) { init_ = d; return; }
		void set_length(uint32_t d) { length_ = d; return; }
};

class MmISAKMP_SPI: public MmVarOctets {
	protected:
		SPIsizeCtrl *ctrl_;

	public:
		MmISAKMP_SPI(CSTR, const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);

		virtual ~MmISAKMP_SPI();
		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
		void set_ctrl(bool, uint32_t);
};

class MmISAKMP_SPI_ReplayStat: public MmISAKMP_SPI {
	public:
		MmISAKMP_SPI_ReplayStat(CSTR,
			const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);

		virtual ~MmISAKMP_SPI_ReplayStat();
		virtual ItPosition length_for_reverse(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// FQDN, USER_FQDN (ID)
//
////////////////////////////////

class MmAsciiString: public MmVarOctets {
	public:
		MmAsciiString(CSTR, const PObject * = 0, const PObject * = 0,
			const ICVoverwriter * = 0, METH_HC_ForIPinfo = 0);
		virtual ~MmAsciiString();
		virtual PvObject *reversePv(RControl &, const ItPosition &,
			const ItPosition &, const OCTBUF &) const;
};

class PvAsciiString: public PvOctets {
	public:
		PvAsciiString();
		PvAsciiString(uint32_t, OCTSTR = 0, bool = false);
		virtual ~PvAsciiString();
		virtual PvObject *shallowCopy() const;
		virtual void print() const;
		virtual void log(uint32_t = 0) const;
};



//
// McUdp_ISAKMP <-> McISAKMP_Encryption
//
////////////////////////////////

class MmEncrypt_onISAKMP: public MmReference_More0 {
	static TypevsMcDict dict_;
	McHdr_ISAKMP *tophdr_;

	public:
		MmEncrypt_onISAKMP(CSTR, McHdr_ISAKMP *);
		virtual ~MmEncrypt_onISAKMP();

		int32_t token() const {
			return(metaToken(tkn_isakmp_encryption_ref_)); }

		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McISAKMP_Encryption *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
		virtual RObject *reverse(RControl &, RObject *,
			ItPosition &, OCTBUF &) const;
};



//
// McUdp_ISAKMP <-> McPld_ISAKMP
//
////////////////////////////////

class MmPayload_onISAKMP: public MmReference_More0 {
	static TypevsMcDict dict_;

	public:
		MmPayload_onISAKMP(CSTR);
		virtual ~MmPayload_onISAKMP();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_SA <-> McPld_ISAKMP_P
//
////////////////////////////////

class MmISAKMP_PonSA: public MmReference_More0 {
	static TypevsMcDict dict_;

	public:
		MmISAKMP_PonSA(CSTR);
		virtual ~MmISAKMP_PonSA();
		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_P <-> McPld_ISAKMP_T
//
////////////////////////////////

class MmISAKMP_TonP: public MmReference_More0 {
	static TypevsMcDict dict_;
	McPld_ISAKMP_P *p_;

	public:
		MmISAKMP_TonP(McPld_ISAKMP_P *, CSTR);
		virtual ~MmISAKMP_TonP();
		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
		virtual WObject *compose(WControl &,
			WObject *, const PObject *) const;
		virtual RObject *reverse(RControl &,
			RObject *, ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_SA_ONE <-> McPld_ISAKMP_SA
//
////////////////////////////////

class MmDOIonSA: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmDOIonSA(CSTR);
		virtual ~MmDOIonSA();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_N_ONE <-> McPld_ISAKMP_N
//
////////////////////////////////

class MmDOIonN: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmDOIonN(CSTR);
		virtual ~MmDOIonN();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_SA_IPsec_ONE <-> McPld_ISAKMP_SA_IPsec
//
////////////////////////////////

class MmSIT_onSA_IPsec: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmSIT_onSA_IPsec(CSTR);
		virtual ~MmSIT_onSA_IPsec();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP_SA_IPsec *);
		static void add(McPld_ISAKMP_SA_IPsec *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_N_IPsec_ONE <-> McPld_ISAKMP_N_IPsec
//
////////////////////////////////

class MmType_onN_IPsec: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmType_onN_IPsec(CSTR);
		virtual ~MmType_onN_IPsec();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP_N_IPsec *);
		static void add(McPld_ISAKMP_N_IPsec *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_P_ONE <-> McPld_ISAKMP_P
//
////////////////////////////////

class MmProtocolIDonP: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmProtocolIDonP(CSTR);
		virtual ~MmProtocolIDonP();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_ID_ONE <-> McPld_ISAKMP_ID
//
////////////////////////////////

class MmIDtype_onID: public MmReference_Must1 {
	static TypevsMcDict dict_;

	public:
		MmIDtype_onID(CSTR);
		virtual ~MmIDtype_onID();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McPld_ISAKMP *);
		static void add(McPld_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};



//
// McPld_ISAKMP_T <-> McAttr_ISAKMP
//
////////////////////////////////

class MmAttr_onT: public MmReference_More0 {
	static TypevsMcDict dict_;

	public:
		MmAttr_onT(CSTR);
		virtual ~MmAttr_onT();

		int32_t token() const { return(metaToken(tkn_option_ref_)); }
		const TypevsMcDict *get_dict() const { return(&dict_); }
		static void add_other(McAttr_ISAKMP *);
		static void add(McAttr_ISAKMP *);
		bool overwrite_DictType(RControl &,
			ItPosition &, OCTBUF &) const;
};
#endif	// __McIKE_h__


syntax highlighted by Code2HTML, v. 0.9.1