UEFI UDP4 - 处理多个接口
UEFI UDP4 - handling multiple interfaces
我探索了很多不同的 UEFI UDP 代码示例,但在大多数情况下,它们退回到“假设我们只有一个网络接口”并使用 LocateProtocol
而不是 LocateHandleBuffer
.我正在测试的系统似乎有 3 个接口(虽然我不知道这些是什么 - 我假设可能有一个是环回)。所以这提出了几个问题:
- 我假设我需要对每个多个句柄执行
OpenProtocol()
,然后是 CreateChild()
从“服务绑定协议”到“协议”,然后是 OpenProtocol()
关于后者?
- 我什么时候可以获得有用的信息来区分接口并选择一个接口,并可能提前终止循环?
- 我是在每个子句柄上使用
Configure()
,还是在此之前我以某种方式过滤掉了错误的句柄?
- 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 .
我探索了很多不同的 UEFI UDP 代码示例,但在大多数情况下,它们退回到“假设我们只有一个网络接口”并使用 LocateProtocol
而不是 LocateHandleBuffer
.我正在测试的系统似乎有 3 个接口(虽然我不知道这些是什么 - 我假设可能有一个是环回)。所以这提出了几个问题:
- 我假设我需要对每个多个句柄执行
OpenProtocol()
,然后是CreateChild()
从“服务绑定协议”到“协议”,然后是OpenProtocol()
关于后者? - 我什么时候可以获得有用的信息来区分接口并选择一个接口,并可能提前终止循环?
- 我是在每个子句柄上使用
Configure()
,还是在此之前我以某种方式过滤掉了错误的句柄? - 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