Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

207 lines
4.8 KiB

/*++
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;
}