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.
 
 
 
 
 
 

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;
}