A2osX/LIB/LIBTCPIP.S.TCP.txt

577 lines
10 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 $900
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
TCP.IN jsr IP.FillSKT.TemplateSrcDst
ldy #S.TCP.SRCPORT
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.DST.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.DST.PORT
ldy #S.TCP.DSTPORT
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.SRC.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.SRC.PORT
lda hSocketTable
>SYSCALL GetMemPtrA
>STYA ZPPtrSKT
ldx #0
.3 lda (ZPPtrSKT)
beq .7
cmp #S.SOCKET.SOCK.STREAM
bne .7
ldy #S.SOCKET.SRC.ADDR
.4 lda SKT.Template,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 no, go check if Dst Match
ldy #S.TCP.OPTIONS yes, only accept SYN packet
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.SYN
beq .7 maybe a regular frame for a regular socket
jmp TCP.IN.JMP.LISTEN
.5 ldy #S.SOCKET.DST.ADDR
.6 lda SKT.Template,y regular socket, check remote ADDR/PORT
cmp (ZPPtrSKT),y
bne .7
iny
cpy #S.SOCKET.DST.PORT+2
bne .6
stx hSocket
ldy #S.SOCKET.TCP.STATUS
lda (ZPPtrSKT),y
asl
tax
jmp (L.TCP.IN.JMP,x)
.7 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
bcc .8
inc ZPPtrSKT+1
.8 inx
cpx #K.SKTTABLE.SIZE
bne .3
.9 clc Discard frame
rts
*--------------------------------------
TCP.IN.JMP.CLOSED
clc
rts
*--------------------------------------
TCP.IN.JMP.LISTEN
lda #S.SOCKET.SOCK.STREAM
sta SKT.Template+S.SOCKET.SOCK
stz SKT.Template+S.SOCKET.SO
>PUSHW L.SKT.Template
jsr SKT.New
bcs .9
phy
pha
txa
jsr SKT.AddToQueueA
pla
sta ZPPtrSKT+1
pla
sta ZPPtrSKT
bcc .3 Queued successfully ?
lda #0 error
sta (ZPPtrSKT) clear this socket
lda #ERR.SKT.OOS
.9 rts
.3 jsr ARP.AddFromFrameInPtr
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
sec
.1 lda (ZPFrameInPtr),y Set ACK=SEQ+1 for new socket...
adc #0
sta TmpDWord,x
dey
dex
bpl .1
ldx #3
ldy #S.SOCKET.SQ.ACKNUM+3
.4 lda TmpDWord,x Update new socket with ACK number
sta (ZPPtrSKT),y
dey
dex
bpl .4
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNRCVD
sta (ZPPtrSKT),y
ldy #S.SOCKET.TCP.OPTIONS
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jsr TCP.Out
bcs .9
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNSENT
sta (ZPPtrSKT),y
clc
rts
*--------------------------------------
TCP.IN.JMP.SYNSENT
clc
rts
*--------------------------------------
TCP.IN.JMP.SYNRCVD
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameInPtr),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 (ZPFrameInPtr),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.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.ESTBLSH
sta (ZPPtrSKT),y
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.ESTBLSH
ldy #S.TCP.OPTIONS
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.ACK
beq .1
jsr TCP.UpdateSktAckNum
.1 jsr TCP.SetDataInPtrAndLen
jsr SKT.AddDataToSktIn
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.OUT ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
bit #S.TCP.OPTIONS.SYN
beq TCP.OUT.ESTBLSH
>LDYAI 0
jsr TCP.NewFrame
bcs .9
ldy #S.TCP.OPTIONS
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
sta (ZPFrameOutPtr),y
jsr TCP.SendFrame
bcs .9
ldy #S.TCP.OPTIONS
lda #0
sta (ZPFrameOutPtr),y
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNSENT
sta (ZPFrameOutPtr),y
clc
.9 rts
*--------------------------------------
TCP.OUT.ESTBLSH ldy #S.SOCKET.SQ.OUTUSED
lda (ZPPtrSKT),y
pha
iny
lda (ZPPtrSKT),y
ply
bne .1
tax
beq .2 Y,A=0 : nothing to send....
.1 cpy #K.TCP.MSS
pha
sbc /K.TCP.MSS OUTDATA > MSS ?
pla
bcs .2 no....get data len
>LDYAI K.TCP.MSS yes get only MSS
.2 >STYA TmpOffset
jsr TCP.NewFrame
bcs .9
jsr SKT.GetDataFromSktOut
ldy #S.SOCKET.SQ.SEQNUM compute new SEQ.NUM
lda (ZPPtrSKT),y
clc
adc TmpOffset
sta TmpDWord
iny
lda (ZPPtrSKT),y
adc TmpOffset+1
sta TmpDWord+1
iny
lda (ZPPtrSKT),y
adc #0
sta TmpDWord+2
iny
lda (ZPPtrSKT),y
adc #0
sta TmpDWord+3
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
.3 lda TmpDWord,x
sta (ZPFrameOutPtr),y
dey
dex
bpl .3
ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
bit #S.TCP.OPTIONS.ACK
beq .7
ldy #S.TCP.OPTIONS
lda (ZPFrameOutPtr),y
ora #S.TCP.OPTIONS.ACK
sta (ZPFrameOutPtr),y
.7 jsr TCP.SendFrame
bcs .9
ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
and #$ff^S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
.71 lda TmpDWord,x
sta (ZPPtrSKT),y
dey
dex
bpl .71
.8 clc
.9 rts
*--------------------------------------
TCP.GetSktAckNum
ldy #S.TCP.ACK.NUMBER
ldx #4
.1 lda (ZPFrameInPtr),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.UpdateSktAckNum
ldy #S.SOCKET.SQ.ACKNUM+3
lda (ZPPtrSKT),y
clc
adc ZPDataInLen
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc ZPDataInLen+1
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
rts
*--------------------------------------
TCP.SetDataInPtrAndLen
ldy #S.TCP.DATAOFFSET
lda (ZPFrameInPtr),y
and #$F0
lsr
lsr
adc #S.TCP
sta TmpOffset
lda #0
* clc
adc /S.TCP
sta TmpOffset+1 TmpOffset=Data Offset in Frame
lda ZPFrameInPtr
* clc
adc TmpOffset
sta ZPDataInPtr
lda ZPFrameInPtr+1
adc #0
sta ZPDataInPtr+1
lda ZPFrameInLen
sec
sbc TmpOffset
sta ZPDataInLen
lda ZPFrameInLen+1
sbc TmpOffset+1
sta ZPDataInLen+1
rts
*--------------------------------------
TCP.NewFrame ldx #S.IP.PROTOCOL.TCP
jsr FRM.NewIP
bcs .9
jsr SKT.SetFrameOutDstIP
ldy #S.SOCKET.SRC.PORT
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.TCP.SRCPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
ldy #S.SOCKET.DST.PORT
lda (ZPPtrSKT),y
tax
iny
lda (ZPPtrSKT),y
ldy #S.TCP.DSTPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
ldy #S.TCP.DATAOFFSET
lda #$50 Header size = 5 DWORDS
sta (ZPFrameOutPtr),y
ldy #S.SOCKET.SQ.INFREE
lda (ZPPtrSKT),y
pha
iny
lda (ZPPtrSKT),y
ldy #S.TCP.WINDOW
sta (ZPFrameOutPtr),y
iny
pla
sta (ZPFrameOutPtr),y
clc
.9 rts
*--------------------------------------
TCP.SendFrame ldy #S.SOCKET.SQ.SEQNUM+7
ldx #7
.1 lda (ZPPtrSKT),y
pha
dey
dex
bpl .1
ldy #S.TCP.SEQ.NUMBER
.2 pla
sta (ZPFrameOutPtr),y
iny
cpy #S.TCP.SEQ.NUMBER+8
bne .2
jmp FRM.SendIP
*--------------------------------------
TCP.ComputeChecksum
lda #0 RESET.TCP.CHECKSUM
ldy #S.TCP.CHECKSUM
sta (ZPFrameOutPtr),y
iny
sta (ZPFrameOutPtr),y
>LDYA ZPFrameOutPtr
>STYA ZPTmpPtr1
lda ZPFrameOutLen
sec
sbc #S.IP-2
sta ZPDataInLen
lda ZPFrameOutLen+1
sbc /S.IP-2
sta ZPDataInLen+1
clc
* lda ZPDataInLen+1
* adc #0 RESERVED (all zero)
sta IP.CHECKSUM
lda ZPDataInLen
adc #S.IP.PROTOCOL.TCP
sta IP.CHECKSUM+1
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.10 lda (ZPFrameOutPtr),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameOutPtr),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .10
ldy #S.IP
.1 jsr DecDataInLen
beq .8
lda (ZPTmpPtr1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
bne .20
inc ZPTmpPtr1+1
.20 jsr DecDataInLen
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 (ZPFrameOutPtr),y
iny
lda IP.CHECKSUM+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameOutPtr),y
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.TCP
LOAD LIB/LIBTCPIP.S
ASM