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

View File

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

View File

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

View File

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