summaryrefslogtreecommitdiff
path: root/StdLib/EfiSocketLib
diff options
context:
space:
mode:
authorlpleahy <lpleahy@6f19259b-4bc3-4df7-8a09-765794883524>2012-02-24 18:45:09 +0000
committerlpleahy <lpleahy@6f19259b-4bc3-4df7-8a09-765794883524>2012-02-24 18:45:09 +0000
commitf74dc4bbba84a07f8c01fea4c43aa77d800ee43c (patch)
tree7802fb388e5d12a47ac8a6bf35abae8de12a27f0 /StdLib/EfiSocketLib
parent287b4d32eee06417557ca2229c4ed75701aa651e (diff)
downloadedk2-f74dc4bbba84a07f8c01fea4c43aa77d800ee43c.zip
edk2-f74dc4bbba84a07f8c01fea4c43aa77d800ee43c.tar.gz
edk2-f74dc4bbba84a07f8c01fea4c43aa77d800ee43c.tar.bz2
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
Diffstat (limited to 'StdLib/EfiSocketLib')
-rw-r--r--StdLib/EfiSocketLib/Ip4.c1
-rw-r--r--StdLib/EfiSocketLib/Socket.c112
-rw-r--r--StdLib/EfiSocketLib/Socket.h4
-rw-r--r--StdLib/EfiSocketLib/Tcp4.c1
-rw-r--r--StdLib/EfiSocketLib/Tcp6.c1
-rw-r--r--StdLib/EfiSocketLib/Udp4.c1
-rw-r--r--StdLib/EfiSocketLib/Udp6.c1
7 files changed, 72 insertions, 49 deletions
diff --git a/StdLib/EfiSocketLib/Ip4.c b/StdLib/EfiSocketLib/Ip4.c
index f295b42..5a0f528 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 d6adba3..acb2367 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 30b6420..f2fbdb5 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 b3ed45a..32c7a39 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 0ee9fb6..6f2cf75 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 6625c07..ae67c4e 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 187f0ad..9f47f1c 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