【问题标题】:UEFI UDP Receive tokenUEFI UDP 接收令牌
【发布时间】:2022-01-20 15:52:38
【问题描述】:

MiSimonSend TCP or UDP packets from efi application 中提供的示例代码显示了如何发送和接收单个数据包。我已经成功地能够发送多个数据包,但我在接收端遇到了困难。

UEFI UDP 协议 EFI_UDP4_PROTOCOL.Receive() 函数的 documentation 表示它

将异步接收请求放入接收队列。

根据 EDK2 源代码,人们可能会推断这是 NetMapInsertTail() 将新令牌放在 RxTokens 列表中。根据同一消息来源,似乎在传送数据报时,此标记会被删除,并带有NetMapRemoveHead()。然而,根据经验,在我成功接收到一个数据包后,从回调返回并发出RecycleSignal 的信号,我对Receive() 的下一次调用失败并出现 EFI_ACCESS_DENIED,在此上下文中描述为:

具有相同 Token.Event 的接收完成令牌已在接收队列中。

该接口没有提供任何 API 来确定“接收队列”中的内容,因此很难调查“删除”操作是否没有按照我的想法进行,或者是否正在重新排队,等等

所以我的问题的关键是:如何安排从同一个 UDP 端口接收多个数据报?

  • 接收队列上的令牌是否应该可以多次重复使用而无需多次调用Receive()? (如果是这样,必须做些什么来准备它以供重复使用?)
  • 还是需要为每个传入的数据包重新创建一些东西? (如果是,那么他们何时以及如何获释?)

【问题讨论】:

    标签: c network-programming udp uefi


    【解决方案1】:

    令牌中的事件只被调用一次,规范说(Spec 2.9,第 30.1.2 章接收):

    "为事件提供适当的通知功能和上下文 将使用户能够接收通知和接收状态。 保证不会重新进入那个通知功能。”

    您需要为每个令牌分配一个新事件。如果您想同时侦听多个数据报,您可以为每个事件使用唯一的上下文,但使用相同的通知函数。

    对于每个令牌,您必须:

    创建事件和令牌 -> 调用接收 -> 处理数据报或错误 -> 发出回收事件信号 -> 释放令牌事件

    【讨论】:

    • 好吧,我太新了,无法投票,但这解决了我的问题。
    • 很高兴我能帮上忙。如果您愿意,可以将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2020-07-03
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多