summaryrefslogtreecommitdiff
path: root/StdLib/EfiSocketLib/UseEfiSocketLib.c
diff options
context:
space:
mode:
Diffstat (limited to 'StdLib/EfiSocketLib/UseEfiSocketLib.c')
-rw-r--r--StdLib/EfiSocketLib/UseEfiSocketLib.c138
1 files changed, 104 insertions, 34 deletions
diff --git a/StdLib/EfiSocketLib/UseEfiSocketLib.c b/StdLib/EfiSocketLib/UseEfiSocketLib.c
index a07b2b6e22..1c122af650 100644
--- a/StdLib/EfiSocketLib/UseEfiSocketLib.c
+++ b/StdLib/EfiSocketLib/UseEfiSocketLib.c
@@ -15,14 +15,30 @@
#include "Socket.h"
-CONST EFI_GUID mEslRawServiceGuid = {
- 0xc31bf4a5, 0x2c7, 0x49d2, { 0xa5, 0x58, 0xfe, 0x62, 0x6f, 0x7e, 0xd4, 0x77 }
+/**
+ The following GUID values are only used when an application links
+ against EfiSocketLib. An alternative set of values exists in
+ SocketDxe\EntryUnload.c which the SocketDxe driver uses to coexist
+ with socket applications.
+
+ Tag GUID - IPv4 in use by an application using EfiSocketLib
+**/
+CONST EFI_GUID mEslIp4ServiceGuid = {
+ 0x9c756011, 0x5d44, 0x4ee0, { 0xbc, 0xe7, 0xc3, 0x82, 0x18, 0xfe, 0x39, 0x8d }
};
+
+/**
+ Tag GUID - TCPv4 in use by an application using EfiSocketLib
+**/
CONST EFI_GUID mEslTcp4ServiceGuid = {
0xffc659c2, 0x4ef2, 0x4532, { 0xb8, 0x75, 0xcd, 0x9a, 0xa4, 0x27, 0x4c, 0xde }
};
+
+/**
+ Tag GUID - UDPv4 in use by an application using EfiSocketLib
+**/
CONST EFI_GUID mEslUdp4ServiceGuid = {
0x44e03a55, 0x8d97, 0x4511, { 0xbf, 0xef, 0xa, 0x8b, 0xc6, 0x2c, 0x25, 0xae }
};
@@ -31,10 +47,20 @@ CONST EFI_GUID mEslUdp4ServiceGuid = {
/**
Connect to the EFI socket library
- @param [in] ppSocketProtocol Address to receive the socket protocol address
+ This routine creates the ::ESL_SOCKET structure and returns
+ the API (::EFI_SOCKET_PROTOCOL address) to the socket file
+ system layer in BsdSocketLib.
+
+ This routine is called from the ::socket routine in BsdSocketLib
+ to create the data structure and initialize the API for a socket.
+ Note that this implementation is only used by socket applications
+ that link directly to EslSocketLib.
+
+ @param [in] ppSocketProtocol Address to receive the ::EFI_SOCKET_PROTOCOL
+ structure address
+
+ @return Value for ::errno, zero (0) indicates success.
- @retval 0 Successfully returned the socket protocol
- @retval other Value for errno
**/
int
EslServiceGetProtocol (
@@ -42,7 +68,7 @@ EslServiceGetProtocol (
)
{
EFI_HANDLE ChildHandle;
- DT_SOCKET * pSocket;
+ ESL_SOCKET * pSocket;
int RetVal;
EFI_STATUS Status;
@@ -81,6 +107,16 @@ EslServiceGetProtocol (
/**
Connect to the network layer
+ This routine is the constructor for the EfiSocketLib when the
+ library is linked directly to an application. This routine
+ walks the ::cEslSocketBinding table to create ::ESL_SERVICE
+ structures, associated with the network adapters, which this
+ routine links to the ::ESL_LAYER structure.
+
+ This routine is called from ::EslConstructor as a result of the
+ constructor redirection in ::mpfnEslConstructor at the end of this
+ file.
+
@retval EFI_SUCCESS Successfully connected to the network layer
**/
@@ -89,11 +125,12 @@ EslServiceNetworkConnect (
VOID
)
{
+ BOOLEAN bSomethingFound;
UINTN HandleCount;
- EFI_HANDLE * pHandles;
UINTN Index;
- CONST DT_SOCKET_BINDING * pSocketBinding;
- CONST DT_SOCKET_BINDING * pEnd;
+ CONST ESL_SOCKET_BINDING * pEnd;
+ EFI_HANDLE * pHandles;
+ CONST ESL_SOCKET_BINDING * pSocketBinding;
EFI_STATUS Status;
DBG_ENTER ( );
@@ -102,13 +139,14 @@ EslServiceNetworkConnect (
// Initialize the socket layer
//
Status = EFI_SUCCESS;
+ bSomethingFound = FALSE;
EslServiceLoad ( gImageHandle );
//
// Connect the network devices
//
- pSocketBinding = &cEslSocketBinding [0];
- pEnd = &pSocketBinding [ cEslSocketBindingEntries ];
+ pSocketBinding = &cEslSocketBinding[0];
+ pEnd = &pSocketBinding[ cEslSocketBindingEntries ];
while ( pEnd > pSocketBinding ) {
//
// Attempt to locate the network adapters
@@ -121,24 +159,30 @@ EslServiceNetworkConnect (
&HandleCount,
&pHandles );
if ( EFI_ERROR ( Status )) {
- break;
+ DEBUG (( DEBUG_ERROR,
+ "ERROR with %s layer, Status: %r\r\n",
+ pSocketBinding->pName,
+ Status ));
}
- if ( NULL != pHandles ) {
- //
- // Attempt to connect to this network adapter
- //
- for ( Index = 0; HandleCount > Index; Index++ ) {
- Status = EslServiceConnect ( gImageHandle,
- pHandles [ Index ]);
- if ( EFI_ERROR ( Status )) {
- break;
+ else {
+ if ( NULL != pHandles ) {
+ //
+ // Attempt to connect to this network adapter
+ //
+ for ( Index = 0; HandleCount > Index; Index++ ) {
+ Status = EslServiceConnect ( gImageHandle,
+ pHandles[ Index ]);
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ bSomethingFound = TRUE;
}
- }
- //
- // Done with the handles
- //
- gBS->FreePool ( pHandles );
+ //
+ // Done with the handles
+ //
+ gBS->FreePool ( pHandles );
+ }
}
//
@@ -150,6 +194,9 @@ EslServiceNetworkConnect (
//
// Return the network connection status
//
+ if ( bSomethingFound ) {
+ Status = EFI_SUCCESS;
+ }
DBG_EXIT_STATUS ( Status );
return Status;
}
@@ -158,6 +205,15 @@ EslServiceNetworkConnect (
/**
Disconnect from the network layer
+ Destructor for the EfiSocketLib when the library is linked
+ directly to an application. This routine walks the
+ ::cEslSocketBinding table to remove the ::ESL_SERVICE
+ structures (network connections) from the ::ESL_LAYER structure.
+
+ This routine is called from ::EslDestructor as a result of the
+ destructor redirection in ::mpfnEslDestructor at the end of this
+ file.
+
@retval EFI_SUCCESS Successfully disconnected from the network layer
**/
@@ -167,10 +223,10 @@ EslServiceNetworkDisconnect (
)
{
UINTN HandleCount;
- EFI_HANDLE * pHandles;
UINTN Index;
- CONST DT_SOCKET_BINDING * pSocketBinding;
- CONST DT_SOCKET_BINDING * pEnd;
+ CONST ESL_SOCKET_BINDING * pEnd;
+ EFI_HANDLE * pHandles;
+ CONST ESL_SOCKET_BINDING * pSocketBinding;
EFI_STATUS Status;
DBG_ENTER ( );
@@ -183,8 +239,8 @@ EslServiceNetworkDisconnect (
//
// Disconnect the network devices
//
- pSocketBinding = &cEslSocketBinding [0];
- pEnd = &pSocketBinding [ cEslSocketBindingEntries ];
+ pSocketBinding = &cEslSocketBinding[0];
+ pEnd = &pSocketBinding[ cEslSocketBindingEntries ];
while ( pEnd > pSocketBinding ) {
//
// Attempt to locate the network adapters
@@ -205,7 +261,7 @@ EslServiceNetworkDisconnect (
//
for ( Index = 0; HandleCount > Index; Index++ ) {
Status = EslServiceDisconnect ( gImageHandle,
- pHandles [ Index ]);
+ pHandles[ Index ]);
if ( EFI_ERROR ( Status )) {
break;
}
@@ -238,5 +294,19 @@ EslServiceNetworkDisconnect (
}
-PFN_ESL_xSTRUCTOR mpfnEslConstructor = EslServiceNetworkConnect;
-PFN_ESL_xSTRUCTOR mpfnEslDestructor = EslServiceNetworkDisconnect;
+/**
+ Socket layer's service binding protocol delcaration.
+**/
+CONST EFI_SERVICE_BINDING_PROTOCOL mEfiServiceBinding = {
+ NULL,
+ NULL
+};
+
+
+/**
+ The following entries redirect the constructor and destructor
+ for any socket application that links against the EfiSocketLib.
+ Note that the SocketDxe driver uses different redirection.
+**/
+PFN_ESL_xSTRUCTOR mpfnEslConstructor = EslServiceNetworkConnect; ///< Constructor for EfiSocketLib
+PFN_ESL_xSTRUCTOR mpfnEslDestructor = EslServiceNetworkDisconnect; ///< Destructor for EfiSocketLib