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 接收令牌的主要内容,如果未能解决你的问题,请参考以下文章
android-Android udp接收不到组播,请问如何解决