|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
rxcexmit.c
Abstract:
This module implements the data transmission routines along a connection as well as datagram transmissions
Revision History:
Balan Sethu Raman [SethuR] 15-Feb-1995
Notes:
--*/
#include "precomp.h"
#pragma hdrstop
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RxCeSend)
#pragma alloc_text(PAGE, RxCeSendDatagram)
#endif
//
// The debug trace level
//
#define Dbg (DEBUG_TRACE_RXCEXMIT)
NTSTATUS RxCeSend( IN PRXCE_VC pVc, IN ULONG SendOptions, IN PMDL pMdl, IN ULONG SendLength, IN PVOID pCompletionContext) /*++
Routine Description:
This routine sends a TSDU along the specified connection.
Arguments:
hConnection - the connection on which the TSDU is to be sent
hVc - the virtual circuit Id. along which the TSDU is to be sent
SendOptions - the options for the send operation
pMdl - the buffer to be sent.
SendLength - length of data to be sent
pCompletionContext - the context passed back to the caller during SendCompletion
Return Value:
STATUS_SUCCESS if successfull
Notes:
--*/ { NTSTATUS Status;
PRXCE_TRANSPORT pTransport = NULL; PRXCE_ADDRESS pAddress = NULL; PRXCE_CONNECTION pConnection = NULL;
PAGED_CODE();
// Update profiling info.
RxProfile(RxCeXmit,RxCeSend);
try { Status = STATUS_CONNECTION_DISCONNECTED;
// reference the objects
pConnection = pVc->pConnection; pAddress = pConnection->pAddress; pTransport = pAddress->pTransport;
if (RxCeIsVcValid(pVc) && RxCeIsConnectionValid(pConnection) && RxCeIsAddressValid(pAddress) && RxCeIsTransportValid(pTransport)) {
if (pVc->State == RXCE_VC_ACTIVE) { Status = RxTdiSend( pTransport, pAddress, pConnection, pVc, SendOptions, pMdl, SendLength, pCompletionContext); }
if (!NT_SUCCESS(Status)) { RxDbgTrace(0, Dbg,("RxTdiSend returned %lx\n",Status)); } } } finally { if (AbnormalTermination()) { RxLog(("RxCeSend: T: %lx A: %lx C: %lx VC: %lx\n",pTransport,pAddress,pConnection,pVc)); RxWmiLog(LOG, RxCeSend, LOGPTR(pTransport) LOGPTR(pAddress) LOGPTR(pConnection) LOGPTR(pVc)); Status = STATUS_CONNECTION_DISCONNECTED; } }
return Status; }
NTSTATUS RxCeSendDatagram( IN PRXCE_ADDRESS pAddress, IN PRXCE_CONNECTION_INFORMATION pConnectionInformation, IN ULONG SendOptions, IN PMDL pMdl, IN ULONG SendLength, IN PVOID pCompletionContext) /*++
Routine Description:
This routine sends a TSDU to a specified transport address.
Arguments:
pLocalAddress - the local address
pConnectionInformation - the remote address
SendOptions - the options for the send operation
pMdl - the buffer to be sent.
SendLength - length of data to be sent
pCompletionContext - the context passed back to the caller during Send completion.
Return Value:
STATUS_SUCCESS if successfull
Notes:
--*/ { NTSTATUS Status;
PRXCE_TRANSPORT pTransport = NULL;
PAGED_CODE();
// Update profiling info.
RxProfile(RxCeXmit,RxCeSendDatagram);
try { Status = STATUS_CONNECTION_DISCONNECTED;
pTransport = pAddress->pTransport;
if (RxCeIsAddressValid(pAddress) && RxCeIsTransportValid(pTransport)) { Status = RxTdiSendDatagram( pTransport, pAddress, pConnectionInformation, SendOptions, pMdl, SendLength, pCompletionContext);
if (!NT_SUCCESS(Status)) { RxDbgTrace(0, Dbg,("RxTdiSendDatagram returned %lx\n",Status)); } } } finally { if (AbnormalTermination()) { RxLog(("RxCeSendDg: T: %lx A: %lx\n",pTransport,pAddress)); RxWmiLog(LOG, RxCeSendDatagram, LOGPTR(pTransport) LOGPTR(pAddress)); Status = STATUS_UNEXPECTED_NETWORK_ERROR; } }
return Status; }
|