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.
186 lines
5.4 KiB
186 lines
5.4 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// File:
|
|
|
|
//
|
|
|
|
// Module: MS SNMP Provider
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//***************************************************************************
|
|
|
|
/*--------------------------------------------------
|
|
Filename: message.hpp
|
|
Author: B.Rajeev
|
|
Purpose: Provides declarations for the Message and
|
|
WaitingMessage classes.
|
|
--------------------------------------------------*/
|
|
|
|
|
|
#ifndef __MESSAGE__
|
|
#define __MESSAGE__
|
|
|
|
#include "forward.h"
|
|
#include "common.h"
|
|
#include "error.h"
|
|
#include "reg.h"
|
|
#include "timer.h"
|
|
|
|
|
|
/*--------------------------------------------------
|
|
Overview:
|
|
|
|
Message: Stores the parameters passed to the session with
|
|
a call to the SendFrame method. A message may either be
|
|
transmitted immediately or enqueued in the FlowControlMechanism
|
|
queue for future transmission. After transmission, the message
|
|
becomes a part of a WaitingMessage.
|
|
|
|
WaitingMessage: Encapsulates the state maintained for each outstanding
|
|
reply. This includes its timer_event_id, retransmission
|
|
information (Message ptr) etc.
|
|
|
|
Note - A Message/WaitingMessage may be cancelled at any time
|
|
--------------------------------------------------*/
|
|
|
|
class Message
|
|
{
|
|
SessionFrameId session_frame_id;
|
|
SnmpPdu *snmp_pdu;
|
|
SnmpOperation &operation;
|
|
|
|
public:
|
|
|
|
Message(IN const SessionFrameId session_frame_id,
|
|
IN SnmpPdu &snmp_pdu,
|
|
IN SnmpOperation &snmp_operation);
|
|
|
|
SessionFrameId GetSessionFrameId(void) const;
|
|
|
|
SnmpOperation &GetOperation(void) const;
|
|
|
|
void SetSnmpPdu(IN SnmpPdu &snmp_pdu);
|
|
|
|
SnmpPdu &GetSnmpPdu(void) const;
|
|
|
|
~Message(void);
|
|
};
|
|
|
|
|
|
// instances store the list of request ids used for a waiting message
|
|
typedef CList<RequestId, RequestId> RequestIdList;
|
|
|
|
// encapsulates state for a message that is transmitted and
|
|
// subsequently waits for a reply. It uses the timer to rexmt
|
|
// the message and if the reply isn't forthcoming, informs the
|
|
// flow control mechanism that no reply has been received. When
|
|
// a reply is received it informs the fc mech. of the event
|
|
// Each transmission of the waiting message uses a different request id
|
|
|
|
class WaitingMessage
|
|
{
|
|
// it operates in the session's context
|
|
SnmpImpSession *session;
|
|
Message *message;
|
|
SnmpPdu *reply_snmp_pdu;
|
|
TransportFrameId last_transport_frame_id;
|
|
TimerEventId m_TimerEventId ;
|
|
|
|
// stores the list of request ids used for the waiting message
|
|
// (inclusive of the original transmission)
|
|
RequestIdList request_id_list;
|
|
|
|
UINT max_rexns;
|
|
UINT rexns_left;
|
|
UINT strobes;
|
|
|
|
BOOL sent_message_processed;
|
|
BOOL active;
|
|
|
|
// deregisters the waiting message from the message registry
|
|
// for each request id stored in the RequestIdList
|
|
void DeregisterRequestIds();
|
|
|
|
public:
|
|
|
|
// initializes the private variables. in future,
|
|
// max_rexns and timeout_period might be obtained this way
|
|
// rather than from the session
|
|
WaitingMessage(IN SnmpImpSession &session, IN Message &message);
|
|
|
|
// returns the private message
|
|
Message *GetMessage(void)
|
|
{
|
|
return message;
|
|
}
|
|
|
|
TimerEventId GetTimerEventId () ;
|
|
|
|
void SetTimerEventId ( TimerEventId a_TimerEventId ) ;
|
|
|
|
// sends the message. involves request_id generation,
|
|
// registering with the message_registry, decoding the
|
|
// message, updating the pdu and registering a timer event
|
|
void Transmit();
|
|
|
|
// used by the timer to notify the waiting message of
|
|
// a timer event. if need, the message is retransmitted.
|
|
// when all rexns are exhausted, ReceiveReply is called
|
|
void TimerNotification(void);
|
|
|
|
// A call to this function signifies that state corresponding to the
|
|
// waiting_message need not be kept any further
|
|
// it notifies the flow control mechanism of the termination
|
|
// which destroys the waiting_message
|
|
void ReceiveReply(IN const SnmpPdu *snmp_pdu,
|
|
IN SnmpErrorReport &snmp_error_report = SnmpErrorReport(Snmp_Success, Snmp_No_Error));
|
|
|
|
// The WinSnmp implementation, posts an event when a message is received,
|
|
// however, when a call is made to the library to receive a message,
|
|
// it hands them out in no specific order. Therefore, responses may
|
|
// be received before their corresponding SENT_FRAME event is processed.
|
|
// The following methods are concerned with buffering and
|
|
// retrieving such snmp pdus.
|
|
|
|
// buffers the snmp pdu received as a reply
|
|
void BufferReply(IN const SnmpPdu &reply_snmp_pdu);
|
|
|
|
// returns TRUE if a reply has been buffered
|
|
BOOL ReplyBuffered();
|
|
|
|
// returns a ptr to the buffered reply pdu, if buffered
|
|
// otherwise a null ptr is returned
|
|
// IMPORTANT: it sets the reply_snmp_pdu to NULL, so that it may
|
|
// not be deleted when the waiting message is destroyed
|
|
SnmpPdu *GetBufferedReply();
|
|
|
|
// informs the waiting message that a sent message has been
|
|
// processed
|
|
void SetSentMessageProcessed();
|
|
|
|
// if a sent message has been processed, it returns TRUE, else FALSE
|
|
BOOL GetSentMessageProcessed();
|
|
|
|
// an exit fn - prepares an error report and calls
|
|
// ReceiveReply to signal a non-receipt
|
|
void WrapUp( IN SnmpErrorReport &error_report =
|
|
SnmpErrorReport(Snmp_Error, Snmp_Local_Error) );
|
|
|
|
void SelfDestruct(void);
|
|
|
|
// if required, it cancels registration with the message_registry and
|
|
// the timer event with the timer, deletes message ptr
|
|
~WaitingMessage(void);
|
|
};
|
|
|
|
|
|
#endif // __MESSAGE__
|