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

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

?? pktindex.c

?? Vitual Ring Routing 管你知不知道
?? C
字號:
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// (c) Microsoft Corporation. All rights reserved. 
//
// This file is part of the Microsoft Virtual Ring Routing distribution.
// You should have received a copy of the Microsoft Research Shared Source
// license agreement (MSR-SSLA) for this software; see the file "license.txt".
// If not, please see http://research.microsoft.com/vrr/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//

//
// Maintains short-lived summary of messages and/or packets recently seen.
//

#include "headers.h"

// PX:
//* PacketIndexInit
//
//  Initialize Packet Index.
//
void
PacketIndexInit(PacketIndex *PX)
{
    KeInitializeSpinLock(&PX->Lock);
    PX->FirstPXE = PX->LastPXE = SentinelPXE(PX);
}

//* AddRefPXE
void
AddRefPXE(PacketIndexEntry *PXE)
{
    InterlockedIncrement(&PXE->RefCnt);
}

//* ReleasePXE
void
ReleasePXE(PacketIndexEntry *PXE)
{
    if (InterlockedDecrement(&PXE->RefCnt) == 0) {
        ExFreePool(PXE);
    }
}

//* RemovePXE
//
//  Caller must hold PX->Lock.
//
void
RemovePXE(
    PacketIndex *PX,
    PacketIndexEntry *PXE)
{
    //
    // Sanity checks.
    //
    VRRASSERT(PXE != (PacketIndexEntry *)PX);

    //
    // Adjust pointers and free memory.
    //
    PXE->Next->Prev = PXE->Prev;
    PXE->Prev->Next = PXE->Next;
    ReleasePXE(PXE);
    ReleasePXE(PXE);
}

//* InsertPXE
//
//  Insert PXE into Packet Index.
//
//  Caller must hold the PX->Lock.
//
void
InsertPXE(
    MiniportAdapter *VA,
    PacketIndexEntry *PXE)
{
    PacketIndex *PX = &VA->PX;
    PacketIndexEntry *NextPXE;
    uint RemoveNext = FALSE;

    VRRASSERT(PX != NULL);
    VRRASSERT(PXE != NULL);

    //
    // Find insertion point for the PXE in the Packet Index.
    //
    for (NextPXE = PX->FirstPXE; 
         NextPXE != SentinelPXE(PX);
         NextPXE = NextPXE->Next) {

         if (VirtualAddressLessThan(PXE->Origin,NextPXE->Origin))
             continue;
         if (VirtualAddressGreaterThan(PXE->Origin,NextPXE->Origin))
             break;
         if (PXE->FrameSeqNo < NextPXE->FrameSeqNo)
             continue;
         if (PXE->FrameSeqNo > NextPXE->FrameSeqNo)
             break;
         //
         // Duplicate: replace older PXE in case new instance still in use.
         //
         RemoveNext = TRUE;
         break;
    }

    //
    // Insert the new PXE immediately prior to NextPXE.
    //
    PXE->Prev = NextPXE->Prev;
    PXE->Prev->Next = PXE;
    PXE->Next = NextPXE;
    PXE->Next->Prev = PXE;
    AddRefPXE(PXE);
    AddRefPXE(PXE);

    if (RemoveNext == TRUE)
        RemovePXE(PX,NextPXE);
   
}

//* CreatePXE
//
//  Allocate a new Packet Index Entry in memory.
//
PacketIndexEntry *
CreatePXE(
    VirtualAddress Origin,
    uint FrameSeqNo,
    uchar Type)
{
    PacketIndexEntry *PXE;

    PXE = ExAllocatePool(NonPagedPool, sizeof *PXE);
    if (PXE == NULL)
        return NULL;

    //
    // Initialize the PXE.
    //
    RtlZeroMemory(PXE, sizeof *PXE);
    RtlCopyMemory(PXE->Origin,Origin,sizeof(VirtualAddress));
    PXE->FrameSeqNo = FrameSeqNo;
    PXE->Type = Type;

    return PXE;
}

//* FindPXE
//
//  Returns PXE iff in Packet Index, else NULL.
//
//  Caller must hold the PX->Lock.
//
PacketIndexEntry *
FindPXE(
    PacketIndex *PX,
    VirtualAddress Origin,
    uint FrameSeqNo,
    uchar Type)
{
    PacketIndexEntry *PXE;

    VRRASSERT(PX != NULL);

    for (PXE = PX->FirstPXE; 
         PXE != SentinelPXE(PX);
         PXE = PXE->Next) {
         
        if (IsUnspecified(Origin) || VirtualAddressEqual(PXE->Origin, Origin))
        if (FrameSeqNo == 0 || FrameSeqNo == PXE->FrameSeqNo)
        if (PXE->Type == Type)
            return PXE;
    }

    return NULL;    
}

