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

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

?? maintbuf.c

?? Vitual Ring Routing 管你知不知道
?? C
?? 第 1 頁 / 共 3 頁
字號:
//
void
MaintBufRecvAck(
    MiniportAdapter *VA,
    const VirtualAddress Address,
    VRRIf InIf,
    VRRIf OutIf,
    VRRAckId AckNum)
{
    MaintBuf *MB = VA->MaintBuf;
    MaintBufNode *MBN;
    MaintBufPacket **PrevMBP;
    MaintBufPacket *MBP = NULL;
    MaintBufPacket *NextMBP;
    uint NumPackets;
    KIRQL OldIrql;

    //
    // Find the appropriate MaintBufNode.
    //
    KeAcquireSpinLock(&MB->Lock, &OldIrql);
    MBN = MaintBufFindNode(MB, Address, InIf, OutIf);
    if (MBN != NULL) {
        //
        // Is this a valid ack?
        // That is, between LastAckNum and NextAckNum.
        //
        if (MaintBufValidAck(MBN, AckNum)) {
        
            //
            // We have received a valid ack, confirming the link.
            //
            MBN->NumValidAcks++;
            MBN->LastAckNum = AckNum;
            MBN->LastAckRcv = KeQueryInterruptTime();

            //
            // Remove any acknowledged packets.
            // This maintains the invariant that waiting packets
            // have a sequence number between LastAckNum and NextAckNum.
            //
            NumPackets = 0;
            for (PrevMBP = &MBN->MBP;
                 (MBP = *PrevMBP) != NULL;
                 PrevMBP = &MBP->Next) {

                //
                // If we receive MBP->AckNum, will it be valid?
                //
                if (! MaintBufValidAck(MBN, MBP->AckNum)) {
                    //
                    // Remove this packet (and any older ones).
                    //
                    *PrevMBP = NULL;
                    MB->NumPackets -= MBN->NumPackets - NumPackets;
                    MBN->NumPackets = NumPackets;
                    break;
                }
                NumPackets++;
            }
        }
        else {
            //
            // This is an invalid ack, because the ack sequence number
            // is not in the proper range.
            //
            MBN->NumInvalidAcks++;
            
        }
    }

    //
    // Track count of successful MB packet transmissions.
    //
    for (NextMBP = MBP; NextMBP != NULL; NextMBP = NextMBP->Next)
        MBN->MBNTxSuccess++;

    KeReleaseSpinLock(&MB->Lock, OldIrql);

    //
    // Did we find any packets to complete?
    //
    while (MBP != NULL) {
        NextMBP = MBP->Next;
        MaintBufPacketRelease(VA, MBP);
        MBP = NextMBP;
    }
}

//* MaintBufStaticSendComplete
//
//  Completion handler for statically source-routed packets.
//
void
MaintBufStaticSendComplete(
    MiniportAdapter *VA,
    NDIS_PACKET *Packet,
    NDIS_STATUS Status)
{
    SRPacket *SRP = PC(Packet)->srp;

    PrintfNdisStatus(__FUNCTION__,Status,FALSE);

    NdisFreePacketClone(Packet);

   (*SRP->TransmitComplete)(VA, SRP, Status);
}

