345 lines
12 KiB
C
345 lines
12 KiB
C
/*++
|
|
|
|
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
|