Kernel 0.92 : TCP close fix

This commit is contained in:
Rémy GIBERT 2018-11-11 23:05:04 +01:00
parent 478a13a4be
commit 2b0f70dc74
6 changed files with 93 additions and 59 deletions

Binary file not shown.

Binary file not shown.

View File

@ -186,20 +186,17 @@ SKT.connect.STREAM
SKT.connect.SEQPACKET
jsr SKT.SetRemAddr
jsr SKT.NewTCB
bcs SKT.connect.99
bcs .99
lda #S.TCP.OPTIONS.SYN
jsr TCP.OUT.SendOptA Send SYN
bcs .9
lda #S.SOCKET.TCP.S.SYNSENT
sta SKT.Cache+S.SOCKET.TCP.S
jmp SKT.StoreTCB
jmp SKT.StoreTCB.S
.9 lda #ERR.SKT.BAD
sec
SKT.connect.99 rts
.99 rts
*/--------------------------------------
* # Listen
* Listen for connections on a socket
@ -354,22 +351,30 @@ SKT.shutdown.SEQPACKET
rts
SKT.shutdown.STREAM
pla
jsr SKT.GetTCB
ldy #S.SOCKET.TCP.S
lda (ZPPtrSKT),y
cmp #S.SOCKET.TCP.S.CLWAIT
cmp #S.SOCKET.TCP.S.ESTBLSH
bne .1
lda #S.SOCKET.TCP.S.LASTACK
bra .2
lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA
bcs .9
.1 lda #S.SOCKET.TCP.S.FINWT1
.2 sta (ZPPtrSKT),y
lda #S.SOCKET.TCP.S.FINWT1
jmp SKT.StoreTCB.S
.1 cmp #S.SOCKET.TCP.S.TIMEWT
beq .8
lda #S.TCP.OPTIONS.RST+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA
bcs .9
ldy #S.SOCKET.TCP.O
lda (ZPPtrSKT),y
ora #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jmp TCP.OUT
lda #S.SOCKET.TCP.S.TIMEWT
jmp SKT.StoreTCB.S
.8 clc
.9 rts
*/--------------------------------------
* # Read (STREAM)
* ## C
@ -447,7 +452,8 @@ SKT.Write jsr SKT.PullhFDDataInPtrLen
lda (ZPPtrSKT),y
cmp #S.SOCKET.TCP.S.ESTBLSH
bcc .90 Not yet established...no data
bne .91
jsr SKT.AddDataToSktOut will call SKT.GetTCB
bcs .90
@ -1261,7 +1267,7 @@ SKT.AckDataToSktOut
.8 rts
*--------------------------------------
SKT.NewTCB ldx #S.SOCKET
SKT.NewTCB ldx #S.SOCKET.TCP.INTAIL
.1 stz SKT.Cache,x
inx
@ -1271,7 +1277,7 @@ SKT.NewTCB ldx #S.SOCKET
>LDYAI K.TCP.WSIZE
>STYA SKT.Cache+S.SOCKET.TCP.INFREE
>SYSCALL getmem
bcs SKT.StoreTCB.RTS
bcs .9
txa
ldy #S.SOCKET.SQ.hInMem
sta (ZPPtrSKT),y
@ -1279,7 +1285,7 @@ SKT.NewTCB ldx #S.SOCKET
>LDYAI K.TCP.WSIZE
>STYA SKT.Cache+S.SOCKET.TCP.OUTFREE
>SYSCALL getmem
bcs SKT.StoreTCB.RTS
bcs .9
txa
ldy #S.SOCKET.SQ.hOutMem
sta (ZPPtrSKT),y
@ -1290,18 +1296,22 @@ SKT.NewTCB ldx #S.SOCKET
sta SKT.Cache+S.SOCKET.TCP.OUTNEXTSEQ,x
dex
bpl .2
* clc
.9 rts
*--------------------------------------
SKT.StoreTCB ldy #S.SOCKET
SKT.StoreTCB.S ldy #S.SOCKET.TCP.S
sta (ZPPtrSKT),y
SKT.StoreTCB ldy #S.SOCKET.TCP.INTAIL
.1 lda SKT.Cache,y
sta (ZPPtrSKT),y
iny
cpy #S.SOCKET.TCP
bne .1
clc
SKT.StoreTCB.RTS
rts
*--------------------------------------
SKT.GetTCB ldy #S.SOCKET
SKT.GetTCB ldy #S.SOCKET.TCP.INTAIL
.1 lda (ZPPtrSKT),y
sta SKT.Cache,y
iny

View File

