144 lines
2.4 KiB
C
144 lines
2.4 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
aep.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the echo protocol support code.
|
||
|
||
Author:
|
||
|
||
Jameel Hyder (jameelh@microsoft.com)
|
||
Nikhil Kamkolkar (nikhilk@microsoft.com)
|
||
|
||
Revision History:
|
||
19 Jun 1992 Initial Version
|
||
|
||
Notes: Tab stop: 4
|
||
--*/
|
||
|
||
#define FILENUM AEP
|
||
#include <atalk.h>
|
||
#pragma hdrstop
|
||
|
||
|
||
VOID
|
||
AtalkAepPacketIn(
|
||
IN PPORT_DESCRIPTOR pPortDesc,
|
||
IN PDDP_ADDROBJ pDdpAddr,
|
||
IN PBYTE pPkt,
|
||
IN USHORT PktLen,
|
||
IN PATALK_ADDR pSrcAddr,
|
||
IN PATALK_ADDR pDestAddr,
|
||
IN ATALK_ERROR ErrorCode,
|
||
IN BYTE DdpType,
|
||
IN PVOID pHandlerCtx,
|
||
IN BOOLEAN OptimizedPath,
|
||
IN PVOID OptimizeCtx
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
|
||
Arguments:
|
||
|
||
|
||
Return Value:
|
||
|
||
|
||
--*/
|
||
{
|
||
PBUFFER_DESC pBufDesc;
|
||
SEND_COMPL_INFO SendInfo;
|
||
|
||
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
|
||
|
||
// Turn around and send the packet back to the destination address.
|
||
if (ATALK_SUCCESS(ErrorCode))
|
||
{
|
||
if ((DdpType == DDPPROTO_EP) &&
|
||
(PktLen > 0))
|
||
{
|
||
if (*pPkt == EP_COMMAND_REQUEST)
|
||
{
|
||
// This is an echo request, we have some data that needs
|
||
// to be echoed back! Do it.
|
||
pBufDesc = AtalkAllocBuffDesc(
|
||
NULL,
|
||
PktLen,
|
||
(BD_CHAR_BUFFER | BD_FREE_BUFFER));
|
||
|
||
if (pBufDesc)
|
||
{
|
||
// Change command to be Reply
|
||
*pPkt = EP_COMMAND_REPLY;
|
||
|
||
// This *does not* set the PktLen in pBufDesc. Set it.
|
||
AtalkCopyBufferToBuffDesc(
|
||
pPkt,
|
||
PktLen,
|
||
pBufDesc,
|
||
0);
|
||
|
||
AtalkSetSizeOfBuffDescData(pBufDesc, PktLen);
|
||
|
||
// Call AtalkDdpSend.
|
||
SendInfo.sc_TransmitCompletion = atalkAepSendComplete;
|
||
SendInfo.sc_Ctx1 = pBufDesc;
|
||
// SendInfo.sc_Ctx2 = NULL;
|
||
// SendInfo.sc_Ctx3 = NULL;
|
||
if (!ATALK_SUCCESS(AtalkDdpSend(pDdpAddr,
|
||
pSrcAddr,
|
||
(BYTE)DDPPROTO_EP,
|
||
FALSE,
|
||
pBufDesc,
|
||
NULL,
|
||
0,
|
||
NULL,
|
||
&SendInfo)))
|
||
{
|
||
AtalkFreeBuffDesc(pBufDesc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DBGPRINT(DBG_COMP_AEP, DBG_LEVEL_ERR,
|
||
("AtalkAepPacketIn: Ignoring incoming packet AepPacketIn %lx\n",
|
||
ErrorCode));
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
VOID FASTCALL
|
||
atalkAepSendComplete(
|
||
IN NDIS_STATUS Status,
|
||
IN PSEND_COMPL_INFO pSendInfo
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
|
||
Arguments:
|
||
|
||
|
||
Return Value:
|
||
|
||
|
||
--*/
|
||
{
|
||
AtalkFreeBuffDesc((PBUFFER_DESC)(pSendInfo->sc_Ctx1));
|
||
}
|
||
|
||
|