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));
|
|||
|
}
|
|||
|
|
|||
|
|