UEFI UDP 接收令牌

Posted

技术标签:

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

MiSimon 在Send 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()? (如果是这样,必须做些什么来准备它以供重复使用?) 还是需要为每个传入的数据包重新创建一些东西? (如果是,那么他们何时以及如何获释?)

【问题讨论】:

【参考方案1】:

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

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

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

对于每个令牌,您必须:

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

【讨论】:

好吧,我太新了,无法投票,但这解决了我的问题。 很高兴我能帮上忙。如果您愿意,可以将答案标记为已接受。

以上是关于UEFI UDP 接收令牌的主要内容,如果未能解决你的问题,请参考以下文章

我用udp发送一个16进制包,接收端怎么解析。

android-Android udp接收不到组播,请问如何解决

UDP 端口无法接收数据

Java:通过 TCP 发送/接收数据并从 UDP 接收图像

如何接收组播 UDP?

linux内核协议栈 UDP之数据报接收过程