es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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 con NetMapRemoveHead(). Después de recibir correctamente un paquete y regresar desde la devolución de llamada, la siguiente llamada a Receive() 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:

    1. Reutilizar tokens de recepción: Es posible reutilizar un token de recepción varias veces sin realizar varias llamadas a 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.
    2. 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:

    • Examinar el código fuente de EDK2 con más detalle para comprender mejor cómo se gestiona la cola de recepción.
    • Implementar una solución alternativa que utilice múltiples tokens de recepción preasignados para evitar la necesidad de reutilizar tokens.
    • Implementar un protocolo o mecanismo de comunicación diferente que se adapte mejor a los requisitos específicos de la aplicación.

    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.

Comments are closed.