diff -r 000000000000 -r af10295192d8 tcpiputils/dhcp/src/DHCPIP4States.cpp --- /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); + } + } + + +