Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

344 lines
12 KiB

/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
DRRSeq.c
Abstract:
Priority/DRR Sequencer. This module is a scheduling component that
determines the order in which submitted packets should be sent.
Author:
Environment:
Kernel Mode
Revision History:
--*/
#ifndef _DRRSEQ_H_FILE
#define _DRRSEQ_H_FILE
// The sequencer classifies each flow into an internal "priority group" based
// on the flow's service type and conformance status. Within each priority
// group, there may be one or more priority levels or offsets. The total
// number of internal priority levels is the sum of the priority levels for
// each priority group. The internal priority assigned to each flow is
// calculated from the priority group and the relative priority within the
// group, which is obtained from the QOS Priority object. The 802.1 priority,
// is set by the wrapper. The non conforming values are obtained from the
// packet.
//
// The flows of the following servicetypes have no internal priority.
// SERVICETYPE_BESTEFFORT
// SERVICETYPE_NONCONFORMING
// SERVICETYPE_QUALITATIVE.
//
// SERVICETYPE_BESTEFFORT is treated as SERVICETYPE_QUALITATIVE in the sequencer, so the no of priority
// groups is 1 less than the no. of servicetypes.
#define RELATIVE_PRIORITIES 8
#define PRIORITY_GROUPS (NUM_TC_SERVICETYPES - 1)
#define INTERNAL_PRIORITIES (((PRIORITY_GROUPS - 2) * RELATIVE_PRIORITIES) + 2)
#define DEFAULT_PRIORITY_OFFSET 3
#define DEFAULT_MIN_QUANTUM 1500
#define PRIORITY_GROUP_NON_CONFORMING 0
#define PRIORITY_GROUP_BEST_EFFORT 1
#define PRIORITY_GROUP_CONTROLLED_LOAD 2
#define PRIORITY_GROUP_GUARANTEED 3
#define PRIORITY_GROUP_NETWORK_CONTROL 4
//
// For maintaining stats
//
#define SEQUENCER_AVERAGING_ARRAY_SIZE 256
#define NETCARD_AVERAGING_ARRAY_SIZE 256
#define SEQUENCER_FLOW_AVERAGING_ARRAY_SIZE 256
// The DRR Sequencer's pipe information
typedef struct _DSEQ_PIPE {
// ContextInfo - Generic context info
// Lock - Protects pipe and flow data
// Flags - See below
// Flows - List of all installed flows
// ActiveFlows - Lists of flows that are waiting to send packets
// PriorityLevels - Number of priority offsets for each priority group
// StartPriority - Lowest internal priority value for each priority group
// ActiveFlowCount - Number of active flows for each service type
// MaxOutstandingSends - Maximum number of outstanding sends
// OutstandingSends - Number of outstanding sends
// PacketsInNetcardAveragingArray
// PacketsInSequencer - Current number packets in sequencer
// PacketsInSequencerAveragingArray
// Bandwidth - Link speed
// MinimumQuantum - Minimum quantum size for DRR
// MinimumRate - Smallest rate currently assigned to a flow
// TimerResolution - Timer resolution in OS time units
// PsFlags - Flags from pipe parameters
// PsPipeContext - PS's pipe context value
PS_PIPE_CONTEXT ContextInfo;
#ifdef INSTRUMENT
PS_DRRSEQ_STATS Stats;
PRUNNING_AVERAGE PacketsInNetcardAveragingArray;
ULONG PacketsInSequencer;
PRUNNING_AVERAGE PacketsInSequencerAveragingArray;
#endif
NDIS_SPIN_LOCK Lock;
ULONG Flags;
LIST_ENTRY Flows;
LIST_ENTRY ActiveFlows[INTERNAL_PRIORITIES];
ULONG PriorityLevels[PRIORITY_GROUPS];
ULONG StartPriority[PRIORITY_GROUPS];
ULONG ActiveFlowCount[PRIORITY_GROUPS];
ULONG TotalActiveFlows;
ULONG MaxOutstandingSends;
ULONG OutstandingSends;
ULONG Bandwidth;
ULONG MinimumQuantum;
ULONG MinimumRate;
ULONG TimerResolution;
ULONG PsFlags;
HANDLE PsPipeContext;
PPS_PROCS PsProcs;
PSU_SEND_COMPLETE PreviousUpcallsSendComplete;
PPS_PIPE_CONTEXT PreviousUpcallsSendCompletePipeContext;
} DSEQ_PIPE, *PDSEQ_PIPE;
// Pipe flag values
#define DSEQ_DEQUEUE 1
#define DSEQ_PASSTHRU 2
typedef enum _FLOW_STATE {
DRRSEQ_FLOW_CREATED = 1,
DRRSEQ_FLOW_DELETED
} FLOW_STATE;
// The DRR Sequencer's flow information
typedef struct _DSEQ_FLOW {
// ContextInfo - Generic context info
// ActiveLinks - Links in active flow list
// Links - Links in installed flow list
// PacketQueue - Self-explanatory
// PacketSendTime - Send time for current packet
// LastConformanceTime - Absolute conformance time of last packet
// TokenRate - TokenRate from GQOS
// UserPriority - Priority offset assigned by user
// Priority - Internal priority
// PriorityGroup - Priority group for flow
// Quantum - Quantum assigned to flow for DRR
// DeficitCounter - Current value of DRR deficit counter
// Flags - See below
// PsFlowContext - PS's flow context value
// BucketSize - TokenBucketSize from GQOS
// NumPacketsInSeq - Number of packets from this flow in the sequencer
// PacketsInSeqAveragingArray-Data for computing average packets in seq from this flow
PS_FLOW_CONTEXT ContextInfo;
LIST_ENTRY ActiveLinks;
LIST_ENTRY Links;
LIST_ENTRY PacketQueue;
LARGE_INTEGER PacketSendTime;
LARGE_INTEGER LastConformanceTime;
ULONG TokenRate;
ULONG UserPriority;
ULONG Priority;
ULONG PriorityGroup;
ULONG Quantum;
ULONG DeficitCounter;
ULONG Flags;
HANDLE PsFlowContext;
ULONG BucketSize;
#ifdef INSTRUMENT
ULONG PacketsInSequencer;
PS_DRRSEQ_STATS Stats;
PRUNNING_AVERAGE PacketsInSeqAveragingArray;
#endif
FLOW_STATE State;
} DSEQ_FLOW, *PDSEQ_FLOW;
#define MAX_DEQUEUED_PACKETS 8
#define FLOW_USER_PRIORITY 0x00000002
// The following macro checks a packet for conformance based on the flow's
// LastPacketTime, the current time, and the timer resolution.
#define PacketIsConforming(_flow, _curtime, _r) \
( (_flow)->PacketSendTime.QuadPart <= ((_curtime).QuadPart + (_r)) )
#define AdjustLastPacketTime(_flow, _curtime, _r) \
if ((_curtime).QuadPart > ((_flow)->PacketSendTime.QuadPart + (_r))) \
if ((_curtime).QuadPart > ((_flow)->LastConformanceTime.QuadPart - (_r))) \
(_flow)->PacketSendTime = (_flow)->LastConformanceTime; \
else \
(_flow)->PacketSendTime = (_curtime);
// The Shaper's pipe information
typedef struct _TS_PIPE {
// ContextInfo - Generic context info
// Lock - Protects pipe data
// ActiveFlows - List of flows that are waiting to send packets
// Timer - Timer struct
// TimerStatus - Status of timer
// TimerResolution - Timer resolution in OS time units
// PsPipeContext - PS's pipe context value
// DropPacket - PS's drop packet routine
// ControlledLoadMode - Default mode for non-conforming traffic from
// controlled load flows
// GuaranteedMode - Default mode for non-conforming traffic from
// guaranteed service flows
// IntermediateSystem - TRUE if "IS" mode should be used for implementing discard semantics
// Stats - Per Pipe stats.
// PacketsInShaperAveragingArray
PS_PIPE_CONTEXT ContextInfo;
#ifdef INSTRUMENT
PS_SHAPER_STATS Stats;
PRUNNING_AVERAGE PacketsInShaperAveragingArray;
ULONG PacketsInShaper;
#endif
NDIS_SPIN_LOCK Lock;
LIST_ENTRY ActiveFlows;
NDIS_MINIPORT_TIMER Timer;
ULONG TimerStatus;
ULONG TimerResolution;
HANDLE PsPipeContext;
PPS_PROCS PsProcs;
ULONG ControlledLoadMode;
ULONG GuaranteedMode;
ULONG NetworkControlMode;
ULONG Qualitative;
ULONG IntermediateSystem;
} TS_PIPE, *PTS_PIPE;
#define TIMER_UNINITIALIZED 0
#define TIMER_INACTIVE 1
#define TIMER_SET 2
#define TIMER_PROC_EXECUTING 3
// The Shaper's flow information
typedef struct _TS_FLOW {
// ContextInfo - Generic context info
// Flags - See below
// Links - Links in active flow list
// Mode - Shape/Discard mode
// Shape - Indicates whether to shape traffic
// PacketQueue - Self-explanatory
// FlowEligibilityTime - Absolute conformance time of 1st packet in queue
// PsFlowContext - PS's flow context value
// Stats - Per flow stats.
// PacketsInShaperAveragingArray - Per flow averaging data
// State - State of the flow
PS_FLOW_CONTEXT ContextInfo;
ULONG Flags;
LIST_ENTRY Links;
ULONG Mode;
ULONG Shape;
LIST_ENTRY PacketQueue;
LARGE_INTEGER FlowEligibilityTime;
HANDLE PsFlowContext;
#ifdef QUEUE_LIMIT
ULONG QueueSize;
ULONG QueueSizeLimit;
ULONG DropOverLimitPacketsFromHead;
ULONG UseDefaultQueueLimit;
#endif // QUEUE_LIMIT
#ifdef INSTRUMENT
ULONG PacketsInShaper;
PS_SHAPER_STATS Stats;
PRUNNING_AVERAGE PacketsInShaperAveragingArray;
#endif
FLOW_STATE State;
} TS_FLOW, *PTS_FLOW;
typedef struct _TBC_PIPE {
// ContextInfo - Generic context info
// MaxPacket - Maximum packet size for pipe
// PsPipeContext - PS's pipe context value
// DropPacket - PS's drop packet routine
// HeaderLength - Length of MAC header for this pipe
// ControlledLoadMode - Default mode for non-conforming traffic from
// controlled load flows
// GuaranteedMode - Default mode for non-conforming traffic from
// guaranteed service flows
// IntermediateSystem - TRUE if "IS" mode should be used for implementing discard semantics
// Stats - Per Pipe stats.
PS_PIPE_CONTEXT ContextInfo;
#ifdef INSTRUMENT
PS_CONFORMER_STATS Stats;
#endif // INSTRUMENT
ULONG MaxPacket;
HANDLE PsPipeContext;
ULONG TimerResolution;
PPS_PROCS PsProcs;
ULONG HeaderLength;
ULONG ControlledLoadMode;
ULONG GuaranteedMode;
ULONG NetworkControlMode;
ULONG Qualitative;
ULONG IntermediateSystem;
} TBC_PIPE, *PTBC_PIPE;
// The conformer's flow information
typedef struct _TBC_FLOW {
// ContextInfo - Generic context info
// Lock - Protects flow data
// TokenRate - TokenRate from generic QoS
// Capacity - TokenBucketSize from generic QoS
// PeakRate - PeakBandwidth from generic QoS
// MinPolicedUnit - MinimumPolicedUnit from generic QoS
// Mode - Flow S/D mode
// NoConformance - Indicates whether flow is exempt from conformance algorithm
// LastConformanceTime - Absolute tb conformance time of last non-discarded packet
// LastPeakTime - Absolute peak conformance time of last non-discarded packet
// PeakConformanceTime - Earliest time next packet can be sent, based on peak rate
// LastConformanceCredits - Number of credits at LastConformanceTime
// PsFlowContext - PS's flow context value
// Stats - Per flow stats.
PS_FLOW_CONTEXT ContextInfo;
NDIS_SPIN_LOCK Lock;
ULONG TokenRate;
ULONG Capacity;
ULONG PeakRate;
ULONG MinPolicedUnit;
ULONG Mode;
ULONG NoConformance;
LARGE_INTEGER LastConformanceTime;
LARGE_INTEGER LastPeakTime;
LARGE_INTEGER PeakConformanceTime;
ULONG LastConformanceCredits;
HANDLE PsFlowContext;
#ifdef INSTRUMENT
PS_CONFORMER_STATS Stats;
#endif // INSTRUMENT
} TBC_FLOW, *PTBC_FLOW;
#endif