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.
190 lines
4.4 KiB
190 lines
4.4 KiB
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
/*---------------------------------------------------------
|
|
Filename: transp.cpp
|
|
Written By: B.Rajeev
|
|
----------------------------------------------------------*/
|
|
|
|
#include "precomp.h"
|
|
#include "common.h"
|
|
#include "sync.h"
|
|
#include "address.h"
|
|
#include "tsess.h"
|
|
#include "tsent.h"
|
|
#include "idmap.h"
|
|
|
|
#include "dummy.h"
|
|
#include "flow.h"
|
|
#include "frame.h"
|
|
#include "timer.h"
|
|
#include "message.h"
|
|
#include "ssent.h"
|
|
#include "opreg.h"
|
|
|
|
#include "session.h"
|
|
#include "transp.h"
|
|
|
|
/*------------------------------------------------------------
|
|
Purpose: The SnmpTransport class provides the implementation
|
|
of the transport protocol layer for use by the SnmpSession class.
|
|
The SnmpImpTransport provides a UDP implementation of the
|
|
transport layer.
|
|
-------------------------------------------------------------*/
|
|
|
|
TransportFrameId SnmpImpTransport::next_transport_frame_id = ILLEGAL_TRANSPORT_FRAME_ID ;
|
|
|
|
SnmpTransport::SnmpTransport (
|
|
|
|
IN SnmpSession &session,
|
|
IN const SnmpTransportAddress &transportAddress
|
|
|
|
) :transport_address(transportAddress.Copy())
|
|
{
|
|
}
|
|
|
|
SnmpTransportAddress &SnmpTransport::GetTransportAddress()
|
|
{
|
|
return *transport_address;
|
|
}
|
|
|
|
SnmpTransport::~SnmpTransport()
|
|
{
|
|
delete transport_address;
|
|
}
|
|
|
|
SnmpImpTransport::SnmpImpTransport (
|
|
|
|
IN SnmpSession &session,
|
|
IN const SnmpTransportAddress &address
|
|
|
|
) : SnmpTransport(session, address),
|
|
session(session)
|
|
{
|
|
is_valid = FALSE;
|
|
transport_created = FALSE;
|
|
|
|
if ( !GetTransportAddress()() )
|
|
return;
|
|
|
|
try {
|
|
|
|
transport = new TransportWindow(*this);
|
|
}
|
|
catch ( Heap_Exception e_He )
|
|
{
|
|
return ;
|
|
}
|
|
catch ( GeneralException exception )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
transport_created = TRUE;
|
|
|
|
if ( !(*transport)() )
|
|
return;
|
|
|
|
is_valid = TRUE;
|
|
}
|
|
|
|
|
|
SnmpImpTransport::~SnmpImpTransport(void)
|
|
{
|
|
if ( transport_created )
|
|
delete transport;
|
|
}
|
|
|
|
|
|
void SnmpImpTransport::TransportSendFrame(
|
|
|
|
OUT TransportFrameId &transport_frame_id,
|
|
IN SnmpPdu &snmpPdu
|
|
)
|
|
{
|
|
if ( next_transport_frame_id == ILLEGAL_TRANSPORT_FRAME_ID )
|
|
next_transport_frame_id++;
|
|
|
|
store.Register(transport_frame_id, SnmpErrorReport(Snmp_Success, Snmp_No_Error) );
|
|
|
|
transport->PostMessage(Window :: g_SentFrameEvent,
|
|
transport_frame_id, 0);
|
|
|
|
|
|
DebugMacro4(
|
|
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
|
|
__FILE__,__LINE__,
|
|
L"posted: transport_frame_id = %d\n", transport_frame_id
|
|
) ;
|
|
)
|
|
|
|
try
|
|
{
|
|
if ( transport->SendPdu(snmpPdu) == FALSE )
|
|
store.Modify(transport_frame_id, SnmpErrorReport(Snmp_Error, Snmp_Local_Error));
|
|
}
|
|
catch ( Heap_Exception e_He )
|
|
{
|
|
store.Modify(transport_frame_id, SnmpErrorReport(Snmp_Error, Snmp_Local_Error));
|
|
}
|
|
catch ( GeneralException exception )
|
|
{
|
|
store.Modify(transport_frame_id, SnmpErrorReport(Snmp_Error, Snmp_Local_Error));
|
|
}
|
|
}
|
|
|
|
void SnmpImpTransport::HandleSentFrame(IN TransportFrameId transport_frame_id)
|
|
{
|
|
TransportSentFrame(transport_frame_id, store.Remove(transport_frame_id));
|
|
}
|
|
|
|
void SnmpImpTransport::TransportSentFrame(IN TransportFrameId transport_frame_id,
|
|
IN SnmpErrorReport &errorReport)
|
|
{
|
|
session.SessionSentFrame(transport_frame_id, errorReport);
|
|
}
|
|
|
|
void SnmpImpTransport::TransportReceiveFrame (
|
|
|
|
IN SnmpPdu &snmpPdu ,
|
|
IN SnmpErrorReport &errorReport
|
|
)
|
|
{
|
|
session.SessionReceiveFrame(snmpPdu, errorReport);
|
|
}
|
|
|
|
SnmpUdpIpTransport :: SnmpUdpIpTransport (
|
|
|
|
IN SnmpSession &session,
|
|
IN const SnmpTransportIpAddress &ipAddress
|
|
|
|
) : SnmpImpTransport ( session , ipAddress )
|
|
{
|
|
}
|
|
|
|
void * SnmpUdpIpImp::operator()(void) const
|
|
{
|
|
if ( ( SnmpTransportIpAddress::operator()() == NULL ) ||
|
|
( SnmpImpTransport::operator()() == NULL ) )
|
|
return NULL;
|
|
else
|
|
return (void *)this;
|
|
}
|
|
|
|
SnmpIpxTransport :: SnmpIpxTransport (
|
|
|
|
IN SnmpSession &session,
|
|
IN const SnmpTransportIpxAddress &ipxAddress
|
|
|
|
) : SnmpImpTransport ( session , ipxAddress )
|
|
{
|
|
}
|
|
|
|
void * SnmpIpxImp::operator()(void) const
|
|
{
|
|
if ( ( SnmpTransportIpxAddress::operator()() == NULL ) ||
|
|
( SnmpImpTransport::operator()() == NULL ) )
|
|
return NULL;
|
|
else
|
|
return (void *)this;
|
|
}
|