A2osX/LIB/LIBTCPIP.S.TCP.txt
2017-01-29 22:47:19 +01:00

442 lines
7.7 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.

PR#3
PREFIX /A2OSX.SRC
LOMEM $A00
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
TCP.IN ldy #S.IP.SRC+3
ldx #3
.1 lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.DST.ADDR,x
dey
dex
bpl .1
ldy #S.TCP.SRCPORT
lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.DST.PORT+1
iny
lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.DST.PORT
ldy #S.IP.DST+3
ldx #3
.2 lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.SRC.ADDR,x
dey
dex
bpl .2
ldy #S.TCP.DSTPORT
lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.SRC.PORT+1
iny
lda (ZPFrameBase),y
sta TmpSocket+S.SOCKET.SRC.PORT
>LDYA L.SKT.TABLE
>STYA ZPPtrSKT
ldx #0
.3 lda (ZPPtrSKT)
beq .7
cmp #S.SOCKET.SOCK.STREAM
bne .7
ldy #S.SOCKET.SRC.ADDR
.4 lda TmpSocket,y
cmp (ZPPtrSKT),y
bne .7 Not for this socket...
iny
cpy #S.SOCKET.SRC.PORT+2
bne .4
ldy #S.SOCKET.SO
lda (ZPPtrSKT),y
and #S.SOCKET.SO.ACCEPTCONN Listening socket?
beq .5
ldy #S.TCP.OPTIONS yes, only accept SYN packet
lda (ZPFrameBase),y
cmp #S.TCP.OPTIONS.SYN
bne .7 not for this listening socket
jmp TCP.IN.LISTEN.NEW
.5 ldy #S.SOCKET.DST.ADDR
.6 lda TmpSocket,y regular socket, check remote ADDR/PORT
cmp (ZPPtrSKT),y
bne .7
iny
cpy #S.SOCKET.DST.PORT+2
bne .6
jmp TCP.IN.REGULAR
.7 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
bcc .8
inc ZPPtrSKT+1
.8 inx
cpx #K.SKTTABLE.SIZE
bne .3
clc Discard frame
rts
*--------------------------------------
TCP.IN.LISTEN.NEW
lda #S.SOCKET.SOCK.STREAM
sta TmpSocket
stz TmpSocket+S.SOCKET.SO
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
sec
.1 lda (ZPFrameBase),y
adc #0
sta TmpSocket+S.SOCKET.SQ.ACKNUM,x
dey
dex
bpl .1
ldx #3
.2 lda A2osX.TIMER16,x
sta TmpSocket+S.SOCKET.SQ.SEQNUM,x
dex
bpl .2
>PUSHW L.TmpSocket
jsr SKT.NEW
bcs .9
phy
pha
txa
jsr SKT.AddToQueueL
pla
sta ZPPtrSKT+1
pla
sta ZPPtrSKT
bcc .3
lda #0 error
sta (ZPPtrSKT) clear this socket
lda #ERR.SKT.OOS
.9 rts
.3 ldy #S.SOCKET.STATUS
lda #S.SOCKET.STATUS.SYNRCVD
sta (ZPPtrSKT),y
jmp TCP.SendSYNACK
*--------------------------------------
TCP.IN.REGULAR stx hSocket
ldy #S.SOCKET.STATUS
lda (ZPPtrSKT),y
asl
tax
jmp (L.TCP.IN.JMP,x)
*--------------------------------------
TCP.IN.JMP.CLOSED
TCP.IN.JMP.LISTEN
TCP.IN.JMP.SYNSENT
clc
rts
*--------------------------------------
TCP.IN.JMP.SYNRCVD
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameBase),y
cmp #S.TCP.OPTIONS.ACK
bne .8
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
sec
.10 lda (ZPPtrSKT),y
adc #0
sta TmpDWord,x
dey
dex
bpl .10
ldx #3
ldy #S.TCP.ACK.NUMBER+3
.11 lda (ZPFrameBase),y
cmp TmpDWord,x
bne .8
dey
dex
bpl .11
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
.12 lda TmpDWord,x
sta (ZPPtrSKT),y
dey
dex
bpl .12
ldy #S.SOCKET.STATUS
lda #S.SOCKET.STATUS.ESTBLSH
sta (ZPPtrSKT),y
>PUSHW K.TCP.WSIZE
>PUSHBI 0
>SYSCALL GetMem
bcs *
txa
ldy #S.SOCKET.SQ.hInMem
sta (ZPPtrSKT),y
>PUSHW K.TCP.WSIZE
>PUSHBI 0
>SYSCALL GetMem
bcs *
txa
ldy #S.SOCKET.SQ.hOutMem
sta (ZPPtrSKT),y
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.ESTBLSH
ldy #S.TCP.OPTIONS
lda (ZPFrameBase),y
cmp #S.TCP.OPTIONS.ACK
bne .3
jsr TCP.UpdateAck
.3 lda ZPFrameBase
clc
adc #S.TCP
sta ZPDataPtr
lda ZPFrameBase+1
adc /S.TCP
sta ZPDataPtr+1
ldy #S.TCP.DATAOFFSET
lda (ZPFrameBase),y
lsr
lsr
clc
adc ZPDataPtr
sta ZPDataPtr
lda ZPDataPtr+1
adc ZPDataPtr+1
sta ZPDataPtr+1
lda ZPDataPtr
sec
sbc ZPFrameBase
sta ZPDataLen
lda ZPDataPtr+1
sbc ZPFrameBase+1
sta ZPDataLen+1
ldy #S.SOCKET.SQ.ACKNUM+3
lda (ZPPtrSKT),y
clc
adc ZPDataLen
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc ZPDataLen+1
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
jsr TCP.SendACK
clc
rts
*--------------------------------------
TCP.IN.JMP.CLWAIT
TCP.IN.JMP.LASTACK
TCP.IN.JMP.FINWT1
TCP.IN.JMP.FINWT2
TCP.IN.JMP.CLOSING
TCP.IN.JMP.TIMEWT
clc
rts
*--------------------------------------
TCP.UpdateAck ldy #S.TCP.ACK.NUMBER
ldx #4
.1 lda (ZPFrameBase),y
pha
iny
dex
bne .1
ldy #S.SOCKET.SQ.ACKNUM+3
ldx #4
.2 pla
sta (ZPPtrSKT),y
dey
dex
bne .2
rts
*--------------------------------------
TCP.SendACK lda #S.TCP.OPTIONS.ACK
bra TCP.SendMSG
TCP.SendSYNACK lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
TCP.SendMSG sta TCP.MSG+S.TCP.OPTIONS
ldy #S.SOCKET.SRC.ADDR+3
ldx #3
.1 lda (ZPPtrSKT),y
sta TCP.MSG+S.IP.SRC,x
dey
dex
bpl .1
ldy #S.SOCKET.SRC.PORT
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SRCPORT+1
iny
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SRCPORT
ldy #S.SOCKET.DST.ADDR+3
ldx #3
.2 lda (ZPPtrSKT),y
sta TCP.MSG+S.IP.DST,x
dey
dex
bpl .2
ldy #S.SOCKET.DST.PORT
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.DSTPORT+1
iny
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.DSTPORT
ldy #S.SOCKET.SQ.SEQNUM+7
ldx #7
.3 lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SEQ.NUMBER,x
dey
dex
bpl .3
>PUSHW L.TCP.MSG
jsr SEND.TCP.FRAME
clc
rts
*--------------------------------------
TCP.ComputeChecksum
lda #0 RESET.TCP.CHECKSUM
ldy #S.TCP.CHECKSUM
sta (ZPFrameBase),y
iny
sta (ZPFrameBase),y
>LDYA ZPFrameBase
>STYA ZPTmpPtr1
lda ZPFrameLen
sec
sbc #S.IP-2
sta ZPDataLen
lda ZPFrameLen+1
sbc /S.IP-2
sta ZPDataLen+1
clc
* lda ZPDataLen+1
* adc #0 RESERVED (all zero)
sta IP.CHECKSUM
lda ZPDataLen
adc #S.IP.PROTOCOL.TCP
sta IP.CHECKSUM+1
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.10 lda (ZPFrameBase),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameBase),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .10
ldy #S.IP
.1 jsr DecDataLen
beq .8
lda (ZPTmpPtr1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
bne .20
inc ZPTmpPtr1+1
.20 jsr DecDataLen
bne .2
lda #0
bra .21
.2 lda (ZPTmpPtr1),y
.21 adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
bne .1
inc ZPTmpPtr1+1
bra .1
.8 ldy #S.TCP.CHECKSUM
lda IP.CHECKSUM
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameBase),y
iny
lda IP.CHECKSUM+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameBase),y
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.TCP
LOAD LIB/LIBTCPIP.S
ASM