Better handle transmit errors
Return 0 receive bytes when socket is closed git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12099 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -2524,6 +2524,15 @@ EslSocketReceive (
|
|||||||
if ( NULL != pSocketProtocol ) {
|
if ( NULL != pSocketProtocol ) {
|
||||||
pSocket = SOCKET_FROM_PROTOCOL ( pSocketProtocol );
|
pSocket = SOCKET_FROM_PROTOCOL ( pSocketProtocol );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return the transmit error if necessary
|
||||||
|
//
|
||||||
|
if ( EFI_SUCCESS != pSocket->TxError ) {
|
||||||
|
pSocket->errno = EIO;
|
||||||
|
Status = pSocket->TxError;
|
||||||
|
pSocket->TxError = EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
//
|
//
|
||||||
// Verify the socket state
|
// Verify the socket state
|
||||||
//
|
//
|
||||||
@ -2671,6 +2680,7 @@ EslSocketReceive (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return the operation status
|
// Return the operation status
|
||||||
@ -2894,6 +2904,15 @@ EslSocketTransmit (
|
|||||||
if ( NULL != pSocketProtocol ) {
|
if ( NULL != pSocketProtocol ) {
|
||||||
pSocket = SOCKET_FROM_PROTOCOL ( pSocketProtocol );
|
pSocket = SOCKET_FROM_PROTOCOL ( pSocketProtocol );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Return the transmit error if necessary
|
||||||
|
//
|
||||||
|
if ( EFI_SUCCESS != pSocket->TxError ) {
|
||||||
|
pSocket->errno = EIO;
|
||||||
|
Status = pSocket->TxError;
|
||||||
|
pSocket->TxError = EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
//
|
//
|
||||||
// Verify the socket state
|
// Verify the socket state
|
||||||
//
|
//
|
||||||
@ -3063,6 +3082,7 @@ EslSocketTransmit (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return the operation status
|
// Return the operation status
|
||||||
|
@ -2448,13 +2448,21 @@ EslTcpReceive4 (
|
|||||||
&& ( NULL == pSocket->pRxPacketListHead )
|
&& ( NULL == pSocket->pRxPacketListHead )
|
||||||
&& ( NULL == pSocket->pRxOobPacketListHead )) {
|
&& ( NULL == pSocket->pRxOobPacketListHead )) {
|
||||||
Status = pSocket->RxError;
|
Status = pSocket->RxError;
|
||||||
|
pSocket->RxError = EFI_SUCCESS;
|
||||||
switch ( Status ) {
|
switch ( Status ) {
|
||||||
default:
|
default:
|
||||||
pSocket->errno = EIO;
|
pSocket->errno = EIO;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_CONNECTION_FIN:
|
case EFI_CONNECTION_FIN:
|
||||||
pSocket->errno = ESHUTDOWN;
|
//
|
||||||
|
// Continue to return zero bytes received when the
|
||||||
|
// peer has successfully closed the connection
|
||||||
|
//
|
||||||
|
pSocket->RxError = EFI_CONNECTION_FIN;
|
||||||
|
*pDataLength = 0;
|
||||||
|
pSocket->errno = 0;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EFI_CONNECTION_REFUSED:
|
case EFI_CONNECTION_REFUSED:
|
||||||
@ -2481,7 +2489,6 @@ EslTcpReceive4 (
|
|||||||
pSocket->errno = ENOPROTOOPT;
|
pSocket->errno = ENOPROTOOPT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pSocket->RxError = EFI_SUCCESS;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Status = EFI_NOT_READY;
|
Status = EFI_NOT_READY;
|
||||||
|
Reference in New Issue
Block a user