You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IPv6环境下EDK2应用调用LoadImage加载mtftp文件返回EFI_NOT_FOUND问题

IPv6环境下EDK2 LoadImage返回EFI_NOT_FOUND问题排查与解决

问题场景

基于EDK2和C开发IPv6 PXE功能应用,通过EFI_LOAD_FILE_PROTOCOL下载Windows EFI启动加载器bootmgfw.efi,未直接调用mtftp()。Wireshark抓包确认镜像已完整下载,文件大小与缓冲区数据均正常,但调用LoadImage()时返回EFI_NOT_FOUND。

调用代码:

Status = bootServices->LoadImage(TRUE, ImageHandle, loadFilePath, NULL, 0, &loadedBootProgram);

其中loadFilePath由当前镜像路径自连接生成:

*dummyPath = devPathUtilities->AppendDevicePath(thisImageFilePath, thisImageFilePath);

该逻辑在IPv4环境下稳定运行,但IPv6环境失效。已知IPv6_DEVICE_PATH可能相关,但无法创建包含该类型的设备路径对象;也可通过MEMORY_DEVICE_PATH从缓冲区加载,但目标镜像需感知网络加载状态以完成后续下载,因此不考虑此方案。

已修改pxeProtocolInterface->Mode->ProxyOffer内容,并将pxeProtocolInterface->Mode->ProxyOfferReceived设为true(IPv4环境下StartImage成功的必要操作)。LoadImage()文档未提及IPv6相关内容,且目标镜像本身无损坏——作为PXE指定的首个镜像时可正常加载。

问题排查与解决步骤

1. 修正设备路径构造逻辑

IPv4环境下的设备路径包含IP4_DEVICE_PATH节点,但IPv6环境下需替换为IPv6_DEVICE_PATH节点。当前用AppendDevicePath自连接原有路径的方式,复用了IPv4的设备路径结构,导致UEFI无法识别IPv6环境下的有效路径。

解决方法:
基于当前IPv6网络适配器重新构造设备路径:

  • 获取当前IPv6网络适配器的EFI_DEVICE_PATH_PROTOCOL
  • 创建IPv6_DEVICE_PATH节点,填入正确的IPv6地址、端口等信息
  • 将IPv6_DEVICE_PATH与文件路径节点拼接成完整加载路径

示例代码片段:

// 假设已获取IPv6网络设备的device path: NetDevicePath
IPv6_DEVICE_PATH Ip6Node = {
  { MESSAGING_DEVICE_PATH, MSG_IP6_DP, sizeof(IPv6_DEVICE_PATH) },
  // 填入目标服务器IPv6地址
  {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF},
  69, // TFTP默认端口
  // 填入本地IPv6地址
  {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF},
  0, // 本地端口
  64, // 前缀长度
  128 // 跳数限制
};
FILE_PATH_DEVICE_PATH FileNode = {
  { MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, sizeof(FILE_PATH_DEVICE_PATH) },
  L"bootmgfw.efi"
};
// 拼接完整路径:网络设备路径 + IPv6节点 + 文件节点
EFI_DEVICE_PATH_PROTOCOL *NewLoadPath = AppendDevicePath(NetDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&Ip6Node);
NewLoadPath = AppendDevicePath(NewLoadPath, (EFI_DEVICE_PATH_PROTOCOL*)&FileNode);

2. 完善PXE协议IPv6上下文初始化

仅修改ProxyOffer和ProxyOfferReceived不足以适配IPv6环境,需补充初始化以下字段:

  • 将pxeProtocolInterface->Mode->Ipv6Supported设为TRUE
  • 正确填充pxeProtocolInterface->Mode->Ipv6ConfigData,包括IPv6地址、网关、DNS等信息
  • 确认IPv6 DHCP相关字段(如Dhcpv6AckReceived)已正确设置

3. 调整LoadImage参数的网络上下文

IPv6环境下LoadImage需明确绑定当前IPv6网络设备的上下文,而非复用原有镜像的IPv4绑定路径。将loadFilePath替换为当前IPv6网络适配器设备路径 + 正确文件路径节点,避免UEFI因路径绑定的IPv4上下文无法定位镜像。

4. 排查UEFI固件兼容性

部分UEFI固件对IPv6 PXE的支持存在兼容性差异,可尝试:

  • 更新固件至最新版本
  • 检查固件设置中是否开启IPv6 PXE支持
  • 在不同品牌设备上测试,排除固件特定bug

内容的提问来源于stack exchange,提问作者BVintila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:00:14