+/**\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
+EslTcp6VerifyLocalIpAddress (\r
+ IN ESL_PORT * pPort,\r
+ IN EFI_TCP6_CONFIG_DATA * pConfigData\r
+ )\r
+{\r
+ UINTN AddressCount;\r
+ EFI_IP6_ADDRESS_INFO * pAddressInfo;\r
+ UINTN DataSize;\r
+ EFI_TCP6_ACCESS_POINT * pAccess;\r
+ EFI_IP6_CONFIG_INTERFACE_INFO * pIpConfigData;\r
+ EFI_IP6_CONFIG_PROTOCOL * pIpConfigProtocol;\r
+ ESL_SERVICE * pService;\r
+ EFI_STATUS Status;\r
+\r
+ DBG_ENTER ( );\r
+\r
+ //\r
+ // Use break instead of goto\r
+ //\r
+ pIpConfigData = NULL;\r
+ for ( ; ; ) {\r
+ //\r
+ // Determine if the IP address is specified\r
+ //\r
+ pAccess = &pConfigData->AccessPoint;\r
+ DEBUG (( DEBUG_BIND,\r
+ "Requested IP address: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\r\n",\r
+ pAccess->StationAddress.Addr[0],\r
+ pAccess->StationAddress.Addr[1],\r
+ pAccess->StationAddress.Addr[2],\r
+ pAccess->StationAddress.Addr[3],\r
+ pAccess->StationAddress.Addr[4],\r
+ pAccess->StationAddress.Addr[5],\r
+ pAccess->StationAddress.Addr[6],\r
+ pAccess->StationAddress.Addr[7],\r
+ pAccess->StationAddress.Addr[8],\r
+ pAccess->StationAddress.Addr[9],\r
+ pAccess->StationAddress.Addr[10],\r
+ pAccess->StationAddress.Addr[11],\r
+ pAccess->StationAddress.Addr[12],\r
+ pAccess->StationAddress.Addr[13],\r
+ pAccess->StationAddress.Addr[14],\r
+ pAccess->StationAddress.Addr[15]));\r
+ if (( 0 == pAccess->StationAddress.Addr [ 0 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 1 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 2 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 3 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 4 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 5 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 6 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 7 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 8 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 9 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 10 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 11 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 12 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 13 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 14 ])\r
+ && ( 0 == pAccess->StationAddress.Addr [ 15 ]))\r
+ {\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Open the configuration protocol\r
+ //\r
+ pService = pPort->pService;\r
+ Status = gBS->OpenProtocol ( pService->Controller,\r
+ &gEfiIp6ConfigProtocolGuid,\r
+ (VOID **)&pIpConfigProtocol,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL );\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 IP configuration data size\r
+ //\r
+ DataSize = 0;\r
+ Status = pIpConfigProtocol->GetData ( pIpConfigProtocol,\r
+ Ip6ConfigDataTypeInterfaceInfo,\r
+ &DataSize,\r
+ NULL );\r
+ if ( EFI_BUFFER_TOO_SMALL != Status ) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Failed to get IP Configuration data size, Status: %r\r\n",\r
+ Status ));\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Allocate the configuration data buffer\r
+ //\r
+ pIpConfigData = AllocatePool ( DataSize );\r
+ if ( NULL == pIpConfigData ) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Not enough memory to allocate IP Configuration data!\r\n" ));\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Get the IP configuration\r
+ //\r
+ Status = pIpConfigProtocol->GetData ( pIpConfigProtocol,\r
+ Ip6ConfigDataTypeInterfaceInfo,\r
+ &DataSize,\r
+ pIpConfigData );\r
+ if ( EFI_ERROR ( Status )) {\r
+ DEBUG (( DEBUG_ERROR,\r
+ "ERROR - Failed to return IP Configuration data, 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: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\r\n",\r
+ pIpConfigData->HwAddress.Addr [ 0 ],\r
+ pIpConfigData->HwAddress.Addr [ 1 ],\r
+ pIpConfigData->HwAddress.Addr [ 2 ],\r
+ pIpConfigData->HwAddress.Addr [ 3 ],\r
+ pIpConfigData->HwAddress.Addr [ 4 ],\r
+ pIpConfigData->HwAddress.Addr [ 5 ],\r
+ pIpConfigData->HwAddress.Addr [ 6 ],\r
+ pIpConfigData->HwAddress.Addr [ 7 ],\r
+ pIpConfigData->HwAddress.Addr [ 8 ],\r
+ pIpConfigData->HwAddress.Addr [ 9 ],\r
+ pIpConfigData->HwAddress.Addr [ 10 ],\r
+ pIpConfigData->HwAddress.Addr [ 11 ],\r
+ pIpConfigData->HwAddress.Addr [ 12 ],\r
+ pIpConfigData->HwAddress.Addr [ 13 ],\r
+ pIpConfigData->HwAddress.Addr [ 14 ],\r
+ pIpConfigData->HwAddress.Addr [ 15 ]));\r
+\r
+ //\r
+ // Validate the hardware address\r
+ //\r
+ Status = EFI_SUCCESS;\r
+ if (( 16 == pIpConfigData->HwAddressSize )\r
+ && ( pAccess->StationAddress.Addr [ 0 ] == pIpConfigData->HwAddress.Addr [ 0 ])\r
+ && ( pAccess->StationAddress.Addr [ 1 ] == pIpConfigData->HwAddress.Addr [ 1 ])\r
+ && ( pAccess->StationAddress.Addr [ 2 ] == pIpConfigData->HwAddress.Addr [ 2 ])\r
+ && ( pAccess->StationAddress.Addr [ 3 ] == pIpConfigData->HwAddress.Addr [ 3 ])\r
+ && ( pAccess->StationAddress.Addr [ 4 ] == pIpConfigData->HwAddress.Addr [ 4 ])\r
+ && ( pAccess->StationAddress.Addr [ 5 ] == pIpConfigData->HwAddress.Addr [ 5 ])\r
+ && ( pAccess->StationAddress.Addr [ 6 ] == pIpConfigData->HwAddress.Addr [ 6 ])\r
+ && ( pAccess->StationAddress.Addr [ 7 ] == pIpConfigData->HwAddress.Addr [ 7 ])\r
+ && ( pAccess->StationAddress.Addr [ 8 ] == pIpConfigData->HwAddress.Addr [ 8 ])\r
+ && ( pAccess->StationAddress.Addr [ 9 ] == pIpConfigData->HwAddress.Addr [ 9 ])\r
+ && ( pAccess->StationAddress.Addr [ 10 ] == pIpConfigData->HwAddress.Addr [ 10 ])\r
+ && ( pAccess->StationAddress.Addr [ 11 ] == pIpConfigData->HwAddress.Addr [ 11 ])\r
+ && ( pAccess->StationAddress.Addr [ 12 ] == pIpConfigData->HwAddress.Addr [ 12 ])\r
+ && ( pAccess->StationAddress.Addr [ 13 ] == pIpConfigData->HwAddress.Addr [ 13 ])\r
+ && ( pAccess->StationAddress.Addr [ 14 ] == pIpConfigData->HwAddress.Addr [ 14 ])\r
+ && ( pAccess->StationAddress.Addr [ 15 ] == pIpConfigData->HwAddress.Addr [ 15 ])) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Walk the list of other IP addresses assigned to this adapter\r
+ //\r
+ for ( AddressCount = 0; pIpConfigData->AddressInfoCount > AddressCount; AddressCount += 1 ) {\r
+ pAddressInfo = &pIpConfigData->AddressInfo [ AddressCount ];\r
+\r
+ //\r
+ // Display the IP address\r
+ //\r
+ DEBUG (( DEBUG_BIND,\r
+ "Actual adapter IP address: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\r\n",\r
+ pAddressInfo->Address.Addr [ 0 ],\r
+ pAddressInfo->Address.Addr [ 1 ],\r
+ pAddressInfo->Address.Addr [ 2 ],\r
+ pAddressInfo->Address.Addr [ 3 ],\r
+ pAddressInfo->Address.Addr [ 4 ],\r
+ pAddressInfo->Address.Addr [ 5 ],\r
+ pAddressInfo->Address.Addr [ 6 ],\r
+ pAddressInfo->Address.Addr [ 7 ],\r
+ pAddressInfo->Address.Addr [ 8 ],\r
+ pAddressInfo->Address.Addr [ 9 ],\r
+ pAddressInfo->Address.Addr [ 10 ],\r
+ pAddressInfo->Address.Addr [ 11 ],\r
+ pAddressInfo->Address.Addr [ 12 ],\r
+ pAddressInfo->Address.Addr [ 13 ],\r
+ pAddressInfo->Address.Addr [ 14 ],\r
+ pAddressInfo->Address.Addr [ 15 ]));\r
+\r
+ //\r
+ // Validate the IP address\r
+ //\r
+ if (( pAccess->StationAddress.Addr [ 0 ] == pAddressInfo->Address.Addr [ 0 ])\r
+ && ( pAccess->StationAddress.Addr [ 1 ] == pAddressInfo->Address.Addr [ 1 ])\r
+ && ( pAccess->StationAddress.Addr [ 2 ] == pAddressInfo->Address.Addr [ 2 ])\r
+ && ( pAccess->StationAddress.Addr [ 3 ] == pAddressInfo->Address.Addr [ 3 ])\r
+ && ( pAccess->StationAddress.Addr [ 4 ] == pAddressInfo->Address.Addr [ 4 ])\r
+ && ( pAccess->StationAddress.Addr [ 5 ] == pAddressInfo->Address.Addr [ 5 ])\r
+ && ( pAccess->StationAddress.Addr [ 6 ] == pAddressInfo->Address.Addr [ 6 ])\r
+ && ( pAccess->StationAddress.Addr [ 7 ] == pAddressInfo->Address.Addr [ 7 ])\r
+ && ( pAccess->StationAddress.Addr [ 8 ] == pAddressInfo->Address.Addr [ 8 ])\r
+ && ( pAccess->StationAddress.Addr [ 9 ] == pAddressInfo->Address.Addr [ 9 ])\r
+ && ( pAccess->StationAddress.Addr [ 10 ] == pAddressInfo->Address.Addr [ 10 ])\r
+ && ( pAccess->StationAddress.Addr [ 11 ] == pAddressInfo->Address.Addr [ 11 ])\r
+ && ( pAccess->StationAddress.Addr [ 12 ] == pAddressInfo->Address.Addr [ 12 ])\r
+ && ( pAccess->StationAddress.Addr [ 13 ] == pAddressInfo->Address.Addr [ 13 ])\r
+ && ( pAccess->StationAddress.Addr [ 14 ] == pAddressInfo->Address.Addr [ 14 ])\r
+ && ( pAccess->StationAddress.Addr [ 15 ] == pAddressInfo->Address.Addr [ 15 ])) {\r
+ break;\r
+ }\r
+ }\r
+ if ( pIpConfigData->AddressInfoCount > AddressCount ) {\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 != pIpConfigData ) {\r
+ FreePool ( pIpConfigData );\r
+ }\r
+\r
+ //\r
+ // Return the IP address status\r
+ //\r
+ DBG_EXIT_STATUS ( Status );\r
+ return Status;\r
+}\r
+\r
+\r