windows-nt/Source/XPSP1/NT/net/rras/ndis/asyncmac/write.c

195 lines
3.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
_write.c
Abstract:
This is the main file for the AsyncMAC Driver for the Remote Access
Service. This driver conforms to the NDIS 3.0 interface.
Author:
Thomas J. Dimitri (TommyD) 08-May-1992
Environment:
Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
Revision History:
Ray Patch (raypa) 04/13/94 Modified for new WAN wrapper.
--*/
#define RAISEIRQL
#include "asyncall.h"
#if DBG
ULONG UlFramesOut = 0;
#endif
// asyncmac.c will define the global parameters.
ULONG GlobalXmitCameBack = 0;
ULONG GlobalXmitCameBack2 = 0;
ULONG GlobalXmitCameBack3 = 0;
//
// The assemble frame routine is specific for RAS 1.0 and 2.0
// frame formats. It uses a 16 byte CRC at the end.
//
VOID
AsyncFrameRASXonXoff(
PUCHAR pStartOfFrame,
postamble *pPostamble,
PASYNC_FRAME pFrame,
UCHAR controlCastByte);
VOID
AsyncFrameRASNormal(
PUCHAR pStartOfFrame,
postamble *pPostamble,
PASYNC_FRAME pFrame,
UCHAR controlCastByte);
NTSTATUS
AsyncWriteCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject, //... Our device object.
IN PIRP Irp, //... I/O request packet.
IN PNDIS_WAN_PACKET WanPacket //... Completion context.
)
/*++
This is the IO Completion routine for WriteFrame.
It is called when an I/O Write request has completed.
--*/
{
NTSTATUS Status;
NTSTATUS PacketStatus;
PASYNC_INFO AsyncInfo;
//
// Make the compiler happy.
//
UNREFERENCED_PARAMETER(DeviceObject);
//
// Initialize locals.
//
AsyncInfo = WanPacket->MacReserved1;
PacketStatus = NDIS_STATUS_FAILURE;
Status = Irp->IoStatus.Status;
//
// Free the irp used to send the packt to the serial driver
//
IoFreeIrp(Irp);
//
// What was the outcome of the IRP.
//
switch ( Status ) {
case STATUS_SUCCESS:
PacketStatus = NDIS_STATUS_SUCCESS;
break;
case STATUS_TIMEOUT:
DbgTracef(-2,("ASYNC: Status TIMEOUT on write\n"));
break;
case STATUS_CANCELLED:
DbgTracef(-2,("ASYNC: Status CANCELLED on write\n"));
break;
case STATUS_PENDING:
DbgTracef(0,("ASYNC: Status PENDING on write\n"));
break;
default:
DbgTracef(-2,("ASYNC: Unknown status 0x%.8x on write", Status));
break;
}
//
// Count this packet completion.
//
AsyncInfo->Out++;
//
// Tell the Wrapper that we have finally the packet has been sent
//
NdisMWanSendComplete(
AsyncInfo->Adapter->MiniportHandle,
WanPacket,
PacketStatus);
//
// We return STATUS_MORE_PROCESSING_REQUIRED so that the
// IoCompletionRoutine will stop working on the IRP.
//
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS
AsyncGetFrameFromPool(
IN PASYNC_INFO Info,
OUT PASYNC_FRAME *NewFrame )
/*++
--*/
{
PASYNC_ADAPTER Adapter=Info->Adapter;
PASYNC_FRAME pFrame;
pFrame = (ASYNC_FRAME*)
ExAllocateFromNPagedLookasideList(&Adapter->AsyncFrameList);
if (pFrame == NULL) {
*NewFrame = NULL;
return NDIS_STATUS_RESOURCES;
}
//
// increase by 16 for frame runover padding when we have to resync
//
pFrame->Frame =
(PUCHAR)pFrame + sizeof(ASYNC_FRAME) + sizeof(PVOID);
(ULONG_PTR)pFrame->Frame &= ~((ULONG_PTR)(sizeof(PVOID)-1));
pFrame->FrameLength = Adapter->MaxFrameSize;
// assign back ptr from frame to adapter
pFrame->Adapter=Adapter;
// setup another back ptr
pFrame->Info=Info;
*NewFrame = pFrame;
return(NDIS_STATUS_SUCCESS);
}