A2osX/LIB/LIBTCPIP.S.IP.txt
2019-07-07 22:48:57 +02:00

264 lines
4.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
*--------------------------------------
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 lda hFrameIn
beq .8
>SYSCALL2 FreeMem
.8 clc
rts
*--------------------------------------
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