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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? maintbuf.c

?? Vitual Ring Routing 管你知不知道
?? C
?? 第 1 頁 / 共 3 頁
字號:
    // TxToken(LocIF,RemIF) from MBN(OutIf,InIf)
    //
    if (FindNextHop(VA, 
                    SRP->Dest, 
                    MBN->OutIf, 
                    MBN->InIf,
                    &SRP->Token, 
                    NULL,
                    NULL_SR_FLAGS) != SuccessFwd) {

        VrrKdPrint("MaintBufCreateAckRequest: Error: Fwd!=FNH(d)",NULL,(char *)SRP->Dest);
        ExFreePool(SRP);
        ExFreePool(AR);
        return NULL;
    }

    //
    // Initialize the Acknowledgement Request.
    //
    AR->next = NULL;
    AR->opt.optionType = VRR_OPTION_TYPE_ACKREQ;
    AR->opt.optDataLen = ACK_REQUEST_LEN;
    AR->opt.identification = MaintBufAckNum(MBN);
    RtlCopyMemory(AR->opt.Source, SRP->Source, sizeof(VirtualAddress));
    RtlCopyMemory(AR->opt.Dest, SRP->Dest, sizeof(VirtualAddress));
    VRRASSERT(SRP->Token.LocIF == MBN->OutIf);
    VRRASSERT(SRP->Token.RemIF == MBN->InIf);
    AR->opt.RackSourceIF = SRP->Token.LocIF;
    AR->opt.RackDestIF = SRP->Token.RemIF;

    VrrTrace(VA,3,"MB:AR=New",AR->opt.Source,AR->opt.Dest,AR->opt.Dest,"id",AR->opt.identification,NULL,0);

    return SRP;
}

//* MaintBufAckRequestSendComplete
//
//  Called to complete the transmission of a packet
//  from MaintBufCreateAckRequest.
//
static void
MaintBufAckRequestSendComplete(
    MiniportAdapter *VA,
    NDIS_PACKET *Packet,
    NDIS_STATUS Status)
{
    SRPacket *SRP = PC(Packet)->srp;

    UNREFERENCED_PARAMETER(VA);
    UNREFERENCED_PARAMETER(Status);

    NdisFreePacketClone(Packet);
    SRPacketFree(SRP);
}

//* RexmitFailNCE
//
//  Abort a Maintbuf packet and flush Msg queue of all msg for this
//  link.
//
Time
RexmitFailNCE(
    MiniportAdapter *VA,
    MaintBufPacket *MBP)
{
    NeighborCache *NC = &VA->NC;
    NeighborCacheEntry *NCE;
    SRPacket *srp = MBP->srp;
    InternalOption *Opt;
    InternalOption *NewOpt;
    KIRQL OldIrql;
    Time Now = KeQueryInterruptTime();
    Time Delay = min(TDOWN_DELAY,min(SETUP_DELAY, SR_DELAY));

    VrrTrace(VA,1,"MB:**=FailLink",srp->Source,srp->Token.NextVAddress,srp->Token.NextVAddress,"FrameSeqNo",srp->FrameSeqNo,NULL,0);

    //
    // Find and FAIL the NCE for this packet.
    //
    KeAcquireSpinLock(&NC->Lock, &OldIrql);
    NCE=FindNCE(NC, srp->Token.NextVAddress, srp->Token.LocIF, srp->Token.RemIF, VRR_NCE_STATE_ANY);
    if (NCE != NULL) {
        AddRefNCE(NCE);
        NCE->CountFailRexmit++;
        FailNCE(NCE, Now);
    }
    KeReleaseSpinLock(&NC->Lock, OldIrql);

    //
    // Purge message queue of messages for this destination.
    //
    MsgFailLink(VA, srp->Token.NextVAddress, srp->Token.LocIF, srp->Token.RemIF);

    //
    // Update route and vset. Send TearDowns. 
    //
    if (NCE != NULL)
        RouteUpdateNCE(VA, NCE, VRR_NCE_STATE_FAILED);
    else
        VrrKdPrint("RexmitFailNCE: cannot find NCE", NULL, NULL);

    //
    // In VRR we drop rather than attempt to salvage any VRR messages.
    //

    //
    // Release the failing MBP.
    //
    MaintBufPacketRelease(VA, MBP);

    if (NCE != NULL)
        ReleaseNCE(NCE);

    return Delay;

}

