| Index: net/third_party/udt/src/ccc.cpp
|
| ===================================================================
|
| --- net/third_party/udt/src/ccc.cpp (revision 78992)
|
| +++ net/third_party/udt/src/ccc.cpp (working copy)
|
| @@ -1,311 +0,0 @@
|
| -/*****************************************************************************
|
| -Copyright (c) 2001 - 2009, The Board of Trustees of the University of Illinois.
|
| -All rights reserved.
|
| -
|
| -Redistribution and use in source and binary forms, with or without
|
| -modification, are permitted provided that the following conditions are
|
| -met:
|
| -
|
| -* Redistributions of source code must retain the above
|
| - copyright notice, this list of conditions and the
|
| - following disclaimer.
|
| -
|
| -* Redistributions in binary form must reproduce the
|
| - above copyright notice, this list of conditions
|
| - and the following disclaimer in the documentation
|
| - and/or other materials provided with the distribution.
|
| -
|
| -* Neither the name of the University of Illinois
|
| - nor the names of its contributors may be used to
|
| - endorse or promote products derived from this
|
| - software without specific prior written permission.
|
| -
|
| -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
| -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
| -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
| -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
| -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
| -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -*****************************************************************************/
|
| -
|
| -/*****************************************************************************
|
| -written by
|
| - Yunhong Gu, last updated 07/09/2009
|
| -*****************************************************************************/
|
| -
|
| -
|
| -#include "core.h"
|
| -#include "ccc.h"
|
| -#include <cmath>
|
| -#include <cstring>
|
| -
|
| -CCC::CCC():
|
| -m_iSYNInterval(CUDT::m_iSYNInterval),
|
| -m_dPktSndPeriod(1.0),
|
| -m_dCWndSize(16.0),
|
| -m_iBandwidth(),
|
| -m_dMaxCWndSize(),
|
| -m_iMSS(),
|
| -m_iSndCurrSeqNo(),
|
| -m_iRcvRate(),
|
| -m_iRTT(),
|
| -m_pcParam(NULL),
|
| -m_iPSize(0),
|
| -m_UDT(),
|
| -m_iACKPeriod(0),
|
| -m_iACKInterval(0),
|
| -m_bUserDefinedRTO(false),
|
| -m_iRTO(-1),
|
| -m_PerfInfo()
|
| -{
|
| -}
|
| -
|
| -CCC::~CCC()
|
| -{
|
| - delete [] m_pcParam;
|
| -}
|
| -
|
| -void CCC::setACKTimer(const int& msINT)
|
| -{
|
| - m_iACKPeriod = msINT;
|
| -
|
| - if (m_iACKPeriod > m_iSYNInterval)
|
| - m_iACKPeriod = m_iSYNInterval;
|
| -}
|
| -
|
| -void CCC::setACKInterval(const int& pktINT)
|
| -{
|
| - m_iACKInterval = pktINT;
|
| -}
|
| -
|
| -void CCC::setRTO(const int& usRTO)
|
| -{
|
| - m_bUserDefinedRTO = true;
|
| - m_iRTO = usRTO;
|
| -}
|
| -
|
| -void CCC::sendCustomMsg(CPacket& pkt) const
|
| -{
|
| - CUDT* u = CUDT::getUDTHandle(m_UDT);
|
| -
|
| - if (NULL != u)
|
| - {
|
| - pkt.m_iID = u->m_PeerID;
|
| - u->m_pSndQueue->sendto(u->m_pPeerAddr, pkt);
|
| - }
|
| -}
|
| -
|
| -const CPerfMon* CCC::getPerfInfo()
|
| -{
|
| - CUDT* u = CUDT::getUDTHandle(m_UDT);
|
| - if (NULL != u)
|
| - u->sample(&m_PerfInfo, false);
|
| -
|
| - return &m_PerfInfo;
|
| -}
|
| -
|
| -void CCC::setMSS(const int& mss)
|
| -{
|
| - m_iMSS = mss;
|
| -}
|
| -
|
| -void CCC::setBandwidth(const int& bw)
|
| -{
|
| - m_iBandwidth = bw;
|
| -}
|
| -
|
| -void CCC::setSndCurrSeqNo(const int32_t& seqno)
|
| -{
|
| - m_iSndCurrSeqNo = seqno;
|
| -}
|
| -
|
| -void CCC::setRcvRate(const int& rcvrate)
|
| -{
|
| - m_iRcvRate = rcvrate;
|
| -}
|
| -
|
| -void CCC::setMaxCWndSize(const int& cwnd)
|
| -{
|
| - m_dMaxCWndSize = cwnd;
|
| -}
|
| -
|
| -void CCC::setRTT(const int& rtt)
|
| -{
|
| - m_iRTT = rtt;
|
| -}
|
| -
|
| -void CCC::setUserParam(const char* param, const int& size)
|
| -{
|
| - delete [] m_pcParam;
|
| - m_pcParam = new char[size];
|
| - memcpy(m_pcParam, param, size);
|
| - m_iPSize = size;
|
| -}
|
| -
|
| -//
|
| -CUDTCC::CUDTCC():
|
| -m_iRCInterval(),
|
| -m_LastRCTime(),
|
| -m_bSlowStart(),
|
| -m_iLastAck(),
|
| -m_bLoss(),
|
| -m_iLastDecSeq(),
|
| -m_dLastDecPeriod(),
|
| -m_iNAKCount(),
|
| -m_iDecRandom(),
|
| -m_iAvgNAKNum(),
|
| -m_iDecCount()
|
| -{
|
| -}
|
| -
|
| -void CUDTCC::init()
|
| -{
|
| - m_iRCInterval = m_iSYNInterval;
|
| - m_LastRCTime = CTimer::getTime();
|
| - setACKTimer(m_iRCInterval);
|
| -
|
| - m_bSlowStart = true;
|
| - m_iLastAck = m_iSndCurrSeqNo;
|
| - m_bLoss = false;
|
| - m_iLastDecSeq = CSeqNo::decseq(m_iLastAck);
|
| - m_dLastDecPeriod = 1;
|
| - m_iAvgNAKNum = 0;
|
| - m_iNAKCount = 0;
|
| - m_iDecRandom = 1;
|
| -
|
| - m_dCWndSize = 16;
|
| - m_dPktSndPeriod = 1;
|
| -}
|
| -
|
| -void CUDTCC::onACK(const int32_t& ack)
|
| -{
|
| - uint64_t currtime = CTimer::getTime();
|
| - if (currtime - m_LastRCTime < (uint64_t)m_iRCInterval)
|
| - return;
|
| -
|
| - m_LastRCTime = currtime;
|
| -
|
| - if (m_bSlowStart)
|
| - {
|
| - m_dCWndSize += CSeqNo::seqlen(m_iLastAck, ack);
|
| - m_iLastAck = ack;
|
| -
|
| - if (m_dCWndSize > m_dMaxCWndSize)
|
| - {
|
| - m_bSlowStart = false;
|
| - if (m_iRcvRate > 0)
|
| - m_dPktSndPeriod = 1000000.0 / m_iRcvRate;
|
| - else
|
| - m_dPktSndPeriod = m_dCWndSize / (m_iRTT + m_iRCInterval);
|
| - }
|
| - }
|
| - else
|
| - m_dCWndSize = m_iRcvRate / 1000000.0 * (m_iRTT + m_iRCInterval) + 16;
|
| -
|
| - // During Slow Start, no rate increase
|
| - if (m_bSlowStart)
|
| - return;
|
| -
|
| - if (m_bLoss)
|
| - {
|
| - m_bLoss = false;
|
| - return;
|
| - }
|
| -
|
| - int64_t B = (int64_t)(m_iBandwidth - 1000000.0 / m_dPktSndPeriod);
|
| - if ((m_dPktSndPeriod > m_dLastDecPeriod) && ((m_iBandwidth / 9) < B))
|
| - B = m_iBandwidth / 9;
|
| -
|
| - double inc;
|
| -
|
| - if (B <= 0)
|
| - inc = 1.0 / m_iMSS;
|
| - else
|
| - {
|
| - // inc = max(10 ^ ceil(log10( B * MSS * 8 ) * Beta / MSS, 1/MSS)
|
| - // Beta = 1.5 * 10^(-6)
|
| -
|
| - inc = pow(10.0, ceil(log10(B * m_iMSS * 8.0))) * 0.0000015 / m_iMSS;
|
| -
|
| - if (inc < 1.0/m_iMSS)
|
| - inc = 1.0/m_iMSS;
|
| - }
|
| -
|
| - m_dPktSndPeriod = (m_dPktSndPeriod * m_iRCInterval) / (m_dPktSndPeriod * inc + m_iRCInterval);
|
| -
|
| - //set maximum transfer rate
|
| - if ((NULL != m_pcParam) && (m_iPSize == 8))
|
| - {
|
| - int64_t maxSR = *(int64_t*)m_pcParam;
|
| - if (maxSR <= 0)
|
| - return;
|
| -
|
| - double minSP = 1000000.0 / (double(maxSR) / m_iMSS);
|
| - if (m_dPktSndPeriod < minSP)
|
| - m_dPktSndPeriod = minSP;
|
| - }
|
| -}
|
| -
|
| -void CUDTCC::onLoss(const int32_t* losslist, const int&)
|
| -{
|
| - //Slow Start stopped, if it hasn't yet
|
| - if (m_bSlowStart)
|
| - {
|
| - m_bSlowStart = false;
|
| - if (m_iRcvRate > 0)
|
| - m_dPktSndPeriod = 1000000.0 / m_iRcvRate;
|
| - else
|
| - m_dPktSndPeriod = m_dCWndSize / (m_iRTT + m_iRCInterval);
|
| - }
|
| -
|
| - m_bLoss = true;
|
| -
|
| - if (CSeqNo::seqcmp(losslist[0] & 0x7FFFFFFF, m_iLastDecSeq) > 0)
|
| - {
|
| - m_dLastDecPeriod = m_dPktSndPeriod;
|
| - m_dPktSndPeriod = ceil(m_dPktSndPeriod * 1.125);
|
| -
|
| - m_iAvgNAKNum = (int)ceil(m_iAvgNAKNum * 0.875 + m_iNAKCount * 0.125);
|
| - m_iNAKCount = 1;
|
| - m_iDecCount = 1;
|
| -
|
| - m_iLastDecSeq = m_iSndCurrSeqNo;
|
| -
|
| - // remove global synchronization using randomization
|
| - srand(m_iLastDecSeq);
|
| - m_iDecRandom = (int)ceil(m_iAvgNAKNum * (double(rand()) / RAND_MAX));
|
| - if (m_iDecRandom < 1)
|
| - m_iDecRandom = 1;
|
| - }
|
| - else if ((m_iDecCount ++ < 5) && (0 == (++ m_iNAKCount % m_iDecRandom)))
|
| - {
|
| - // 0.875^5 = 0.51, rate should not be decreased by more than half within a congestion period
|
| - m_dPktSndPeriod = ceil(m_dPktSndPeriod * 1.125);
|
| - m_iLastDecSeq = m_iSndCurrSeqNo;
|
| - }
|
| -}
|
| -
|
| -void CUDTCC::onTimeout()
|
| -{
|
| - if (m_bSlowStart)
|
| - {
|
| - m_bSlowStart = false;
|
| - if (m_iRcvRate > 0)
|
| - m_dPktSndPeriod = 1000000.0 / m_iRcvRate;
|
| - else
|
| - m_dPktSndPeriod = m_dCWndSize / (m_iRTT + m_iRCInterval);
|
| - }
|
| - else
|
| - {
|
| - /*
|
| - m_dLastDecPeriod = m_dPktSndPeriod;
|
| - m_dPktSndPeriod = ceil(m_dPktSndPeriod * 2);
|
| - m_iLastDecSeq = m_iLastAck;
|
| - */
|
| - }
|
| -}
|
|
|