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

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

?? pktpair.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.
//
// This file is derived from the Microsoft Research Mesh Connectivity Layer,
// available under the MSR-SSLA license, and downloadable from
// http://research.microsoft.com/mesh/.
//
// Abstract:
//
// Packet pair measurements.
//

#include "headers.h"

// 
// The basic algorithm is as follows: each node sends 
// two packets, back-to-back, to each of its neighbors. 
// The neighbor responds back to the second packet, 
// and reports the time difference between the two 
// receive events. If no response is received by the 
// time we are ready to send the next packet-pair, 
// the sender takes a penalty of 3 times the current 
// average.
// 

//
// Default PKT_PAIR parameter values.
//

// Scaled by MAXALPHA of 10, this becomes 0.1.  
#define DEFAULT_PKT_PAIR_ALPHA  1

// 2 second probe period. 
#define DEFAULT_PKT_PAIR_PROBE_PERIOD (2 * SECOND)

// PKT_PAIR penalty factor of 3.
#define DEFAULT_PKT_PAIR_PENALTY_FACTOR 3            

// Initial Packet pair estimate.
#define INITIAL_PKTPAIR_ESTIMATE (1 * MILLISECOND)

// Probe padding size.
#define PROBE_PADDING 1000

// Calculate min over this multiple of probe period.
#define MIN_OVER_PROBES 50

// Values larger than this are considered infinite.
#define DEFAULT_PKT_PAIR_INFINITY (30 * MILLISECOND)

//* PktPairIsInfinite
//
//  Returns TRUE if the link metric indicates that the link
//  is effectively broken.
//
boolint
PktPairIsInfinite(uint Metric)
{
    return (Metric > DEFAULT_PKT_PAIR_INFINITY);
}

//* PktPairInitLinkMetric
//
// Init metric informtion for a new link.
//
void 
PktPairInitLinkMetric(
    MiniportAdapter *VA,
    int SNode,
    Link *Link, 
    Time Now)
{
    uint i; 

    UNREFERENCED_PARAMETER(SNode);

    //
    // The basic metric.
    //
    Link->Metric = INITIAL_PKTPAIR_ESTIMATE;

    //
    // PktPair sender-specific info.
    //
    Link->MetricInfo.PktPair.ProbeSeq = 0;
    Link->MetricInfo.PktPair.PairsSent = 0;
    Link->MetricInfo.PktPair.RepliesSent = 0;
    Link->MetricInfo.PktPair.RepliesRcvd = 0;
    Link->MetricInfo.PktPair.LostPairs = 0;
    Link->MetricInfo.PktPair.ProbeTimeout = Now + 
                                            VA->MetricParams.PktPair.ProbePeriod +
                                            GetRandomNumber(VA->MetricParams.PktPair.ProbePeriod >> 2);
    Link->MetricInfo.PktPair.Outstanding = 0; 
    Link->MetricInfo.PktPair.Delta = 0; 
    Link->MetricInfo.PktPair.RTT = INITIAL_PKTPAIR_ESTIMATE; 
    Link->MetricInfo.PktPair.LastRTT = 0; 
    Link->MetricInfo.PktPair.LastPktPair = 0; 

    //
    // PktPair receiver-specific info.
    //
    Link->MetricInfo.PktPair.LastProbeTimestamp = (uint)-1; 
    Link->MetricInfo.PktPair.TimeLastProbeRcvd = 0;
    Link->MetricInfo.PktPair.LastProbeSeq = (uint)-1;

    //
    // Min Time History. 
    //
    Link->MetricInfo.PktPair.CurrMin = (uint)-1; 
    Link->MetricInfo.PktPair.NumSamples = 0;
    Link->MetricInfo.PktPair.NextMinTime = Now + VA->MetricParams.PktPair.ProbePeriod * MIN_OVER_PROBES; 
    for (i = 0; i < MAX_PKTPAIR_HISTORY; i++) { 
        Link->MetricInfo.PktPair.MinHistory[i].Min = (uint)-1; 
        Link->MetricInfo.PktPair.MinHistory[i].Seq = (uint)-1;
    }
}

