+\r
+ //\r
+ // Set errno if a failure occurs\r
+ //\r
+ if ( EFI_ERROR ( Status )) {\r
+ pSocket->errno = EADDRNOTAVAIL;\r
+ }\r
+ }\r
+ if ( !EFI_ERROR ( Status )) {\r
+ //\r
+ // Validate the buffer length\r
+ //\r
+ if (( NULL == pDataLength )\r
+ && ( 0 > pDataLength )\r
+ && ( NULL == pBuffer )) {\r
+ if ( NULL == pDataLength ) {\r
+ DEBUG (( DEBUG_RX,\r
+ "ERROR - pDataLength is NULL!\r\n" ));\r
+ }\r
+ else if ( NULL == pBuffer ) {\r
+ DEBUG (( DEBUG_RX,\r
+ "ERROR - pBuffer is NULL!\r\n" ));\r
+ }\r
+ else {\r
+ DEBUG (( DEBUG_RX,\r
+ "ERROR - Data length < 0!\r\n" ));\r
+ }\r
+ Status = EFI_INVALID_PARAMETER;\r
+ pSocket->errno = EFAULT;\r
+ }\r
+ else{\r
+ //\r
+ // Synchronize with the socket layer\r
+ //\r
+ RAISE_TPL ( TplPrevious, TPL_SOCKETS );\r
+\r
+ //\r
+ // Validate the local address\r
+ //\r
+ switch ( pSocket->Domain ) {\r
+ default:\r
+ DEBUG (( DEBUG_RX,\r
+ "ERROR - Invalid socket address family: %d\r\n",\r
+ pSocket->Domain ));\r
+ Status = EFI_INVALID_PARAMETER;\r
+ pSocket->errno = EADDRNOTAVAIL;\r
+ break;\r
+\r
+ case AF_INET:\r
+ //\r
+ // Determine the connection point within the network stack\r
+ //\r
+ switch ( pSocket->Type ) {\r
+ default:\r
+ DEBUG (( DEBUG_RX,\r
+ "ERROR - Invalid socket type: %d\r\n",\r
+ pSocket->Type));\r
+ Status = EFI_INVALID_PARAMETER;\r
+ pSocket->errno = EADDRNOTAVAIL;\r
+ break;\r
+\r
+ case SOCK_STREAM:\r
+ case SOCK_SEQPACKET:\r
+ Status = EslTcpReceive4 ( pSocket,\r
+ Flags,\r
+ BufferLength,\r
+ pBuffer,\r
+ pDataLength,\r
+ pAddress,\r
+ pAddressLength );\r
+ break;\r
+\r
+ case SOCK_DGRAM:\r
+ Status = EslUdpReceive4 ( pSocket,\r
+ Flags,\r
+ BufferLength,\r
+ pBuffer,\r
+ pDataLength,\r
+ pAddress,\r
+ pAddressLength);\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Release the socket layer synchronization\r
+ //\r
+ RESTORE_TPL ( TplPrevious );\r
+ }\r