diff -r 000000000000 -r af10295192d8 tcpiputils/dhcp/include/DHCPIP6IA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dhcp/include/DHCPIP6IA.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,470 @@ +// Copyright (c) 2004-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: +// DHCPv6 Identity Association - holds config info associated with IAID +// IAID (Identity Association Id) is generated by client at least one per interface +// (DUID DHCP Unique IDentifier) +// +// + +/** + @file DHCPIP6IA.h +*/ + +#ifndef DHCPIP6IA_H +#define DHCPIP6IA_H + +#include +#include "DhcpIP6Msg.h" +#include + +class CDHCPIP6Control; +class CDHCPIP6StateMachine; + +namespace DHCPv6 +{ + +const TInt KDHCPOptionIA_IAIDLength = 4; //(4 bytes) + +/* + Identity Association for Non-temporary Addresses Option + 0 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | OPTION_IA_NA | option-len | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | IAID (4 octets) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | T1 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | T2 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + . IA_NA-options . + . . + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + option-code OPTION_IA_NA (3). + + option-len 12 + length of IA_NA-options field. + + IAID The unique identifier for this IA_NA; the + IAID must be unique among the identifiers for + all of this client's IA_NAs. The number + space for IA_NA IAIDs is separate from the + number space for IA_TA IAIDs. + + T1 The time at which the client contacts the + server from which the addresses in the IA_NA + were obtained to extend the lifetimes of the + addresses assigned to the IA_NA; T1 is a + time duration relative to the current time + expressed in units of seconds. + + T2 The time at which the client contacts any + available server to extend the lifetimes of + the addresses assigned to the IA_NA; T2 is a + time duration relative to the current time + expressed in units of seconds. + + IA_NA-options Options associated with this IA_NA. + +Identity Association for Temporary Addresses Option doesn't have T1 and T2 fields +*/ +class CDHCPOptionIA : public COptionNode +/** + * Option associated with DUID identifying one set of config parameters + * associated with a DHCP interface Id (DUID). + * Part common for NA_IA & TA_IA + * + * @internalTechnology + */ + { + +public: + CDHCPOptionIA() : + COptionNode(NULL) + { + } + + virtual TPtr8 GetOptionsDes() const = 0; + + TUint32 GetIAID() const; + void SetIAID(const TUint32 aIAID); + }; + +inline TUint32 CDHCPOptionIA::GetIAID() const + { + __ASSERT_DEBUG(GetLength() >= KDHCPOptionIA_IAIDLength, User::Panic(KDhcpv6, KErrBadDescriptor)); + return TBigEndian::GetValue(iPtr8 + KOptionHeaderLength, KDHCPOptionIA_IAIDLength); + } + +inline void CDHCPOptionIA::SetIAID(const TUint32 aIAID) + { + __ASSERT_DEBUG( GetLength() >= KDHCPOptionIA_IAIDLength, User::Panic( KDhcpv6, KErrBadDescriptor ) ); + TBigEndian::SetValue(iPtr8 + KOptionHeaderLength, KDHCPOptionIA_IAIDLength, aIAID); + } + +//no options involved in the init length of IA_TA option +const TInt KDHCPOptionIA_TATInitLength = KDHCPOptionIA_IAIDLength; + +class CDHCPOptionIA_TA : public CDHCPOptionIA +/** + * Option associated with DUID identifying one set of config parameters + * associated with a DHCP interface Id (DUID). + * Part specific to TA_IA + * + * @internalTechnology + */ + { + +public: + CDHCPOptionIA_TA() : + CDHCPOptionIA() + { + } + + static COptionNode* NewL(); + + virtual TPtr8 GetOptionsDes() const; + }; + +const TInt KDHCPOptionIA_NAT1Length = 4; //(4 bytes) +const TInt KDHCPOptionIA_NAT2Length = 4; //(4 bytes) +//no options involved in the init length +const TInt KDHCPOptionIA_NATInitLength = KDHCPOptionIA_NAT1Length + KDHCPOptionIA_NAT2Length + KDHCPOptionIA_IAIDLength; + +const TInt KIA_NoTimePreference = 0x00; + +class CDHCPOptionIA_NA : public CDHCPOptionIA +/** + * Option associated with DUID identifying one set of config parameters + * associated with a DHCP interface Id (DUID) + * Part specific to IA_NA + * + * @internalTechnology + */ + { + +public: + CDHCPOptionIA_NA() : + CDHCPOptionIA() + { + } + + static COptionNode* NewL(); + + + virtual TPtr8 GetOptionsDes() const; + + TUint32 GetT1() const; + void SetT1(TUint32 aT1); + TUint32 GetT2() const; + void SetT2(TUint32 aT1); + }; + + +inline TUint32 CDHCPOptionIA_NA::GetT1() const + { +// __ASSERT_DEBUG(GetLength() >= KDHCPOptionStatusCodeLength, User::Panic(KDhcpv6, KErrBadDescriptor)); + return TBigEndian::GetValue(iPtr8 + KOptionHeaderLength + KDHCPOptionIA_IAIDLength, KDHCPOptionIA_NAT1Length); + } + +inline void CDHCPOptionIA_NA::SetT1(TUint32 aT1) + { +// __ASSERT_DEBUG(GetLength() >= KDHCPOptionStatusCodeLength, User::Panic(KDhcpv6, KErrBadDescriptor)); + TBigEndian::SetValue(iPtr8 + KOptionHeaderLength + KDHCPOptionIA_IAIDLength, KDHCPOptionIA_NAT1Length, aT1); + } + + +inline TUint32 CDHCPOptionIA_NA::GetT2() const + { +// __ASSERT_DEBUG(GetLength() >= KDHCPOptionStatusCodeLength, User::Panic(KDhcpv6, KErrBadDescriptor)); + return TBigEndian::GetValue(iPtr8 + KOptionHeaderLength + KDHCPOptionIA_IAIDLength + KDHCPOptionIA_NAT1Length, + KDHCPOptionIA_NAT2Length); + } + +inline void CDHCPOptionIA_NA::SetT2(TUint32 aT2) + { +// __ASSERT_DEBUG(GetLength() >= KDHCPOptionStatusCodeLength, User::Panic(KDhcpv6, KErrBadDescriptor)); + TBigEndian::SetValue(iPtr8 + KOptionHeaderLength + KDHCPOptionIA_IAIDLength + KDHCPOptionIA_NAT1Length, + KDHCPOptionIA_NAT2Length, aT2); + } + + +const TInt KDHCPOptionAddressPrefLifeTimeLength = 4; //(4 bytes) +const TInt KDHCPOptionAddressValidLifeTimeLength = 4; //(4 bytes) +/* + IA Address Option + 0 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 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | OPTION_IAADDR | option-len | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | IPv6 address | + | | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | preferred-lifetime | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | valid-lifetime | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + . . + . IAaddr-options . + . . + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + option-code OPTION_IAADDR (5). + + option-len 24 + length of IAaddr-options field. + + IPv6 address An IPv6 address. + + preferred-lifetime The preferred lifetime for the IPv6 address in + the option, expressed in units of seconds. + + valid-lifetime The valid lifetime for the IPv6 address in the + option, expressed in units of seconds. + + IAaddr-options Options associated with this address. +*/ + +const TInt KDHCPOptionIAAddressLength = KOptionHeaderLength + KIp6AddressLength + KDHCPOptionAddressPrefLifeTimeLength + KDHCPOptionAddressValidLifeTimeLength; +const TInt KDHCPOptionIAAddressWithStatusCodeLength = KDHCPOptionIAAddressLength + KOptionHeaderLength + KDHCPOptionStatusCodeLength; + +struct SIPAddressInfo; + +class CDHCPOptionIAAddress : public COptionNode +/** + * Option associated with IAID (IA option) carrying address config info + * + * @internalTechnology + */ + { + +public: + CDHCPOptionIAAddress() : + COptionNode( &iAddress ), + iAddress( &iPreferredLifeTime, KIp6AddressLength ), + iPreferredLifeTime( &iValidLifeTime, KDHCPOptionAddressPrefLifeTimeLength ), + iValidLifeTime(&iOptions, KDHCPOptionAddressValidLifeTimeLength ), + iOptions(NULL) + { + iRecord.iFirst = &iAddress; + } + + virtual ~CDHCPOptionIAAddress(); + + static CDHCPOptionIAAddress* NewL() + { + return new(ELeave)CDHCPOptionIAAddress(); + } + + TInt GetAddressOptionL(TPtr8& aPtr, SIPAddressInfo& aAddressInfo); + TInt AddAddressOptionL(TPtr8& aPtr, SIPAddressInfo& aAddressInfo, TStatusCodes aStatusCodeToSend); + + inline COptionList& GetOptions() { return iOptions; } + + +public: + CConstItem iAddress; + CConstItem iPreferredLifeTime; + CConstItem iValidLifeTime; + +protected: + COptionList iOptions; + }; + + + +const TInt KAddrIndexAll = -1; + +//persistent data +struct SIPAddressInfo +/** + * Contains IPv6 address info associated with the particular IAID + * + * @internalTechnology + */ + { + SIPAddressInfo() : + iPreferredLifeTime( KIA_NoTimePreference ), + iValidLifeTime( KIA_NoTimePreference ), + iStatusCode( ESuccess ) + { + } + TInetAddr iAddress; + TUint32 iPreferredLifeTime; //renew of the address via unicast (renew) + TUint32 iValidLifeTime; //renew address via multicast (rebind) + TInt iStatusCode; + }; + +struct SIdentityAssociationConfigInfo : public Meta::SMetaData +/** + * Contains config info associated with one IAID. The first address of the first IA option + * in the server's reply message is stored in CDHCPStateMachine::iCurrentAddress variable + * so as KConnGetCurrentAddr Ioctl command works for IP4 & IP6 + * + * @see SIdentityAssociationConfigInfoTA, SIdentityAssociationConfigInfoNA + * @internalTechnology + */ + { + SIdentityAssociationConfigInfo() : iIAID(0) + { + } + + ~SIdentityAssociationConfigInfo() //non-virtual since never accessed via base class + { + iAddressInfo.Close(); + } + + void Reset(); + void ResetAddressInfos(); + TUint32 IaId() const; + TInt AddressInfo( TInt aIndex, TStatusCodes aStatusCode ) const; + TInt AddAddressesL( CDHCPOptionIA& aDHCPOptionIA, TMessageType aMessageType ); + void ExtractAddressesL( CDHCPOptionIA& aDHCPOptionIA, TUint32 aRebindTimeSpan ); + + const SIPAddressInfo* GetValidAddressInfo( TInt& aPos ) const; + + void SetAddressStatus( TInt aIndex, TStatusCodes aStatusCode ); + +protected: + TUint32 iIAID; //Identity Association ID + RArray iAddressInfo; + +public: + DATA_VTABLE + }; + +inline void SIdentityAssociationConfigInfo::ResetAddressInfos() + { + iAddressInfo.Reset(); + } + +inline TUint32 SIdentityAssociationConfigInfo::IaId() const + { + return iIAID; + } + +inline const SIPAddressInfo* SIdentityAssociationConfigInfo::GetValidAddressInfo( TInt& aPos ) const + { + return ( aPos = AddressInfo( aPos, ESuccess )) != KErrNotFound ? &iAddressInfo[aPos - 1] : NULL; + } + +struct SIdentityAssociationConfigInfoTA : public SIdentityAssociationConfigInfo +/** + * Contains config info associated with one IAID for Temporary Addresses + * + * @see SIPAddressInfo + * @internalTechnology + */ + { + TUint32 iLifeTime; //the longest life time from associated addresses + }; + +struct SIdentityAssociationConfigInfoNA : public SIdentityAssociationConfigInfo +/** + * Contains config info associated with one IAID for Non-temporary Addresses + * + * @see SIPAddressInfo + * @internalTechnology + */ + { + TUint32 iT1; //renew of the IA via unicast + TUint32 iT2; //rebind of the IA via multicast to all servers and rely agents + + void ExtractIAOptionInfoL( CDHCPOptionIA_NA& aDHCPOptionIA ); + +public: + DATA_VTABLE + }; + +class TInterfaceConfigInfo +/** + * Contains all IAIDs associated with the interface identified by DUID + * By having iSIdentityAssociationConfigInfoTA and iSIdentityAssociationConfigInfoNA members + * we confined ourselves to one NAID and one TAID for the moment. There could be an array of these. + * + * @see SIdentityAssociationConfigInfo + * @see SIdentityAssociationConfigInfoTA + * @see SIdentityAssociationConfigInfoNA + * @internalTechnology + */ + { +friend class CDHCPIP6Control; +friend class CDHCPIP6StateMachine; + +public: + void Reset(); + void AppendIAOptionsL( CDHCPMessageHeaderIP6& aMessage, TMessageType aMessageType ); + void ParseIAOptionsL( CDHCPMessageHeaderIP6& aMessage ); + + void ResetUseUnicast(); + void CheckForUnicast( CDHCPMessageHeaderIP6& aMessage ); + void GetServerAddress( TInetAddr& aAddress ); // to send/receive data + + TBool AnyAddressToDecline() const; + void SetAddressStatus( TInt aIndex, TStatusCodes aStatusCode ); + + const SIPAddressInfo* GetValidAddressInfo( TInt& aPos ) const; + + TUint32 RenewTime() const; + TUint32 RebindTime() const; + +protected: + TBool iUseUnicast; //ETrue if the server's sent a unicast option + TInetAddr iServerAddress; // to store the address of the DHCP Server we are dealing with + +public: +//not used yet SIdentityAssociationConfigInfoTA iSIdentityAssociationConfigInfoTA; + SIdentityAssociationConfigInfoNA iSIdentityAssociationConfigInfoNA; + }; + +//if we ever what to work with more than one IA we need to add mechanism how to make one an active one +inline TUint32 TInterfaceConfigInfo::RenewTime() const + { + return iSIdentityAssociationConfigInfoNA.iT1; + } + +inline TUint32 TInterfaceConfigInfo::RebindTime() const + { + return iSIdentityAssociationConfigInfoNA.iT2; + } + +inline void TInterfaceConfigInfo::SetAddressStatus( TInt aIndex, TStatusCodes aStatusCode ) + { + iSIdentityAssociationConfigInfoNA.SetAddressStatus(aIndex, aStatusCode); + } + +inline void TInterfaceConfigInfo::ResetUseUnicast() + { + iUseUnicast = EFalse; + } + +inline TBool TInterfaceConfigInfo::AnyAddressToDecline() const + { + TInt dummy = 0; + return iSIdentityAssociationConfigInfoNA.AddressInfo( dummy, EMarkForDecline ) != KErrNotFound; + } + +inline const SIPAddressInfo* TInterfaceConfigInfo::GetValidAddressInfo( TInt& aPos ) const + { + return iSIdentityAssociationConfigInfoNA.GetValidAddressInfo(aPos); + } + +}//DHCPv6 namespace + +#endif +