@@ -667,3 +667,37 @@ var exchangeHelloWorld = [][]byte{
667
667
// server ACK
668
668
11 : []byte ("\xd8 \x5e \xd3 \x43 \x03 \xeb \x28 \xcd \xc1 \x05 \x4d \xbb \x08 \x00 \x45 \x00 \x00 \x28 \x00 \x00 \x40 \x00 \x40 \x06 \xb6 \x5b \xc0 \xa8 \x01 \x91 \xc0 \xa8 \x01 \x93 \x04 \xd2 \x84 \x96 \xbe \x6e \x4c \x28 \x5e \x72 \x2b \x97 \x50 \x10 \x10 \x00 \xfd \x56 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 " ),
669
669
}
670
+
671
+ func TestUnexpectedStateClosing (t * testing.T ) {
672
+ // TCB is a server which returns an HTTP response and receives a FINACK.
673
+ var tcb seqs.ControlBlock
674
+ const httpLen = 1192
675
+ const issA , issB , windowA , windowB = 1 , 127 , 2000 , 2000
676
+ tcb .HelperInitState (seqs .StateEstablished , issA , issA , windowA )
677
+ tcb .HelperInitRcv (issB , issB , windowB )
678
+
679
+ ex := []seqs.Exchange {
680
+ 0 : { // Server sends HTTP response.
681
+ Outgoing : & seqs.Segment {SEQ : issA , ACK : issB , Flags : PSHACK , WND : windowA , DATALEN : httpLen },
682
+ WantState : seqs .StateEstablished ,
683
+ },
684
+ 1 : { // Client sends an ACK to server.
685
+ Incoming : & seqs.Segment {SEQ : issB , ACK : issA + httpLen , Flags : seqs .FlagACK , WND : windowB },
686
+ WantState : seqs .StateEstablished ,
687
+ },
688
+ 2 : { // Client sends FIN|ACK to server.
689
+ Incoming : & seqs.Segment {SEQ : issB , ACK : issA + httpLen , Flags : FINACK , WND : windowB },
690
+ WantPending : & seqs.Segment {SEQ : issA + httpLen , ACK : issB + 1 , Flags : seqs .FlagACK , WND : windowA },
691
+ WantState : seqs .StateCloseWait ,
692
+ },
693
+ 3 : { // Server sends out FINACK.
694
+ Outgoing : & seqs.Segment {SEQ : issA + httpLen , ACK : issB + 1 , Flags : FINACK , WND : windowA },
695
+ WantState : seqs .StateLastAck ,
696
+ },
697
+ 4 : { // Client sends back ACK.
698
+ Incoming : & seqs.Segment {SEQ : issB + 1 , ACK : issA + httpLen + 1 , Flags : seqs .FlagACK , WND : windowB },
699
+ WantState : seqs .StateClosed ,
700
+ },
701
+ }
702
+ tcb .HelperExchange (t , ex [:])
703
+ }
0 commit comments