NEW
  AUTO 3,1
*--------------------------------------
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

				ldx #3

.2				lda ZPFrameInPtr,x
				sta ZPFrameOutPtr,x
				dex
				bpl .2

				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.LOC.ADDR+S.SOCKADDR.PORT+1
				sta SKT.REM.ADDR+S.SOCKADDR.PORT+1
				iny
				lda (ZPFrameInPtr),y
				sta SKT.LOC.ADDR+S.SOCKADDR.PORT
				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
