亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcptime.c

?? 代碼在ti的c67系列單片機上實現了完整的TCPIP協議棧
?? C
字號:
//--------------------------------------------------------------------------
// Ip Stack
//--------------------------------------------------------------------------
// TCPTIME.C
//
// TCP Timer Timeout Functions
//
// Author: Michael A. Denio
// Copyright 1999 by Texas Instruments Inc.
//-------------------------------------------------------------------------
#include <stkmain.h>
#include "tcp.h"

// tcp_backoff - Exponential backoff applied to Timer Ticks
UINT32 tcp_backoff[TCP_MAXBACKOFF+1] =
       { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };

//--------------------------------------------------------------------
// TcpSetPersist
//
// Set persist time used when client advertised window is Zero
//--------------------------------------------------------------------
void TcpSetPersist( TCPPROT *pt )
{
    UINT32 Ticks;

    // Calculate
    Ticks = ( pt->t_srtt + 2 * pt->t_rttvar ) >> TCP_FIXP_SHIFT;
    Ticks *= tcp_backoff[pt->t_rtxindex];

    // Start/restart persistance timer.
    TCPT_RANGESET( pt->dwTicksPersist, Ticks, TCPTV_PERSMIN, TCPTV_PERSMAX);

    // Back off some more next time
    if (pt->t_rtxindex < TCP_MAXBACKOFF)
        pt->t_rtxindex++;
}

//--------------------------------------------------------------------
// TcpTimeoutWait2
//
// Called when the TCP wait timer (TIME_WAIT or FIN_WAIT_2) has fired
//--------------------------------------------------------------------
void TcpTimeoutWait2( TCPPROT *pt )
{
    // If we're in the TIMEWAIT state, close the control block
    // Otherwise, we're in FIN_WAIT_2 - if we've been idle for more
    // than MAX_IDLE (10min), close the control block. Otherwise,
    // time another interval.
    if( pt->t_state != TSTATE_TIMEWAIT && pt->t_tidle <= TCPTV_MAX_IDLE )
        pt->dwTicksWait2 = TCPTV_KEEP_INTVL;
    else
        TcpClose( pt );
}

//--------------------------------------------------------------------
// TcpTimeoutPersist
//
// Called when the TCP retransmit timer has expired
//--------------------------------------------------------------------
void TcpTimeoutPersist( TCPPROT *pt )
{
    DbgPrintf(DBG_INFO,"TCP: Persist Timeout");

    // Bump the timeout stats
    tcps.dwPersistTimeout++;

    // Set the next persist timeout
    TcpSetPersist( pt );

    // Force a segment (check for lost window advertisement)
    pt->t_flags |= TF_PERSIST;
    TcpOutput( pt );
}

//--------------------------------------------------------------------
// TcpTimeoutKeep
//
// Called when the TCP KeepAlive timer has expired
//--------------------------------------------------------------------
void TcpTimeoutKeep( TCPPROT *pt )
{
    INT32  KeepAlive;

    DbgPrintf(DBG_INFO,"TCP: Keep Timeout");

    // Bump the timeout stats
    tcps.dwKeepTimeout++;

    // Check for timeout on a connection request
    if( pt->t_state < TSTATE_ESTAB )
        goto KeepDrop;

    // Get the socket option KEEPALIVE
    KeepAlive = SockGetOptionFlags( pt->hSock ) & SO_KEEPALIVE;

    // Once "closed", KeepAlive no longer applies. Otherwise, when
    // KeepAlive is set, send a probe.
    if( KeepAlive && pt->t_state <= TSTATE_CLOSEWAIT )
    {
        // If we've been idle too long (2 hours + 10 min), drop connection
        if( pt->t_tidle >= TCPTV_KEEP_IDLE + TCPTV_MAX_IDLE )
            goto KeepDrop;

        // Bump the "probe" stats
        tcps.dwKeepProbe++;

        // Send a keepalive packet
        TcpGenPacket( pt, SockGetFIP(pt->hSock), SockGetFPort(pt->hSock),
                      SockGetLIP(pt->hSock), SockGetLPort(pt->hSock),
                      pt->rcv_nxt, pt->snd_una-1, 0 );

        // Set to probe again in in 75 seconds
        pt->dwTicksKeep = TCPTV_KEEP_INTVL;
    }
    else
    {
        // We're not active
        // Set to probe again in in 2 hours seconds
        pt->dwTicksKeep = TCPTV_KEEP_IDLE;
    }
    return;

KeepDrop:
    // Bump the drop stats
    tcps.dwKeepDrops++;

    // Set socket error and drop connection
    TcpDrop( pt, ETIMEDOUT );
}

