From: lpleahy Date: Fri, 24 Feb 2012 18:45:09 +0000 (+0000) Subject: Fix issues detected by python web-server. X-Git-Tag: edk2-stable201903~13626 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=f74dc4bbba84a07f8c01fea4c43aa77d800ee43c;p=mirror_edk2.git Fix issues detected by python web-server. * Removed display of TPL * Added NOP implementation for SO_REUSEADDR * Add better detection of socket address * Return first address Signed-off-by: lpleahy Python Web server below: --------------- import sys import BaseHTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler HandlerClass = SimpleHTTPRequestHandler ServerClass = BaseHTTPServer.HTTPServer Protocol = "HTTP/1.0" port = 80 server_address = ('', port) HandlerClass.protocol_version = Protocol httpd = ServerClass(server_address, HandlerClass) sa = httpd.socket.getsockname() print "Serving HTTP on", sa[0], "port", sa[1], "..." httpd.serve_forever() git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13034 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/StdLib/EfiSocketLib/Ip4.c b/StdLib/EfiSocketLib/Ip4.c index f295b4250e..5a0f5284f5 100644 --- a/StdLib/EfiSocketLib/Ip4.c +++ b/StdLib/EfiSocketLib/Ip4.c @@ -619,6 +619,7 @@ EslIp4RemoteAddressSet ( pIp4->DestinationAddress.Addr[1] = (UINT8)( pRemoteAddress->sin_addr.s_addr >> 8 ); pIp4->DestinationAddress.Addr[2] = (UINT8)( pRemoteAddress->sin_addr.s_addr >> 16 ); pIp4->DestinationAddress.Addr[3] = (UINT8)( pRemoteAddress->sin_addr.s_addr >> 24 ); + pPort->pSocket->bAddressSet = TRUE; Status = EFI_SUCCESS; // diff --git a/StdLib/EfiSocketLib/Socket.c b/StdLib/EfiSocketLib/Socket.c index d6adba3237..acb23677aa 100644 --- a/StdLib/EfiSocketLib/Socket.c +++ b/StdLib/EfiSocketLib/Socket.c @@ -1259,7 +1259,10 @@ EslSocketBind ( // // Verify that at least one network connection was found // - if ( NULL == pSocket->pPortList ) { + if ( NULL != pSocket->pPortList ) { + Status = EFI_SUCCESS; + } + else { if ( EADDRNOTAVAIL == pSocket->errno ) { DEBUG (( DEBUG_BIND | DEBUG_POOL | DEBUG_INIT, "ERROR - Socket address is not available!\r\n" )); @@ -1993,70 +1996,60 @@ EslSocketGetLocalAddress ( // // Verify the socket state // - Status = EslSocketIsConfigured ( pSocket ); - if ( !EFI_ERROR ( Status )) { + EslSocketIsConfigured ( pSocket ); + if ( pSocket->bAddressSet ) { // // Verify the address buffer and length address // if (( NULL != pAddress ) && ( NULL != pAddressLength )) { // - // Verify the socket state + // Verify the API // - if (( SOCKET_STATE_CONNECTED == pSocket->State ) - || ( SOCKET_STATE_LISTENING == pSocket->State )) { + if ( NULL == pSocket->pApi->pfnLocalAddrGet ) { + Status = EFI_UNSUPPORTED; + pSocket->errno = ENOTSUP; + } + else { // - // Verify the API + // Synchronize with the socket layer // - if ( NULL == pSocket->pApi->pfnLocalAddrGet ) { - Status = EFI_UNSUPPORTED; - pSocket->errno = ENOTSUP; - } - else { - // - // Synchronize with the socket layer - // - RAISE_TPL ( TplPrevious, TPL_SOCKETS ); + RAISE_TPL ( TplPrevious, TPL_SOCKETS ); + // + // Verify that there is just a single connection + // + pPort = pSocket->pPortList; + if ( NULL != pPort ) { // - // Verify that there is just a single connection + // Verify the address length // - pPort = pSocket->pPortList; - if (( NULL != pPort ) && ( NULL == pPort->pLinkSocket )) { + LengthInBytes = pSocket->pApi->AddressLength; + if (( LengthInBytes <= *pAddressLength ) + && ( 255 >= LengthInBytes )) { // - // Verify the address length + // Return the local address and address length // - LengthInBytes = pSocket->pApi->AddressLength; - if (( LengthInBytes <= *pAddressLength ) - && ( 255 >= LengthInBytes )) { - // - // Return the local address and address length - // - ZeroMem ( pAddress, LengthInBytes ); - pAddress->sa_len = (uint8_t)LengthInBytes; - *pAddressLength = pAddress->sa_len; - pSocket->pApi->pfnLocalAddrGet ( pPort, pAddress ); - pSocket->errno = 0; - Status = EFI_SUCCESS; - } - else { - pSocket->errno = EINVAL; - Status = EFI_INVALID_PARAMETER; - } + ZeroMem ( pAddress, LengthInBytes ); + pAddress->sa_len = (uint8_t)LengthInBytes; + *pAddressLength = pAddress->sa_len; + pSocket->pApi->pfnLocalAddrGet ( pPort, pAddress ); + pSocket->errno = 0; + Status = EFI_SUCCESS; } else { - pSocket->errno = ENOTCONN; - Status = EFI_NOT_STARTED; + pSocket->errno = EINVAL; + Status = EFI_INVALID_PARAMETER; } - - // - // Release the socket layer synchronization - // - RESTORE_TPL ( TplPrevious ); } - } - else { - pSocket->errno = ENOTCONN; - Status = EFI_NOT_STARTED; + else { + pSocket->errno = ENOTCONN; + Status = EFI_NOT_STARTED; + } + + // + // Release the socket layer synchronization + // + RESTORE_TPL ( TplPrevious ); } } else { @@ -2064,6 +2057,13 @@ EslSocketGetLocalAddress ( Status = EFI_INVALID_PARAMETER; } } + else { + // + // Address not set + // + Status = EFI_NOT_STARTED; + pSocket->errno = EADDRNOTAVAIL; + } } // @@ -2808,6 +2808,14 @@ EslSocketOptionGet ( LengthInBytes = sizeof ( pSocket->MaxRxBuf ); break; + case SO_REUSEADDR: + // + // Return the address reuse flag + // + pOptionData = (UINT8 *)&pSocket->bReUseAddr; + LengthInBytes = sizeof ( pSocket->bReUseAddr ); + break; + case SO_SNDBUF: // // Return the maximum transmit buffer size @@ -3032,6 +3040,14 @@ EslSocketOptionSet ( LengthInBytes = sizeof ( pSocket->MaxRxBuf ); break; + case SO_REUSEADDR: + // + // Return the address reuse flag + // + pOptionData = (UINT8 *)&pSocket->bReUseAddr; + LengthInBytes = sizeof ( pSocket->bReUseAddr ); + break; + case SO_SNDBUF: // // Send buffer size diff --git a/StdLib/EfiSocketLib/Socket.h b/StdLib/EfiSocketLib/Socket.h index 30b642000e..f2fbdb57b3 100644 --- a/StdLib/EfiSocketLib/Socket.h +++ b/StdLib/EfiSocketLib/Socket.h @@ -989,9 +989,10 @@ typedef struct _ESL_SOCKET { // // Socket options // + BOOLEAN bIncludeHeader; ///< TRUE if including the IP header BOOLEAN bListenCalled; ///< TRUE if listen was successfully called BOOLEAN bOobInLine; ///< TRUE if out-of-band messages are to be received inline with normal data - BOOLEAN bIncludeHeader; ///< TRUE if including the IP header + BOOLEAN bReUseAddr; ///< TRUE if using same address is allowed // // Socket data @@ -999,6 +1000,7 @@ typedef struct _ESL_SOCKET { int Domain; ///< Specifies family of protocols int Type; ///< Specifies how to make network connection int Protocol; ///< Specifies lower layer protocol to use + BOOLEAN bAddressSet; ///< Set when the address is specified BOOLEAN bConfigured; ///< Set after the socket is configured BOOLEAN bRxDisable; ///< Receive disabled via shutdown diff --git a/StdLib/EfiSocketLib/Tcp4.c b/StdLib/EfiSocketLib/Tcp4.c index b3ed45a716..32c7a394c4 100644 --- a/StdLib/EfiSocketLib/Tcp4.c +++ b/StdLib/EfiSocketLib/Tcp4.c @@ -1171,6 +1171,7 @@ EslTcp4LocalAddressSet ( // Set the port number // pAccessPoint->StationPort = SwapBytes16 ( pIpAddress->sin_port ); + pPort->pSocket->bAddressSet = TRUE; // // Display the local address diff --git a/StdLib/EfiSocketLib/Tcp6.c b/StdLib/EfiSocketLib/Tcp6.c index 0ee9fb6a64..6f2cf75779 100644 --- a/StdLib/EfiSocketLib/Tcp6.c +++ b/StdLib/EfiSocketLib/Tcp6.c @@ -1210,6 +1210,7 @@ EslTcp6LocalAddressSet ( // Set the port number // pAccessPoint->StationPort = SwapBytes16 ( pIpAddress->sin6_port ); + pPort->pSocket->bAddressSet = TRUE; // // Display the local address diff --git a/StdLib/EfiSocketLib/Udp4.c b/StdLib/EfiSocketLib/Udp4.c index 6625c078d0..ae67c4e8c5 100644 --- a/StdLib/EfiSocketLib/Udp4.c +++ b/StdLib/EfiSocketLib/Udp4.c @@ -463,6 +463,7 @@ EslUdp4RemoteAddressSet ( pUdp4->ConfigData.RemoteAddress.Addr[2] = (UINT8)( pRemoteAddress->sin_addr.s_addr >> 16 ); pUdp4->ConfigData.RemoteAddress.Addr[3] = (UINT8)( pRemoteAddress->sin_addr.s_addr >> 24 ); pUdp4->ConfigData.RemotePort = SwapBytes16 ( pRemoteAddress->sin_port ); + pPort->pSocket->bAddressSet = TRUE; Status = EFI_SUCCESS; // diff --git a/StdLib/EfiSocketLib/Udp6.c b/StdLib/EfiSocketLib/Udp6.c index 187f0ad641..9f47f1c736 100644 --- a/StdLib/EfiSocketLib/Udp6.c +++ b/StdLib/EfiSocketLib/Udp6.c @@ -113,6 +113,7 @@ EslUdp6LocalAddressSet ( // Set the port number // pConfig->StationPort = SwapBytes16 ( pIpAddress->sin6_port ); + pPort->pSocket->bAddressSet = TRUE; // // Display the local address diff --git a/StdLib/Include/Efi/EfiSocketLib.h b/StdLib/Include/Efi/EfiSocketLib.h index f71653fa16..d78e9f6a12 100644 --- a/StdLib/Include/Efi/EfiSocketLib.h +++ b/StdLib/Include/Efi/EfiSocketLib.h @@ -115,18 +115,12 @@ **/ #define RAISE_TPL(PreviousTpl, tpl) \ VERIFY_TPL ( tpl ); \ - PreviousTpl = gBS->RaiseTPL ( tpl ); \ - DEBUG (( DEBUG_TPL | DEBUG_TPL, \ - "%d: TPL\r\n", \ - tpl )) + PreviousTpl = gBS->RaiseTPL ( tpl ); /** Restore the TPL to the previous value **/ #define RESTORE_TPL(tpl) \ - DEBUG (( DEBUG_TPL | DEBUG_TPL, \ - "%d: TPL\r\n", \ - tpl )); \ gBS->RestoreTPL ( tpl ) //------------------------------------------------------------------------------