diff -r 000000000000 -r af10295192d8 tcpiputils/dhcp/include/DHCPIP6StateMachine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dhcp/include/DHCPIP6StateMachine.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,229 @@ +// 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: +// The DHCPIP6StateMachine header file +// +// + +/** + @file DHCPIP6StateMachine.h +*/ + +#ifndef DHCPIP6STATEMACHINE_H +#define DHCPIP6STATEMACHINE_H + +#include "DHCPStateMachine.h" +#include "DHCPIP6MsgSender.h" +#include "DHCPIP6IA.h" + +class CDHCPIP6State; +class CDHCPIP6MessageSender; +class CDhcpIP6MessageReader; +#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION +class CDhcpHwAddrManager; +#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION +class CDHCPIP6StateMachine : public CDHCPStateMachine +/** + * Implements helper function & starts DHCPv6 tasks (SOLICITATION,INFORM,....) + * + * @internalTechnology + */ + { +friend class CDHCPIP6Control; +friend class CDHCPIP6ListenToNeighbor; +friend class CDHCPIP6Select; +friend class CDHCPIP6ReplyNoBinding; +friend class CDHCPIP6Renew; +friend class CDHCPIP6Reconfigure; +friend class CDHCPIP6Rebind; + +public: + /*tasks the statemachine could be started for + enum ETask + { //Initiated by: Reason: + ESolicitation, //Client IP Address & Info (DNS servers,..... + EInformRequest, //Client Info only + EConfirm, //Client Using the same address after reboot, return from sleep, change IAP,.... + EConfigExchange, //Client After lease time expired + EReconfigure, //Server Information given to client's changed + ERebind, //Client Renew message didn't work + EDecline, //Client IP Address not suitable + ERelease //Client IP Address not needed any more + }; + */ + +public: + ~CDHCPIP6StateMachine(); +#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION + static CDHCPIP6StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager); +#else + static CDHCPIP6StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName); +#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION + //interface used by CDHCPIP6Control + virtual void GetServerAddress( TInetAddr& aAddress ); + virtual void SetCurrentAddress(const TInetAddr& aCurrentAddress, const TInetAddr& aSubnetMask); + +#ifdef SYMBIAN_NETWORKING_DHCPSERVER + virtual void CreateOfferMsgL(); + virtual void HandleRequestMsgL(); + virtual void HandleInformMsgL(); + virtual CDHCPState* ReceiveOnPort67L( TRequestStatus* aStatus ); + virtual void CloseNSendServerMsgL(TRequestStatus& aStatus, CDHCPStateMachine::EAddressType aEAddressType); + virtual void InitialiseServerSocketL(); +#endif // SYMBIAN_NETWORKING_DHCPSERVER + //dhcpIPX tasks + virtual void StartInitL(MStateMachineNotify* aStateMachineNotify, EInitialisationContext aInitialisationContext, TInt aUserTimeOut = 0 );//Starts Solicitation + virtual void StartInformL(MStateMachineNotify* aStateMachineNotify, TBool aStaticAddress);//Starts InformRequest + virtual void StartRebootL(MStateMachineNotify* aStateMachineNotify);//Starts Confirm + virtual void StartRenewL(MStateMachineNotify* aStateMachineNotify, TInt aUserTimeOut); + virtual void StartRebindL(MStateMachineNotify* aStateMachineNotify); + virtual void StartDeclineL(MStateMachineNotify* aStateMachineNotify); + virtual void StartReleaseL(MStateMachineNotify* aStateMachineNotify); + //dhcpIP6 special task + void StartReconfigureL(MStateMachineNotify* aStateMachineNotify); + + virtual void RemoveConfiguredAddress(const TInetAddr *aInetAddr = NULL); + virtual CDHCPState* ReceiveL( TRequestStatus* aStatus ); + void CancelMessageReceiver(); + virtual void CloseNSendMsgL(TRequestStatus& aStatus, CDHCPStateMachine::EAddressType aEAddressType); + + //interface used by CDHCPIP6States derivatives + void CreateMessageL(); + void CreateCommonMsgStart(); + void CreateCommonMsgEndL(); + virtual void InitialiseSocketL(); + //message creation functions //IP6 naming + //-------------------------------------------------------------------- + virtual void CreateDiscoverMsgL(); //solicit message + virtual void CreateOfferAcceptanceRequestMsgL(); //request + virtual void CreateRebootRequestMsgL(); //confirm + virtual void CreateInformMsgL(); //inform-request + virtual void CreateDeclineMsgL(); //decline + virtual void CreateRenewRequestMsgL(); //renew + virtual void CreateRebindRequestMsgL(); //rebind + virtual void CreateReleaseMsgL(); //release + virtual void HandleOfferL(); //handle advertisement + virtual CDHCPState* HandleReplyL( TRequestStatus* aStatus );//handle final reply + + virtual void BindSocketForUnicastL(); + + TUint GetMessageType() const; + TBool CheckXid() const; + + CDHCPIP6MessageSender* MessageSender() const; + DHCPv6::CDHCPMessageHeaderIP6* DhcpMessage() const; + + void ConfigureInterfaceL( TInt aPos ); +#ifdef SYMBIAN_TCPIPDHCP_UPDATE + void StartInformL(MStateMachineNotify* aStateMachineNotify); +#endif //SYMBIAN_TCPIPDHCP_UPDATE + /*the below are values from the base class initialised from the IA (iInterfaceConfigInfo) + used in current transanction (renew or rebind) so that they can be accessed from within the + CDHCPIP6Renew and CDHCPIP6Rebind classes + TUint32 iRenewalTimeT1; + TUint32 iRebindTimeT2; + TUint32 iLeaseTime; + */ + +protected: + CDHCPIP6StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName); + void ConstructL(); + + virtual void AssembleClientIDsL(); + virtual void PrepareToSendL(CDHCPStateMachine::EAddressType aEAddressType); +#ifdef SYMBIAN_NETWORKING_DHCPSERVER +#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION + CDHCPIP6StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager); +#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION + virtual void PrepareToSendServerMsgL(CDHCPStateMachine::EAddressType aEAddressType); +#endif // SYMBIAN_NETWORKING_DHCPSERVER + virtual void AssignAddresses( TInetAddr& aDest, const TInetAddr& aSrc ) const; + + virtual void OnCompletion(); + +// virtual void DoCancel(); + +protected: + void SetMessageHeaderL( DHCPv6::TMessageType aMsgType ); + void HandleAckL(); + +public: + DHCPv6::TInterfaceConfigInfo iInterfaceConfigInfo; + +private: + CDhcpIP6MessageReader* iMessageReader; + mutable RBuf8 iServerId; + TInt iUserRebindTimeout; + EInitialisationContext iStartInitCalls; //We need to know when StartInitL is called for the second time. + //On the second time we will try once to solicit a DHCP server. + //If it fails we will complete the client and try harder on subsequent + + }; + +#ifdef SYMBIAN_NETWORKING_DHCPSERVER +#ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION +inline CDHCPIP6StateMachine::CDHCPIP6StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName): + CDHCPStateMachine( aEsock, aConnection, aInterfaceName,EFalse ), iStartInitCalls(EFirstCall) +/** + * Constructor of the DHCPIP6StateMachine + * + * @internalTechnology + * + */ + { + } +#else +inline CDHCPIP6StateMachine::CDHCPIP6StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager): + CDHCPStateMachine( aEsock, aConnection, aInterfaceName, aDhcpHwAddrManager, EFalse ), iStartInitCalls(EFirstCall) +/** + * Constructor of the DHCPIP6StateMachine + * + * @internalTechnology + * + */ + { + } +#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION +#else // SYMBIAN_NETWORKING_DHCPSERVER + +inline CDHCPIP6StateMachine::CDHCPIP6StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName): + CDHCPStateMachine( aEsock, aConnection, aInterfaceName ), iStartInitCalls(EFirstCall) +/** + * Constructor of the DHCPIP6StateMachine + * + * @internalTechnology + * + */ + { + } +#endif // SYMBIAN_NETWORKING_DHCPSERVER + +inline CDHCPIP6MessageSender* CDHCPIP6StateMachine::MessageSender() const + { + return static_cast(iMessageSender); + } + +/** + * Accessor method for the current DHCP message + * + * @internalTechnology + * + */ +inline DHCPv6::CDHCPMessageHeaderIP6* CDHCPIP6StateMachine::DhcpMessage() const + { + return static_cast(iDhcpMessage); + } + + +#endif +