tcpiputils/dhcp/include/DHCPIP4StateMachine.h
changeset 0 af10295192d8
child 53 7e41d162e158
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpiputils/dhcp/include/DHCPIP4StateMachine.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,248 @@
+// 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 DHCPIP4StateMachine header file
+// 
+//
+
+/**
+ @file DHCPIP4StateMachine.h
+*/
+
+#ifndef __DHCPIP4STATEMACHINE_H__
+#define __DHCPIP4STATEMACHINE_H__
+
+#include "DHCPStateMachine.h"
+#include "DHCPIP4Msg.h"
+
+class CDHCPIP4State;
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+class CDhcpHwAddrManager;
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+class CDHCPIP4StateMachine : public CDHCPStateMachine
+/**
+  * Implements helper function & starts DHCPv4 tasks (INIT,INFORM,....)
+  *
+  * @internalTechnology
+  */
+	{
+friend class CDHCPIP4Control;
+friend class CDHCPIP4Select;
+friend class CDHCPIP4HandleClientMsgs;
+friend class CDHCPIP4SendRequestResponse;
+friend class CDHCPIP4SendInformResponse;
+
+public:
+   /* tasks the statemachine could be started for
+   enum ETask
+      {
+      EInit,
+      EInform,
+      EReboot,
+      ERenew,
+      ERebind,
+      EDecline,
+      ERelease
+      };
+   */
+
+public:
+	~CDHCPIP4StateMachine();
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER  		
+#ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl);	
+#else
+	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl);
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+#else 	
+	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName);
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+	virtual void GetServerAddress( TInetAddr& aAddress );
+#ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+	void StartInformL(MStateMachineNotify* aStateMachineNotify);
+#endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
+  	virtual void SetCurrentAddress(const TInetAddr& aCurrentAddress, const TInetAddr& aSubnetMask);
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER  	
+	virtual void GetClientAddress(TInetAddr& aAddress);
+	virtual CDHCPState* ReceiveOnPort67L( TRequestStatus* aStatus );
+	virtual void InitialiseServerSocketL();//For the Server Impl
+	virtual void CreateOfferMsgL();
+   	virtual void HandleRequestMsgL();
+   	virtual void HandleInformMsgL();   	
+	virtual void InitServerStateMachineL(MStateMachineNotify* aStateMachineNotify);	
+	virtual void InitServerBinding(MStateMachineNotify* aStateMachineNotify);	
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+   virtual CDHCPState* ReceiveL( TRequestStatus* aStatus );
+   
+   //interface used by CDHCPIP4Control
+	virtual void StartInitL(MStateMachineNotify* aStateMachineNotify, EInitialisationContext aInitialisationContext, TInt aUserTimeOut = 0);
+	virtual void StartInformL(MStateMachineNotify* aStateMachineNotify, TBool aStaticAddress);
+	virtual void StartRebootL(MStateMachineNotify* aStateMachineNotify);
+	virtual void StartRenewL(MStateMachineNotify* aStateMachineNotify, TInt aUserTimeOut);
+	virtual void StartRebindL(MStateMachineNotify* aStateMachineNotify);
+	virtual void StartDeclineL(MStateMachineNotify* aStateMachineNotify);
+	virtual void StartReleaseL(MStateMachineNotify* aStateMachineNotify);
+
+	virtual void RemoveConfiguredAddress(const TInetAddr *aInetAddr = NULL);
+
+	//interface used by CDHCPIP4States derivatives
+   void CreateMessageL();
+   void CreateCommonMsgStart();
+   void CreateCommonMsgEndL();
+   virtual void InitialiseSocketL();
+   virtual void CreateDiscoverMsgL();
+   virtual void CreateOfferAcceptanceRequestMsgL();
+   virtual void CreateRebootRequestMsgL();
+   virtual void CreateInformMsgL();
+   virtual void CreateDeclineMsgL();
+   virtual void CreateRenewRequestMsgL();
+   virtual void CreateRebindRequestMsgL();
+   virtual void CreateReleaseMsgL();
+   TInt CreateIPv4LinkLocal();
+   virtual void HandleOfferL();
+   virtual CDHCPState* HandleReplyL( TRequestStatus* aStatus );
+  
+   virtual void BindSocketForUnicastL();
+
+   TUint8 GetMessageTypeL() const;
+	TBool CheckXid() const;
+
+	//interface used by both CDHCPIP4States derivatives & CDHCPIP4Control
+	TBool IsUsingStaticAddress() const;
+#ifdef _DEBUG
+	static TInt GetDestPort();
+#endif
+
+#ifdef SYMBIAN_DNS_PROXY
+	void ReadDhcpMsgParamsL();
+#endif // SYMBIAN_DNS_PROXY	
+
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER
+	void CheckClientMsgL();	
+	void HandleRequest();
+	void HandleInformL();
+	void ProcessDiscoverL();
+	void ProcessRequestL();
+	void ProcessInformL();
+	TUint8 GetClientMessageTypeL() const;
+	TUint32 GetIPAddressToOffer();
+	TUint32 GetClientIPAddress();
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION	
+	TBool ClientHwAddrProvisioned();
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+protected:
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER
+#ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl);
+#else
+	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl);
+#endif
+#else 
+	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName);
+#endif // SYMBIAN_NETWORKING_DHCPSERVER		
+	
+	void ConstructL();
+
+	void ConfigureInterfaceL();
+	virtual void PrepareToSendL(CDHCPStateMachine::EAddressType aEAddressType);
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+	virtual void PrepareToSendServerMsgL(CDHCPStateMachine::EAddressType aEAddressType);
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+   	virtual void AssembleClientIDsL();
+	virtual void AssignAddresses( TInetAddr& aDest, const TInetAddr& aSrc ) const;
+
+protected:
+	DHCPv4::CDHCPMessageHeaderIP4* DhcpMessage() const;
+	void SetMessageHeaderL( DHCPv4::TDHCPv4MessageType aMsgType );
+#ifdef 	SYMBIAN_NETWORKING_DHCPSERVER
+	void SetMessageHeaderAsServerL( DHCPv4::TDHCPv4MessageType aMsgType );
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+	void HandleAckL();
+	void CreateFqdnUpdateRequestL();
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+private:
+	void ProcessDeclineL();
+	TUint32 GenerateClientIPAddress();
+    void AddParamRequestOptionL(TUint8 aParamReqValue);
+	void CheckClientParamListL();
+	void AddMessageOptionsL();
+#endif // SYMBIAN_NETWORKING_DHCPSERVER   
+private:
+   //accessed by CDHCPIP4Control & CDHCPIP6MessageReader
+	TInetAddr iDHCPServerAddr; //server address currently used to send/receive
+	TUint32 iServerAddress;	// to store the address of the DHCP Server we are dealing with
+#ifdef 	SYMBIAN_NETWORKING_DHCPSERVER
+	TInetAddr iDHCPClientAddr; //client address 
+	TBool iBroadCastFlag;
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+	TPtr8 iIncomingMsgDataPtr;
+	TInetAddr iDHCPServerID;
+	TInetAddr iBroadcastAddress;
+	TInetAddr iSubnetMask;
+	};
+	
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER
+#ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl):
+                     CDHCPStateMachine( aEsock, aConnection, aInterfaceName ,aDHCPServerImpl),
+                     iIncomingMsgDataPtr( 0, 0 )
+#else
+inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl):
+                     CDHCPStateMachine( aEsock, aConnection, aInterfaceName , aDhcpHwAddrManager, aDHCPServerImpl),
+                     iIncomingMsgDataPtr( 0, 0 )
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+/**
+  * Constructor of the DHCPv4StateMachine
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	}
+		
+#else // SYMBIAN_NETWORKING_DHCPSERVER
+
+inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName):
+                     CDHCPStateMachine( aEsock, aConnection, aInterfaceName ),
+                     iIncomingMsgDataPtr( 0, 0 )
+/**
+  * Constructor of the DHCPv4StateMachine
+  *
+  * @internalTechnology
+  *
+  */
+	{
+	}
+#endif // SYMBIAN_NETWORKING_DHCPSERVER
+
+inline DHCPv4::CDHCPMessageHeaderIP4* CDHCPIP4StateMachine::DhcpMessage() const
+	{
+	return static_cast<DHCPv4::CDHCPMessageHeaderIP4*>(iDhcpMessage);
+	}
+
+inline TBool CDHCPIP4StateMachine::IsUsingStaticAddress() const
+	{
+	return iCfgInfoOnly;
+	}
+	
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+inline TUint32 CDHCPIP4StateMachine::GetClientIPAddress()
+	{
+	DHCPv4::CDHCPMessageHeaderIP4* v4Msg = DhcpMessage();
+	return  v4Msg->GetCIAddr();
+	}
+#endif // SYMBIAN_NETWORKING_DHCPSERVER	
+
+#endif
+