//* UpdatePacketIndex
//
//  Update existing PXE or create a new one.
//
//  Returns TRUE iff a new PXE was created.
//
//  Caller must not hold PX->Lock.
//
uint
UpdatePacketIndex(
    MiniportAdapter *VA,
    VirtualAddress Origin,
    uint FrameSeqNo,
    uchar HopCount,
    VirtualAddress Source,
    VirtualAddress Dest,
    VRRIf LocIF,
    uchar Type)
{
    PacketIndex *PX = &VA->PX;
    PacketIndexEntry *PXE;
    uint NewPXE = FALSE;
    KIRQL OldIrql;

    if (PXE_CTL_MSG_ONLY && Type == VRR_OPTION_TYPE_PACKET)
        return FALSE;
        
    KeAcquireSpinLock(&VA->PX.Lock, &OldIrql);

    //
    // PXE have unique keys (Origin,FrameSeqNo).
    //
    if ((PXE=FindPXE(PX, Origin,FrameSeqNo,Type)) == NULL) {
        NewPXE = TRUE;
        if ((PXE=CreatePXE(Origin,FrameSeqNo,Type)) != NULL)
            InsertPXE(VA, PXE);
    }

    //
    // Update non-key fields within the PXE.
    //
    if (PXE != NULL) {
        PXE->Timeout = KeQueryInterruptTime() + PACKET_INDEX_LIFETIME;
        PXE->HopCount = HopCount;
        RtlCopyMemory(PXE->Source,Source,sizeof(VirtualAddress));
        RtlCopyMemory(PXE->Dest,Dest,sizeof(VirtualAddress));
        PXE->LocIF = LocIF;
        PXE->Timeout = KeQueryInterruptTime() + PACKET_INDEX_LIFETIME;
    }

    KeReleaseSpinLock(&VA->PX.Lock, OldIrql);

    return NewPXE;
}


//* PacketIndexCleanup
//
// Flush the Packet Index.
//
void
PacketIndexCleanup(
    MiniportAdapter *VA)
{
    PacketIndexEntry *PXE;
    PacketIndex *PX = &VA->PX;
    KIRQL OldIrql;

    KeAcquireSpinLock(&VA->PX.Lock, &OldIrql);
    while ((PXE = PX->FirstPXE) != SentinelPXE(PX))
        RemovePXE(PX, PXE);
    KeReleaseSpinLock(&VA->PX.Lock, OldIrql);
}

