tcpiputils/dhcp/include/DHCPIP4StateMachine.h
changeset 0 af10295192d8
child 53 7e41d162e158
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // The DHCPIP4StateMachine header file
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file DHCPIP4StateMachine.h
       
    20 */
       
    21 
       
    22 #ifndef __DHCPIP4STATEMACHINE_H__
       
    23 #define __DHCPIP4STATEMACHINE_H__
       
    24 
       
    25 #include "DHCPStateMachine.h"
       
    26 #include "DHCPIP4Msg.h"
       
    27 
       
    28 class CDHCPIP4State;
       
    29 #ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
    30 class CDhcpHwAddrManager;
       
    31 #endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
    32 class CDHCPIP4StateMachine : public CDHCPStateMachine
       
    33 /**
       
    34   * Implements helper function & starts DHCPv4 tasks (INIT,INFORM,....)
       
    35   *
       
    36   * @internalTechnology
       
    37   */
       
    38 	{
       
    39 friend class CDHCPIP4Control;
       
    40 friend class CDHCPIP4Select;
       
    41 friend class CDHCPIP4HandleClientMsgs;
       
    42 friend class CDHCPIP4SendRequestResponse;
       
    43 friend class CDHCPIP4SendInformResponse;
       
    44 
       
    45 public:
       
    46    /* tasks the statemachine could be started for
       
    47    enum ETask
       
    48       {
       
    49       EInit,
       
    50       EInform,
       
    51       EReboot,
       
    52       ERenew,
       
    53       ERebind,
       
    54       EDecline,
       
    55       ERelease
       
    56       };
       
    57    */
       
    58 
       
    59 public:
       
    60 	~CDHCPIP4StateMachine();
       
    61 #ifdef SYMBIAN_NETWORKING_DHCPSERVER  		
       
    62 #ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
    63 	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl);	
       
    64 #else
       
    65 	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl);
       
    66 #endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
    67 #else 	
       
    68 	static CDHCPIP4StateMachine* NewL(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName);
       
    69 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
    70 	virtual void GetServerAddress( TInetAddr& aAddress );
       
    71 #ifdef SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
    72 	void StartInformL(MStateMachineNotify* aStateMachineNotify);
       
    73 #endif //SYMBIAN_NETWORKING_DHCP_MSG_HEADERS
       
    74   	virtual void SetCurrentAddress(const TInetAddr& aCurrentAddress, const TInetAddr& aSubnetMask);
       
    75 #ifdef SYMBIAN_NETWORKING_DHCPSERVER  	
       
    76 	virtual void GetClientAddress(TInetAddr& aAddress);
       
    77 	virtual CDHCPState* ReceiveOnPort67L( TRequestStatus* aStatus );
       
    78 	virtual void InitialiseServerSocketL();//For the Server Impl
       
    79 	virtual void CreateOfferMsgL();
       
    80    	virtual void HandleRequestMsgL();
       
    81    	virtual void HandleInformMsgL();   	
       
    82 	virtual void InitServerStateMachineL(MStateMachineNotify* aStateMachineNotify);	
       
    83 	virtual void InitServerBinding(MStateMachineNotify* aStateMachineNotify);	
       
    84 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
    85    virtual CDHCPState* ReceiveL( TRequestStatus* aStatus );
       
    86    
       
    87    //interface used by CDHCPIP4Control
       
    88 	virtual void StartInitL(MStateMachineNotify* aStateMachineNotify, EInitialisationContext aInitialisationContext, TInt aUserTimeOut = 0);
       
    89 	virtual void StartInformL(MStateMachineNotify* aStateMachineNotify, TBool aStaticAddress);
       
    90 	virtual void StartRebootL(MStateMachineNotify* aStateMachineNotify);
       
    91 	virtual void StartRenewL(MStateMachineNotify* aStateMachineNotify, TInt aUserTimeOut);
       
    92 	virtual void StartRebindL(MStateMachineNotify* aStateMachineNotify);
       
    93 	virtual void StartDeclineL(MStateMachineNotify* aStateMachineNotify);
       
    94 	virtual void StartReleaseL(MStateMachineNotify* aStateMachineNotify);
       
    95 
       
    96 	virtual void RemoveConfiguredAddress(const TInetAddr *aInetAddr = NULL);
       
    97 
       
    98 	//interface used by CDHCPIP4States derivatives
       
    99    void CreateMessageL();
       
   100    void CreateCommonMsgStart();
       
   101    void CreateCommonMsgEndL();
       
   102    virtual void InitialiseSocketL();
       
   103    virtual void CreateDiscoverMsgL();
       
   104    virtual void CreateOfferAcceptanceRequestMsgL();
       
   105    virtual void CreateRebootRequestMsgL();
       
   106    virtual void CreateInformMsgL();
       
   107    virtual void CreateDeclineMsgL();
       
   108    virtual void CreateRenewRequestMsgL();
       
   109    virtual void CreateRebindRequestMsgL();
       
   110    virtual void CreateReleaseMsgL();
       
   111    TInt CreateIPv4LinkLocal();
       
   112    virtual void HandleOfferL();
       
   113    virtual CDHCPState* HandleReplyL( TRequestStatus* aStatus );
       
   114   
       
   115    virtual void BindSocketForUnicastL();
       
   116 
       
   117    TUint8 GetMessageTypeL() const;
       
   118 	TBool CheckXid() const;
       
   119 
       
   120 	//interface used by both CDHCPIP4States derivatives & CDHCPIP4Control
       
   121 	TBool IsUsingStaticAddress() const;
       
   122 #ifdef _DEBUG
       
   123 	static TInt GetDestPort();
       
   124 #endif
       
   125 
       
   126 #ifdef SYMBIAN_DNS_PROXY
       
   127 	void ReadDhcpMsgParamsL();
       
   128 #endif // SYMBIAN_DNS_PROXY	
       
   129 
       
   130 #ifdef SYMBIAN_NETWORKING_DHCPSERVER
       
   131 	void CheckClientMsgL();	
       
   132 	void HandleRequest();
       
   133 	void HandleInformL();
       
   134 	void ProcessDiscoverL();
       
   135 	void ProcessRequestL();
       
   136 	void ProcessInformL();
       
   137 	TUint8 GetClientMessageTypeL() const;
       
   138 	TUint32 GetIPAddressToOffer();
       
   139 	TUint32 GetClientIPAddress();
       
   140 #ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION	
       
   141 	TBool ClientHwAddrProvisioned();
       
   142 #endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   143 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   144 protected:
       
   145 #ifdef SYMBIAN_NETWORKING_DHCPSERVER
       
   146 #ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   147 	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl);
       
   148 #else
       
   149 	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl);
       
   150 #endif
       
   151 #else 
       
   152 	CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName);
       
   153 #endif // SYMBIAN_NETWORKING_DHCPSERVER		
       
   154 	
       
   155 	void ConstructL();
       
   156 
       
   157 	void ConfigureInterfaceL();
       
   158 	virtual void PrepareToSendL(CDHCPStateMachine::EAddressType aEAddressType);
       
   159 #ifdef SYMBIAN_NETWORKING_DHCPSERVER	
       
   160 	virtual void PrepareToSendServerMsgL(CDHCPStateMachine::EAddressType aEAddressType);
       
   161 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   162    	virtual void AssembleClientIDsL();
       
   163 	virtual void AssignAddresses( TInetAddr& aDest, const TInetAddr& aSrc ) const;
       
   164 
       
   165 protected:
       
   166 	DHCPv4::CDHCPMessageHeaderIP4* DhcpMessage() const;
       
   167 	void SetMessageHeaderL( DHCPv4::TDHCPv4MessageType aMsgType );
       
   168 #ifdef 	SYMBIAN_NETWORKING_DHCPSERVER
       
   169 	void SetMessageHeaderAsServerL( DHCPv4::TDHCPv4MessageType aMsgType );
       
   170 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   171 	void HandleAckL();
       
   172 	void CreateFqdnUpdateRequestL();
       
   173 #ifdef SYMBIAN_NETWORKING_DHCPSERVER	
       
   174 private:
       
   175 	void ProcessDeclineL();
       
   176 	TUint32 GenerateClientIPAddress();
       
   177     void AddParamRequestOptionL(TUint8 aParamReqValue);
       
   178 	void CheckClientParamListL();
       
   179 	void AddMessageOptionsL();
       
   180 #endif // SYMBIAN_NETWORKING_DHCPSERVER   
       
   181 private:
       
   182    //accessed by CDHCPIP4Control & CDHCPIP6MessageReader
       
   183 	TInetAddr iDHCPServerAddr; //server address currently used to send/receive
       
   184 	TUint32 iServerAddress;	// to store the address of the DHCP Server we are dealing with
       
   185 #ifdef 	SYMBIAN_NETWORKING_DHCPSERVER
       
   186 	TInetAddr iDHCPClientAddr; //client address 
       
   187 	TBool iBroadCastFlag;
       
   188 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   189 	TPtr8 iIncomingMsgDataPtr;
       
   190 	TInetAddr iDHCPServerID;
       
   191 	TInetAddr iBroadcastAddress;
       
   192 	TInetAddr iSubnetMask;
       
   193 	};
       
   194 	
       
   195 #ifdef SYMBIAN_NETWORKING_DHCPSERVER
       
   196 #ifndef SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   197 inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName,TBool aDHCPServerImpl):
       
   198                      CDHCPStateMachine( aEsock, aConnection, aInterfaceName ,aDHCPServerImpl),
       
   199                      iIncomingMsgDataPtr( 0, 0 )
       
   200 #else
       
   201 inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName, CDhcpHwAddrManager* aDhcpHwAddrManager, TBool aDHCPServerImpl):
       
   202                      CDHCPStateMachine( aEsock, aConnection, aInterfaceName , aDhcpHwAddrManager, aDHCPServerImpl),
       
   203                      iIncomingMsgDataPtr( 0, 0 )
       
   204 #endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
       
   205 /**
       
   206   * Constructor of the DHCPv4StateMachine
       
   207   *
       
   208   * @internalTechnology
       
   209   *
       
   210   */
       
   211 	{
       
   212 	}
       
   213 		
       
   214 #else // SYMBIAN_NETWORKING_DHCPSERVER
       
   215 
       
   216 inline CDHCPIP4StateMachine::CDHCPIP4StateMachine(RSocketServ& aEsock, RConnection& aConnection, const TName& aInterfaceName):
       
   217                      CDHCPStateMachine( aEsock, aConnection, aInterfaceName ),
       
   218                      iIncomingMsgDataPtr( 0, 0 )
       
   219 /**
       
   220   * Constructor of the DHCPv4StateMachine
       
   221   *
       
   222   * @internalTechnology
       
   223   *
       
   224   */
       
   225 	{
       
   226 	}
       
   227 #endif // SYMBIAN_NETWORKING_DHCPSERVER
       
   228 
       
   229 inline DHCPv4::CDHCPMessageHeaderIP4* CDHCPIP4StateMachine::DhcpMessage() const
       
   230 	{
       
   231 	return static_cast<DHCPv4::CDHCPMessageHeaderIP4*>(iDhcpMessage);
       
   232 	}
       
   233 
       
   234 inline TBool CDHCPIP4StateMachine::IsUsingStaticAddress() const
       
   235 	{
       
   236 	return iCfgInfoOnly;
       
   237 	}
       
   238 	
       
   239 #ifdef SYMBIAN_NETWORKING_DHCPSERVER	
       
   240 inline TUint32 CDHCPIP4StateMachine::GetClientIPAddress()
       
   241 	{
       
   242 	DHCPv4::CDHCPMessageHeaderIP4* v4Msg = DhcpMessage();
       
   243 	return  v4Msg->GetCIAddr();
       
   244 	}
       
   245 #endif // SYMBIAN_NETWORKING_DHCPSERVER	
       
   246 
       
   247 #endif
       
   248