@ -56,13 +56,23 @@ TCP.CLOSE ldx #0
ldy #S.SOCKET.TCP.S
lda (ZPTmpPtr1),y
cmp #S.SOCKET.TCP.S.TIMEWT
bcc .8
bne .8
ldy #S.SOCKET.SQ.hInMem
lda (ZPTmpPtr1),y
>SYSCALL freemem
ldy #S.SOCKET.SQ.hOutMem
lda (ZPTmpPtr1),y
>SYSCALL freemem
plx
phx
lda SKT.TABLE,x
jsr SKT.Shutdown
>SYSCALL freemem
plx
phx
stz SKT.TABLE,x
.8 plx
inx
@ -105,8 +115,7 @@ TCP.IN.JMP.LISTEN
bcs .9
lda #S.SOCKET.TCP.S.SYNRCVD
sta SKT.Cache+S.SOCKET.TCP.S
jmp SKT.StoreTCB
jmp SKT.StoreTCB.S
.9 lda #ERR.SKT.OOS
.99 rts
@ -141,8 +150,7 @@ TCP.IN.JMP.SYNSENT
bcs .9
lda #S.SOCKET.TCP.S.ESTBLSH
sta SKT.Cache+S.SOCKET.TCP.S
jmp SKT.StoreTCB
jmp SKT.StoreTCB.S
.9 lda #S.TCP.OPTIONS.RST
jsr TCP.OUT.SendOptA
@ -175,8 +183,7 @@ TCP.IN.JMP.SYNRCVD
bpl .1
lda #S.SOCKET.TCP.S.ESTBLSH
sta SKT.Cache+S.SOCKET.TCP.S
jmp SKT.StoreTCB
jmp SKT.StoreTCB.S
.8 clc
.9 rts
@ -209,13 +216,12 @@ TCP.IN.JMP.ESTBLSH
beq .8
jsr TCP.IN.ACKTheFIN
lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA FIN received, Send FIN.ACK
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.CLWAIT
sta (ZPPtrSKT),y
jmp SKT.StoreTCB
jmp SKT.StoreTCB.S
.8 clc
.9 rts
@ -230,30 +236,38 @@ TCP.IN.JMP.LASTACK
bit #S.TCP.OPTIONS.ACK
beq .8
ldx SKT.Index
lda SKT.TABLE,x
jmp SKT.shutdown
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.TIMEWT
sta (ZPPtrSKT),y
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.FINWT1
ldy #S.TCP.OPTIONS only accept ACK packet
jsr SKT.GetTCB
ldy #S.TCP.OPTIONS FIN sent, accept ACK or FIN/ACK packet
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.FIN
beq .8
ldy #S.SOCKET.TCP.O
lda #S.TCP.OPTIONS.FIN send FIN
sta (ZPPtrSKT),y
jsr TCP.IN.ACKTheFIN
bne .1
lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA Send FIN.ACK
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.SOCKET.TCP.S.FINWT2
sta (ZPPtrSKT),y
jmp SKT.StoreTCB.S
.1 jsr TCP.IN.ACKTheFIN FIN/ACK
lda #S.TCP.OPTIONS.FIN+S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA Send FIN.ACK
bcs .9
lda #S.SOCKET.TCP.S.TIMEWT
jmp SKT.StoreTCB.S
.8 clc
* clc
.9 rts
*--------------------------------------
TCP.IN.JMP.FINWT2
@ -263,12 +277,15 @@ TCP.IN.JMP.FINWT2
bit #S.TCP.OPTIONS.FIN
beq .8
jsr SKT.GetTCB
jsr TCP.IN.ACKTheFIN
bcs .9
ldy #S.SOCKET.TCP.S
lda #S.TCP.OPTIONS.ACK
jsr TCP.OUT.SendOptA FIN received, Send ACK
bcs .9
lda #S.SOCKET.TCP.S.TIMEWT
sta (ZPPtrSKT),y
jmp SKT.StoreTCB.S
.8 clc
.9 rts
@ -311,21 +328,27 @@ TCP.IN.ACKTheFIN
ora #S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jsr SKT.GetTCB
ldx #3
ldy #S.TCP.ACKNUM+3
sec
.2 lda SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x
adc #0
sta SKT.Cache+S.SOCKET.TCP.INLASTSEQNUM,x
dex
bpl .2
ldx #3
sec
.3 lda SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x
adc #0
sta SKT.Cache+S.SOCKET.TCP.OUTACKNUM,x
dey
dex
bpl .3
jmp TCP.OUT.I ACK the FIN
rts
*--------------------------------------
TCP.IN.SetDataInPtrAndLen
ldy #S.IP.TOTAL.LENGTH+1

View File

@ -446,6 +446,7 @@ CL.CheckCmd ldy #$ff
lda (pPs),y
>SYSCALL GetMemPtr
jsr CL.SearchExt
bcs CL.CheckCmd.90
.6 >PUSHEA.G CMD.Stat

View File

@ -280,7 +280,7 @@ CS.RUN.BATCH >SYSCALL GetChar
jsr CL.Trace
*--------------------------------------
CS.RUN.Exec jsr CL.Parse
bcs CS.RUN.LOOP.8
bcs CS.RUN.LOOP.END
lda (ZPArgVBuf)
beq CS.RUN.LOOP.8