A2osX/LIB/LIBTCPIP.S.IP.txt
2018-11-17 18:17:13 +01:00

257 lines
4.4 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
PREFIX
AUTO 4,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
jmp UDP.IN
.3 cmp #S.IP.PROTOCOL.TCP
bne .9
jsr TCP.IN TCP will NOT discard FrameIn
.9 lda hFrameIn
beq .8
>SYSCALL 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 ZPDataInLen
lda ZPFrameOutLen+1
sbc /S.IP
sta ZPDataInLen+1
clc
* lda ZPDataInLen+1
* adc /S.IP.PROTOCOL.TCP (all zero)
sta IP.CHECKSUM
lda ZPDataInLen
adc #S.IP.PROTOCOL.TCP
sta IP.CHECKSUM+1
jsr IP.AddSrcDstIPToChecksum
lda ZPDataInLen
eor #$ff
tax
lda ZPDataInLen+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