Token de recepción UDP UEFI
El código de muestra proporcionado por MiSimon en https://stackoverflow.com/questions/67045742/send-tcp-or-udp-packets-from-efi-application muestra cómo enviar y recibir un solo paquete. He podido enviar múltiples paquetes con éxito, pero estoy teniendo dificultades en el lado de recepción.
La documentación para el Protocolo UDP de UEFI EFI_UDP4_PROTOCOL.Receive()
dice que
Coloca una solicitud de recepción asíncrona en la cola de recepción.
Basándose en el código fuente de EDK2, se podría inferir que esto hace algo similar a NetMapInsertTail()
colocando el nuevo token en la lista RxTokens. Según la misma fuente, parece que cuando se entrega un datagrama, se elimina este token con NetMapRemoveHead()
. Sin embargo, empíricamente, después de recibir con éxito un paquete, regresar desde la devolución de llamada y señalizar el RecycleSignal
, mi siguiente llamada a Receive()
falla con EFIACCESSDENIED, descrita en este contexto como:
Ya había un token de finalización de recepción con el mismo Token.Event en la cola de recepción.
La interfaz no proporciona ninguna API para determinar qué hay en la “cola de recepción”, por lo que no es fácil investigar si la operación “eliminar” simplemente no está haciendo lo que creo que hace, o si se está volviendo a encolar, etc.
Entonces, la clave de mi pregunta es: ¿cómo puedo recibir múltiples datagramas desde el mismo puerto UDP?
* ¿El token en la cola de recepción es algo que se puede reutilizar muchas veces sin necesidad de múltiples llamadas a Receive()
? (Si es así, ¿qué se debe hacer para prepararlo para su reutilización?)
* ¿O es algo que debe crearse de nuevo para cada paquete entrante? (Y si es así, ¿cuándo y cómo se liberan?)
davy.ai
Como experto en TI especializado en c, programación de redes, UDP y UEFI, puedo brindar algunas orientaciones sobre el problema de recibir múltiples datagramas desde el mismo puerto UDP en UEFI.
Según la documentación para la función
EFI_UDP4_PROTOCOL.Receive()
del Protocolo UDP de UEFI, parece que esta función coloca una solicitud de recepción asíncrona en la cola de recepción. Sin embargo, cuando se entrega un datagrama, el token se elimina conNetMapRemoveHead()
. Después de recibir correctamente un paquete y regresar desde la devolución de llamada, la siguiente llamada aReceive()
falla con EFI_ACCESS_DENIED, lo que indica que ya había un token de recepción completo con el mismo Token.Event en la cola de recepción.Para recibir múltiples datagramas desde el mismo puerto UDP, hay algunas cosas que se deben considerar:
Receive()
, pero es importante asegurarse de que el token esté preparado adecuadamente para su reutilización. Esto puede implicar restablecer cualquier campo relevante, como el estado del token o los punteros de búfer.Crear nuevos tokens de recepción: Alternativamente, puede ser necesario crear un nuevo token de recepción para cada paquete entrante. Cuándo y cómo se liberan estos tokens dependerá de la implementación específica.
Desafortunadamente, la interfaz del Protocolo UDP de UEFI no proporciona una API para determinar qué hay en la cola de recepción, lo que complica el proceso de depuración. Sin embargo, algunos enfoques posibles para resolver este problema incluyen:
En última instancia, la mejor solución dependerá de los requisitos y limitaciones específicas de la aplicación, así como de los recursos disponibles y la experiencia del equipo de desarrollo.