Networking 我怎样才能传送至少一个;“两个字节”;在本地网络上(UEFI DXE)

Networking 我怎样才能传送至少一个;“两个字节”;在本地网络上(UEFI DXE),networking,driver,uefi,Networking,Driver,Uefi,我需要编写驱动程序(DXE),它可以从虚拟机(QEMU)向主机系统(OS-Ubuntu)传输“两个字节”。我已经阅读了UEFI_规范和开发人员指南,但我仍然不明白如何编写代码以及应该使用什么协议(尝试使用TCPv4,但甚至无法找到HandleBuffer) 我得到: EFI_UNSUPPORTED 如果有人能给我解释一下或者给我看一些代码的例子,我将非常感激。谢谢。对于大多数与网络相关的协议,您首先必须使用相应的“服务绑定协议”来获取包含您正在寻找的协议的句柄 使用以下步骤访问TCP4协议:

我需要编写驱动程序(DXE),它可以从虚拟机(QEMU)向主机系统(OS-Ubuntu)传输“两个字节”。我已经阅读了UEFI_规范和开发人员指南,但我仍然不明白如何编写代码以及应该使用什么协议(尝试使用TCPv4,但甚至无法找到HandleBuffer)

我得到:

EFI_UNSUPPORTED

如果有人能给我解释一下或者给我看一些代码的例子,我将非常感激。谢谢。

对于大多数与网络相关的协议,您首先必须使用相应的“服务绑定协议”来获取包含您正在寻找的协议的句柄

使用以下步骤访问TCP4协议:

gBS->LocateHandleBuffer(ByProtovol,gEfiTcp4ServiceBindingProtocolGuid, NULL, &HandleCount, &HandleBuffer);
// Loop over the HandleBuffer Array and pick the one you need
gBS->HandleProtocol(HandleBuffer[YourIndex], &gEfiTcp4ServiceBindingProtocolGuid, &Tcp4SBProtocol);
Tcp4SBProtocol->CreateChild(Tcp4SBProtocol, &Tcp4Handle);
gBS->HandleProtocol(Tcp4Handle, &gEfiTcp4ProtocolGuid, &Tcp4Protocol);
要检查NIC是否可用,您可以使用:

// This should return EFI_SUCCESS
gBS->LocateProtocol(&gEfiSimpleNetworkProtocolGuid, NULL, &SimpleNetworkProtocol);

中有一个完整的HttpProtocol代码示例(从第1548页开始),TCP4协议没有太大的不同。

Hi Ivan-请不要使用俚语或聊天缩写,因为有些人可能不理解。http协议也应该这样做?所有网络相关协议(TCP、MNP、UDP等)的过程都是相同的(该规则的例外是SimpleNetworkProtocol),首先获取ServiceBindingProtocol,然后使用它获取协议实例。Uefi规范包含完整的HTTP示例。我尝试加载此示例,但在函数LocateProtocol()中找到了:EFI_NOT_。那么为什么找不到http协议。如何解决此问题?请引导到efishell中,并确保您拥有网络堆栈所有层的驱动程序(使用“驱动程序”命令列出所有可用的驱动程序)。如果驱动程序名与edk2中的驱动程序名匹配,则至少应该有以下驱动程序:SnpDxe、MnpDxe、Ip4Dxe、Udp4Dxe、DnsDxe、Dhcp4Dxe、TcpDxe、HttpUtilitiesDxe和HttpDxe,并且都应该连接到网络设备。如果缺少其中一些驱动程序,则可以构建edk2网络PKG并从shell或应用程序加载驱动程序激动。
// This should return EFI_SUCCESS
gBS->LocateProtocol(&gEfiSimpleNetworkProtocolGuid, NULL, &SimpleNetworkProtocol);