tcpiputils/dhcp/include/DHCPIP6StateMachine.h
changeset 0 af10295192d8
--- /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<CDHCPIP6MessageSender*>(iMessageSender);
+   }
+
+/**
+  * Accessor method for the current DHCP message
+  *
+  * @internalTechnology
+  *
+  */
+inline DHCPv6::CDHCPMessageHeaderIP6* CDHCPIP6StateMachine::DhcpMessage() const
+	{
+	return static_cast<DHCPv6::CDHCPMessageHeaderIP6*>(iDhcpMessage);
+	}
+
+
+#endif
+