//* MaintBufTimer
//
//  Called periodically to retransmit packets in the Maintenance Buffer.
//
Time
MaintBufTimer(MiniportAdapter *VA, Time Now)
{
    MaintBuf *MB = VA->MaintBuf;
    MaintBufNode **PrevMBN, *MBN;
    MaintBufPacket *MBP;
    MaintBufPacket *Salvage = NULL;
    NDIS_PACKET *Packet;
    NDIS_PACKET *RexmitPackets = NULL;
    SRPacket *SRP;
    Time Timeout = MAXTIME;
    Time Deadline;
    KIRQL OldIrql;
    NDIS_STATUS Status;

    KeAcquireSpinLock(&MB->Lock, &OldIrql);

    //
    // Inspect each MaintBufNode in the Maintenance Buffer.
    // We are only interested in MBNs that have unacknowledged ack requests.
    // While doing this, we update Timeout to track
    // the next time by which we want to run.
    //
    PrevMBN = &MB->MBN;
    while ((MBN = *PrevMBN) != NULL) {
        if (MaintBufAckExpected(MBN)) {

            NeighborCacheEntry *NCE;
            uchar NCEState = 0;

            Deadline = max(MBN->FirstAckReq, MBN->LastAckRcv) +
                                                        MAINTBUF_LINK_TIMEOUT;

            //
            // Abort the packet if the Destination is in state FAILED, or
            // if we are giving up retransmissions of the packet.
            //
            // Snapshot NCE state for the packet destination.
            //
            KeAcquireSpinLockAtDpcLevel(&VA->NC.Lock);
            NCE=FindNCE(&VA->NC, MBN->Address, MBN->InIf, MBN->OutIf, VRR_NCE_STATE_ANY);
            NCEState = (NCE == NULL) ? VRR_NCE_STATE_FAILED : NCE->State;
            KeReleaseSpinLockFromDpcLevel(&VA->NC.Lock);

            if (NCEState == VRR_NCE_STATE_FAILED || Deadline <= Now) {
                //
                // Move any waiting packets to the salvage list.
                //
                while ((MBP = MBN->MBP) != NULL) {
                    MBN->MBP = MBP->Next;
                    MBP->Next = Salvage;
                    Salvage = MBP;
                }
                MB->NumPackets -= MBN->NumPackets;
                MBN->MBNTxFailed += MBN->NumPackets;
                MBN->NumPackets = 0;

                //
                // We no longer expect an ack.
                //
                MBN->LastAckNum = MaintBufAckNum(MBN);
                // Next loop iteration will inspect the same MBN again.
                continue;
            }

            if (Deadline < Timeout)
                Timeout = Deadline;

            //
            // If it's been too long since we requested an ack,
            // we should retransmit the request.
            //
            Deadline = MBN->LastAckReq + MAINTBUF_REXMIT_TIMEOUT;
            if (Deadline <= Now) {
                //
                // Retransmit an ack request.
                //
                MBN->NumAckReqs++;
                MBN->LastAckReq = Now;
                Deadline = MBN->LastAckReq + MAINTBUF_REXMIT_TIMEOUT;

                //
                // Retransmit only the most recent packet.
                //
                MBP = MBN->MBP;
                if (MBP == NULL) {
                    //
                    // We do not have a packet to retransmit,
                    // so create a packet to carry the ack req.
                    //
                    SRP = MaintBufCreateAckRequest(VA, MBN);
                }
                else {
                    //
                    // Retransmit the existing packet,
                    // but update it with current sequence number.
                    //
                    SRP = MBP->srp;
                    SRP->ackreq->opt.identification = MaintBufAckNum(MBN);
                }

                if (SRP != NULL) {
                    //
                    // This will update the metric in the source route
                    // and bump the Usage counter for the link.
                    //
                    if (! TxQueueIsFull(VA, SRP)) {
                        InterlockedIncrement((PLONG)&VA->CountRexmitQueueFull);
                        goto DoNotTransmit;
                    }

                    //
                    // Check for options that can be piggy-backed.
                    //
                    MsgLoadSRPfromPCache(VA, SRP);

                    Status = SRPacketToPkt(VA, SRP, &Packet);

                    //
                    // We only want to send Acks once.
                    //
                    if (SRP->ack != NULL) {
                        SRFreeOptionList((InternalOption *) SRP->ack);
                        SRP->ack = NULL;
                    }

                    if (Status == NDIS_STATUS_SUCCESS) {
                        if (MBP == NULL) {
                            PC(Packet)->TransmitComplete =
                                MaintBufAckRequestSendComplete;
                            PC(Packet)->srp = SRP;
                        }
                        else {
                            //
                            // Need a reference to MBP, released in
                            // MaintBufTransmitComplete.
                            //
                            InterlockedIncrement((PLONG)&MBP->RefCnt);
                            PC(Packet)->TransmitComplete =
                                MaintBufTransmitComplete;
    
                            PC(Packet)->MBP = MBP;
                        }

                        //
                        // Queue the packet using the OrigPacket link.
                        //
                        PC(Packet)->OrigPacket = RexmitPackets;
                        RexmitPackets = Packet;
                        MBN->MBNRexmits++;
                    }
                    else {
                    DoNotTransmit:
                        MBN->MBNTxFailed++;
                        if (MBP == NULL) {
                            //
                            // We just need to free the packet.
                            //
                            SRPacketFree(SRP);
                        }
                        else {
                            //
                            // We leave the MBP on the MBN.
                            //
                        }
                    }
                }
            }
        }
        else {
            //
            // There are no outstanding ack requests.
            // Hence we must have no waiting packets.
            //
            VRRASSERT(MBN->MBP == NULL);

            Deadline = MBN->LastAckReq + MAINTBUF_IDLE_TIMEOUT;

            if (Deadline <= Now) {
                //
                // This Maintenance Buffer Node has been idle for a long time.
                // If we delete it, we lose the AckNum state for this neighbor.
                // But this is OK after sufficient time.
                //
                *PrevMBN = MBN->Next;
                ExFreePool(MBN);
                // Next loop iteration looks at the next MBN.
                continue;
            }
        }

        if (Deadline < Timeout)
            Timeout = Deadline;

        // Move to the next MBN.
        PrevMBN = &MBN->Next;
    }
    KeReleaseSpinLock(&MB->Lock, OldIrql);

    //
    // Send any queued retransmissions.
    //
    while ((Packet = RexmitPackets) != NULL) {
        RexmitPackets = PC(Packet)->OrigPacket;

        if (PC(Packet)->PA == NULL) {
            //
            // This means the source route is trying to use a physical adapter
            // that no longer exists.
            //
            if (PC(Packet)->TransmitComplete == MaintBufTransmitComplete) {

                VrrKdPrint("MaintBufTimer: rexmit via MiniportSendRouteError",NULL,PC(Packet)->srp->Dest);
            }
            (*PC(Packet)->TransmitComplete)(VA, Packet, NDIS_STATUS_FAILURE);
        }
        else {
            //
            // Transmit the packet.
            //
            VrrTrace(VA,3,"MB:MP=ReTx(ProtocolTransmit)",VA->Address,PC(Packet)->srp->Token.NextVAddress,PC(Packet)->srp->Token.NextVAddress,
                   "FrameSeqNo", PC(Packet)->srp->FrameSeqNo,NULL,0);
            ProtocolTransmit(PC(Packet)->PA, Packet);
        }
    }

    //
    // If there were any waiting packets,
    // send errors and salvage them.
    // NB: These packets may have outstanding references.
    //
    while ((MBP = Salvage) != NULL) {
        Salvage = MBP->Next;
        
        //
        // Abort the packet and ensure NCE(Dest) is in state FAILED.
        //
        RexmitFailNCE(VA, MBP);
        
        if (Deadline < Timeout)
            Timeout = Deadline;
    }

    //
    // Return the time of our next call.
    //
    VRRASSERT(Now < Timeout);
    return Timeout;
}

