我正在尝试为8位AVR MCU实现一个非常小的IP堆栈。我不希望它支持TCP,因为它真的太大而且我不需要它,而是UDP(当然还有ARP和ICMP)。
我希望堆栈代码适合16 kiB的ROM和1 kiB的RAM,当然为应用程序留出尽可能多的空间。我使用基于ENC28J60的板进行PHY / MAC管理,它具有内部8 kiB RX / TX循环缓冲区。当数据包到达此芯片时,它会将它们一个接一个地写入RX缓冲区,但不会覆盖最旧的数据包。最旧的指针由指针指向,当用户完成读取时,指针必须更新以指向下一个数据包。当新数据包到达时,它还会在其中一个引脚上发送中断。
对于RX部分,我想像lwIP那样工作: signal 当我们收到一个中断(保存其地址和大小)时新数据包就绪,但只有当用户继续调用我们的IP堆栈功能。这应该没问题;如果用户没有经常调用我们的函数,新的到达数据包将被丢弃,就是这样。用户为堆栈提供UDP回调。
现在,问题在于TX。假设我想将UDP数据包发送到某些IP,我不知道链接地址。在发送数据包之前必须发送ARP请求。如果UDP数据包在ARP回复之前进入该怎么办?它必须由我的UDP回调处理,但如果我想从此回调发送一些内容怎么办?我还在等待ARP回复。确定这种阻止机制不对。
我的问题是:是否可以接受异步发送?因此,如果我想发送内容,我提供带回调的send函数,当UDP数据包可能被调用时它被调用发送。这样,一切都是事件驱动的。
答案 0 :(得分:2)
关于异步发送是否“可接受”,我无法想象它为什么会出现问题,只要你能在代码大小要求中实现它。
至于实现这种方案的最佳方式,我不知道你想支持多大的数据包大小(我猜的比理论上最大的64K要少很多),但我会分配一个环发送缓冲区,每当负责实际发送到硬件的进程运行其循环/中断/无论什么时,它都会检查每个活动缓冲区的ARP状态(有ARP条目,ARP请求未完成,ARP请求超时,没有ARP条目)或请求未完成)并采取适当的措施(分别:推送到具有适当MAC的硬件,跳过这一次,丢弃,发送ARP请求)。您可以在每次更新ARP表时触发此发送例程以便您可以满足任何必要的实时要求(尽管有些人会认为以太网不是并且永远不会是真正具有实时功能的系统,但那是另一个不介意火焰战的论坛的主题。)
答案 1 :(得分:1)
你有两个回调(基本上是异步路径),一个用于从IP层接收,一个用于发送到IP?
另外,如果您正在实现图层,我认为IP发送/路由功能应该处理该级别的ARP回复。