207 lines
4.8 KiB
C
207 lines
4.8 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
|