/*++

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