tcpiputils/dhcp/src/DHCPIP4States.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpiputils/dhcp/src/DHCPIP4States.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,176 @@
+// 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:
+// Implements the DHCPv4 States representing each interface
+// 
+//
+
+/**
+ @file DHCPIP4States.cpp
+ @internalTechnology
+*/
+
+#include "DHCPIP4States.h"
+#include "DHCPMsg.h"
+#include "DHCPServer.h"
+
+#include "DHCPStatesDebug.h"
+
+CAsynchEvent* CDHCPIP4Select::ProcessL(TRequestStatus& aStatus)
+/**
+  * Interface function, execute state machine
+  *
+  * @internalTechnology
+  */
+	{
+	DHCP_DEBUG_PUBLISH_STATE(DHCPDebug::EDHCPIP4Select);
+	CDHCPIP4StateMachine& rDHCPIPv4 = DHCPIPv4();
+	
+	if (rDHCPIPv4.iReceiving)
+		{		
+		if((rDHCPIPv4.GetMessageTypeL() == DHCPv4::EDHCPOffer) && rDHCPIPv4.CheckXid())
+			{
+			return CDHCPSelect::ProcessL(aStatus);
+			}
+		else
+			{
+			rDHCPIPv4.iReceiving = EFalse;
+			}	
+		}				
+	return rDHCPIPv4.ReceiveL(&aStatus);	
+	}
+
+#ifdef SYMBIAN_NETWORKING_DHCPSERVER	
+CAsynchEvent* CDHCPIP4HandleClientMsgs::ProcessL(TRequestStatus& aStatus)
+/**
+  * Interface function, execute state machine
+  *
+  * @internalTechnology
+  */
+	{
+	__CFLOG_VAR((KLogSubSysDHCP, KLogCode, _L8("CDHCPIP4HandleClientMsgs::ProcessL")));
+	
+	DHCP_DEBUG_PUBLISH_STATE(DHCPDebug::EDHCPIP4HandleClientMsgs);
+	CDHCPIP4StateMachine& rDHCPv4  = DHCPIPv4();
+	rDHCPv4.iReceiving = EFalse;
+	
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	TBool provisioned = rDHCPv4.ClientHwAddrProvisioned();
+	if(provisioned)
+		{
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+		rDHCPv4.CheckClientMsgL();
+#ifdef SYMBIAN_NETWORKING_ADDRESS_PROVISION
+		}
+#endif //SYMBIAN_NETWORKING_ADDRESS_PROVISION
+	// self complete to continue the state machine
+	TRequestStatus* p = &aStatus;
+	User::RequestComplete(p, KErrNone);
+	return iNext;
+	}	
+	
+CAsynchEvent* CDHCPIP4SendRequestResponse::ProcessL(TRequestStatus& aStatus)
+	{
+	__CFLOG_VAR((KLogSubSysDHCP, KLogCode, _L8("CDHCPIP4SendRequestResponse::ProcessL")));
+	
+	DHCP_DEBUG_PUBLISH_STATE(DHCPDebug::EDHCPIP4SendRequestResponse);
+	CDHCPIP4StateMachine& rDHCPIPv4 = DHCPIPv4();
+	
+	if (rDHCPIPv4.iReceiving)
+		{		
+		if((rDHCPIPv4.GetClientMessageTypeL() == DHCPv4::EDHCPRequest))
+			{
+			if(rDHCPIPv4.CheckXid())
+				{
+				// this is from the same client which we last serviced
+				return CDHCPSendRequestResponse::ProcessL(aStatus);	
+				}
+			else 
+				{
+				// this request is not from the same client as the one we recently serviced  
+				// check if this was a renew/rebind request from a client whom we provided an IP address in the past
+				// then we need to service this client and not ignore it
+				TUint32 clientAddr = rDHCPIPv4.GetClientIPAddress();
+				if(rDHCPIPv4.GetIPAddressToOffer() == clientAddr ||
+						!clientAddr)
+					{
+					rDHCPIPv4.SetClientIdentified(ETrue);
+					return 	CDHCPSendRequestResponse::ProcessL(aStatus);	
+					}
+				else
+					{
+					// unexpected packet, proceed to recieve the packet and discard.
+					__CFLOG_VAR((KLogSubSysDHCP, KLogCode, _L8("CDHCPIP4SendRequestResponse::ProcessL Unexpected packet")));
+					rDHCPIPv4.iReceiving = EFalse;
+					} 
+				}	
+			}
+		else
+			{
+			rDHCPIPv4.iReceiving = EFalse;
+			}	
+		}				
+	return rDHCPIPv4.ReceiveOnPort67L(&aStatus);
+	}
+	
+CAsynchEvent* CDHCPIP4SendInformResponse::ProcessL(TRequestStatus& aStatus)
+	{
+	__CFLOG_VAR((KLogSubSysDHCP, KLogCode, _L8("CDHCPIP4SendInformResponse::ProcessL")));
+	
+	DHCP_DEBUG_PUBLISH_STATE(DHCPDebug::EDHCPIP4SendInformResponse);	
+	CDHCPIP4StateMachine& rDHCPIPv4 = DHCPIPv4();
+	
+	if (rDHCPIPv4.iReceiving)
+		{		
+		if((rDHCPIPv4.GetClientMessageTypeL() == DHCPv4::EDHCPInform))
+			{
+			return CDHCPSendInformResponse::ProcessL(aStatus);
+			}
+		else
+			{
+			rDHCPIPv4.iReceiving = EFalse;
+			}	
+		}				
+	return rDHCPIPv4.ReceiveOnPort67L(&aStatus);
+	}	
+
+void CDHCPIP4BindServer::TimerExpired()
+	{
+	CDHCPStateMachine& rDHCP = Dhcp();
+	CDHCPBindServer::TimerExpired();
+	if ( !rDHCP.TimerActive() )
+		{
+		//finish either => bound or not
+		TRequestStatus* p = &iStateMachine->iStatus;
+		User::RequestComplete(p, iErr); 
+		rDHCP.SetAsyncCancelHandler(NULL);
+		}
+	}
+		
+#endif // SYMBIAN_NETWORKING_DHCPSERVER
+
+void CDHCPIP4WaitForDAD::TimerExpired()
+	{
+	CDHCPStateMachine& rDHCP = Dhcp();
+	CDHCPWaitForDADBind::TimerExpired();
+	if ( !rDHCP.TimerActive() )
+		{
+		//finish either => bound or not
+		TRequestStatus* p = &iStateMachine->iStatus;
+		User::RequestComplete(p, iErr); 
+		rDHCP.SetAsyncCancelHandler(NULL);
+		}
+	}
+	
+
+