diff -r 000000000000 -r af10295192d8 tcpiputils/dhcp/src/DHCPIP6MsgSender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dhcp/src/DHCPIP6MsgSender.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,132 @@ +// 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 Message sender DHCPIP6 specific access functthat fustions +// resends messages until max retry or max count has been reached.. +// +// + +/** + @file DHCPIP6MsgSender.cpp + @internalTechnology +*/ + +#include "DHCPServer.h" +#include "DHCPIP6MsgSender.h" +#include "DhcpIP6Msg.h" +#include +#include + +/* +the retransmition alg recomended by RFC3315 (DHCPv6). Could be used for DHCPv4 as well +for DHPCv4 doesn't specify anything + RT for the first message transmission is based on IRT: + + RT = IRT + RAND*IRT + + RT for each subsequent message transmission is based on the previous + value of RT: + + RT = 2*RTprev + RAND*RTprev + + MRT specifies an upper bound on the value of RT (disregarding the + randomisation added by the use of RAND). If MRT has a value of 0, + there is no upper limit on the value of RT. Otherwise: + + if (RT > MRT) + RT = MRT + RAND*MRT + +*/ +TBool CDHCPIP6MessageSender::SendingContinues() const +/** + * determines whether to continue the sending + * + * + * @internalTechnology + * + */ + { + if ( iRetryCount ) + {//EElapsedTime option MUST be the first option in the option part of the message + //see CDHCPIP6StateMachine::SetMessageHeader fn + TUint32 elapsedHundrOfSecs = iMicroSecs.Int() / KMicrosecondsInSecs * 100; + TUint8* elapsedOptionBody = const_cast(iMsg->Des().Ptr()) + DHCPv6::KDHCPHeaderLength + DHCPv6::KOptionHeaderLength; + TUint32 current = TBigEndian::GetValue( elapsedOptionBody, DHCPv6::KElapsedTimeOptionLen ); + TBigEndian::SetValue( elapsedOptionBody, DHCPv6::KElapsedTimeOptionLen, current + elapsedHundrOfSecs ); + } + return iRetryCount < iMaxRetryCount && iRetryDuration < iMaxRetryDuration; + } + +TBool CDHCPIP6MessageSender::CalculateDelay() +/** + * Calculates the first and the next retransmition time. Returns ETrue is the time calculated + * is greater than zero. + * + * @internalTechnology + * + */ + { + if ( iRetryCount > -1 ) + { + TInt ms = iMicroSecs.Int(); + ms = iInitialRetryTimeout ? iInitialRetryTimeout : ms + 2*ms + iXid.Rnd( -ms/10, ms/10 ); + + if ( ms > iMaxRetryTimeout || ms <= 0 ) + { + ms = iMaxRetryTimeout + iXid.Rnd( -iMaxRetryTimeout/10, iMaxRetryTimeout/10 ); + } + iInitialRetryTimeout = 0; + iMicroSecs = ms; + } + else + {//msg to be send for the first time + iMicroSecs = iXid.Rnd( 0, iFirstSendDelay ); + } + + return iMicroSecs.Int() > 0; + } + +void CDHCPIP6MessageSender::SetListener( MMSListener* aMMSListener ) + { + iMMSListener = aMMSListener; + } + +MMSListener* CDHCPIP6MessageSender::EventListener() const + { + return iMMSListener; + } + +void CDHCPIP6MessageSender::SetInitialRetryTimeout( TInt aSeconds ) + { + iInitialRetryTimeout = KMicrosecondsInSecs * aSeconds; + } + +void CDHCPIP6MessageSender::SetMaxRetryTimeout( TInt aSeconds ) + { + iMaxRetryTimeout = KMicrosecondsInSecs * aSeconds; + } + +void CDHCPIP6MessageSender::SetMaxRetryCount( TInt aCount ) + { + iMaxRetryCount = aCount; + } + +void CDHCPIP6MessageSender::SetMaxRetryDuration( TInt aSeconds ) + { + iMaxRetryDuration = KMicrosecondsInSecs * aSeconds; + } + +void CDHCPIP6MessageSender::SetFirstSendDelay( TInt aSeconds ) + { + iFirstSendDelay = KMicrosecondsInSecs * aSeconds; + }