Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/IScsiDxe/IScsiDhcp6.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- 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/IScsiDhcp6.c
r85718 r99404 8 8 9 9 #include "IScsiImpl.h" 10 11 10 12 11 /** … … 30 29 IN CHAR8 *RootPath, 31 30 IN UINT16 Length, 32 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData31 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData 33 32 ) 34 33 { 35 EFI_STATUS Status;36 UINT16 IScsiRootPathIdLen;37 CHAR8 *TmpStr;38 ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];39 ISCSI_ROOT_PATH_FIELD *Field;40 UINT32 FieldIndex;41 UINT8 Index;42 ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;43 EFI_IP_ADDRESS Ip;44 UINT8 IpMode;45 46 ConfigNvData = &ConfigData->SessionConfigData;34 EFI_STATUS Status; 35 UINT16 IScsiRootPathIdLen; 36 CHAR8 *TmpStr; 37 ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; 38 ISCSI_ROOT_PATH_FIELD *Field; 39 UINT32 FieldIndex; 40 UINT8 Index; 41 ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; 42 EFI_IP_ADDRESS Ip; 43 UINT8 IpMode; 44 45 ConfigNvData = &ConfigData->SessionConfigData; 47 46 ConfigNvData->DnsMode = FALSE; 48 47 // 49 48 // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> 50 49 // 51 IScsiRootPathIdLen = (UINT16) 50 IScsiRootPathIdLen = (UINT16)AsciiStrLen (ISCSI_ROOT_PATH_ID); 52 51 53 52 if ((Length <= IScsiRootPathIdLen) || 54 (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { 53 (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) 54 { 55 55 return EFI_NOT_FOUND; 56 56 } 57 57 58 // 58 59 // Skip the iSCSI RootPath ID "iscsi:". 59 60 // 60 61 RootPath = RootPath + IScsiRootPathIdLen; 61 Length = (UINT16) 62 63 TmpStr = (CHAR8 *)AllocatePool (Length + 1);62 Length = (UINT16)(Length - IScsiRootPathIdLen); 63 64 TmpStr = (CHAR8 *)AllocatePool (Length + 1); 64 65 if (TmpStr == NULL) { 65 66 return EFI_OUT_OF_RESOURCES; … … 67 68 68 69 CopyMem (TmpStr, RootPath, Length); 69 TmpStr[Length] 70 71 Index 72 FieldIndex 70 TmpStr[Length] = '\0'; 71 72 Index = 0; 73 FieldIndex = 0; 73 74 ZeroMem (&Fields[0], sizeof (Fields)); 74 75 … … 88 89 89 90 if (!ConfigNvData->DnsMode) { 90 while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER) && (Index < Length)) {91 while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER) && (Index < Length)) { 91 92 Index++; 92 93 } … … 96 97 // 97 98 TmpStr[Index] = '\0'; 98 Index += 2;99 Index += 2; 99 100 } else { 100 101 while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) { 101 102 Index++; 102 103 } 104 103 105 // 104 106 // Skip ':'. 105 107 // 106 108 TmpStr[Index] = '\0'; 107 Index += 1;108 } 109 110 Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8) 109 Index += 1; 110 } 111 112 Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8)AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str); 111 113 112 114 // … … 114 116 // 115 117 for (FieldIndex = 1; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { 116 117 118 if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { 118 119 Fields[FieldIndex].Str = &TmpStr[Index]; … … 130 131 131 132 if (Fields[FieldIndex].Str != NULL) { 132 Fields[FieldIndex].Len = (UINT8) 133 Fields[FieldIndex].Len = (UINT8)AsciiStrLen (Fields[FieldIndex].Str); 133 134 } 134 135 } … … 143 144 (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || 144 145 (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) 145 ) {146 146 ) 147 { 147 148 Status = EFI_INVALID_PARAMETER; 148 149 goto ON_EXIT; 149 150 } 151 150 152 // 151 153 // Get the IP address of the target. 152 154 // 153 Field 155 Field = &Fields[RP_FIELD_IDX_SERVERNAME]; 154 156 if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) { 155 157 IpMode = ConfigNvData->IpMode; … … 165 167 return EFI_INVALID_PARAMETER; 166 168 } 169 167 170 CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len); 168 171 ConfigNvData->TargetUrl[Field->Len + 1] = '\0'; 169 172 } else { 170 ZeroMem (&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));173 ZeroMem (&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl)); 171 174 Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip); 172 175 CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS)); … … 185 188 goto ON_EXIT; 186 189 } 190 187 191 // 188 192 // Get the port of the iSCSI target. … … 190 194 Field = &Fields[RP_FIELD_IDX_PORT]; 191 195 if (Field->Str != NULL) { 192 ConfigNvData->TargetPort = (UINT16) 196 ConfigNvData->TargetPort = (UINT16)AsciiStrDecimalToUintn (Field->Str); 193 197 } else { 194 198 ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; 195 199 } 200 196 201 // 197 202 // Get the LUN. … … 206 211 ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); 207 212 } 213 208 214 // 209 215 // Get the target iSCSI Name. … … 215 221 goto ON_EXIT; 216 222 } 223 217 224 // 218 225 // Validate the iSCSI name. … … 259 266 EFIAPI 260 267 IScsiDhcp6ParseReply ( 261 IN EFI_DHCP6_PROTOCOL 262 IN VOID 263 IN EFI_DHCP6_PACKET 268 IN EFI_DHCP6_PROTOCOL *This, 269 IN VOID *Context, 270 IN EFI_DHCP6_PACKET *Packet 264 271 ) 265 272 { 266 EFI_STATUS Status;267 UINT32 Index;268 UINT32 OptionCount;269 EFI_DHCP6_PACKET_OPTION *BootFileOpt;270 EFI_DHCP6_PACKET_OPTION **OptionList;271 ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;272 UINT16 ParaLen;273 EFI_STATUS Status; 274 UINT32 Index; 275 UINT32 OptionCount; 276 EFI_DHCP6_PACKET_OPTION *BootFileOpt; 277 EFI_DHCP6_PACKET_OPTION **OptionList; 278 ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData; 279 UINT16 ParaLen; 273 280 274 281 OptionCount = 0; 275 282 BootFileOpt = NULL; 276 283 277 Status 284 Status = This->Parse (This, Packet, &OptionCount, NULL); 278 285 if (Status != EFI_BUFFER_TOO_SMALL) { 279 286 return EFI_NOT_READY; … … 291 298 } 292 299 293 ConfigData = (ISCSI_ATTEMPT_CONFIG_NVDATA *) 300 ConfigData = (ISCSI_ATTEMPT_CONFIG_NVDATA *)Context; 294 301 295 302 for (Index = 0; Index < OptionCount; Index++) { … … 301 308 // 302 309 if (OptionList[Index]->OpCode == DHCP6_OPT_DNS_SERVERS) { 303 304 310 if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) { 305 311 Status = EFI_UNSUPPORTED; 306 312 goto Exit; 307 313 } 314 308 315 // 309 316 // Primary DNS server address. … … 317 324 CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[16], sizeof (EFI_IPv6_ADDRESS)); 318 325 } 319 320 326 } else if (OptionList[Index]->OpCode == DHCP6_OPT_BOOT_FILE_URL) { 321 327 // … … 331 337 goto Exit; 332 338 } 339 333 340 // 334 341 // Check param-len 1, should be 16 bytes. … … 353 360 // 354 361 Status = IScsiDhcp6ExtractRootPath ( 355 (CHAR8 *) 362 (CHAR8 *)BootFileOpt->Data, 356 363 BootFileOpt->OpLen, 357 364 ConfigData … … 363 370 return Status; 364 371 } 365 366 372 367 373 /** … … 384 390 EFI_STATUS 385 391 IScsiDoDhcp6 ( 386 IN EFI_HANDLE Image,387 IN EFI_HANDLE Controller,388 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData392 IN EFI_HANDLE Image, 393 IN EFI_HANDLE Controller, 394 IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData 389 395 ) 390 396 { … … 436 442 Dhcp6Handle, 437 443 &gEfiDhcp6ProtocolGuid, 438 (VOID **) 444 (VOID **)&Dhcp6, 439 445 Image, 440 446 Controller, … … 494 500 495 501 do { 496 497 502 TimerStatus = gBS->CheckEvent (Timer); 498 503 … … 510 515 ); 511 516 } 512 513 517 } while (TimerStatus == EFI_NOT_READY); 514 515 518 } 516 519 … … 543 546 return Status; 544 547 } 545
Note:
See TracChangeset
for help on using the changeset viewer.