//* MaintBufSendPacket
//
//  Sends a Source-Routed packet that must be explicitly
//  acked by the destination.
//
//  TxQueueIsFull has already been called, but if we retransmit
//  then we should call it again.
//
//  NB: We must create a new NDIS_PACKET for every (re)transmission.
//  We can not allow a single NDIS_PACKET to be sent twice simultaneously.
//
//  Returns TRUE if the packet was transmitted successfully, else FALSE.
//
uint
MaintBufSendPacket(
    MiniportAdapter *VA,
    SRPacket *srp,
    void (*Complete)(MiniportAdapter *VA, SRPacket *srp, NDIS_STATUS Status))
{
    MaintBuf *MB = VA->MaintBuf;
    InternalAcknowledgementRequest *AR = NULL;
    MaintBufNode *MBN;
    MaintBufPacket *MBP = NULL;
    NDIS_PACKET *Packet = NULL;
    Time Now;
    Time Timeout = 0;
    uint Index;
    KIRQL OldIrql;
    NDIS_STATUS Status;

    VRRASSERT(srp->ackreq == NULL);

    //
    // We have to initialize this before unlocking MaintBuf.
    //
    srp->TransmitComplete = Complete;

    //
    // If the packet contains nothing more than ack(s) then
    // we do not send it via the maintbuf in order to avoid
    // generating Acks for Acks.
    //
    if (SRPContainsMessages(srp)) {
        //
        // Use the Maintenance Buffer to send the packet,
        // requesting an acknowledgement.
        //
        InterlockedIncrement((PLONG)&VA->CountXmitMaintBuf);

        //
        // In testing we sometimes supress all tx.
        //
        if (VA->TxDropAllButHello) {
            (*Complete)(VA, srp, NDIS_STATUS_RESOURCES);
            return TRUE;
        }

        //
        // VRR control messages have fixed NextHop.
        // They must not be rerouted by FNH.
        // At this point the NextHop should already be known.
        //
        VRRASSERT(! IsNullTxToken(&srp->Token) );

        AR = ExAllocatePool(NonPagedPool, sizeof *AR);
        if (AR == NULL) {
            (*Complete)(VA, srp, NDIS_STATUS_RESOURCES);
            return FALSE;
        }

        srp->ackreq = AR;
        RtlZeroMemory(AR, sizeof *AR);
        AR->opt.optionType = VRR_OPTION_TYPE_ACKREQ;
        AR->opt.optDataLen = ACK_REQUEST_LEN;
        RtlCopyMemory(&AR->opt.Source, &srp->Token.Source, sizeof(VirtualAddress));
        RtlCopyMemory(&AR->opt.Dest, &srp->Token.NextVAddress, sizeof(VirtualAddress));
        AR->opt.RackSourceIF = srp->Token.LocIF;
        AR->opt.RackDestIF = srp->Token.RemIF;

        // AR->opt.identification initialized in MaintBufAddPacket.

        //
        // Find the MaintBufNode for the packet.
        //
        KeAcquireSpinLock(&MB->Lock, &OldIrql);
        Now = KeQueryInterruptTime();
        
        MBN = MaintBufFindNode(MB,
                               srp->Token.NextVAddress,
                               srp->Token.LocIF,   // InIf.
                               srp->Token.RemIF);  // OutIf.

        if (MBN != NULL) {

            InterlockedIncrement((PLONG)&MBN->MBNCountPackets);

            //
            // Create and initialize a new MaintBufPacket structure.
            //
            MBP = ExAllocatePool(NonPagedPool, sizeof *MBP);
            if (MBP != NULL) {
                //
                // Initialize the MaintBufPacket. It starts with 1 ref
                // for its existence on MBN.
                //
                MBP->RefCnt = 1;
                MBP->srp = srp;

                //
                // Are we requesting the first ack?
                //
                if (! MaintBufAckExpected(MBN))
                    MBN->FirstAckReq = Now;

                //
                // If MaintBufAddPacket returns an NDIS_PACKET,
                // it also adds a reference to MBP.
                //
                if ((Packet=MaintBufAddPacket(VA, MBN, MBP))==NULL) {
                    MBN->MBP = MBP->Next;
                    ExFreePool(MBP);
                    MBP = NULL;
                }
                else {
                    //
                    // We are sending an Ack Request to this node.
                    //
                    MBN->NumAckReqs++;
                    MBN->LastAckReq = Now;
                    Timeout = MBN->LastAckReq + MAINTBUF_REXMIT_TIMEOUT;
                }
            }
        }
        KeReleaseSpinLock(&MB->Lock, OldIrql);

        //
        // Error handling.
        //
        if (MBP == NULL) {
            (*Complete)(VA, srp, NDIS_STATUS_RESOURCES);
            return FALSE;
        }

        //
        // Reschedule the next MaintBufTimer call.
        //
        if (Timeout != 0)
            MiniportRescheduleTimeout(VA, Now, Timeout);

        //
        // Ensure PC(PC(Packet)->PA is valid.
        //
        PC(Packet)->PA = FindPhysicalAdapterFromIndex(VA, srp->Token.LocIF);

        MaintBufTransmit(VA, MBP, Packet);
    }
    else {
        //
        // Just send the packet directly.
        //

        Status = SRPacketToPkt(VA, srp, &Packet);
        if (Status != NDIS_STATUS_SUCCESS) {
            (*Complete)(VA, srp, Status);
            return FALSE;
        }

        PC(Packet)->srp = srp;
        PC(Packet)->TransmitComplete = MaintBufStaticSendComplete;

        //
        // In testing we sometimes supress all tx.
        //
        if (VA->TxDropAllButHello) {
            MaintBufStaticSendComplete(VA, Packet, NDIS_STATUS_FAILURE);
            return TRUE;
        }

        if (PC(Packet)->PA == NULL) {
            //
            // This means the packet is trying to use a physical adapter that
            // no longer exists.
            //
            VrrKdPrint("MBSendPacket MaintBufStaticSendComplete",NULL,NULL);
            MaintBufStaticSendComplete(VA, Packet, NDIS_STATUS_FAILURE);
            return FALSE;
        }
        else {
            VrrTrace(VA,3,"MB:MP=ReTx(MaintBufStaticSendComplete)",srp->Source,srp->Token.NextVAddress,srp->Dest,NULL,0,"FrameSeqNo",srp->FrameSeqNo);
            ProtocolTransmit(PC(Packet)->PA, Packet);
        }
    }

    return TRUE;
}

