Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/IScsiDxe/IScsiDhcp.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156854
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/IScsiDxe/IScsiDhcp.c
r85718 r99404 8 8 9 9 #include "IScsiImpl.h" 10 11 10 12 11 /** … … 28 27 IN CHAR8 *RootPath, 29 28 IN UINT8 Length, 30 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData29 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData 31 30 ) 32 31 { 33 EFI_STATUS Status;34 UINT8 IScsiRootPathIdLen;35 CHAR8 *TmpStr;36 ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];37 ISCSI_ROOT_PATH_FIELD *Field;38 UINT32 FieldIndex;39 UINT8 Index;40 ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;41 EFI_IP_ADDRESS Ip;42 UINT8 IpMode;32 EFI_STATUS Status; 33 UINT8 IScsiRootPathIdLen; 34 CHAR8 *TmpStr; 35 ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; 36 ISCSI_ROOT_PATH_FIELD *Field; 37 UINT32 FieldIndex; 38 UINT8 Index; 39 ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; 40 EFI_IP_ADDRESS Ip; 41 UINT8 IpMode; 43 42 44 43 ConfigNvData = &ConfigData->SessionConfigData; … … 47 46 // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> 48 47 // 49 IScsiRootPathIdLen = (UINT8) 48 IScsiRootPathIdLen = (UINT8)AsciiStrLen (ISCSI_ROOT_PATH_ID); 50 49 51 50 if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { 52 51 return EFI_NOT_FOUND; 53 52 } 53 54 54 // 55 55 // Skip the iSCSI RootPath ID "iscsi:". 56 56 // 57 57 RootPath += IScsiRootPathIdLen; 58 Length = (UINT8)(Length - IScsiRootPathIdLen);59 60 TmpStr = (CHAR8 *)AllocatePool (Length + 1);58 Length = (UINT8)(Length - IScsiRootPathIdLen); 59 60 TmpStr = (CHAR8 *)AllocatePool (Length + 1); 61 61 if (TmpStr == NULL) { 62 62 return EFI_OUT_OF_RESOURCES; … … 64 64 65 65 CopyMem (TmpStr, RootPath, Length); 66 TmpStr[Length] 67 68 Index 69 FieldIndex 66 TmpStr[Length] = '\0'; 67 68 Index = 0; 69 FieldIndex = RP_FIELD_IDX_SERVERNAME; 70 70 ZeroMem (&Fields[0], sizeof (Fields)); 71 71 … … 89 89 90 90 if (Fields[FieldIndex].Str != NULL) { 91 Fields[FieldIndex].Len = (UINT8) 91 Fields[FieldIndex].Len = (UINT8)AsciiStrLen (Fields[FieldIndex].Str); 92 92 } 93 93 } … … 102 102 (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || 103 103 (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) 104 ) {105 104 ) 105 { 106 106 Status = EFI_INVALID_PARAMETER; 107 107 goto ON_EXIT; 108 108 } 109 109 110 // 110 111 // Get the IP address of the target. 111 112 // 112 Field 113 Field = &Fields[RP_FIELD_IDX_SERVERNAME]; 113 114 114 115 if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) { … … 126 127 return EFI_INVALID_PARAMETER; 127 128 } 129 128 130 CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len); 129 131 ConfigNvData->TargetUrl[Field->Len + 1] = '\0'; 130 132 } else { 131 133 ConfigNvData->DnsMode = FALSE; 132 ZeroMem (ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));134 ZeroMem (ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl)); 133 135 Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip); 134 136 CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS)); … … 138 140 } 139 141 } 142 140 143 // 141 144 // Check the protocol type. … … 146 149 goto ON_EXIT; 147 150 } 151 148 152 // 149 153 // Get the port of the iSCSI target. … … 151 155 Field = &Fields[RP_FIELD_IDX_PORT]; 152 156 if (Field->Str != NULL) { 153 ConfigNvData->TargetPort = (UINT16) 157 ConfigNvData->TargetPort = (UINT16)AsciiStrDecimalToUintn (Field->Str); 154 158 } else { 155 159 ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; 156 160 } 161 157 162 // 158 163 // Get the LUN. … … 167 172 ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); 168 173 } 174 169 175 // 170 176 // Get the target iSCSI Name. … … 176 182 goto ON_EXIT; 177 183 } 184 178 185 // 179 186 // Validate the iSCSI name. … … 217 224 IN EFI_DHCP4_STATE CurrentState, 218 225 IN EFI_DHCP4_EVENT Dhcp4Event, 219 IN EFI_DHCP4_PACKET *Packet , OPTIONAL226 IN EFI_DHCP4_PACKET *Packet OPTIONAL, 220 227 OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL 221 228 ) 222 229 { 223 EFI_STATUS Status;224 UINT32 OptionCount;225 EFI_DHCP4_PACKET_OPTION **OptionList;226 UINT32 Index;230 EFI_STATUS Status; 231 UINT32 OptionCount; 232 EFI_DHCP4_PACKET_OPTION **OptionList; 233 UINT32 Index; 227 234 228 235 if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) { … … 232 239 OptionCount = 0; 233 240 234 Status 241 Status = This->Parse (This, Packet, &OptionCount, NULL); 235 242 if (Status != EFI_BUFFER_TOO_SMALL) { 236 243 return EFI_NOT_READY; … … 254 261 255 262 Status = IScsiDhcpExtractRootPath ( 256 (CHAR8 *) 263 (CHAR8 *)&OptionList[Index]->Data[0], 257 264 OptionList[Index]->Length, 258 (ISCSI_ATTEMPT_CONFIG_NVDATA *) 265 (ISCSI_ATTEMPT_CONFIG_NVDATA *)Context 259 266 ); 260 267 … … 286 293 EFI_STATUS 287 294 IScsiParseDhcpAck ( 288 IN EFI_DHCP4_PROTOCOL *Dhcp4,289 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData295 IN EFI_DHCP4_PROTOCOL *Dhcp4, 296 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData 290 297 ) 291 298 { 292 EFI_STATUS 293 EFI_DHCP4_MODE_DATA 294 UINT32 295 EFI_DHCP4_PACKET_OPTION 296 UINT32 297 ISCSI_SESSION_CONFIG_NVDATA 299 EFI_STATUS Status; 300 EFI_DHCP4_MODE_DATA Dhcp4ModeData; 301 UINT32 OptionCount; 302 EFI_DHCP4_PACKET_OPTION **OptionList; 303 UINT32 Index; 304 ISCSI_SESSION_CONFIG_NVDATA *NvData; 298 305 299 306 Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData); … … 315 322 OptionList = NULL; 316 323 317 Status 324 Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList); 318 325 if (Status != EFI_BUFFER_TOO_SMALL) { 319 326 return EFI_DEVICE_ERROR; … … 336 343 // 337 344 if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) { 338 339 345 if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) { 340 346 Status = EFI_INVALID_PARAMETER; 341 347 break; 342 348 } 349 343 350 // 344 351 // Primary DNS server address. … … 378 385 EFI_STATUS 379 386 IScsiSetIp4Policy ( 380 IN EFI_IP4_CONFIG2_PROTOCOL 387 IN EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2 381 388 ) 382 389 { 383 EFI_IP4_CONFIG2_POLICY 384 EFI_STATUS 385 UINTN 390 EFI_IP4_CONFIG2_POLICY Policy; 391 EFI_STATUS Status; 392 UINTN DataSize; 386 393 387 394 DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); 388 Status = Ip4Config2->GetData (389 Ip4Config2,390 Ip4Config2DataTypePolicy,391 &DataSize,392 &Policy393 );395 Status = Ip4Config2->GetData ( 396 Ip4Config2, 397 Ip4Config2DataTypePolicy, 398 &DataSize, 399 &Policy 400 ); 394 401 if (EFI_ERROR (Status)) { 395 402 return Status; … … 398 405 if (Policy != Ip4Config2PolicyStatic) { 399 406 Policy = Ip4Config2PolicyStatic; 400 Status = Ip4Config2->SetData (401 Ip4Config2,402 Ip4Config2DataTypePolicy,403 sizeof (EFI_IP4_CONFIG2_POLICY),404 &Policy405 );407 Status = Ip4Config2->SetData ( 408 Ip4Config2, 409 Ip4Config2DataTypePolicy, 410 sizeof (EFI_IP4_CONFIG2_POLICY), 411 &Policy 412 ); 406 413 if (EFI_ERROR (Status)) { 407 414 return Status; … … 427 434 EFI_STATUS 428 435 IScsiDoDhcp ( 429 IN EFI_HANDLE Image,430 IN EFI_HANDLE Controller,431 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData436 IN EFI_HANDLE Image, 437 IN EFI_HANDLE Controller, 438 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData 432 439 ) 433 440 { 434 EFI_HANDLE 435 EFI_IP4_CONFIG2_PROTOCOL 436 EFI_DHCP4_PROTOCOL 437 EFI_STATUS 438 EFI_DHCP4_PACKET_OPTION 439 EFI_DHCP4_CONFIG_DATA 440 ISCSI_SESSION_CONFIG_NVDATA 441 EFI_STATUS 441 EFI_HANDLE Dhcp4Handle; 442 EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; 443 EFI_DHCP4_PROTOCOL *Dhcp4; 444 EFI_STATUS Status; 445 EFI_DHCP4_PACKET_OPTION *ParaList; 446 EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData; 447 ISCSI_SESSION_CONFIG_NVDATA *NvData; 448 EFI_STATUS MediaStatus; 442 449 443 450 Dhcp4Handle = NULL; … … 451 458 MediaStatus = EFI_SUCCESS; 452 459 NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus); 453 if (MediaStatus != EFI_SUCCESS) {460 if (MediaStatus != EFI_SUCCESS) { 454 461 AsciiPrint ("\n Error: Could not detect network connection.\n"); 455 462 return EFI_NO_MEDIA; … … 463 470 // So, we need to switch its policy to static. 464 471 // 465 Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **) 472 Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **)&Ip4Config2); 466 473 if (!EFI_ERROR (Status)) { 467 474 Status = IScsiSetIp4Policy (Ip4Config2); … … 487 494 Dhcp4Handle, 488 495 &gEfiDhcp4ProtocolGuid, 489 (VOID **) 496 (VOID **)&Dhcp4, 490 497 Image, 491 498 Controller, … … 496 503 } 497 504 498 NvData 505 NvData = &ConfigData->SessionConfigData; 499 506 500 507 ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3); … … 508 515 // 509 516 ParaList->OpCode = DHCP4_TAG_PARA_LIST; 510 ParaList->Length = (UINT8) 517 ParaList->Length = (UINT8)(NvData->TargetInfoFromDhcp ? 4 : 3); 511 518 ParaList->Data[0] = DHCP4_TAG_NETMASK; 512 519 ParaList->Data[1] = DHCP4_TAG_ROUTER; … … 535 542 goto ON_EXIT; 536 543 } 544 537 545 // 538 546 // Parse the ACK to get required information.
Note:
See TracChangeset
for help on using the changeset viewer.