vpnengine/ikev2lib/inc/ikev2payloads.h
changeset 0 33413c0669b9
child 1 c9c2ad51f972
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev2lib/inc/ikev2payloads.h	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,571 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Payload classes.
+*
+*/
+#ifndef _IKEV2PAYLOADS_H_
+#define _IKEV2PAYLOADS_H_
+#include "ikev2const.h"
+#include "ikemsgheader.h"
+
+//
+// GENERIC PAYLOAD HEADER
+//
+//                     1                   2                   3
+// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Next Payload  !C!  RESERVED   !         Payload Length        !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TPayloadIkev2
+{
+	public:
+		static inline TInt Size() { return sizeof(TPayloadIkev2); }
+		static inline TPayloadIkev2* Cast(const TAny* aPayload) { return (TPayloadIkev2*)aPayload; }		
+		inline void Init() { PUT32(&u.iData8[0], 0);}   
+		inline TUint8 GetNextPayload() { return u.iData8[0]; }
+		inline void SetNextPayload(TUint8 aPayload) { u.iData8[0] = aPayload; }
+		inline TUint16 GetLength() const { return (TUint16)GET16(&u.iData8[2]); }
+		inline void SetLength(TUint16 aLength) { PUT16(&u.iData8[2], aLength); }
+		inline TBool GetCritical() const { return ((u.iData8[1] & IKEV2_PL_CRITICAL) == IKEV2_PL_CRITICAL); }		
+		inline void SetReserved() { u.iData8[1] &= IKEV2_PL_CRITICAL; }
+		inline void SetCritical() { u.iData8[1] |= IKEV2_PL_CRITICAL; }
+		inline TUint8* PayloadPtr() { return (TUint8 *)((char *)this); } 
+		inline TUint8* PayloadData() const   
+				{ return (TUint8 *)((char *)this + sizeof(*this)); } //returns a * to the specific data of this payload
+		inline const TUint PlDataLen() const  
+				{ if ( GetLength() > sizeof(*this) )
+			           return (GetLength() - sizeof(*this));
+		          else return 0;
+				} //returns a * to the specific data of this payload
+		inline TPayloadIkev2 *Next() const
+				{ return (TPayloadIkev2 *)((char *)this + GetLength()); }
+		//
+		// The following methods are used to manage "ENCRYPTED" bit (0)
+		// in payload reserved field. This bit is set to 1 when a
+		// payload has been received within a encrypted payload.
+		// Encrypted bit is NEVER set into transmitted payload.
+		//
+		inline TBool Encrypted() const { return ((u.iData8[1] & IKEV2_PL_ENCRYPTED) == IKEV2_PL_ENCRYPTED); }		
+		inline void SetEncrypted() { u.iData8[1] |= IKEV2_PL_ENCRYPTED; }
+		inline void ResetEncrypted() { u.iData8[1] &= ~IKEV2_PL_ENCRYPTED; }		
+		
+	private:
+		union
+		{
+			TUint32 iData32[1];
+			TUint16 iData16[2];
+			TUint8  iData8[4];
+		} u;
+};
+
+#define TSAPayload TPayloadIkev2
+#define TNoncePayload TPayloadIkev2
+#define TVendorPlIkev2 TPayloadIkev2
+#define TEAPPayloadIkev2 TPayloadIkev2
+//
+// Transform Attributes
+//
+// In this phase there is only one attribute defined for IKEv2 which is
+// encryption key length for transform type Encryption Algorithm
+//
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !A!       Attribute Type        !    AF=0  Attribute Length     !
+//	 !F!                             !    AF=1  Attribute Value      !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                   AF=0  Attribute Value                       !
+//   !                   AF=1  Not Transmitted                       !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TDataAttributes
+{
+	public:
+		inline TInt Size() const { return sizeof(*this); }		
+		inline TBool IsBasic() const {return ((u.iData8[0] & 0x80) != 0);} //return if basic attrib or variable
+		inline void SetBasic() { u.iData8[0] |= 0x80;}
+		inline void SetVariable() { u.iData8[0] &= 0x7f;}		
+		inline TUint16 GetType() { return TUint16(GET16(&u.iData16[0]) & 0x7fff);}
+		inline void SetType(TUint16 aType) { PUT16(&u.iData16[0], aType);}				
+		inline TUint16 GetValue() { return TUint16(GET16(&u.iData16[1]));}
+		inline void SetValue(TUint16 aValue) { PUT16(&u.iData16[1], aValue); }
+		inline TUint8* Data() {return (TUint8*)((TUint8*)this + Size());}
+		inline TDataAttributes* Next()
+		{
+			if ( IsBasic() )
+			     return (TDataAttributes*)((TUint8*)this + Size());
+		    else return (TDataAttributes*)((TUint8*)this + (Size() + (TInt)GetValue()));
+        }
+
+	private:
+		union
+		{
+			TUint32 iData32[1];
+			TUint16 iData16[2];
+			TUint8  iData8[4];
+		} u;
+};
+
+//
+// Transform Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! 0 (last) or 3 !   RESERVED    !        Transform Length       !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !Transform Type !   RESERVED    !          Transform ID         !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                      Transform Attributes                     ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TTransformIkev2 
+{
+	public:
+		static inline TTransformIkev2* Cast(const TAny* aPayload)	{ return (TTransformIkev2*)aPayload; }
+		inline void Init() { PUT32(&u.iData8[0], 0);}   		
+		inline TInt Size() const { return sizeof(*this); }
+		inline TUint8 GetType() const { return u.iData8[4]; };
+		inline void SetType(TUint8 aPayload) { u.iData8[4] = aPayload; };
+		inline TUint16 GetID() const { return (TUint16)GET16(&u.iData16[3]); };
+		inline void SetID(TUint16 aId) { PUT16(&u.iData16[3], aId); };
+		inline void SetReserved() { u.iData8[5] = 0; };
+		inline TDataAttributes* Attributes() const {return (TDataAttributes*)((TUint8*)this + Size()); } 
+		//
+		// The following methods are used to manage "SELECTED" bit (0)
+		// in teh Transform payload reserved field. This bit is set to 1 when
+		// the transform payload has been selected into acceptable
+		// proposal.
+		// "SELECTED" is NEVER set into transmitted payload.
+		//
+		inline TBool IsSelected() { return ((u.iData8[5] & IKEV2_PL_SELECTED) == IKEV2_PL_SELECTED);}		
+		inline void Selected()  { u.iData8[5] |= IKEV2_PL_SELECTED; }
+		inline void NotSelected()  { u.iData8[5] &= ~IKEV2_PL_SELECTED; }		
+
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+//
+// Proposal Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! 0 (last) or 2 !   RESERVED    !         Proposal Length       !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Proposal #    !  Protocol ID  !    SPI Size   !# of Transforms!
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ~                        SPI (variable)                         ~
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                        <Transforms>                           ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TProposalIkev2
+{
+	public:
+		static inline TProposalIkev2 *Cast(const TAny* aPayload) { return (TProposalIkev2 *)aPayload;}
+		inline TInt Size() const { return sizeof(*this); }
+		inline TUint8 GetNum() const { return u.iData8[4]; }
+		inline void SetNum(TUint8 aNumber) { u.iData8[4] = aNumber; }
+		inline TUint8 GetProtocol() const { return u.iData8[5]; }
+		inline void SetProtocol(TUint8 aProtocol) { u.iData8[5] = aProtocol; }
+		inline TUint8 GetSPISize() const { return u.iData8[6]; }
+		inline void SetSPISize(TUint8 aSpiSize) { u.iData8[6] = aSpiSize; } 
+		inline TUint8 GetNumTrans() const { return u.iData8[7]; };
+		inline void SetNumTrans(TUint8 aNumber) { u.iData8[7] = aNumber; } 
+		inline TTransformIkev2* TransformPl() const    //next payload (transform)
+				{ return (TTransformIkev2*)((TUint8*)this + sizeof(*this) + GetSPISize()); } 
+		inline TUint8 *SPI() {return (TUint8 *)((TUint8*)this + sizeof(*this));} //*to the SPI
+		inline void GetIpsecSPI(TUint32* aSPI) const {Mem::Copy( (TUint8*)aSPI, ((TUint8*)this + sizeof(*this)), 4); }		
+		inline void SetIpsecSPI(TUint32 aSPI) { Mem::Copy(((TUint8*)this + sizeof(*this)), (TUint8*)&aSPI, 4); }
+		inline TInt PropHdrLth() const { return (Size() + (TInt)GetSPISize()); }
+		inline TBool Last() const { return u.iData8[0] == 0;}
+		
+    private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+//
+// Key Exchange Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !          DH Group #           !           RESERVED            !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                       Key Exchange Data                       ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TKEPayloadIkev2 
+{
+	public:
+		static inline TKEPayloadIkev2 *Cast(const TAny* aPayload) { return (TKEPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TKEPayloadIkev2); }
+		inline TUint16 GetDHGroup() const { return (TUint16)GET16(&u.iData16[2]); };
+		inline void SetDHGroup(TUint16 aGroup) { PUT16(&u.iData16[2], aGroup); };
+		inline void SetReserved() { PUT16(&u.iData16[3], 0); };		
+		inline TUint8 *DHPublic() {return (TUint8 *)((TUint8*)this + sizeof(*this));}
+		inline TUint8 GetNextPayload() { return u.iData8[0]; }
+
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+		
+};
+
+//
+// Identification Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !   ID Type     !                 RESERVED                      |
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                   Identification Data                         ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TIDPayloadIkev2 
+{
+	public:
+		static inline TIDPayloadIkev2 *Cast(const TAny* aPayload) { return (TIDPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TIDPayloadIkev2); }
+		inline TUint8 GetIdType() { return u.iData8[4]; };
+		inline void SetIdType(TUint8 aIdType) { u.iData8[4] = aIdType; };
+		inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; };		
+		inline TUint8 *IdData() {return (TUint8*)((TUint8*)this + sizeof(*this));}
+		inline TUint8 GetNextPayload() { return u.iData8[0]; }
+
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+//
+// Authentication Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Auth Method   !                RESERVED                       !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                      Authentication Data                      ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TAuthPayloadIkev2 
+{
+	public:
+		static inline TAuthPayloadIkev2 *Cast(const TAny* aPayload) { return (TAuthPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TAuthPayloadIkev2); }
+		inline TUint8 GetAuthMethod() { return u.iData8[4]; };
+		inline void SetAuthMethod(TUint8 aMethod) { u.iData8[4] = aMethod; };
+		inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; };		
+		inline TUint8 *AuthData() {return (TUint8*)((TUint8*)this + sizeof(*this));}
+
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+//
+//   Traffic Selector Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Number of TSs !                 RESERVED                      !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                       <Traffic Selectors>                     ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TTSPayloadIkev2 
+{
+	   public:
+		   static inline TTSPayloadIkev2 *Cast(const TAny* aPayload) { return (TTSPayloadIkev2 *)aPayload;}		
+		   static inline TInt Size() { return sizeof(TTSPayloadIkev2); }
+		   inline TUint8 GetNumberOfTs() { return u.iData8[4]; };
+		   inline void SetNumberOfTs(TUint8 aNumber) { u.iData8[4] = aNumber; };
+		   inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; };		
+		   inline TUint8* TrafficSelectors() {return (TUint8*)((TUint8*)this + sizeof(*this));}
+		   inline TUint8 GetNextPayload() { return u.iData8[0]; }
+
+	   private:
+		   union
+		   {
+			   TUint32 iData32[2];
+			   TUint16 iData16[4];
+			   TUint8  iData8[8];
+		   } u;
+
+};
+
+//
+//   Traffic Selector
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !   TS Type     !IP Protocol ID*|       Selector Length         |
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   |           Start Port*         |           End Port*           |
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                         Starting Address*                     ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                         Ending Address*                       ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TTrafficSelector
+{
+	public:
+		static inline TTrafficSelector* Cast(const TAny* aPayload) { return (TTrafficSelector *)aPayload;}				
+		static inline TInt Size() { return sizeof(TTrafficSelector); }
+		inline void Init() { PUT32(&u.iData8[0], 0); PUT32(&u.iData8[4], 0); };		
+		inline void SetLength(TUint16 aLth) { PUT16(&u.iData8[2], aLth);  };
+		inline void SetType(TUint8 aType) { u.iData8[0] = aType;  };
+		inline void SetProtocol(TUint8 aProt) { u.iData8[1] = aProt;  };
+		inline void SetStartPort(TUint16 aPort) { PUT16(&u.iData8[4], aPort); };
+		inline void SetEndPort(TUint16 aPort) { PUT16(&u.iData8[6], aPort); };				
+		inline TUint16 Length() const { return (TUint16)GET16(&u.iData8[2]);  };
+		inline TUint16 StartPort() const { return (TUint16)GET16(&u.iData8[4]);  };
+		inline TUint16 EndPort() const { return (TUint16)GET16(&u.iData8[6]);  };				
+		inline TUint8  Protocol() const { return u.iData8[1];  };
+		inline TUint8  Type() const { return u.iData8[0];  };						
+		inline const TUint8 *Addresses() const {return (TUint8*)((TUint8*)this + sizeof(*this));}
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+
+//
+//   Certificate Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Cert Encoding !                                               !
+//   +-+-+-+-+-+-+-+-+                                               !
+//   ~                       Certificate Data                        ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TCertPayloadIkev2 
+{
+	public:
+		static inline TCertPayloadIkev2 *Cast(const TAny* aPayload) { return (TCertPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TPayloadIkev2) + sizeof(char); }
+		inline TUint8 GetEncoding() const { return u.iData8[4]; };
+		inline void SetEncoding(TUint8 aEncoding) { u.iData8[4] = aEncoding; };
+		inline TUint8 *Certificate() const {return (TUint8*)((TUint8*)this + Size());}
+		inline TUint8 GetNextPayload() const { return u.iData8[0]; }
+
+	private:
+		union
+		{
+			TUint8  iData8[5];
+		} u;
+};
+//
+//   Certificate Request Payload
+//		                 1                   2                   3
+//	 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//	 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Cert Encoding !                                               !
+//   +-+-+-+-+-+-+-+-+                                               !
+//	 ~                    Certification Authority                    ~
+//	 !                                                               !
+//	 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TCReqPayloadIkev2 
+{
+	public:
+		static inline TCReqPayloadIkev2 *Cast(const TAny* aPayload) { return (TCReqPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TPayloadIkev2) + sizeof(char); }
+		inline TUint8 GetEncoding() const { return u.iData8[4]; };		
+		inline void SetEncoding(TUint8 aEncoding) { u.iData8[4] = aEncoding; };		
+		inline TUint8* Authority() const {return (TUint8*)((TUint8*)this + Size());}
+		inline TUint8 GetNextPayload() { return u.iData8[0]; }
+
+	private:
+		union
+		{
+			TUint8  iData8[5];
+		} u;
+};
+
+//
+//   Notify Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !  Protocol ID  !   SPI Size    !      Notify Message Type      !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                Security Parameter Index (SPI)                 ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                       Notification Data                       ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TNotifPayloadIkev2 
+{
+	public:
+		static inline TNotifPayloadIkev2 *Cast(const TAny* aPayload) { return (TNotifPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TNotifPayloadIkev2); }
+		inline TUint8 GetProtocolId() { return u.iData8[4]; };
+		inline void SetProtocolId(TUint8 aProtId) { u.iData8[4] = aProtId; };
+		inline TUint8 GetSPISize() const { return u.iData8[5]; }
+		inline void SetSPISize(TUint8 aSpiSize) { u.iData8[5] = aSpiSize; }
+		inline TUint16 GetMsgType() const { return (TUint16)GET16(&u.iData16[3]); };
+		inline void SetMsgType(TUint16 aType) { PUT16(&u.iData16[3], aType); };
+		inline TUint8* SPI() {return (TUint8*)((TUint8*)this + sizeof(*this));} 
+		inline TUint8* NotifData() const {return (TUint8*)((TUint8*)this + Size() + GetSPISize());}
+		inline TUint NotifDataLength() const { return TPayloadIkev2::Cast(this)->GetLength() - Size() - GetSPISize(); }
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+		
+};
+
+//
+//   Delete Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C!  RESERVED   !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Protocol ID   !   SPI Size    !           # of SPIs           !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~               Security Parameter Index(es) (SPI)              ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TDeletePlIkev2 
+{
+	public:
+		static inline TDeletePlIkev2 *Cast(const TAny* aPayload) { return (TDeletePlIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TDeletePlIkev2); }
+		inline TUint8 GetProtocolId() const { return u.iData8[4]; };
+		inline void SetProtocolId(TUint8 aProtId) { u.iData8[4] = aProtId; };
+		inline TUint8 GetSPISize() const { return u.iData8[5]; }
+		inline void SetSPISize(TUint8 aSpiSize) { u.iData8[5] = aSpiSize; }
+		inline TUint16 GetNbrOfSpis() const { return (TUint16)GET16(&u.iData16[3]); };
+		inline void SetNbrOfSpis(TUint16 aType) { PUT16(&u.iData16[3], aType); };
+		inline const TUint8* SPIs() const {return (TUint8*)((TUint8*)this + sizeof(*this));} 
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+//
+//   Configuration Payload
+//                       1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   ! Next Payload  !C! RESERVED    !         Payload Length        !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !   CFG Type    !                    RESERVED                   !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//   !                                                               !
+//   ~                   Configuration Attributes                    ~
+//   !                                                               !
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class TCPPayloadIkev2
+{
+	public:
+		static inline TCPPayloadIkev2 *Cast(const TAny* aPayload) { return (TCPPayloadIkev2 *)aPayload;}		
+		static inline TInt Size() { return sizeof(TCPPayloadIkev2); }
+		inline TUint8 GetCFGType() { return u.iData8[4]; };
+		inline void SetCFGType(TUint8 aCFGType) { u.iData8[4] = aCFGType; };
+		inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; };				
+		inline TDataAttributes* Attributes() {return (TDataAttributes*)((TUint8*)this + sizeof(*this));}
+		
+	private:
+		union
+		{
+			TUint32 iData32[2];
+			TUint16 iData16[4];
+			TUint8  iData8[8];
+		} u;
+
+};
+
+#endif