//--------------------------------------------------------------------
// TcpTimeoutRexmt
//
// Called when the TCP retransmit timer has expired
//--------------------------------------------------------------------
void TcpTimeoutRexmt( TCPPROT *pt )
{
    UINT32 win,Ticks;

    DbgPrintf(DBG_INFO,"TCP: Retransmit Timeout");

    //
    // Message has not been acked within retransmit interval.
    // Back off to a longer retransmit interval and retransmit one segment.
    //
    if( ++pt->t_rtxindex > TCP_MAXBACKOFF )
    {
        //
        // Aleady at max - drop it like a bad habit
        //
        pt->t_rtxindex = TCP_MAXBACKOFF;

        // Bump the drop stats
        tcps.dwTimeoutDrops++;

        // Set socket error and drop connection
        TcpDrop( pt, ETIMEDOUT );
        return;
    }

    // Bump the stats
    tcps.dwRexmtTimeout++;

    // Calculate
    Ticks = ( pt->t_srtt + 4 * pt->t_rttvar ) >> TCP_FIXP_SHIFT;
    Ticks *= tcp_backoff[pt->t_rtxindex];

    // Start/restart retransmit timer.
    TCPT_RANGESET( pt->t_trtx, Ticks, TCPTV_RTXMIN, TCPTV_RTXMAX);
    pt->dwTicksRexmt = pt->t_trtx;

    DbgPrintf(DBG_INFO,"TCP: Retransmit Ticks %ld",pt->t_trtx);

    //
    // If we've retransmitted four or more times, notify the
    // Socket handler. Also, the round trip time is no longer
    // accurate, so we reset it.
    //
    if (pt->t_rtxindex > TCP_MAXBACKOFF / 4)
    {
        // Notify socket its losing data
        SockValidateRoute( pt->hSock );
        // First pre-adjust rttvar so that RTO will be
        // the same if we time out again
        pt->t_rttvar += pt->t_srtt/4;
        // Now clear srtt so that the measured RTT is used
        pt->t_srtt   = TCPTV_SRTTBASE;
    }

    // Retransmit earliest unacked sequence
    pt->snd_nxt = pt->snd_una;

    // Force a segment to be sent.
    pt->t_flags |= TF_ACKNOW;

    // If timing a segment in this window, stop the timer.
    pt->t_trtt = 0;

    //
    // Close the congestion window down to one segment
    // (we'll open it by one segment for each ack we get).
    //
    // This "slow start" keeps us from dumping all that data
    // as back-to-back packets
    //

    // Take one half the LESSER of the advertised window, or the
    // congestion window.
    if( pt->snd_wnd < pt->snd_cwnd )
        win = pt->snd_wnd / 2 / (UINT32)pt->t_mss;
    else
        win = pt->snd_cwnd / 2 / (UINT32)pt->t_mss;
    if (win < 2)
        win = 2;
    pt->snd_cwnd = pt->t_mss;                   // (one segment)
    pt->t_dupacks = 0;                          // Reset fast retransmit

    // Retransmit earliest unacked sequence
    TcpOutput( pt );
}

