0

(编辑:已解决——见下文)

这是我的情况:

TL-MR3020 -----ethernet----- mbed
OpenWRT                      C/C++ custom networking stack
192.168.2.1                  192.168.2.16
  • TL-MR3020是一款 Linux 嵌入式路由器
  • mbed是一个 ARM 微控制器。

在网络上,我只希望他们使用端口 2225 上的 UDP 数据包交换消息。特别是,TL-MR3020 必须每秒定期向 192.168.2.16:2225 发送数据包,而 mbed 必须每 50 毫秒定期向 192.168.2.1 发送数据包:2225。

一切都很好,直到我从 mbed(lwIP,对我来说不是那么轻量级)中删除了网络堆栈库并编写了一个新的最小堆栈。
我的新堆栈在以太网链路启动后发送 5 个免费 ARP 回复,然后开始发送和接收 udp 数据包。

现在 TL-MR3020 没有收到任何 UDP 数据包。特别是,ifconfig我可以看到数据包来了,但我的应用程序无法获取它们。
此外,如果我连接笔记本电脑而不是 TL-MR3020,我可以看到使用 Wireshark 的 UDP 数据包。没有任何问题,除了为我的应用程序完成。

我有一个 node.js 脚本必须接收数据包,但它什么也没有收到,但是如果我从本地发送 UDP 数据包到本地,脚本会接收它们。
我认为我的应用程序还可以,因为 SOCAT 都不能使用socat - UDP-LISTEN:2225.

我已经检查过 TL-MR3020:

  • arp 表具有正确的 ip-mac 关联
  • 目标 MAC 地址与传入接口匹配
  • 目标 IP 地址与传入接口匹配
  • IP校验和:wireshark说好=假,坏=假
  • UDP校验和:wireshark说好=假,坏=假

所以,我在问......自定义网络堆栈发送 UDP 数据包的最低要求是什么?

解决了:

  • 您需要在 IP 标头中有一个好的校验和。
  • UDP校验和,我的例子,可以设置为零。
  • tcpdump非常有帮助(感谢 AndrewMcDonnell)
4

0 回答 0