/** @file\r
iSCSI DHCP6 related configuration routines.\r
\r
-Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
UINT8 Index;\r
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;\r
EFI_IP_ADDRESS Ip;\r
- UINT8 IpMode; \r
+ UINT8 IpMode;\r
\r
ConfigNvData = &ConfigData->SessionConfigData;\r
-\r
+ ConfigNvData->DnsMode = FALSE;\r
//\r
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>\r
//\r
// Extract SERVERNAME field in the Root Path option.\r
//\r
if (TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_START_DELIMITER) {\r
- Status = EFI_INVALID_PARAMETER;\r
- goto ON_EXIT;\r
+ //\r
+ // The servername is expressed as domain name.\r
+ //\r
+ ConfigNvData->DnsMode = TRUE;\r
} else {\r
Index++;\r
}\r
\r
Fields[RP_FIELD_IDX_SERVERNAME].Str = &TmpStr[Index];\r
\r
- while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER) && (Index < Length)) {\r
- Index++;\r
- }\r
+ if (!ConfigNvData->DnsMode) {\r
+ while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER)&& (Index < Length)) {\r
+ Index++;\r
+ }\r
\r
- //\r
- // Skip ']' and ':'.\r
- //\r
- TmpStr[Index] = '\0';\r
- Index += 2;\r
+ //\r
+ // Skip ']' and ':'.\r
+ //\r
+ TmpStr[Index] = '\0';\r
+ Index += 2;\r
+ } else {\r
+ while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {\r
+ Index++;\r
+ }\r
+ //\r
+ // Skip ':'.\r
+ //\r
+ TmpStr[Index] = '\0';\r
+ Index += 1;\r
+ }\r
\r
Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8) AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str);\r
\r
//\r
// Get the IP address of the target.\r
//\r
- Field = &Fields[RP_FIELD_IDX_SERVERNAME]; \r
+ Field = &Fields[RP_FIELD_IDX_SERVERNAME];\r
if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) {\r
IpMode = ConfigNvData->IpMode;\r
} else {\r
IpMode = ConfigData->AutoConfigureMode;\r
}\r
\r
- Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);\r
- CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));\r
-\r
+ //\r
+ // Server name is expressed as domain name, just save it.\r
+ //\r
+ if (ConfigNvData->DnsMode) {\r
+ if ((Field->Len + 2) > sizeof (ConfigNvData->TargetUrl)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);\r
+ ConfigNvData->TargetUrl[Field->Len + 1] = '\0';\r
+ } else {\r
+ ZeroMem(&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));\r
+ Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);\r
+ CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));\r
\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
}\r
+\r
//\r
// Check the protocol type.\r
//\r
}\r
\r
/**\r
- EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol \r
+ EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol\r
instance to intercept events that occurs in the DHCPv6 Information Request\r
exchange process.\r
\r
- @param[in] This Pointer to the EFI_DHCP6_PROTOCOL instance that \r
+ @param[in] This Pointer to the EFI_DHCP6_PROTOCOL instance that\r
is used to configure this callback function.\r
@param[in] Context Pointer to the context that is initialized in\r
the EFI_DHCP6_PROTOCOL.InfoRequest().\r
EFI_DHCP6_PACKET_OPTION **OptionList;\r
ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;\r
UINT16 ParaLen;\r
- \r
+\r
OptionCount = 0;\r
BootFileOpt = NULL;\r
- \r
+\r
Status = This->Parse (This, Packet, &OptionCount, NULL);\r
if (Status != EFI_BUFFER_TOO_SMALL) {\r
return EFI_NOT_READY;\r
// The server sends this option to inform the client about an URL to a boot file.\r
//\r
BootFileOpt = OptionList[Index];\r
- } else if (OptionList[Index]->OpCode == DHCP6_OPT_BOOT_FILE_PARA) {\r
+ } else if (OptionList[Index]->OpCode == DHCP6_OPT_BOOT_FILE_PARAM) {\r
//\r
// The server sends this option to inform the client about DHCP6 server address.\r
//\r
Status = EFI_UNSUPPORTED;\r
goto Exit;\r
}\r
- \r
+\r
//\r
// Get iSCSI root path from Boot File Uniform Resource Locator (URL) Option\r
//\r
EFI_DHCP6_PACKET_OPTION *Oro;\r
EFI_DHCP6_RETRANSMISSION InfoReqReXmit;\r
EFI_EVENT Timer;\r
- BOOLEAN MediaPresent;\r
+ EFI_STATUS MediaStatus;\r
\r
//\r
// Check media status before doing DHCP.\r
//\r
- MediaPresent = TRUE;\r
- NetLibDetectMedia (Controller, &MediaPresent);\r
- if (!MediaPresent) {\r
+ MediaStatus = EFI_SUCCESS;\r
+ NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);\r
+ if (MediaStatus != EFI_SUCCESS) {\r
+ AsciiPrint ("\n Error: Could not detect network connection.\n");\r
return EFI_NO_MEDIA;\r
}\r
\r
// Ask the server to reply with DNS and Boot File URL options by info request.\r
// All members in EFI_DHCP6_PACKET_OPTION are in network order.\r
//\r
- Oro->OpCode = HTONS (DHCP6_OPT_REQUEST_OPTION);\r
+ Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
Oro->OpLen = HTONS (2 * 3);\r
Oro->Data[1] = DHCP6_OPT_DNS_SERVERS;\r
Oro->Data[3] = DHCP6_OPT_BOOT_FILE_URL;\r
- Oro->Data[5] = DHCP6_OPT_BOOT_FILE_PARA;\r
+ Oro->Data[5] = DHCP6_OPT_BOOT_FILE_PARAM;\r
\r
InfoReqReXmit.Irt = 4;\r
InfoReqReXmit.Mrc = 1;\r
\r
if (Oro != NULL) {\r
FreePool (Oro);\r
- } \r
+ }\r
\r
if (Timer != NULL) {\r
gBS->CloseEvent (Timer);\r