A2osX/LIB/LIBTCPIP.S.TCP.txt
2018-10-11 08:09:35 +02:00

462 lines
9.6 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 /A2OSX.BUILD
AUTO 4,1
.LIST OFF
*--------------------------------------
TCP.IN jsr FRM.GetTargetSKT.TCPUDP
>DEBUG
jsr SKT.FindMatchingLocRem
bcs TCP.IN.JMP.CLOSED no socket, go discard
>STYA ZPPtrSKT
ldy #S.SOCKET.PROTO
lda (ZPPtrSKT),y
cmp #S.IP.PROTOCOL.TCP
bne TCP.IN.JMP.CLOSED wrong protocol, go discard
ldy #S.TCP.OPTIONS
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.RST RST ? go Kill this socket...
bne TCP.IN.RST ...and discard frame
ldy #S.SOCKET.TCP.S
lda (ZPPtrSKT),y
asl
tax
jmp (J.TCP.IN,x)
*--------------------------------------
TCP.IN.RST jsr SKT.Destroy
*--------------------------------------
TCP.IN.JMP.CLOSED
* lda hFrameIn
* >SYSCALL FreeMem
rts
*--------------------------------------
TCP.IN.JMP.LISTEN
ldy #S.TCP.OPTIONS SYN Received, send SYN.ACK packet
lda (ZPFrameInPtr),y
cmp #S.TCP.OPTIONS.SYN
bne TCP.IN.JMP.CLOSED
ldy #S.SOCKET.T Create a new client socket
lda (ZPPtrSKT),y
tax Same type a listening socket
jsr SKT.Socket.I get new socket in ZPTmpPtr1
bcs TCP.IN.JMP.CLOSED
txa
jsr SKT.AddToQueueA Queued successfully ?
bcs TCP.IN.JMP.CLOSED no, discard frame and new socket
jsr ARP.AddFromFrameInPtr
lda ZPTmpPtr1
sta ZPPtrSKT
ldaZPTmpPtr1+1
sta ZPPtrSKT+1
jsr TCP.IN.ACKTheSYN
jsr SKT.StoreTCB
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA SYN received, Send SYN.ACK
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.SYNRCVD
sta (ZPPtrSKT),y
clc
rts
.9 lda #0 error
sta (ZPPtrSKT) clear this socket
lda #ERR.SKT.OOS
.99 rts
*--------------------------------------
TCP.IN.JMP.SYNSENT
ldy #S.TCP.OPTIONS SYN Send, only accept SYN.ACK packet, then Send ACK
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
cmp #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
bne .9
jsr SKT.GetTCB
ldx #3
ldy #S.TCP.ACKNUM+3
sec Check if ACK=OUTNEXTSEQ+1
.1 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x
adc #0
sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x
eor (ZPFrameInPtr),y
bne .9
dey
dex
bpl .1
jsr TCP.IN.ACKTheSYN
lda #S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA SYN.ACK recieved, Send, ACK
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.ESTBLSH
sta (ZPPtrSKT),y
jmp SKT.StoreTCB
.9 lda #S.TCP.OPTIONS.RST
jsr TCP.OUT.SendOptA
jmp SKT.Destroy
*--------------------------------------
TCP.IN.JMP.SYNRCVD
ldy #S.TCP.OPTIONS SYN Received, SYN.ACK Sent, only accept ACK packet
lda (ZPFrameInPtr),y
cmp #S.TCP.OPTIONS.ACK
bne .8
jsr SKT.GetTCB
ldx #3
ldy #S.TCP.ACKNUM+3
sec
.1 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x Check if ACK=OUTNEXTSEQ+1
adc #0
sta SKT.TmpCache+S.SOCKET.TCP.OUTSEQNUM,x setup SEQNUM
sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x ...and update NEXTSEQ
eor (ZPFrameInPtr),y
bne .8
dey
dex
bpl .1
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.ESTBLSH
sta (ZPPtrSKT),y
jmp SKT.StoreTCB
.8 clc
.9 rts
*--------------------------------------
TCP.IN.JMP.ESTBLSH
jsr SKT.GetTCB
ldy #S.TCP.OPTIONS
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.ACK Remote side ACKed data ?
beq .1
jsr SKT.AckDataToSktOut Yes, Discard sent data
jsr SKT.StoreTCB and update SKT
.1 jsr TCP.IN.SetDataInPtrAndLen
lda ZPDataInLen Incoming Data in this frame ?
ora ZPDataInLen+1
beq .2 No data, ...
jsr SKT.AddDataToSktIn yes, queue data if there is room for....
bcs .2
jsr SKT.StoreTCB success, update socket
.2 ldy #S.TCP.OPTIONS
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.FIN
beq .8
jsr TCP.IN.ACKTheFIN
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.CLWAIT
sta (ZPPtrSKT),y
.8 clc
.9 rts
*--------------------------------------
TCP.IN.JMP.CLWAIT
clc Wait for SKT.CloseA from Daemon
rts
*--------------------------------------
TCP.IN.JMP.LASTACK
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.ACK
beq .8
jmp SKT.Destroy
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.FINWT1
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.ACK
beq TCP.IN.JMP.FINWT2.1
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.FINWT2
sta (ZPPtrSKT),y
*--------------------------------------
TCP.IN.JMP.FINWT2
ldy #S.TCP.OPTIONS only accept FIN packet
lda (ZPFrameInPtr),y
TCP.IN.JMP.FINWT2.1
bit #S.TCP.OPTIONS.FIN
bne .8
jsr TCP.IN.ACKTheFIN
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.TIMEWT
sta (ZPPtrSKT),y
.8 clc
.9 rts
*--------------------------------------
TCP.IN.JMP.CLOSING
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.ACK
beq .1
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.TIMEWT
sta (ZPPtrSKT),y
.1 clc
rts
*--------------------------------------
TCP.IN.JMP.TIMEWT
*--------------------------------------
TCP.IN.ACKTheSYN
ldy #S.TCP.SEQNUM+3 Get Remote SEQ
ldx #3
sec
.3 lda (ZPFrameInPtr),y Set OUTACK=SEQ+1 for new socket...
adc #0
sta SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM,x
sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x
dey
dex
bpl .3
rts
*--------------------------------------
TCP.IN.ACKTheFIN
ldy #S.SOCKET.TCP.O
lda (ZPPtrSKT),y
ora #S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jsr SKT.GetTCB
ldx #3
ldy #S.TCP.ACKNUM+3
sec
.3 lda SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x
adc #0
sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x
dey
dex
bpl .3
jmp TCP.OUT.I ACK the FIN
*--------------------------------------
TCP.IN.SetDataInPtrAndLen
ldy #S.IP.TOTAL.LENGTH+1
lda (ZPFrameInPtr),y
sec
sbc #S.IP-S.ETH
sta ZPDataInLen
dey
lda (ZPFrameInPtr),y
sbc /S.IP-S.ETH
sta ZPDataInLen+1
ldy #S.TCP.DATAOFFSET
lda (ZPFrameInPtr),y
and #$F0 Get TCP Header len in DWORD
lsr
lsr
sta TmpOffset
lda ZPDataInLen
sec
sbc TmpOffset
sta ZPDataInLen
bcs .1
dec ZPDataInLen+1
.1 lda ZPFrameInPtr
clc
adc #S.IP
pha
lda ZPFrameInPtr+1
adc /S.IP
tax
pla
clc
adc TmpOffset
bcc .2
inx
.2 sta ZPDataInPtr
stx ZPDataInPtr+1
rts
*--------------------------------------
TCP.OUT jsr SKT.GetTCB
TCP.OUT.I lda SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1
ldy SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND
bne .1
tax
bne .1
* Y,A=0 : no data to send
ldy #S.SOCKET.TCP.O
lda (ZPPtrSKT),y
bne TCP.OUT.SendOptA a least an option...
clc No, data, no flag....exit
rts
.1 cpy #K.TCP.MSS
pha
sbc /K.TCP.MSS OUTDATA > MSS ?
pla
bcc .2 no....keep data len
>LDYAI K.TCP.MSS yes send only MSS
.2 jsr TCP.NewFrame
bcs TCP.OUT.9
jsr SKT.GetDataFromSktOut
ldy #S.SOCKET.TCP.O
lda (ZPPtrSKT),y
ora #S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA.1
bcs TCP.OUT.9
lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+3
clc
adc ZPDataOutLen
sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+3
lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+2
adc ZPDataOutLen+1
sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+2
bcc .80
inc SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+1
bne .80
inc SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ
.80 jmp SKT.StoreTCB exits with CC
TCP.OUT.9 rts
*--------------------------------------
TCP.OUT.SendOptA
sta .1+1
>LDYAI 0
jsr TCP.NewFrame
bcs TCP.OUT.9
.1 lda #$ff
TCP.OUT.SendOptA.1
ldy #S.TCP.OPTIONS
sta (ZPFrameOutPtr),y
bit #S.TCP.OPTIONS.ACK
beq .10
ldx #3
ldy #S.TCP.ACKNUM+3
.1 lda SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x
sta (ZPFrameOutPtr),y
dey
dex
bpl .1
.10 ldx #3
ldy #S.TCP.SEQNUM+3
.2 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x
sta (ZPFrameOutPtr),y
dey
dex
bpl .2
ldy #S.TCP.WINDOW
lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1
sta (ZPFrameOutPtr),y
iny
lda SKT.TmpCache+S.SOCKET.TCP.INFREE
sta (ZPFrameOutPtr),y
jsr FRM.SendIP
bcs .9
ldy #S.SOCKET.TCP.O
lda #0
sta (ZPPtrSKT),y
* clc
.9 rts
*--------------------------------------
TCP.NewFrame ldx #S.IP.PROTOCOL.TCP
jsr FRM.NewIP
bcs .9
jsr SKT.SetFrameOutDstIP
jsr SKT.SetFrameOutTCPUDPPorts
ldy #S.TCP.DATAOFFSET
lda #$50 Header size = 5 DWORDS
sta (ZPFrameOutPtr),y
ldy #S.TCP.WINDOW
lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1
sta (ZPFrameOutPtr),y
iny
lda SKT.TmpCache+S.SOCKET.TCP.INFREE
sta (ZPFrameOutPtr),y
clc
.9 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBTCPIP.S.TCP
LOAD /A2OSX.SRC/LIB/LIBTCPIP.S
ASM