NEW
  AUTO 3,1
*--------------------------------------
IP.IN			ldy #S.IP.PROTOCOL
				lda (ZPFrameInPtr),y
				cmp #S.IP.PROTOCOL.ICMP
				bne .2

				jmp ICMP.IN

.2				cmp #S.IP.PROTOCOL.UDP
				bne .3

				jsr FRM.GetTargetSKT.TCPUDP

				jsr SKT.FindMatchingLocRem
				bcs .9

				lda hFrameIn
				jsr SKT.AddToQueueA
				bcs .9					Q full, discard...

				rts

.3				cmp #S.IP.PROTOCOL.TCP
				bne .9

				jsr TCP.IN				TCP may NOT discard FrameIn

.9				jmp FRM.DiscardIn
*--------------------------------------
IP.ComputeICMPChecksum
				stz IP.CHECKSUM
				stz IP.CHECKSUM+1

				lda ZPFrameOutLen
				sec
				sbc #S.IP
				eor #$ff
				tax
				lda ZPFrameOutLen+1
				sbc /S.IP
				eor #$ff
				ldy #S.ICMP.CHECKSUM
				clc
				jmp IP.ComputeChecksum
*--------------------------------------
IP.ComputeUDPChecksum
				clc

				ldy #S.UDP.LENGTH+1
				lda (ZPFrameOutPtr),y
				adc #S.IP.PROTOCOL.UDP
				sta IP.CHECKSUM+1

				dey
				lda (ZPFrameOutPtr),y
				adc /S.IP.PROTOCOL.UDP	 	(all zero)
				sta IP.CHECKSUM
				jsr IP.AddSrcDstIPToChecksum

				ldy #S.UDP.LENGTH+1
				lda (ZPFrameOutPtr),y
				eor #$ff
				tax

				dey
				lda (ZPFrameOutPtr),y
				eor #$ff
				ldy #S.UDP.CHECKSUM
				bra IP.ComputeChecksum
*--------------------------------------
IP.ComputeTCPChecksum
				lda ZPFrameOutLen
				sec
				sbc #S.IP
				sta IP.CHECKSUM.TMP
				lda ZPFrameOutLen+1
				sbc /S.IP
				sta IP.CHECKSUM.TMP+1
				clc
*				lda IP.CHECKSUM.TMP+1
*				adc /S.IP.PROTOCOL.TCP	 (all zero)
				sta IP.CHECKSUM

				lda IP.CHECKSUM.TMP
				adc #S.IP.PROTOCOL.TCP
				sta IP.CHECKSUM+1
				jsr IP.AddSrcDstIPToChecksum
				lda IP.CHECKSUM.TMP
				eor #$ff
				tax
				lda IP.CHECKSUM.TMP+1
				eor #$ff
				ldy #S.TCP.CHECKSUM
*--------------------------------------
* X,A = !ByteCount, Y = Offset in Frame
*--------------------------------------
IP.ComputeChecksum
				phy						Save Offset
				pha						Save !ByteCount.HI

				lda #0					Reset Checksum
				sta (ZPFrameOutPtr),y
				iny
				sta (ZPFrameOutPtr),y

				>LDYA ZPFrameOutPtr
				>STYA ZPTmpPtr1

				ldy #S.IP

.1				inx
				bne .11
				pla
				inc
				beq .8
				pha
.11				lda (ZPTmpPtr1),y
				adc IP.CHECKSUM
				sta IP.CHECKSUM

				iny
				bne .20
				inc ZPTmpPtr1+1
.20				inx
				bne .2
				pla
				inc
				beq .7
				pha

.2				lda (ZPTmpPtr1),y

				adc IP.CHECKSUM+1
				sta IP.CHECKSUM+1
				iny
				bne .1
				inc ZPTmpPtr1+1
				bra .1
.7				adc IP.CHECKSUM+1		A=0 from beq .7
				sta IP.CHECKSUM+1
.8				ply
				lda IP.CHECKSUM
				adc #0					Don't forget to add last carry!!!
				eor #$FF
				sta (ZPFrameOutPtr),y
				iny
				lda IP.CHECKSUM+1
				adc #0					Don't forget to add last carry!!!
				eor #$FF
				sta (ZPFrameOutPtr),y
				rts
*--------------------------------------
IP.AddSrcDstIPToChecksum
				ldy #S.IP.SRC
				ldx #4					4 words for SRC & DST IP
.1				lda (ZPFrameOutPtr),y
				adc IP.CHECKSUM
				sta IP.CHECKSUM
				iny
				lda (ZPFrameOutPtr),y
				adc IP.CHECKSUM+1
				sta IP.CHECKSUM+1
				iny
				dex
				bne .1
				rts
*--------------------------------------
IP.SetDestMAC	ldy #S.IP.DST
				lda (ZPFrameOutPtr),y
				iny
.1				and (ZPFrameOutPtr),y
				iny
				cpy #S.IP.DST+4
				bne .1
				cmp #$FF
				bne .3					not a broadcast....
				ldy #S.ETH.DSTMAC
.2				sta (ZPFrameOutPtr),y
				iny
				cpy #S.ETH.DSTMAC+6
				bne .2
				clc
				rts
.3				ldy #S.IP.DST+3
				ldx #3
.4				lda (ZPFrameOutPtr),y
				eor IPCFG+S.IPCFG.IP,x
				and	IPCFG+S.IPCFG.MASK,x
				bne .6
				dey
				dex
				bpl .4

				ldy #S.IP.DST+3			Same network, query ARP for dest IP
				ldx #3
.5				lda (ZPFrameOutPtr),y
				sta ARP.TmpCache+S.ARPCACHE.IP,x
				dey
				dex
				bpl .5
				bra .8

.6				ldx #3					Not Same network, query ARP for GW

.7				lda IPCFG+S.IPCFG.GW,x
				sta ARP.TmpCache+S.ARPCACHE.IP,x
				dex
				bpl .7

.8				jsr ARP.QUERY.I
				bcs .99

				ldx #5
				ldy #S.ETH.DSTMAC+5
.11				lda ARP.TmpCache+S.ARPCACHE.MAC,x
				sta (ZPFrameOutPtr),y
				dey
				dex
				bpl .11
				clc
.99				rts
*--------------------------------------
MAN
SAVE usr/src/lib/libtcpip.s.ip
LOAD usr/src/lib/libtcpip.s
ASM
