diff -r 000000000000 -r af10295192d8 tcpiputils/dhcp/include/DHCPIP4StateMachine.h --- /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(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 +