NEW
  AUTO 3,1
				.LIST OFF	
*--------------------------------------
ICMP.IN			ldy #S.ICMP.TYPE
				lda (ZPFrameInPtr),y
				cmp #S.ICMP.TYPE.ECHOREP
				beq ICMP.IN.ECHOREP
				cmp #S.ICMP.TYPE.ECHOREQ
				bne ICMP.IN.EXIT
*--------------------------------------
ICMP.IN.ECHOREQ	ldy #S.IP.DST+3
				ldx #3
.1				lda (ZPFrameInPtr),y
				cmp IPCFG+S.IPCFG.IP,x
				bne ICMP.IN.EXIT
				dey
				dex
				bne .1
				ldy #S.ICMP.TYPE
				lda #S.ICMP.TYPE.ECHOREP
				sta (ZPFrameInPtr),y

				jsr ARP.AddFromFrameInPtr
				lda hFrameIn
*				stz hFrameIn				DO NOT DISCARD this frame,it is SOURCE frame!!!
				sta	hFrameOut
				>LDYA ZPFrameInPtr
				>STYA ZPFrameOutPtr

				ldx #3 
				ldy #S.IP.DST+3
.3				lda ARP.TmpCache+S.ARPCACHE.IP,x
				sta (ZPFrameOutPtr),y			
				dey
				dex
				bpl .3
				clc						Queue if fail
				jmp FRM.SendIP

ICMP.IN.EXIT	jmp FRM.DiscardIn
*--------------------------------------
ICMP.IN.ECHOREP	jsr FRM.GetTargetSKT.RAW

				ldy #S.ICMP.IDENTIFIER
				lda (ZPFrameInPtr),y
				sta SKT.REM.ADDR+S.SOCKADDR.PORT+1
				iny
				lda (ZPFrameInPtr),y
				sta SKT.REM.ADDR+S.SOCKADDR.PORT

				jsr SKT.FindMatchingLocRem
				bcs ICMP.IN.EXIT

				ldy #S.SOCKET.PROTO
				lda (ZPPtrSKT),y
				cmp #S.IP.PROTOCOL.ICMP
				bne ICMP.IN.EXIT

				lda hFrameIn
				jsr SKT.AddToQueueA
				bcs ICMP.IN.EXIT		Q full, discard...
				rts
*--------------------------------------
MAN
SAVE USR/SRC/LIB/LIBTCPIP.S.ICMP
LOAD USR/SRC/LIB/LIBTCPIP.S
ASM
