+/**\r
+ Check wheather the Controller handle is configured to use DHCP protocol.\r
+\r
+ @param[in] Controller The handle of the controller.\r
+ @param[in] IpVersion IP_VERSION_4 or IP_VERSION_6.\r
+ \r
+ @retval TRUE The handle of the controller need the Dhcp protocol.\r
+ @retval FALSE The handle of the controller does not need the Dhcp protocol.\r
+ \r
+**/\r
+BOOLEAN\r
+IScsiDhcpIsConfigured (\r
+ IN EFI_HANDLE Controller,\r
+ IN UINT8 IpVersion\r
+ )\r
+{\r
+ ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptTmp;\r
+ UINT8 *AttemptConfigOrder;\r
+ UINTN AttemptConfigOrderSize;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ EFI_MAC_ADDRESS MacAddr;\r
+ UINTN HwAddressSize;\r
+ UINT16 VlanId;\r
+ CHAR16 MacString[ISCSI_MAX_MAC_STRING_LEN];\r
+ CHAR16 AttemptName[ISCSI_NAME_IFR_MAX_SIZE];\r
+ \r
+ AttemptConfigOrder = IScsiGetVariableAndSize (\r
+ L"AttemptOrder",\r
+ &gIScsiConfigGuid,\r
+ &AttemptConfigOrderSize\r
+ );\r
+ if (AttemptConfigOrder == NULL || AttemptConfigOrderSize == 0) {\r
+ return FALSE;\r
+ }\r
+ \r
+ //\r
+ // Get MAC address of this network device.\r
+ //\r
+ Status = NetLibGetMacAddress (Controller, &MacAddr, &HwAddressSize);\r
+ if(EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+ //\r
+ // Get VLAN ID of this network device.\r
+ //\r
+ VlanId = NetLibGetVlanId (Controller);\r
+ IScsiMacAddrToStr (&MacAddr, (UINT32) HwAddressSize, VlanId, MacString);\r
+ \r
+ for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {\r
+ UnicodeSPrint (\r
+ AttemptName,\r
+ (UINTN) 128,\r
+ L"%s%d",\r
+ MacString,\r
+ (UINTN) AttemptConfigOrder[Index]\r
+ );\r
+ Status = GetVariable2 (\r
+ AttemptName,\r
+ &gEfiIScsiInitiatorNameProtocolGuid,\r
+ (VOID**)&AttemptTmp,\r
+ NULL\r
+ );\r
+ if(EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
+ ASSERT (AttemptConfigOrder[Index] == AttemptTmp->AttemptConfigIndex);\r
+\r
+ if (AttemptTmp->SessionConfigData.Enabled == ISCSI_DISABLED) {\r
+ FreePool (AttemptTmp);\r
+ continue;\r
+ }\r
+\r
+ if (AttemptTmp->SessionConfigData.IpMode != IP_MODE_AUTOCONFIG && \r
+ AttemptTmp->SessionConfigData.IpMode != ((IpVersion == IP_VERSION_4) ? IP_MODE_IP4 : IP_MODE_IP6)) {\r
+ FreePool (AttemptTmp);\r
+ continue;\r
+ }\r
+ \r
+ if(AttemptTmp->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG ||\r
+ AttemptTmp->SessionConfigData.InitiatorInfoFromDhcp == TRUE ||\r
+ AttemptTmp->SessionConfigData.TargetInfoFromDhcp == TRUE) { \r
+ FreePool (AttemptTmp);\r
+ FreePool (AttemptConfigOrder);\r
+ return TRUE;\r
+ }\r
+\r
+ FreePool (AttemptTmp);\r
+ }\r
+ \r
+ FreePool (AttemptConfigOrder);\r
+ return FALSE;\r
+}\r