+/**\r
+ Verify the adapter's IP address\r
+\r
+ This support routine is called by EslSocketBindTest.\r
+\r
+ @param [in] pPort Address of an ::ESL_PORT structure.\r
+ @param [in] pConfigData Address of the configuration data\r
+\r
+ @retval EFI_SUCCESS - The IP address is valid\r
+ @retval EFI_NOT_STARTED - The IP address is invalid\r
+\r
+ **/\r
+EFI_STATUS\r
+EslTcp4VerifyLocalIpAddress (\r
+ IN ESL_PORT * pPort,\r
+ IN EFI_TCP4_CONFIG_DATA * pConfigData\r
+ )\r
+{\r
+ UINTN DataSize;\r
+ EFI_TCP4_ACCESS_POINT * pAccess;\r
+ EFI_IP4_CONFIG2_INTERFACE_INFO * pIfInfo;\r
+ EFI_IP4_CONFIG2_PROTOCOL * pIpConfig2Protocol;\r
+ ESL_SERVICE * pService;\r
+ EFI_STATUS Status;\r
+\r
+ DBG_ENTER ( );\r
+\r
+ //\r
+ // Use break instead of goto\r
+ //\r
+ pIfInfo = NULL;\r
+ for ( ; ; ) {\r
+ //\r
+ // Determine if the IP address is specified\r
+ //\r
+ pAccess = &pConfigData->AccessPoint;\r
+ DEBUG (( DEBUG_BIND,\r
+ "UseDefaultAddress: %s\r\n",\r
+ pAccess->UseDefaultAddress ? L"TRUE" : L"FALSE" ));\r
+ DEBUG (( DEBUG_BIND,\r
+ "Requested IP address: %d.%d.%d.%d\r\n",\r
+ pAccess->StationAddress.Addr [ 0 ],\r
+ pAccess->StationAddress.Addr [ 1 ],\r
+ pAccess->StationAddress.Addr [ 2 ],\r
+ pAccess->StationAddress.Addr [ 3 ]));\r
+ if ( pAccess->UseDefaultAddress\r
+ || (( 0 == pAccess->StationAddress.Addr [ 0 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 1 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 2 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 3 ])))\r
+ {\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Open the configuration protocol\r
+ //\r
+ pService = pPort->pService;\r
+ Status = gBS->OpenProtocol ( \r
+ pService->Controller,\r
+ &gEfiIp4Config2ProtocolGuid,\r
+ (VOID **)&pIpConfig2Protocol,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL \r
+ );\r
+ if ( EFI_ERROR ( Status )) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - IP Configuration Protocol not available, Status: %r\r\n",\r
+ Status ));\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Get the interface information size.\r
+ //\r
+ DataSize = 0;\r
+ Status = pIpConfig2Protocol->GetData ( \r
+ pIpConfig2Protocol,\r
+ Ip4Config2DataTypeInterfaceInfo,\r
+ &DataSize,\r
+ NULL\r
+ );\r
+ if ( EFI_BUFFER_TOO_SMALL != Status ) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Failed to get the interface information size, Status: %r\r\n",\r
+ Status ));\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Allocate the interface information buffer\r
+ //\r
+ pIfInfo = AllocatePool ( DataSize );\r
+ if ( NULL == pIfInfo ) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Not enough memory to allocate the interface information buffer!\r\n" ));\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Get the interface info.\r
+ //\r
+ Status = pIpConfig2Protocol->GetData ( \r
+ pIpConfig2Protocol,\r
+ Ip4Config2DataTypeInterfaceInfo,\r
+ &DataSize,\r
+ pIfInfo\r
+ );\r
+ if ( EFI_ERROR ( Status )) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Failed to return the interface info, Status: %r\r\n",\r
+ Status ));\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the current configuration\r
+ //\r
+ DEBUG (( DEBUG_BIND,\r
+ "Actual adapter IP address: %d.%d.%d.%d\r\n",\r
+ pIfInfo->StationAddress.Addr [ 0 ],\r
+ pIfInfo->StationAddress.Addr [ 1 ],\r
+ pIfInfo->StationAddress.Addr [ 2 ],\r
+ pIfInfo->StationAddress.Addr [ 3 ]));\r
+\r
+ //\r
+ // Assume the port is not configured\r
+ //\r
+ Status = EFI_SUCCESS;\r
+ if (( pAccess->StationAddress.Addr [ 0 ] == pIfInfo->StationAddress.Addr [ 0 ])\r
+ && ( pAccess->StationAddress.Addr [ 1 ] == pIfInfo->StationAddress.Addr [ 1 ])\r
+ && ( pAccess->StationAddress.Addr [ 2 ] == pIfInfo->StationAddress.Addr [ 2 ])\r
+ && ( pAccess->StationAddress.Addr [ 3 ] == pIfInfo->StationAddress.Addr [ 3 ])) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // The IP address did not match\r
+ //\r
+ Status = EFI_NOT_STARTED;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Free the buffer if necessary\r
+ //\r
+ if ( NULL != pIfInfo ) {\r
+ FreePool ( pIfInfo );\r
+ }\r
+\r
+ //\r
+ // Return the IP address status\r
+ //\r
+ DBG_EXIT_STATUS ( Status );\r
+ return Status;\r
+}\r
+\r
+\r