//* MaintBufSendAck
//
//  Requests delayed transmission of an Ack.
//
void
MaintBufSendAck(
    MiniportAdapter *VA,
    VirtualAddress Source,
    VirtualAddress Dest,
    VRRAckId AckId,
    VRRIf RackSourceIF,
    VRRIf RackDestIF,
    uchar NCEState)
{
    InternalAcknowledgement *Ack;

    //
    // Allocate the Acknowledgement option.
    //
    Ack = ExAllocatePool(NonPagedPool, sizeof *Ack);
    if (Ack == NULL)
        return;

    //
    // Initialize the Acknowledgement option.
    //
    RtlZeroMemory(Ack, sizeof *Ack);
    Ack->opt.optionType = VRR_OPTION_TYPE_ACK;
    Ack->opt.optDataLen = ACKNOWLEDGEMENT_LEN;
    Ack->opt.identification = AckId;
    Ack->opt.RackSourceIF = RackSourceIF;
    Ack->opt.RackDestIF = RackDestIF;
    RtlCopyMemory(Ack->opt.from, Source, SR_ADDR_LEN);
    RtlCopyMemory(Ack->opt.to, Dest, SR_ADDR_LEN);

    //
    // Send the Acknowledgement option.
    //
    MsgQueueMessage(VA, Ack->opt.to,(InternalOption *)Ack,RackDestIF,RackSourceIF,MAX_ACK_DELAY,NULL);
}