//* PktPairInit
// 
//  Called by MiniportInitialize.
//
void PktPairInit(
    MiniportAdapter *VA) 
{
    VA->IsInfinite = PktPairIsInfinite;
    VA->ConvMetric = MiniportConvMetric;
    VA->PathMetric = MiniportPathMetric;
    VA->InitLinkMetric = PktPairInitLinkMetric;

    VA->MetricParams.PktPair.Alpha = DEFAULT_PKT_PAIR_ALPHA;
    VA->MetricParams.PktPair.ProbePeriod = DEFAULT_PKT_PAIR_PROBE_PERIOD; 
    VA->MetricParams.PktPair.PenaltyFactor = DEFAULT_PKT_PAIR_PENALTY_FACTOR; 
}


//* PktPairSendProbeComplete
//
//  Called after sending a probe.  Cleans up after PktPairCreateProbePacket.
//
void
PktPairSendProbeComplete(
    MiniportAdapter *VA,
    NDIS_PACKET *Packet,
    NDIS_STATUS Status)
{
    SRPacket *srp = PC(Packet)->srp;

    UNREFERENCED_PARAMETER(VA);
    UNREFERENCED_PARAMETER(Status);

    NdisFreePacketClone(Packet);
    SRPacketFree(srp);
}

//* PktPairFreePadding
//
//  Helper function when probe is padded.
//
static void
PktPairFreePadding(
    ProtocolAdapter *PA,
    NDIS_PACKET *Packet)
{
    UNREFERENCED_PARAMETER(PA);
    NdisFreePacketClone(Packet);
}

//* PktPairCreateProbePacket
//
//  Creates a packet to send a probe.
//
NDIS_STATUS
PktPairCreateProbePacket(
    MiniportAdapter *VA,
    Link *Adjacent,
    Time Timestamp,
    NDIS_PACKET **ReturnPacket,
    uint Seq,
    boolint LargeProbe,
    MetricType ProbeType)
{
    SRPacket *srp;
    NDIS_PACKET *Packet;
    NDIS_PACKET *ProbePadding;
    void *PaddingData;
    NDIS_STATUS Status;
    
    InterlockedIncrement((PLONG)&VA->CountXmitProbe);

    //
    // Initialize an SRPacket for the Probe.
    // The Probe carries no data so it does not need an IV.
    //
    srp = ExAllocatePool(NonPagedPool, sizeof *srp);
    if (srp == NULL) {
        return NDIS_STATUS_RESOURCES;
    }
    RtlZeroMemory(srp, sizeof *srp);

    //
    // Initialize the Probe option. The probe carries
    // only generic variables, so no need to allocate
    // extra space. 
    //
    srp->Probe = ExAllocatePool(NonPagedPool, sizeof *srp->Probe);
    if (srp->Probe == NULL) {
        Status = NDIS_STATUS_RESOURCES;
        goto FreesrpAndExit;
    }
    RtlZeroMemory(srp->Probe, sizeof *srp->Probe);
    srp->Probe->Opt.OptionType = VRR_OPTION_TYPE_PROBE;
    srp->Probe->Opt.OptDataLen = PROBE_LEN;
    srp->Probe->Opt.MetricType = VA->MetricType;
    srp->Probe->Opt.ProbeType = METRIC_TYPE_PKTPAIR;
    srp->Probe->Opt.Seq = Seq;
    srp->Probe->Opt.Timestamp = Timestamp;
    RtlCopyMemory(srp->Probe->Opt.From, VA->Address, sizeof(VirtualAddress));

    {
        //
        // Obtain physical neighbor address from NCE containing Link Adjacent.
        //
        NeighborCacheEntry *NCE;
        
        NCE = CONTAINING_RECORD(Adjacent,NeighborCacheEntry,AdjOut);
        RtlCopyMemory(srp->Probe->Opt.To, NCE->VAddress, sizeof(VirtualAddress));
    }
    
    srp->Probe->Opt.OutIf = Adjacent->outif;
    srp->Probe->Opt.InIf = Adjacent->inif;
    srp->Probe->Opt.Metric = Adjacent->Metric;

    //
    // Create padding data based on whether LargeProbe is true or false.  
    // NB: MiniportMakeEmptyPacket is defined in headers.h.
    //
    if (LargeProbe) {
        Status = MiniportMakeEmptyPacket(VA, 
                                         PROBE_PADDING, 
                                         &ProbePadding, 
                                         &PaddingData);
        if (Status != NDIS_STATUS_SUCCESS) {
            goto FreesrpAndExit;
        }

        //
        // Note that all-zero padding ensures that we
        // will fail decryption at the receiver, since we
        // do not have correct ethertype. But this is okay,
        // since there are no piggybacked options. 
        //
        RtlZeroMemory(PaddingData, PROBE_PADDING);
    
        srp->Packet = ProbePadding;
        srp->PayloadOffset = 0;
        srp->FreePacket = PktPairFreePadding;
    }

    //
    // Initialize srp members used in VrrHeader construction.
    //
    RtlCopyMemory(srp->Dest, srp->Probe->Opt.To, sizeof(VirtualAddress));
    RtlCopyMemory(srp->Source, VA->Address, sizeof(VirtualAddress));
    RtlCopyMemory(srp->Origin, VA->Address, sizeof(VirtualAddress));
    srp->FrameSeqNo = InterlockedIncrement((unsigned long *)&VrrGlobal.NextFrameSeqNo);
    srp->HopCount = 0;


    //
    // Convert the SRPacket to an NDIS Packet. Again, note that we have
    // not called MsgLoadSRPfromPCache. This ensures that it is okay to 
    // fail decryption at the receiver. Furthermore, without piggybacked 
    // options, we have a better estimate of packet size.
    //
    Status = SRPacketToProbe(VA, srp, &Packet);
    if (Status != NDIS_STATUS_SUCCESS) {
        goto FreesrpAndExit;
    }

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

    *ReturnPacket = Packet;
    return NDIS_STATUS_SUCCESS;

FreesrpAndExit:
    SRPacketFree(srp);
    return Status;
}