//* PacketIndexTimeout
//
//  Housekeeping of Packet Index.
//
Time
PacketIndexTimeout(
    MiniportAdapter *VA,
    Time Now)
{
    NDIS_STATUS Status;
    LARGE_INTEGER Timestamp;
    LARGE_INTEGER Frequency;
    KIRQL OldIrql;
    Time NextTimeout = Now + MIN_PXE_TIMOUT_INTERVAL;
    PacketIndex *PX = &VA->PX;
    PacketIndexEntry *PXE;
    PacketIndexEntry *NextPXE;

    KeAcquireSpinLock(&VA->PX.Lock, &OldIrql);

    for (PXE = VA->PX.FirstPXE;
         PXE != SentinelPXE(&VA->PX);
         PXE = NextPXE) {

        Time PXETimeout = PXE->Timeout;

        NextPXE = PXE->Next;

        if (PXETimeout < Now)
            RemovePXE(PX,PXE);

        if (PXETimeout > Now && PXETimeout < NextTimeout)
            NextTimeout = PXETimeout;
        
    }

    KeReleaseSpinLock(&VA->PX.Lock, OldIrql);

    return NextTimeout;
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区精品字幕| 国产午夜亚洲精品理论片色戒| 国产综合久久久久久鬼色| 五月婷婷激情综合| 午夜免费欧美电影| 亚洲国产一区在线观看| 亚洲日本一区二区| 亚洲精品视频一区| 亚洲国产精品久久艾草纯爱| 亚洲视频 欧洲视频| 亚洲三级久久久| 亚洲狠狠丁香婷婷综合久久久| 成人欧美一区二区三区| 亚洲国产精品国自产拍av| 国产欧美综合在线观看第十页| 国产三区在线成人av| 国产女主播视频一区二区| 26uuu色噜噜精品一区| 久久奇米777| 亚洲欧洲日韩一区二区三区| 亚洲精品videosex极品| 香蕉av福利精品导航| 亚洲h在线观看| 精品在线免费观看| aaa亚洲精品| 欧美日韩在线播放三区| 日韩精品一区二区三区swag| 久久精品日产第一区二区三区高清版| 中文无字幕一区二区三区| 亚洲一区二区av电影| 日本欧美一区二区| 国产精品一区二区在线看| 99久久99久久精品免费看蜜桃| 色婷婷av一区二区三区大白胸| 色婷婷精品久久二区二区蜜臀av | 黄色成人免费在线| 成人在线一区二区三区| 91成人看片片| 日韩欧美国产午夜精品| 久久久久久久网| 一区二区三区四区蜜桃| 久久精品99国产精品| 99热精品国产| 51精品秘密在线观看| 国产亚洲自拍一区| 亚洲国产欧美在线| 韩国一区二区在线观看| 91女厕偷拍女厕偷拍高清| 欧美色欧美亚洲另类二区| 精品盗摄一区二区三区| 亚洲综合无码一区二区| 国产精品资源在线| 91麻豆精品国产无毒不卡在线观看 | 视频一区二区中文字幕| 狠狠狠色丁香婷婷综合激情 | av色综合久久天堂av综合| 欧美日韩二区三区| 美女精品一区二区| av亚洲精华国产精华| 欧美一二三区在线| 亚洲国产精品一区二区尤物区| 韩国三级中文字幕hd久久精品| 欧美日韩国产免费| 一区二区三区国产| 色综合天天综合狠狠| 国产亚洲一区二区在线观看| 蜜臀精品一区二区三区在线观看| 色老汉一区二区三区| 国产精品剧情在线亚洲| 丁香婷婷综合激情五月色| 久久网站最新地址| 国内精品嫩模私拍在线| 欧美电影免费观看高清完整版 | 久久精品国产色蜜蜜麻豆| 欧美日韩一卡二卡| 亚洲成人自拍偷拍| 欧美在线免费观看亚洲| 亚洲精品乱码久久久久久黑人| 国产黑丝在线一区二区三区| 日韩免费观看高清完整版| 日韩av午夜在线观看| 欧美美女网站色| 日韩和的一区二区| 日韩免费视频一区| 国产一区在线视频| 国产精品丝袜黑色高跟| 91蜜桃视频在线| 亚洲精品国产成人久久av盗摄| 色婷婷亚洲综合| 亚洲国产日韩综合久久精品| 欧美日韩免费不卡视频一区二区三区| 亚洲大尺度视频在线观看| 欧美日韩国产在线观看| 免费高清视频精品| 欧美成人伊人久久综合网| 另类综合日韩欧美亚洲| 久久久综合激的五月天| 丁香婷婷综合激情五月色| 欧美国产亚洲另类动漫| 一本到高清视频免费精品| 一区二区三区免费观看| 欧美日韩一区不卡| 国产一区二区三区| 国产精品国产自产拍高清av | 欧美另类久久久品| 久久99精品国产麻豆婷婷洗澡| 久久精品日产第一区二区三区高清版 | 粉嫩av亚洲一区二区图片| 亚洲美女一区二区三区| 91精品久久久久久久99蜜桃| 风流少妇一区二区| 日韩在线观看一区二区| 中文字幕久久午夜不卡| 欧美日韩高清一区二区三区| 国产成人在线视频免费播放| 亚洲成av人片在www色猫咪| 亚洲精品一区二区三区福利| 欧美亚洲丝袜传媒另类| 国内成人精品2018免费看| 亚洲一级二级三级| 国产精品污www在线观看| 欧美日韩一区二区三区高清| 国产.欧美.日韩| 免费在线观看一区二区三区| 18涩涩午夜精品.www| 日韩欧美在线网站| 国产精品三级av| 欧美午夜精品电影| 亚洲综合色区另类av| 国产日韩欧美不卡在线| 成人精品高清在线| 中文字幕在线不卡| 97精品久久久久中文字幕| 亚洲电影在线播放| 国产成人精品一区二| 久久精品国产秦先生| 国产欧美一区在线| 国产成人精品亚洲日本在线桃色| 欧美国产一区二区| 欧美一区二视频| av综合在线播放| 成人爽a毛片一区二区免费| 亚洲一区免费视频| 久久嫩草精品久久久久| 精品视频在线免费看| 粉嫩aⅴ一区二区三区四区五区| 欧美一区二区视频在线观看2020| 国模冰冰炮一区二区| 亚洲小少妇裸体bbw| 久久久久久久久一| 欧美羞羞免费网站| 看电视剧不卡顿的网站| 国产精品乱码久久久久久| 日韩一区二区影院| hitomi一区二区三区精品| 亚洲一级二级三级| 亚洲国产精品t66y| 精品国产91亚洲一区二区三区婷婷| 99精品久久免费看蜜臀剧情介绍| 久久草av在线| 亚洲国产精品综合小说图片区| 国产精品天干天干在线综合| 91精品国产综合久久精品图片| 成人高清免费在线播放| 看片网站欧美日韩| 人人爽香蕉精品| 国产精品少妇自拍| 欧美一区二区福利在线| 日本道免费精品一区二区三区| 国产一区二区福利| 精品一区二区三区免费视频| 婷婷综合另类小说色区| 免费高清不卡av| 午夜精品成人在线| 亚洲人被黑人高潮完整版| 久久久久国色av免费看影院| 欧美日韩一级视频| www国产精品av| 久久夜色精品一区| 欧美大肚乱孕交hd孕妇| 欧美美女黄视频| 91久久久免费一区二区| 91精品国产入口| 91麻豆精品国产91久久久久久久久| 91麻豆精品视频| 91蜜桃免费观看视频| 亚洲愉拍自拍另类高清精品| 免费看日韩a级影片| 无码av免费一区二区三区试看| 中文字幕亚洲欧美在线不卡| 久久亚洲精品国产精品紫薇| 日韩欧美专区在线| 4438亚洲最大| 欧美精品tushy高清| 欧美喷水一区二区| 日韩久久免费av| 欧美综合天天夜夜久久| 久久亚洲一区二区三区明星换脸 | 日本高清不卡aⅴ免费网站| 日韩专区中文字幕一区二区|