//--------------------------------------------------------------------
// TcpXmitTimer
//
// Called when reset xmit timer based on new RTT data
//--------------------------------------------------------------------
void TcpXmitTimer( TCPPROT *pt, UINT32 rtt )
{
    INT32       delta;
    UINT32      rto;

    // Keep this stat for the heck of it.
    tcps.dwRttUpdated++;

    rtt = rtt << TCP_FIXP_SHIFT;

    if( !pt->t_srtt )
    {
        // We have no data yet, so just initialize
        //
        // srtt   = rtt
        // rttvar = srtt / 2
        // RTO    = srtt + 2 * rttvar   (same as 2*rtt)
        //
        pt->t_srtt   = rtt;
        pt->t_rttvar = pt->t_srtt / 2;
        rto = ( rtt * 2 ) >> TCP_FIXP_SHIFT;
    }
    else
    {
        //
        // We want to adjust srtt / rttvar by the following formulas:
        //
        //      delta  = ticks - srtt
        //      srtt   = srtt + (1/8)delta
        //      rttvar = rttvar + (1/4)(|delta| - rttvar)
        //      RTO    = srtt + 4 * rttvar
        //
        delta = rtt - (INT32)pt->t_srtt;

        pt->t_srtt += (UINT32)(delta/8);
        if( (INT32)pt->t_srtt <= 0 )
            pt->t_srtt = 1 << TCP_FIXP_SHIFT;

        if( delta < 0 )
            delta = -delta;

        delta -= (INT32)pt->t_rttvar;
        pt->t_rttvar += (UINT32)(delta/4);
        if( (INT32)pt->t_rttvar <= 0 )
            pt->t_rttvar = 1 << (TCP_FIXP_SHIFT-2);

        rto = ( pt->t_srtt + 4 * pt->t_rttvar ) >> TCP_FIXP_SHIFT;
    }

    // Reset RTT timer
    pt->t_trtt     = 0;

    // Reset RTT backoff
    pt->t_rtxindex = 0;

    TCPT_RANGESET( pt->t_trtx, rto, TCPTV_RTXMIN, TCPTV_RTXMAX);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成都精品91一区二区三| 欧美乱妇20p| 欧美男男青年gay1069videost| 精品国产乱码久久久久久闺蜜| 亚洲免费观看高清完整版在线观看| 亚洲小说欧美激情另类| 成人精品gif动图一区| 欧美一级二级三级乱码| 亚洲精品成人在线| 懂色av一区二区三区蜜臀| 欧美一区二区三区的| 一区二区三区在线不卡| 成人小视频在线观看| 777亚洲妇女| 亚洲一区在线视频| a亚洲天堂av| 久久婷婷国产综合精品青草| 日本系列欧美系列| 欧美伊人久久大香线蕉综合69| 中文一区在线播放| 国产凹凸在线观看一区二区| 日韩精品综合一本久道在线视频| 天天av天天翘天天综合网| 色先锋资源久久综合| 亚洲日本乱码在线观看| 成人av综合一区| 欧美国产精品v| 成人永久免费视频| 国产欧美精品国产国产专区| 国产精品1区二区.| 国产亚洲综合性久久久影院| 国产麻豆一精品一av一免费| 久久日韩精品一区二区五区| 久久国内精品自在自线400部| 91精品国产综合久久久久久久| 五月综合激情网| 在线不卡a资源高清| 免费日本视频一区| 日韩精品一区二区三区在线| 精品一区二区日韩| 国产亚洲精品7777| 福利一区福利二区| 中文字幕一区二区5566日韩| 91小视频免费看| 一二三区精品福利视频| 欧美日韩亚州综合| 免费国产亚洲视频| 国产日韩视频一区二区三区| 成人午夜av电影| 一区二区三区不卡在线观看 | 成人美女视频在线观看18| 中文字幕精品—区二区四季| 91网页版在线| 日韩精品欧美成人高清一区二区| 日韩欧美美女一区二区三区| 国产精品自在欧美一区| 国产精品高清亚洲| 在线观看一区日韩| 美女视频网站久久| 国产性色一区二区| 日本高清不卡视频| 久久精品国产精品亚洲精品| 国产欧美一区二区三区鸳鸯浴 | 毛片av中文字幕一区二区| 日韩免费在线观看| 97精品国产露脸对白| 日本不卡视频一二三区| 国产清纯白嫩初高生在线观看91| 色久优优欧美色久优优| 另类综合日韩欧美亚洲| 成人免费在线视频| 日韩精品一区二区三区在线观看| 白白色亚洲国产精品| 日韩精彩视频在线观看| 国产精品狼人久久影院观看方式| 欧美日韩情趣电影| 成人a免费在线看| 美女性感视频久久| 一区二区三区国产豹纹内裤在线| 久久久www成人免费毛片麻豆| 日本韩国欧美三级| 国产成人午夜精品影院观看视频| 一区二区三区在线影院| 国产日韩欧美a| 日韩欧美一级二级三级久久久| 一本久久精品一区二区| 国产精品综合在线视频| 无吗不卡中文字幕| 亚洲精品乱码久久久久| 日本一区二区三区国色天香| 日韩精品影音先锋| 欧美日韩国产一级| 色综合视频在线观看| 国产一区二区三区综合| 免费观看在线色综合| 亚洲成a天堂v人片| 亚洲精品免费电影| 国产精品乱码妇女bbbb| 欧美精品一区二区高清在线观看| 欧美精品一二三四| 欧美日韩一区高清| 在线一区二区观看| 91色porny在线视频| 成人国产视频在线观看| 国产成人综合网| 国产激情视频一区二区在线观看| 秋霞影院一区二区| 日韩二区三区四区| 日韩av在线免费观看不卡| 亚欧色一区w666天堂| 偷偷要91色婷婷| 爽好久久久欧美精品| 天天色综合成人网| 午夜精品一区二区三区三上悠亚| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美成aⅴ人在线观看 | 国产精品电影一区二区三区| 国产色产综合产在线视频| 久久久国产精品麻豆| 国产精品私人影院| 亚洲色欲色欲www| 一区二区久久久久| 午夜激情久久久| 裸体健美xxxx欧美裸体表演| 免费av网站大全久久| 激情六月婷婷综合| 国产盗摄一区二区三区| 成人免费不卡视频| 欧美在线小视频| 91麻豆精品国产91久久久久久久久| 3d成人h动漫网站入口| 欧美电影免费观看高清完整版在 | 久久夜色精品国产欧美乱极品| 精品国产污网站| 国产日韩欧美一区二区三区综合| 国产精品视频九色porn| 亚洲精品欧美二区三区中文字幕| 亚洲一区二区黄色| 美女视频免费一区| 盗摄精品av一区二区三区| 一本色道久久综合狠狠躁的推荐 | 亚洲欧美另类小说视频| 亚洲国产日产av| 久久99这里只有精品| 成人性生交大合| 欧美精品免费视频| 国产欧美日韩另类一区| 亚洲综合清纯丝袜自拍| 捆绑调教一区二区三区| 成人av电影在线播放| 欧美日韩二区三区| 国产精品女主播av| 丝袜亚洲另类欧美综合| 国产精品一级在线| 欧美日韩国产天堂| 亚洲成人手机在线| 国内外成人在线| 色老汉一区二区三区| 欧美精品一区二区三区在线| 一区二区三区免费| 狠狠色2019综合网| 精品国产人成亚洲区| 综合分类小说区另类春色亚洲小说欧美| 综合亚洲深深色噜噜狠狠网站| 亚洲成人你懂的| 成人动漫一区二区三区| 欧美一区欧美二区| 国产精品午夜久久| 日本不卡在线视频| 91啦中文在线观看| 欧美精品一区二区三区蜜臀| 亚洲成年人影院| 91在线视频网址| 国产午夜亚洲精品不卡| 视频一区二区三区中文字幕| 色综合久久88色综合天天6 | 色狠狠av一区二区三区| 久久在线免费观看| 蜜臀av一区二区| 欧美三级欧美一级| 亚洲欧美另类图片小说| 国产经典欧美精品| 久久久久免费观看| 麻豆精品视频在线观看免费| 欧美日韩精品福利| 亚洲综合在线第一页| 91猫先生在线| 亚洲欧洲美洲综合色网| 国产**成人网毛片九色| 久久在线观看免费| 国产精品一区二区黑丝| 欧美变态tickling挠脚心| 午夜精品久久久久久不卡8050| 欧美影视一区在线| 亚洲精品视频在线观看网站| 91麻豆国产香蕉久久精品| 综合久久国产九一剧情麻豆| av在线不卡网| 亚洲欧洲中文日韩久久av乱码| 成人开心网精品视频|