diff -r db85996de7c4 -r e9cc36e353d4 networkprotocols/tcpipv4v6prt/src/tcp_sap.cpp --- a/networkprotocols/tcpipv4v6prt/src/tcp_sap.cpp Mon Mar 15 12:46:10 2010 +0200 +++ b/networkprotocols/tcpipv4v6prt/src/tcp_sap.cpp Thu Apr 01 00:00:09 2010 +0300 @@ -2580,9 +2580,15 @@ if (InState(ETcpFinWait1|ETcpClosing|ETcpLastAck)) { // If the server doesn't respond because of broken NAT/FW or other, don't keep interface up. - DetachIfDead(); + + //TSW error:JHAA-82JBNG -- FIN retransmission + //Depending on the function return value the decision to + //retransmitt FIN is decided + + TBool continue_send = DetachIfDead(); // Retransmit FIN - SendSegment(KTcpCtlFIN|KTcpCtlACK, iSND.UNA); + if(continue_send == EFalse) + SendSegment(KTcpCtlFIN|KTcpCtlACK, iSND.UNA); return; } @@ -2753,7 +2759,7 @@ // // Detach the SAP if the application has closed and we seem to keep resending stuff. // -void CProviderTCP6::DetachIfDead() +TBool CProviderTCP6::DetachIfDead() { if (iSockFlags.iRecvClose && iSockFlags.iSendClose && Protocol()->FinPersistency() && iBackoff >= Protocol()->FinPersistency()) @@ -2761,7 +2767,15 @@ LOG(Log::Printf(_L("\ttcp SAP[%u] Peer looks dead while %d bytes unacked data. Detach!"), (TInt)this, Min(iSND.NXT - iSND.UNA, iSockOutQLen))); DetachFromInterface(); + + //TSW error:JHAA-82JBNG -- FIN retransmission + //The FinPersistency value read from the tcpip.ini file determines + //the number of times FIN should be retransmitted + //Once we reach the maximum value the DetachFromInterface() is called + //and we return ETrue. + return ETrue; } + return EFalse; } void CProviderTCP6::DetachFromInterface()