UEFI UDP4 - 处理多个接口

UEFI UDP4 - handling multiple interfaces

我探索了很多不同的 UEFI UDP 代码示例,但在大多数情况下,它们退回到“假设我们只有一个网络接口”并使用 LocateProtocol 而不是 LocateHandleBuffer.我正在测试的系统似乎有 3 个接口(虽然我不知道这些是什么 - 我假设可能有一个是环回)。所以这提出了几个问题:

  1. 我假设我需要对每个多个句柄执行 OpenProtocol(),然后是 CreateChild() 从“服务绑定协议”到“协议”,然后是 OpenProtocol() 关于后者?
  2. 我什么时候可以获得有用的信息来区分接口并选择一个接口,并可能提前终止循环?
  3. 我是在每个子句柄上使用 Configure(),还是在此之前我以某种方式过滤掉了错误的句柄?
  4. UEFI 规范中有一条注释,在新代码中应使用 OpenProtocol() 代替 HandleProtocol(),但很少有示例显示这一点,而且看起来很尴尬,因为同一规范建议使用后者只是带有固定参数的前者的包装。真的有充分的理由更喜欢 OpenProtocol() 吗?

如果有人可以用标准 POSIX 套接字模型来解释这一点,对于不习惯 UEFI 中所有这些奇怪的间接层的人来说,这可能会使它更容易理解。

Q1) 您可以调用 gBS->LocateHandleBuffer 来获取所有 EFI_UDP4_SERVICE_BINDING_PROTOCOL 个实例,然后在每个实例上调用 CreateChild。在您使用 OpenProtocol 的每个句柄上。

Q2&Q3) 对于每个 child,您可以调用 GetModeData,将 Udp4ConfigData 设置为 NULL,这样您就不需要在每个实例上调用配置。 使用 GetModeData 的 SnpModeData 参数,您可以获得有关接口的信息(mac 地址、类型...)。不要忘记为您不想使用的每个 child 调用 DestroyChild。

Q4) OpenProtocol 的许多属性旨在供其他驱动程序使用。在应用程序中,您可以使用 BY_HANDLE_PROTOCOL(或改为使用 HandleProtocol)、TEST_PROTOCOL 和 EXCLUSIVE。为什么要使用 OpenProtocol .