/** Get the length of the data that can be retrieved from the socket receive buffer. @param SockBuffer Pointer to the socket receive buffer. @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is OOB. @param BufLen The maximum length of the data buffer to store the received data in socket layer. @return The length of the data can be retreived. **/ UINT32 SockTcpDataToRcv ( IN SOCK_BUFFER *SockBuffer, OUT BOOLEAN *IsUrg, IN UINT32 BufLen ) { NET_BUF *RcvBufEntry; UINT32 DataLen; TCP_RSV_DATA *TcpRsvData; BOOLEAN Urg; ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); RcvBufEntry = SockBufFirst (SockBuffer); ASSERT (RcvBufEntry != NULL); TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { DataLen = MIN (TcpRsvData->UrgLen, BufLen); if (DataLen < TcpRsvData->UrgLen) { TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; } else { TcpRsvData->UrgLen = 0; } return DataLen; } DataLen = RcvBufEntry->TotalSize; RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); if (*IsUrg != Urg) { break; } if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { if (TcpRsvData->UrgLen + DataLen < BufLen) { TcpRsvData->UrgLen = 0; } else { TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); } return MIN (TcpRsvData->UrgLen + DataLen, BufLen); } DataLen += RcvBufEntry->TotalSize; RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); } DataLen = MIN (BufLen, DataLen); return DataLen; }
/** Get the length of the data that can be retrieved from the socket receive buffer. @param[in] SockBuffer Pointer to the socket receive buffer. @param[out] IsUrg Pointer to a BOOLEAN variable. If TRUE the data is OOB. @param[in] BufLen The maximum length of the data buffer to store the received data in the socket layer. @return The length of the data can be retreived. **/ UINT32 SockTcpDataToRcv ( IN SOCK_BUFFER *SockBuffer, OUT BOOLEAN *IsUrg, IN UINT32 BufLen ) { NET_BUF *RcvBufEntry; UINT32 DataLen; TCP_RSV_DATA *TcpRsvData; BOOLEAN Urg; ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); // // Get the first socket receive buffer // RcvBufEntry = SockBufFirst (SockBuffer); ASSERT (RcvBufEntry != NULL); TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; // // Check whether the receive data is out of bound. If yes, calculate the maximum // allowed length of the urgent data and output it. // *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); if (*IsUrg && (TcpRsvData->UrgLen < RcvBufEntry->TotalSize)) { DataLen = MIN (TcpRsvData->UrgLen, BufLen); if (DataLen < TcpRsvData->UrgLen) { TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; } else { TcpRsvData->UrgLen = 0; } return DataLen; } // // Process the next socket receive buffer to get the maximum allowed length // of the received data. // DataLen = RcvBufEntry->TotalSize; RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); if (*IsUrg != Urg) { break; } if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { if (TcpRsvData->UrgLen + DataLen < BufLen) { TcpRsvData->UrgLen = 0; } else { TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); } return MIN (TcpRsvData->UrgLen + DataLen, BufLen); } DataLen += RcvBufEntry->TotalSize; RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); } DataLen = MIN (BufLen, DataLen); return DataLen; }