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.
136 lines
3.6 KiB
136 lines
3.6 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// File:
|
|
|
|
//
|
|
|
|
// Module: MS SNMP Provider
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//***************************************************************************
|
|
|
|
/*-----------------------------------------------------------------
|
|
Filename: address.hpp
|
|
|
|
Written By: B.Rajeev
|
|
|
|
Purpose: Provides a flow control mechanism for the SnmpImpSession.
|
|
-----------------------------------------------------------------*/
|
|
|
|
#ifndef __FLOW_CONTROL__
|
|
#define __FLOW_CONTROL__
|
|
|
|
|
|
#include "forward.h"
|
|
#include "common.h"
|
|
|
|
/*--------------------------------------------------
|
|
Overview:
|
|
--------
|
|
|
|
MessageStore: Provides queue like access to a store of messages.
|
|
In addition to the Enqueue, Dequeue primites, it also enables
|
|
deletion of specified messages from the queue.
|
|
|
|
|
|
FlowControlMechanism: It encapsulates the flow control
|
|
mechanism for the session. Once the window is full, incoming
|
|
messages are buffered. A reply triggers off further message
|
|
transmission until the window is full. If we give up on a
|
|
message after retrying a specified number of times, the flow
|
|
control mechanism must be informed of it. It signals FlowControl
|
|
On/Off (through callback methods), when the window limits are reached
|
|
--------------------------------------------------*/
|
|
|
|
// a CList is used to implement the message store
|
|
typedef CList<Message *, Message *> CListStore;
|
|
|
|
class MessageStore : private CListStore
|
|
{
|
|
#ifdef WANT_MFC
|
|
DECLARE_DYNAMIC(MessageStore);
|
|
#endif
|
|
|
|
public:
|
|
|
|
// Add to the end of the queue.
|
|
void Enqueue( Message &new_message );
|
|
|
|
// Remove and return the first element in the Store
|
|
Message* Dequeue(void);
|
|
|
|
// checks if the queue is empty
|
|
BOOL IsEmpty(void)
|
|
{
|
|
return CListStore::IsEmpty();
|
|
}
|
|
|
|
// remove the message possessing the session_frame_id and return it
|
|
Message *DeleteMessage(SessionFrameId session_frame_id);
|
|
|
|
~MessageStore(void);
|
|
};
|
|
|
|
class FlowControlMechanism
|
|
{
|
|
|
|
// the session providing the context for flow control
|
|
SnmpImpSession *session;
|
|
|
|
UINT outstanding_messages;
|
|
|
|
// this value is specified by the session on creation
|
|
UINT window_size;
|
|
|
|
// provides queue like access to a store of messages
|
|
MessageStore message_store;
|
|
|
|
// obtains lock on the session CriticalSection before
|
|
// calling TransmitMessage
|
|
void TransmitMessageUnderProtection(Message *message);
|
|
|
|
// creates a waiting message, registers it with the message
|
|
// registry and lets it transmit
|
|
void TransmitMessage(Message *message);
|
|
|
|
// transmits messages in message store as long as
|
|
// the window is open
|
|
void ClearMessageStore(void);
|
|
|
|
public:
|
|
|
|
// initializes the private variable
|
|
FlowControlMechanism(SnmpImpSession &session, UINT window_size);
|
|
|
|
|
|
// sends message if within the flow control window
|
|
// else Stores it up
|
|
void SendMessage(Message &message);
|
|
|
|
// It removes the message frame from its message_Store
|
|
void DeleteMessage(SessionFrameId session_frame_id);
|
|
|
|
// this is called by a waiting_message indicating arrival
|
|
// or by the message registry
|
|
void NotifyReceipt(WaitingMessage &waiting_message,
|
|
IN const SnmpPdu *snmp_pdu,
|
|
SnmpErrorReport &error_report);
|
|
|
|
// this is called when the session does not need
|
|
// to be informed, but the flow control window
|
|
// must advance (such as frame cancellation)
|
|
// also destroys the waiting_message
|
|
void AdvanceWindow(WaitingMessage &waiting_message);
|
|
};
|
|
|
|
|
|
#endif // __FLOW_CONTROL__
|