X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=AppPkg%2FApplications%2FSockets%2FOobRx%2FOobRx.c;fp=AppPkg%2FApplications%2FSockets%2FOobRx%2FOobRx.c;h=7e6b8f7ed15a01e804a9e492f2f5f6523d22da76;hb=59bc059327dd519619fa437c0d7c941e090cd8a3;hp=0000000000000000000000000000000000000000;hpb=a88c31639bb24c73383a4528a5b77066e805148b;p=mirror_edk2.git diff --git a/AppPkg/Applications/Sockets/OobRx/OobRx.c b/AppPkg/Applications/Sockets/OobRx/OobRx.c new file mode 100644 index 0000000000..7e6b8f7ed1 --- /dev/null +++ b/AppPkg/Applications/Sockets/OobRx/OobRx.c @@ -0,0 +1,253 @@ +/** @file + Windows version of the OOB Receive application + + Copyright (c) 2011, Intel Corporation + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + +UINT8 mBuffer[65536]; + + +/** + Run the OOB receive application + + @param [in] ArgC Argument count + @param [in] ArgV Argument value array + + @retval 0 Successfully operation + **/ +int +OobRx ( + IN int ArgC, + IN char **ArgV + ) +{ + SOCKET a; + ssize_t BytesReceived; + struct sockaddr_in LocalPort; + UINT32 OobInLine; + UINT16 PortNumber; + struct timeval ReceiveTimeout; + struct sockaddr_in RemotePort; + socklen_t RemotePortLength; + int RetVal; + SOCKET s; + UINT32 TransmittedBefore; + UINT32 TransmittedDuring; + UINT32 TransmittedOob; + UINT32 TransmittedAfter; + UINT32 * pTransmittedBytes; + + // + // Create the socket + // + s = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + if ( -1 == s ) { + RetVal = GET_ERRNO; + printf ( "ERROR - socket error, errno: %d\r\n", RetVal ); + } + else { + // + // Use for/break; instead of goto + // + for ( ; ; ) { + // + // Bind the socket to a known port + // + PortNumber = OOB_RX_PORT; + memset ( &LocalPort, 0, sizeof ( LocalPort )); + SIN_LEN ( LocalPort ) = sizeof ( LocalPort ); + SIN_FAMILY ( LocalPort ) = AF_INET; + SIN_ADDR ( LocalPort ) = 0; + SIN_PORT ( LocalPort ) = htons ( PortNumber ); + RetVal = bind ( s, + (struct sockaddr *)&LocalPort, + sizeof ( LocalPort )); + if ( -1 == RetVal ) { + RetVal = GET_ERRNO; + printf ( "ERROR - bind error, errno: %d\r\n", RetVal ); + break; + } + + // + // Make the port available on the server + // + RetVal = listen ( s, 2 ); + if ( -1 == RetVal ) { + RetVal = GET_ERRNO; + printf ( "ERROR - listen error, errno: %d\r\n", RetVal ); + break; + } + + // + // Wait for a connection to the known port + // + RemotePortLength = sizeof ( RemotePort ); + a = accept ( s, + (struct sockaddr *)&RemotePort, + &RemotePortLength ); + if ( -1 == a ) { + RetVal = GET_ERRNO; + printf ( "ERROR - accept error, errno: %d\r\n", RetVal ); + break; + } + + // + // Use for/break instead of goto + // + for ( ; ; ) { + // + // Set the receive timeout + // + ReceiveTimeout.tv_sec = 0; + ReceiveTimeout.tv_usec = 20 * 1000; + RetVal = setsockopt ( a, + SOL_SOCKET, + SO_RCVTIMEO, + (char *)&ReceiveTimeout, + sizeof ( ReceiveTimeout )); + if ( -1 == RetVal ) { + RetVal = GET_ERRNO; + printf ( "ERROR - setsockopt RCVTIMEO error, errno: %d\r\n", RetVal ); + break; + } + + // + // Select the OOB processing + // + OobInLine = ( 1 < ArgC ); + RetVal = setsockopt ( s, + SOL_SOCKET, + SO_OOBINLINE, + (char *)&OobInLine, + sizeof ( OobInLine )); + if ( -1 == RetVal ) { + RetVal = GET_ERRNO; + printf ( "ERROR - setsockopt OOBINLINE error, errno: %d\r\n", RetVal ); + break; + } + printf ( "%s\r\n", ( 0 != OobInLine ) ? "OOB messages are in-line" + : "OOB messages move to the head of the queue" ); + + // + // Receive data from the remote system + // + TransmittedBefore = 0; + TransmittedOob = 0; + TransmittedDuring = 0; + TransmittedAfter = 0; + pTransmittedBytes = &TransmittedBefore; + do { + // + // Attempt to receive OOB data + // + BytesReceived = recv ( a, &mBuffer[0], sizeof ( mBuffer ), MSG_OOB ); + RetVal = (UINT32)BytesReceived; + if ( 0 < BytesReceived ) { + // + // Display the received OOB data + // + printf ( "%5Ld OOB bytes received\r\n", (UINT64)BytesReceived ); + + // + // Account for the bytes received + // + TransmittedOob += RetVal; + *pTransmittedBytes += TransmittedAfter; + TransmittedAfter = 0; + pTransmittedBytes = &TransmittedDuring; + } + else if ( -1 == BytesReceived ) { + // + // Check for connection timeout + // + RetVal = GET_ERRNO; + if ( RX_TIMEOUT_ERROR != RetVal ) { + // + // Receive error + // + printf ( "ERROR - recv OOB error, errno: %d\r\n", RetVal ); + break; + } + + // + // Ignore the timeout + // Try to receive normal data instead + // + BytesReceived = recv ( a, &mBuffer[0], sizeof ( mBuffer ), 0 ); + RetVal = (UINT32)BytesReceived; + if ( 0 < BytesReceived ) { + // + // Display the received data + // + printf ( "%4Ld bytes received\r\n", (UINT64)BytesReceived ); + + // + // Account for the bytes received + // + TransmittedAfter += RetVal; + } + else if ( -1 == BytesReceived ) { + // + // Check for a timeout + // + RetVal = GET_ERRNO; + if ( RX_TIMEOUT_ERROR != RetVal ) { + printf ( "ERROR - recv error, errno: %d\r\n", RetVal ); + break; + } + } + } + } while ( 0 != RetVal ); + + // + // Display the bytes received + // + if ( 0 == RetVal ) { + printf ( "Bytes before OOB: %8d\r\n", TransmittedBefore ); + if ( 0 != TransmittedDuring ) { + printf ( "Bytes during OOB: %8d\r\n", TransmittedDuring ); + } + printf ( "Out-of-band bytes: %8d\r\n", TransmittedOob ); + printf ( "Bytes after OOB: %8d\r\n", TransmittedAfter ); + printf ( " --------\r\n" ); + printf ( "Total Bytes: %8d\r\n", TransmittedBefore + + TransmittedDuring + + TransmittedOob + + TransmittedAfter ); + } + + // + // Test complete + // + break; + } + + // + // Close the test socket + // + CLOSE_SOCKET ( a ); + break; + } + + // + // Close the socket + // + CLOSE_SOCKET ( s ); + printf ( "Socket closed\r\n" ); + } + + // + // Return the operation status + // + return RetVal; +}