//* MaintBufRecvAck
//
//  Handles a received acknowledgement.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
337p亚洲精品色噜噜噜| 欧美色综合天天久久综合精品| 亚洲免费视频成人| 日韩一区二区麻豆国产| 国产99久久久国产精品潘金 | 亚洲黄色av一区| 日韩美女在线视频| 波多野结衣中文字幕一区二区三区| 首页国产欧美日韩丝袜| 亚洲人亚洲人成电影网站色| 精品国产人成亚洲区| 色先锋资源久久综合| 国产不卡高清在线观看视频| 久久国产精品99久久久久久老狼| 亚洲美女视频一区| 亚洲国产激情av| 精品国精品自拍自在线| 欧美日韩精品免费| 99精品欧美一区| 国产**成人网毛片九色| 国产在线一区观看| 天堂久久一区二区三区| 亚洲免费av高清| 中文字幕亚洲在| 欧美高清在线一区二区| 亚洲精品一线二线三线无人区| 欧美日本一区二区三区| 欧美系列亚洲系列| 色就色 综合激情| 色婷婷精品久久二区二区蜜臂av | 欧美色图第一页| 99在线精品视频| 不卡一区二区在线| 成人黄色软件下载| 成人性生交大片免费| 国产剧情一区在线| 懂色av一区二区三区免费观看| 国产一区二区三区黄视频| 精品一区中文字幕| 国产裸体歌舞团一区二区| 国产在线精品一区二区夜色| 狠狠色伊人亚洲综合成人| 六月丁香综合在线视频| 久久精品国产一区二区三区免费看| 婷婷久久综合九色综合绿巨人| 亚洲国产毛片aaaaa无费看 | 免费在线观看视频一区| 性做久久久久久免费观看欧美| 激情av综合网| 激情综合亚洲精品| 国产激情偷乱视频一区二区三区| 国内外精品视频| 国产成人在线免费| 色欲综合视频天天天| 欧美色视频一区| 欧美美女黄视频| 亚洲精品一区二区三区影院 | 免费视频一区二区| 麻豆精品视频在线| 国产在线精品一区二区| 成人动漫视频在线| 欧美性xxxxx极品少妇| 91精品国产综合久久福利软件 | zzijzzij亚洲日本少妇熟睡| 色综合天天在线| 在线播放欧美女士性生活| 精品国免费一区二区三区| 国产精品萝li| 丝袜亚洲另类欧美| 国产精品1024| 在线观看日韩精品| 欧美一区二区在线视频| 欧美国产日韩在线观看| 亚洲精品高清在线| 轻轻草成人在线| 福利一区福利二区| 欧美日韩性生活| 久久九九全国免费| 一区二区三区美女视频| 开心九九激情九九欧美日韩精美视频电影| 国产乱一区二区| 色狠狠色噜噜噜综合网| 欧美成人一区二区三区片免费| 国产精品短视频| 日本免费新一区视频| 成人av小说网| 日韩欧美亚洲国产另类 | 国产一区二区三区高清播放| 91网站在线播放| 欧美一区二区视频网站| 亚洲欧洲日本在线| 欧美96一区二区免费视频| av亚洲精华国产精华精华 | 欧美日韩国产免费一区二区| 久久精品一区蜜桃臀影院| 午夜视频在线观看一区二区三区 | 欧美性欧美巨大黑白大战| 久久久久久久久久久久电影| 亚洲一区二区三区四区五区黄| 国产精品一色哟哟哟| 91 com成人网| 亚洲蜜臀av乱码久久精品蜜桃| 看电视剧不卡顿的网站| 欧美日韩国产天堂| 亚洲免费观看高清完整版在线观看熊| 久久国产欧美日韩精品| 欧美日韩午夜在线视频| 综合精品久久久| 国产伦精品一区二区三区在线观看| 欧美日韩在线播| 中文字幕欧美一区| 国产精一区二区三区| 亚洲黄色小视频| 成人亚洲一区二区一| 精品久久久久久久久久久久包黑料 | 一区二区三区四区国产精品| 国产一区二区三区蝌蚪| 日韩一级片在线观看| 一级特黄大欧美久久久| 99久久精品久久久久久清纯| 国产欧美日韩在线| 狠狠色综合色综合网络| 日韩一级片网址| 日本网站在线观看一区二区三区| 在线视频一区二区三区| 中文字幕一区二区视频| 国产91色综合久久免费分享| 久久久久久免费毛片精品| 奇米色一区二区三区四区| 欧美日韩中文一区| 亚洲午夜久久久久久久久电影院 | 欧美大片在线观看| 三级精品在线观看| 欧美丝袜丝nylons| 午夜精品福利一区二区三区av | 国产成人精品影院| wwwwxxxxx欧美| 国产精品一区二区不卡| 精品日韩在线观看| 国产精品亚洲а∨天堂免在线| 久久免费国产精品 | 欧美精品自拍偷拍| 亚洲va欧美va天堂v国产综合| 欧美午夜精品一区二区三区| 亚洲午夜在线观看视频在线| 欧美三电影在线| 日韩中文欧美在线| 91超碰这里只有精品国产| 日本欧美一区二区在线观看| 日韩一区二区视频在线观看| 麻豆一区二区三| 欧美精品一区二区不卡| 国产成人一区在线| 综合色天天鬼久久鬼色| 欧美亚洲一区三区| 亚洲成a人片在线观看中文| 日韩一区二区中文字幕| 国产综合久久久久久鬼色 | 欧美精品一区二区三区高清aⅴ | 国产综合久久久久久鬼色| 久久久久99精品国产片| 色综合久久久网| 午夜成人免费视频| 日韩亚洲欧美中文三级| 国产成人99久久亚洲综合精品| 久久成人免费网| 日本一区二区综合亚洲| 91免费版pro下载短视频| 日韩va亚洲va欧美va久久| xfplay精品久久| 色伊人久久综合中文字幕| 三级亚洲高清视频| 国产精品卡一卡二卡三| 欧美日韩综合在线| 国产一区二区三区香蕉| 亚洲日本va午夜在线电影| 日韩一二在线观看| bt7086福利一区国产| 美女一区二区在线观看| 国产精品久久久久影视| 4438x亚洲最大成人网| 成人免费视频caoporn| 亚洲成人在线观看视频| 久久九九99视频| 精品视频999| 99视频超级精品| 六月丁香婷婷久久| 亚洲毛片av在线| 26uuu亚洲综合色欧美| 欧美日韩精品一区二区三区蜜桃| 国产成人午夜精品5599| 水野朝阳av一区二区三区| 欧美国产国产综合| 91精品国产综合久久久蜜臀图片| www..com久久爱| 精品一区二区免费视频| 亚洲图片一区二区| 中日韩免费视频中文字幕| 欧美成va人片在线观看| 色久综合一二码|