Как можно передать хотя бы пару байт по локальной сети (UEFI DXE)

Мне нужно написать драйвер (DXE), который может передавать "пару байтов" из виртуальной машины (QEMU) в хост-систему (ОС - Ubuntu). Я читал UEFI_Spec и Руководство для разработчиков, но так и не понял, как писать код и какой протокол использовать (пробовал использовать TCPv4, но не может даже найти LocateHandleBuffer).

EFI_STATUS Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiTcp4ProtocolGuid, NULL, &HandleCount, &HandleBuffer);

Я получил:

EFI_UNSUPPORTED

Если кто-то может объяснить мне или может показать примеры кода, я буду очень благодарен. Спасибо.


person ivan shingel    schedule 16.02.2020    source источник
comment
Привет, Иван. Пожалуйста, не используйте сленг или аббревиатуры в чате, так как некоторые люди могут их не понять.   -  person d00dle    schedule 16.02.2020


Ответы (1)


Для большинства протоколов, связанных с сетью, вам сначала нужно использовать соответствующий «Протокол привязки службы», чтобы получить дескриптор, который содержит протокол, который вы ищете.

Используйте эти шаги для доступа к Tcp4Protocol:

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);

Чтобы проверить, доступна ли сетевая карта, вы можете использовать:

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

Полный пример кода для HttpProtocol находится в спецификации Uefi ( начиная со страницы 1548), протокол Tcp4 не сильно отличается.

person MiSimon    schedule 16.02.2020
comment
То же самое я должен сделать для протокола http? - person ivan shingel; 25.03.2020
comment
Процедура одинакова для всех связанных с сетью протоколов (TCP, MNP, UDP,...) (исключением из правила является SimpleNetworkProtocol), сначала получите ServiceBindingProtocol, а затем используйте его для получения экземпляра протокола. Спецификация Uefi содержит полный пример HTTP. - person MiSimon; 25.03.2020
comment
Я попытался загрузить этот пример и получил: EFI_NOT_FOUND в функции LocateProtocol(). Итак, почему протокол http не может быть найден. Как я могу решить эту проблему? - person ivan shingel; 08.04.2020
comment
Загрузитесь в efishell и убедитесь, что у вас есть драйверы для всех уровней сетевого стека (используйте команду drivers, чтобы вывести список всех доступных драйверов). Если имена драйверов совпадают с именами из edk2, должны быть как минимум следующие драйверы: SnpDxe, MnpDxe, Ip4Dxe, Udp4Dxe, DnsDxe, Dhcp4Dxe, TcpDxe, HttpUtilitiesDxe и HttpDxe, и все они должны быть подключены к сетевому устройству. Если некоторые из них отсутствуют, вы можете собрать edk2 NetworkPkg и загрузить драйверы из оболочки или вашего приложения. - person MiSimon; 08.04.2020