//* PktPairSendProbeReply
//
//  Send a probe reply. 
//
void
PktPairSendProbeReply(
        MiniportAdapter *VA, 
        InternalProbe *Probe, 
        Time Now, 
        Time OutDelta)
{
    SRPacket *srp;
    NDIS_PACKET *Packet;
    NDIS_STATUS Status;
    PRPktPair *Special; 

    UNREFERENCED_PARAMETER (Now); 

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

    //
    // Initialize the Probe Reply option.
    // Allocate extra space to hold packet-pair data.
    //
    srp->ProbeReply = ExAllocatePool(NonPagedPool, sizeof *srp->ProbeReply + sizeof(PRPktPair));
    if (srp->ProbeReply == NULL)
        goto FreesrpAndExit;

    RtlZeroMemory(srp->ProbeReply, sizeof *srp->ProbeReply + sizeof(PRPktPair));

    srp->ProbeReply->Opt.OptionType = VRR_OPTION_TYPE_PROBEREPLY;
    srp->ProbeReply->Opt.OptDataLen = PROBE_REPLY_LEN + sizeof(PRPktPair);
    srp->ProbeReply->Opt.MetricType = VA->MetricType; 
    srp->ProbeReply->Opt.ProbeType = METRIC_TYPE_PKTPAIR;
    srp->ProbeReply->Opt.Seq = Probe->Opt.Seq; 
    srp->ProbeReply->Opt.Timestamp = Probe->Opt.Timestamp; 
    RtlCopyMemory(srp->ProbeReply->Opt.From, VA->Address,
                  sizeof(VirtualAddress));
    RtlCopyMemory(srp->ProbeReply->Opt.To, Probe->Opt.From,
                  sizeof(VirtualAddress));
    srp->ProbeReply->Opt.OutIf = Probe->Opt.InIf;
    srp->ProbeReply->Opt.InIf = Probe->Opt.OutIf;

    //
    // Fill in packet-pair specific data. 
    //
    Special = (PRPktPair *)srp->ProbeReply->Opt.Special; 
    Special->OutDelta = OutDelta; 
    
    //
    // Initialize srp members used in VrrHeader construction.
    //
    RtlCopyMemory(srp->Dest, Probe->Opt.From, sizeof(VirtualAddress));
    RtlCopyMemory(srp->Source, VA->Address, sizeof(VirtualAddress));
    RtlCopyMemory(srp->Origin, VA->Address, sizeof(VirtualAddress));
    srp->FrameSeqNo = InterlockedIncrement((unsigned long *)&VrrGlobal.NextFrameSeqNo);
    srp->HopCount = 0;

    //
    // Convert the SRPacket to an NDIS Packet.
    //
    Status = SRPacketToProbe(VA, srp, &Packet);
    if (Status != NDIS_STATUS_SUCCESS)
        goto FreesrpAndExit;

    PC(Packet)->srp = srp;

    //
    // Reuse completion routine from PktPairSendProbe.
    //
    PC(Packet)->TransmitComplete = PktPairSendProbeComplete;

    if (PC(Packet)->PA == NULL) {
        //
        // This means the packet is trying to use a physical adapter that
        // no longer exists.  Just free the packet and bail.
        //
        PktPairSendProbeComplete(VA, Packet, NDIS_STATUS_FAILURE);

    } else {
        //
        // Transmit the packet.
        //
        ProtocolTransmit(PC(Packet)->PA, Packet);
    }
    return;

FreesrpAndExit:
    SRPacketFree(srp);
    return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清shemale亚洲人妖| 亚洲综合网站在线观看| 黄页网站大全一区二区| 欧美大片在线观看| 精品无人码麻豆乱码1区2区| 久久综合色鬼综合色| 国产精品一卡二| 国产精品国产自产拍在线| 99国产欧美另类久久久精品| 亚洲欧美精品午睡沙发| 一本色道亚洲精品aⅴ| 亚洲国产精品久久久久秋霞影院| 欧美一区二区三区小说| 国产尤物一区二区在线| 国产亚洲va综合人人澡精品| 成人av网站大全| 亚洲chinese男男1069| 欧美一区二区三区啪啪| 国产精品18久久久久久vr| 亚洲色图制服丝袜| 91精品国产免费| 国产电影一区在线| 亚洲图片欧美综合| 久久久久9999亚洲精品| 91久久精品一区二区| 蜜桃精品视频在线观看| 一区二区三区中文字幕在线观看| 久久99热这里只有精品| 91香蕉视频在线| 亚洲国产精品一区二区www在线| 日韩免费高清视频| 91在线无精精品入口| 日本中文字幕一区| 亚洲人成人一区二区在线观看| 亚洲欧洲日韩在线| 337p亚洲精品色噜噜狠狠| 成人免费观看视频| 蜜臀a∨国产成人精品| 亚洲视频一区二区免费在线观看| 日韩一区二区三区在线观看| 91在线精品一区二区三区| 激情五月激情综合网| 亚洲成人高清在线| 国产精品成人免费精品自在线观看| 欧美日韩电影一区| 91视频一区二区三区| 国模娜娜一区二区三区| 日产国产欧美视频一区精品 | 亚洲精品国产视频| www成人在线观看| 67194成人在线观看| av男人天堂一区| 国产一区二区三区免费看| 亚洲一区二区偷拍精品| 国产精品国产馆在线真实露脸| 精品久久久影院| 91精品黄色片免费大全| 欧美视频一区二区三区四区 | 国产婷婷色一区二区三区 | 国产91在线观看丝袜| 日韩精品久久理论片| 洋洋av久久久久久久一区| 日韩理论在线观看| 国产精品色眯眯| 久久女同精品一区二区| 日韩三级中文字幕| 日韩欧美国产一区二区在线播放| 欧美精品久久一区| 欧美日韩的一区二区| 欧美三级视频在线播放| 欧美亚洲禁片免费| 欧美性感一类影片在线播放| 欧美在线小视频| 欧美中文字幕一区二区三区| 91豆麻精品91久久久久久| 91美女在线视频| 欧美最猛性xxxxx直播| 91丝袜呻吟高潮美腿白嫩在线观看| 成人动漫中文字幕| 不卡高清视频专区| 99久久久国产精品免费蜜臀| 99精品热视频| 色婷婷亚洲精品| 欧美色综合网站| 69av一区二区三区| 1000部国产精品成人观看| jlzzjlzz亚洲女人18| 97国产精品videossex| 91在线国产福利| 欧美性生活影院| 日韩精品综合一本久道在线视频| 久久先锋影音av| 国产精品久久夜| 亚洲午夜在线视频| 欧美精品色综合| 日韩精品一区二区三区在线观看| 精品久久久久久久久久久久包黑料| 欧美精品一区二区三区很污很色的 | 亚洲mv大片欧洲mv大片精品| 日本中文字幕一区| 国产91精品一区二区麻豆亚洲| 99精品久久99久久久久| 欧美日韩一区二区三区不卡| 欧美一区二区三区色| 欧美激情一区二区三区全黄| 一区二区视频在线| 久久精品国产亚洲5555| 成人永久aaa| 在线不卡的av| 国产精品人妖ts系列视频| 一区二区三区免费| 久久国产精品99精品国产| 成人免费观看av| 欧美精品视频www在线观看| 久久久国产精品午夜一区ai换脸| 一区二区三区日韩精品视频| 蜜桃一区二区三区四区| 99久久综合国产精品| 666欧美在线视频| 国产精品久久免费看| 日韩成人精品视频| 91香蕉视频mp4| 26uuu久久综合| 一级精品视频在线观看宜春院 | 免费xxxx性欧美18vr| 成人h动漫精品| 日韩一区二区三区观看| 亚洲女同ⅹxx女同tv| 美女视频网站久久| 色婷婷综合久久久久中文| 久久久亚洲精品石原莉奈| 午夜免费欧美电影| 99国产精品视频免费观看| 精品久久人人做人人爰| 91亚洲永久精品| 欧美精品一区二区久久久| 亚洲国产一二三| av不卡一区二区三区| 26uuu成人网一区二区三区| 亚洲成av人在线观看| 97久久精品人人做人人爽50路 | 成人黄色在线视频| 精品国产乱码久久久久久老虎 | 国产自产视频一区二区三区| 欧美色图激情小说| 亚洲欧美色图小说| 国产a区久久久| 国产亚洲欧美一区在线观看| 日韩1区2区日韩1区2区| 欧美日韩国产一二三| 《视频一区视频二区| 国产高清精品在线| 精品国产自在久精品国产| 午夜精品一区在线观看| 在线精品视频免费观看| 综合久久一区二区三区| 国产成人av一区| 久久久久久久久久久久久久久99| 日本欧美韩国一区三区| 欧美色电影在线| 亚洲午夜在线视频| 欧美日韩视频一区二区| 亚洲v中文字幕| 欧美日韩中文字幕精品| 亚洲综合精品久久| 欧美性生活影院| 视频一区免费在线观看| 欧美一区二区在线观看| 久久99精品国产麻豆婷婷洗澡| 日韩视频中午一区| 狠狠色丁香九九婷婷综合五月| 日韩精品一区二区在线观看| 精品一区二区在线看| 久久综合狠狠综合久久综合88 | 国产成人亚洲精品青草天美| 欧美日韩国产123区| 亚洲愉拍自拍另类高清精品| 91麻豆免费观看| 日韩理论片一区二区| 制服丝袜激情欧洲亚洲| 婷婷久久综合九色国产成人 | 成人激情图片网| 中文字幕欧美一| 欧美亚一区二区| 日韩影视精彩在线| 精品国产伦一区二区三区观看体验 | 欧美日韩在线三级| 日本人妖一区二区| 久久精品人人爽人人爽| 成人18精品视频| 亚洲成人免费观看| 精品免费国产二区三区| 成人禁用看黄a在线| 亚洲一区精品在线| 日韩三级中文字幕| 成人av高清在线| 天堂在线一区二区| 国产欧美一区二区精品忘忧草 | 欧美人xxxx| 黄页视频在线91|