/** Flush the sndBuffer and rcvBuffer of socket. @param Sock Pointer to the socket. **/ VOID SockConnFlush ( IN OUT SOCKET *Sock ) { SOCKET *Child; ASSERT (Sock != NULL); // // Clear the flag in this socket // Sock->Flag = 0; // // Flush the SndBuffer and RcvBuffer of Sock // NetbufQueFlush (Sock->SndBuffer.DataQueue); NetbufQueFlush (Sock->RcvBuffer.DataQueue); // // Signal the pending token // if (Sock->ConnectionToken != NULL) { SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError); Sock->ConnectionToken = NULL; } if (Sock->CloseToken != NULL) { SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError); Sock->CloseToken = NULL; } SockFlushPendingToken (Sock, &(Sock->ListenTokenList)); SockFlushPendingToken (Sock, &(Sock->RcvTokenList)); SockFlushPendingToken (Sock, &(Sock->SndTokenList)); SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList)); // // Destroy the pending connection, if it is a listening socket // if (SOCK_IS_LISTENING (Sock)) { while (!IsListEmpty (&Sock->ConnectionList)) { Child = NET_LIST_HEAD ( &Sock->ConnectionList, SOCKET, ConnectionList ); SockDestroyChild (Child); } Sock->ConnCnt = 0; } return ; }
/** Called by the low layer protocol to indicate that there will be no more data from the communication peer. This function sets the socket's state to SO_NO_MORE_DATA and signals all queued IO tokens with the error status EFI_CONNECTION_FIN. @param[in, out] Sock Pointer to the socket. **/ VOID SockNoMoreData ( IN OUT SOCKET *Sock ) { EFI_STATUS Err; SOCK_NO_MORE_DATA (Sock); if (!IsListEmpty (&Sock->RcvTokenList)) { ASSERT (0 == GET_RCV_DATASIZE (Sock)); Err = Sock->SockError; SOCK_ERROR (Sock, EFI_CONNECTION_FIN); SockFlushPendingToken (Sock, &Sock->RcvTokenList); SOCK_ERROR (Sock, Err); } }