4, // RX buffers\r
4, // TX buffers\r
4 }, // TX Oob buffers\r
+ { L"Tcp6",\r
+ &gEfiTcp6ServiceBindingProtocolGuid,\r
+ &gEfiTcp6ProtocolGuid,\r
+ &mEslTcp6ServiceGuid,\r
+ OFFSET_OF ( ESL_LAYER, pTcp6List ),\r
+ 4, // RX buffers\r
+ 4, // TX buffers\r
+ 4 }, // TX Oob buffers\r
{ L"Udp4",\r
&gEfiUdp4ServiceBindingProtocolGuid,\r
&gEfiUdp4ProtocolGuid,\r
OFFSET_OF ( ESL_LAYER, pUdp4List ),\r
4, // RX buffers\r
4, // TX buffers\r
+ 0 }, // TX Oob buffers\r
+ { L"Udp6",\r
+ &gEfiUdp6ServiceBindingProtocolGuid,\r
+ &gEfiUdp6ProtocolGuid,\r
+ &mEslUdp6ServiceGuid,\r
+ OFFSET_OF ( ESL_LAYER, pUdp6List ),\r
+ 4, // RX buffers\r
+ 4, // TX buffers\r
0 } // TX Oob buffers\r
};\r
\r
**/\r
CONST ESL_PROTOCOL_API * cEslAfInet6Api[] = {\r
NULL, // 0\r
- NULL, // SOCK_STREAM\r
- NULL, // SOCK_DGRAM\r
+ &cEslTcp6Api, // SOCK_STREAM\r
+ &cEslUdp6Api, // SOCK_DGRAM\r
NULL, // SOCK_RAW\r
NULL, // SOCK_RDM\r
- NULL // SOCK_SEQPACKET\r
+ &cEslTcp6Api // SOCK_SEQPACKET\r
};\r
\r
/**\r
// Validate the domain value\r
//\r
if (( AF_INET != domain )\r
+ && ( AF_INET6 != domain )\r
&& ( AF_LOCAL != domain )) {\r
DEBUG (( DEBUG_ERROR | DEBUG_SOCKET,\r
"ERROR - Invalid domain value\r\n" ));\r
if ( EFI_NOT_READY != Status ) {\r
if ( !EFI_ERROR ( Status )) {\r
pSocket->State = SOCKET_STATE_CONNECTED;\r
+\r
+ //\r
+ // Start the receive operations\r
+ //\r
+ EslSocketRxStart ( pSocket->pPortList );\r
}\r
else {\r
pSocket->State = SOCKET_STATE_BOUND;\r
//\r
// Verify the socket state\r
//\r
- if ( SOCKET_STATE_CONNECTED == pSocket->State ) {\r
+ if (( SOCKET_STATE_CONNECTED == pSocket->State )\r
+ || ( SOCKET_STATE_LISTENING == pSocket->State )) {\r
//\r
// Verify the API\r
//\r
IN ESL_IO_MGMT ** ppFreeQueue,\r
IN UINTN DebugFlags,\r
IN CHAR8 * pEventName,\r
- IN EFI_EVENT_NOTIFY pfnCompletion\r
+ IN PFN_API_IO_COMPLETE pfnCompletion\r
)\r
{\r
ESL_IO_MGMT * pEnd;\r
int errno;\r
socklen_t LengthInBytes;\r
socklen_t MaxBytes;\r
- UINT8 * pOptionData;\r
+ CONST UINT8 * pOptionData;\r
ESL_SOCKET * pSocket;\r
EFI_STATUS Status;\r
\r
if ( pSocket->pApi->DefaultProtocol == level ) {\r
Status = pSocket->pApi->pfnOptionGet ( pSocket,\r
OptionName,\r
- &pOptionData,\r
+ (CONST void ** __restrict)&pOptionData,\r
&LengthInBytes );\r
errno = pSocket->errno;\r
break;\r
//\r
// Return the listen flag\r
//\r
- pOptionData = (UINT8 *)&pSocket->bListenCalled;\r
+ pOptionData = (CONST UINT8 *)&pSocket->bListenCalled;\r
LengthInBytes = sizeof ( pSocket->bListenCalled );\r
break;\r
\r
//\r
// Return the debug flags\r
//\r
- pOptionData = (UINT8 *)&pSocket->bOobInLine;\r
+ pOptionData = (CONST UINT8 *)&pSocket->bOobInLine;\r
LengthInBytes = sizeof ( pSocket->bOobInLine );\r
break;\r
\r
//\r
// Return the out-of-band inline flag\r
//\r
- pOptionData = (UINT8 *)&pSocket->bOobInLine;\r
+ pOptionData = (CONST UINT8 *)&pSocket->bOobInLine;\r
LengthInBytes = sizeof ( pSocket->bOobInLine );\r
break;\r
\r
//\r
// Return the receive timeout\r
//\r
- pOptionData = (UINT8 *)&pSocket->RxTimeout;\r
+ pOptionData = (CONST UINT8 *)&pSocket->RxTimeout;\r
LengthInBytes = sizeof ( pSocket->RxTimeout );\r
break;\r
\r
//\r
// Return the maximum receive buffer size\r
//\r
- pOptionData = (UINT8 *)&pSocket->MaxRxBuf;\r
+ pOptionData = (CONST UINT8 *)&pSocket->MaxRxBuf;\r
LengthInBytes = sizeof ( pSocket->MaxRxBuf );\r
break;\r
\r
//\r
// Return the maximum transmit buffer size\r
//\r
- pOptionData = (UINT8 *)&pSocket->MaxTxBuf;\r
+ pOptionData = (CONST UINT8 *)&pSocket->MaxTxBuf;\r
LengthInBytes = sizeof ( pSocket->MaxTxBuf );\r
break;\r
\r
//\r
// Return the socket type\r
//\r
- pOptionData = (UINT8 *)&pSocket->Type;\r
+ pOptionData = (CONST UINT8 *)&pSocket->Type;\r
LengthInBytes = sizeof ( pSocket->Type );\r
break;\r
}\r
LengthInBytes,\r
(VOID **)&pPacket );\r
if ( !EFI_ERROR ( Status )) {\r
- DEBUG (( DebugFlags | DEBUG_POOL | DEBUG_INIT,\r
+ DEBUG (( DebugFlags | DEBUG_POOL,\r
"0x%08x: Allocate pPacket, %d bytes\r\n",\r
pPacket,\r
LengthInBytes ));\r
short DetectedEvents;\r
ESL_SOCKET * pSocket;\r
EFI_STATUS Status;\r
+ EFI_TPL TplPrevious;\r
short ValidEvents;\r
\r
DEBUG (( DEBUG_POLL, "Entering SocketPoll\r\n" ));\r
Events & ( ~ValidEvents )));\r
}\r
else {\r
+ //\r
+ // Synchronize with the socket layer\r
+ //\r
+ RAISE_TPL ( TplPrevious, TPL_SOCKETS );\r
+ \r
+ //\r
+ // Increase the network performance by extending the\r
+ // polling (idle) loop down into the LAN driver\r
+ //\r
+ EslSocketRxPoll ( pSocket );\r
+ \r
+ //\r
+ // Release the socket layer synchronization\r
+ //\r
+ RESTORE_TPL ( TplPrevious );\r
+\r
//\r
// Check for pending connections\r
//\r
// Verify that the socket is connected\r
//\r
if ( SOCKET_STATE_CONNECTED == pSocket->State ) {\r
+ //\r
+ // Poll the network to increase performance\r
+ //\r
+ EslSocketRxPoll ( pSocket );\r
+\r
//\r
// Locate the port\r
//\r
}\r
\r
\r
+/**\r
+ Poll a socket for pending receive activity.\r
+\r
+ This routine is called at elivated TPL and extends the idle\r
+ loop which polls a socket down into the LAN driver layer to\r
+ determine if there is any receive activity.\r
+\r
+ The ::EslSocketPoll, ::EslSocketReceive and ::EslSocketTransmit\r
+ routines call this routine when there is nothing to do.\r
+\r
+ @param [in] pSocket Address of an ::EFI_SOCKET structure.\r
+\r
+ **/\r
+VOID\r
+EslSocketRxPoll (\r
+ IN ESL_SOCKET * pSocket\r
+ )\r
+{\r
+ ESL_PORT * pPort;\r
+\r
+ DEBUG (( DEBUG_POLL, "Entering EslSocketRxPoll\r\n" ));\r
+\r
+ //\r
+ // Increase the network performance by extending the\r
+ // polling (idle) loop down into the LAN driver\r
+ //\r
+ pPort = pSocket->pPortList;\r
+ while ( NULL != pPort ) {\r
+ //\r
+ // Poll the LAN adapter\r
+ //\r
+ pPort->pfnRxPoll ( pPort->pProtocol.v );\r
+\r
+ //\r
+ // Locate the next LAN adapter\r
+ //\r
+ pPort = pPort->pLinkSocket;\r
+ }\r
+\r
+ DEBUG (( DEBUG_POLL, "Exiting EslSocketRxPoll\r\n" ));\r
+}\r
+\r
+\r
/**\r
Start a receive operation\r
\r
//\r
RAISE_TPL ( TplPrevious, TPL_SOCKETS );\r
\r
+ //\r
+ // Poll the network to increase performance\r
+ //\r
+ EslSocketRxPoll ( pSocket );\r
+\r
//\r
// Attempt to buffer the packet for transmission\r
//\r