//* MaintBufResetStatistics
//
//  Resets all counters and statistics gathering for the maintenance buffer.
//
void
MaintBufResetStatistics(MiniportAdapter *VA)
{
    MaintBuf *MB = VA->MaintBuf;
    MaintBufNode *MBN;
    KIRQL OldIrql;

    KeAcquireSpinLock(&MB->Lock, &OldIrql);
    MB->HighWater = MB->NumPackets;
    for (MBN = MB->MBN; MBN != NULL; MBN = MBN->Next) {
        MBN->HighWater = MBN->NumPackets;
        MBN->NumAckReqs = 0;
        MBN->NumFastReqs = 0;
        MBN->NumValidAcks = 0;
        MBN->NumInvalidAcks = 0;
        MBN->MBNCountPackets = 0;
        MBN->MBNTxSuccess = 0;
        MBN->MBNRexmits = 0;
        MBN->MBNTxFailed = 0;
    }
    KeReleaseSpinLock(&MB->Lock, OldIrql);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本中文一区二区三区| 蜜桃一区二区三区在线| 欧美一区二区三区日韩| av成人免费在线观看| 另类的小说在线视频另类成人小视频在线 | 欧美日韩一区二区在线观看| 九一九一国产精品| 天天综合日日夜夜精品| 亚洲视频1区2区| 国产欧美日韩亚州综合 | 国产一区视频网站| 一区二区三区精品视频在线| 欧美精品一区二区高清在线观看 | 欧美日韩你懂得| 一本大道久久a久久综合| 国产精品自拍在线| 美女免费视频一区二区| 亚洲国产aⅴ成人精品无吗| 中文字幕一区二区三区不卡| 久久综合狠狠综合| 日韩午夜在线观看| 9191国产精品| 欧美日本乱大交xxxxx| 在线一区二区观看| 91女厕偷拍女厕偷拍高清| 成人一级黄色片| 国产成人av电影免费在线观看| 蜜桃久久久久久久| 免费观看在线综合| 日韩影院在线观看| 日韩成人伦理电影在线观看| 丝袜美腿高跟呻吟高潮一区| 亚洲高清免费在线| 福利电影一区二区| 国内精品免费**视频| 久国产精品韩国三级视频| 日韩av二区在线播放| 免费观看久久久4p| 蜜臀精品久久久久久蜜臀| 日本中文字幕一区二区有限公司| 日韩avvvv在线播放| 性久久久久久久| 免费一级片91| 九九在线精品视频| 国产乱子伦视频一区二区三区| 国产精品一二三区| 国产成a人亚洲| 99久久国产综合色|国产精品| 92国产精品观看| 欧美三级日韩三级| 91精品国产欧美一区二区| 日韩免费观看高清完整版| 欧美mv和日韩mv的网站| 久久九九久精品国产免费直播| 国产视频一区二区三区在线观看| 国产精品无遮挡| 亚洲男女毛片无遮挡| 亚洲在线免费播放| 日本中文一区二区三区| 国精产品一区一区三区mba桃花| 国产成人免费高清| 91一区二区三区在线观看| 欧美伊人精品成人久久综合97 | 777xxx欧美| 欧美成人性战久久| 亚洲国产成人私人影院tom| 亚洲欧美精品午睡沙发| 日韩精品一二三四| 国产成人亚洲综合a∨婷婷| 91麻豆国产自产在线观看| 欧美精品一级二级| 国产偷国产偷精品高清尤物| 中文字幕色av一区二区三区| 亚洲电影在线播放| 国产一区不卡在线| 99在线精品一区二区三区| 欧美日韩精品是欧美日韩精品| 久久综合中文字幕| 亚洲美女屁股眼交| 激情综合色播五月| 色综合天天天天做夜夜夜夜做| 欧美一级生活片| 综合久久综合久久| 欧洲一区二区三区免费视频| 91精品欧美久久久久久动漫| 欧美国产97人人爽人人喊| 亚洲电影一级片| www.爱久久.com| 91精品国产色综合久久久蜜香臀| 国产精品系列在线| 久久国产精品区| 91麻豆免费在线观看| ww久久中文字幕| 亚洲成人福利片| 国产91丝袜在线播放| 在线播放欧美女士性生活| 国产精品女主播在线观看| 美腿丝袜亚洲三区| 91久久人澡人人添人人爽欧美| 久久天天做天天爱综合色| 亚洲国产精品精华液网站| www.欧美精品一二区| 精品福利在线导航| 日日噜噜夜夜狠狠视频欧美人| av不卡一区二区三区| 精品成人一区二区| 日韩成人伦理电影在线观看| 色噜噜久久综合| 中文乱码免费一区二区| 麻豆视频一区二区| 制服丝袜在线91| 亚洲一区二区欧美| 色综合色综合色综合色综合色综合| 久久久久久一二三区| 蜜臀国产一区二区三区在线播放 | a在线欧美一区| 久久综合色天天久久综合图片| 亚洲一区二区三区在线播放| 成人avav影音| 国产精品国产三级国产| 国产成人综合视频| 久久蜜臀精品av| 精品在线一区二区三区| 日韩一级片在线播放| 91蝌蚪porny成人天涯| 精品免费国产一区二区三区四区| 日韩在线卡一卡二| 欧美精品粉嫩高潮一区二区| 亚洲国产成人av网| 欧美日韩精品三区| 亚洲午夜视频在线| 欧美体内she精高潮| 又紧又大又爽精品一区二区| 99国产麻豆精品| 国产精品电影一区二区三区| 国产aⅴ综合色| 国产精品日韩成人| 99久久er热在这里只有精品66| 一区在线中文字幕| 97精品视频在线观看自产线路二| 中文字幕在线观看不卡| 成人avav影音| 一区二区三区日韩精品| 欧美午夜影院一区| 视频一区视频二区中文字幕| 777色狠狠一区二区三区| 麻豆成人综合网| 久久久久久久综合| 粉嫩一区二区三区性色av| 国产精品国产三级国产普通话蜜臀| 99re热这里只有精品视频| 夜夜嗨av一区二区三区网页| 欧美日韩一区中文字幕| 老司机精品视频一区二区三区| 久久你懂得1024| 99国产精品久| 性欧美大战久久久久久久久| 日韩亚洲欧美在线观看| 国产黄人亚洲片| 亚洲精品写真福利| 欧美乱妇一区二区三区不卡视频 | 色94色欧美sute亚洲13| 亚洲国产精品人人做人人爽| 制服丝袜激情欧洲亚洲| 国产一区二区不卡| 亚洲激情图片小说视频| 欧美一区二区二区| av在线综合网| 日韩成人一级大片| 中文字幕av一区二区三区高| 久久久噜噜噜久噜久久综合| 99久久国产综合精品麻豆| 婷婷综合另类小说色区| 国产亚洲一区二区三区在线观看| 91在线视频网址| 美女网站色91| 亚洲日本va午夜在线影院| 欧美一区永久视频免费观看| 国产黄色成人av| 日韩和欧美一区二区三区| 国产丝袜欧美中文另类| 欧美日韩一本到| 盗摄精品av一区二区三区| 亚洲第一激情av| 中文一区二区完整视频在线观看| 欧美日韩不卡一区二区| 国产不卡视频一区| 日韩精品一卡二卡三卡四卡无卡| 国产精品久久久久久亚洲毛片| 欧美年轻男男videosbes| 懂色av一区二区三区蜜臀| 亚洲午夜久久久久久久久电影院 | 国产精品国产三级国产普通话99| 欧美精品日韩综合在线| jizz一区二区| 国产一区二区主播在线| 亚洲一区二区三区四区在线 | 免费观看成人av| 亚洲一区二区在线播放相泽 | 亚洲欧美日韩在线|