diff -r 000000000000 -r 33413c0669b9 vpnengine/ikev2lib/inc/ikev2payloads.h --- /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) ~ +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// ! ! +// ~ ~ +// ! ! +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +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 ! +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// ! ! +// ~ ~ +// ! ! +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +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