This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:没有响应的 ARP 数据包

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-who-has-no-response

器件型号:TM4C1294NCPDT

我按照配置[仅 NDK 器件]配置了电路板。

当器件连接开关时、一切都是一样的。 但是、当连接路由器时、我无法将数据包转发到设备。

我连续看到 ARP 数据包[谁拥有192.168.10.110? 请告知192.168.10.1。 设备无法响应此 ARP 消息。

在连接路由器时无法与设备通信。   

我是否遗漏了任何有价值的信息?


/*========================= 应用程序特定实例========================= *
/*========================= NDK 配置=================== *
VAR NDK = XDC.loadPackage ('ti.NDK.config');
VAR Global = xdc.useModule('ti.ndk.config.Global');
VAR IP = xdc.useModule('ti.ndk.config.Ip');
VAR UDP = xdc.useModule('ti.ndk.config.Udp');

global.ipv6 = false;
global.stackLibType = Global. min;
Global.networkOpenHook ="&netOpenHook";

//自动调用 fdOpen/CloseSession 以执行套接字任务*/
Global.autoOpenCloseFD = true;

global.pktSizeFrameBuf = 2048;

global.pktNumFrameBufs=60;
global.memRawPageCount = 6;
global.ndkThreadStackSize = 4096;
global.lowTaskStackSize = 2048;
Global.normTaskStackSize = 2048;
global.highTaskStackSize = 2048;

ip.ResolveIP = true;
ip.CallByIP = false;
Ip.autoIp = false;
ip.address ="192.168.10.110";
ip.mask ="255.255.255.0;
ip.gatewayIpAddr ="192.168.10.1";
//ip.ifIdx = 1;
ip.socketTimeToLive = 64;
ip.enableFiltering = true;
ip.domainname ="tiva.net";
Global.netSchedulerOpMode = Global. NC_OPMODE_INTERRUPT;
Global.netSchedulerPri = Global. nc_priority_low;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用了 TI-RTOS NDK。 我配置为静态 IP。

    我可以尝试 使用 NDK 中 console.c 中定义的 DumpRouteTable 方法。

    没有 ARP 条目和 MAC 信息。

    输出如下所示:

    在 NDK API 参考指南中、

    A.7链路层信息(LLI)对象

    •静态
    另一方面,静态条目是由中的应用程序手动配置的 ARP 条目
    它们没有与它们关联的超时。 它们在应用程序或用户之前保持有效
    删除它们。 此处不执行 ARP 请求-应答事务。

    如何通过.cfg 文件或在代码中配置 ARP enty ,任何示例都是值得赞赏的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [~ userid="449587" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response、所有这些都在设备连接交换机时是正确的。 但是、当连接路由器时、我无法将数据包转发到设备。[/quot]

     我不是 NDK 和 ARP 方面的专家。 从 NDK 的角度来看、如果它与交换机配合使用、则它应与路由器配合使用。 我的理解是、器件(运行 NDK 堆栈)将向网络发送 ARP 请求、以找出与其要通信的 IP 地址关联的 MAC 地址。 我不知道您的路由器为何不响应 ARP 请求。  

     我建议您执行以下操作:

     -首先运行直接连接到交换机或路由器的 TI-RTOS TCP 回显示例。  两者都能正常工作吗? 记录 Wireshark 捕获。

    -修改示例以使用静态地址并连接到交换机或路由器?  您可以取消单击该框以自动获取 IP 地址、以便手动输入静态地址。  两者都能正常工作吗? 记录 Wireshark 捕获。

    我还发现以下帖子可能会有所帮助。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597261/rtos-ndk-arp-messages/2204636?tisearch=e2e-sitesearch&keymatch=ndk%25252525252525252520arp#2204636

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/552991/ndk-for-tm4c129-arp-re-sending-timing-setting?tisearch=e2e-sitesearch&keymatch=ndk%25252525252520arp#

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的回答。

    正如您说过的、我实现了 ti-RTOS UDP 回波示例。 但没有任何变化。

    当器件连接开关时、一切都是一样的。 但是、当连接路由器时、我无法将数据包转发到设备。

    路由器设置必须正确,原因如果我使用 PC 而不是我的设备[TM4C1294],我可以将同一数据包转发到 PC。

     在 PC 端,有相同的应用程序回显 UDP。

    什么是缺失的?

    交换机测试:

    我的设备静态 IP:192.168.10.53: UDP 端口20200,测试 PC IP:192.168.10.51

    用于 UDP Echo 测试的 Wireshark 架构  

    路由器测试:

    我的设备静态 IP:192.168.10.53: UDP 端口20200 ,测试 PC IP: 172.1.1.26

    使用端口转发向我的设备发送数据包。

    用于 UDP Echo 测试的 Wireshark 架构  

    这是 LAN 侧。 谁有包。

    这是 WAN 端、目标不可达。

    我的路由器设置:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果运行常用 UDP 回显示例、则 UDP 端口设置为1000。 我认为您需要将路由器上的端口号更改为1000、以查看其是否起作用。 或者将回显程序端口号更改为20000-21000之间、看看这是否会产生影响。 除此之外、我不知道还有什么建议。 某种程度上、防火墙仍然处于阻塞状态。 请记住、运行 NDK 的 NDK 堆栈和 MCU 不知道谁是交换机和谁是路由器。 如果它在连接到交换机时起作用、那么我认为 NDK 正在工作。 您的问题似乎与网络有关。 如果您在公司网络上运行,您可能需要咨询 Planet 路由器供应商以获得一些指导,或者咨询您的 IT 部门。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    更改端口号没有区别。

    此时,设备静态 IP:192.168.10.110端口1000。

    我检查并快照了路由器的 WAN 侧和 LAN 侧。

    路由器通过端口1000将数据包转发到设备。 但器件未接收到任何数据包。 我 确认了调试断点。

    路由器工作正常,但设备未接收 到来自 IP 的任何数据包:172.1.1.26。  

    问题是什么? 我想这是 关于我错过的 NDK 配置。

    这是 WAN 端快照,PC 静态 IP:172.1.26,端口20201

    这是 LAN 端快照,Devie 静态 IP:192.168.10.110,端口1000

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    屏幕截图中显示了端口137。 为什么是这样? 这是 ARP 帧还是其他帧? 我不能告诉你。  

    您能否尝试使用 TivaWare 中的非 TI-RTOS 以太网示例? TivaWare 库中提供了多个以太网示例。 这些示例使用 lwIP TCP/IP 堆栈。 您是否会遇到相同的问题? 如果您遇到相同的问题,则表明存在网络和路由器问题。 如果路由器运行正常、则需要调查 NDK、尽管我不知道原因。 除非我的理解不正确、否则我无法理解为什么 NDK 在连接到交换机与路由器时会以不同的方式对待 ARP。  

    我还建议您尝试使用不同的路由器、看看这是否会产生影响。 如果问题与路由器配置有关、我将无法提供帮助、因为我不熟悉您的特定路由器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="449587" URL"/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response /4089073#4089073"]这是 LAN 端。 谁有电池组。[/quot]

    问题似乎在于 TM4C 器件未响应路由器发出的 ARP 请求。

    当 TM4C 和 PC 通过交换机连接时、TM4C 器件确实响应 PC 的 ARP 请求、我认为路由器的 ARP 请求在某种程度上有所不同。

    您能否使用 Wireshark 检查工作交换机测试和非工作路由器测试的 ARP 请求之间的差异?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    路由器工作正常,但设备未接收 到来自 IP 的任何数据包:172.1.1.26。  

    您可以看到局域网侧截屏。 数据包转发到192.168.10.110。 但 TM4C 器件无法接收任何数据包。

    在同一 LAN 网络中、我可以通过192.168.10.51[另一台 PC]发送数据包、此时 TM4C 器件可以接收来自 LAN 的所有数据包。

    NDK 中是否有路由器配置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是从路由器到 TM4C 器件的 ARP 请求。

    这是 TM4C 器件在处理交换机时发出的 ARP 请求和响应。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我用另一台具有相同静态 IP 192.168.10.110的 PC 更换了 TM4C 器件。  

     此 PC 可以从172.1.1.26[路由器转发]接收。

     “数据包正转发到192.168.10.110”,原因是 PC 已被插拔并拔出到 LAN。 因此路由器可以转发到192.168.10.110。

    如果我重置路由器、当 LAN 中只有 TM4C 器件时 、ARP 数据包将不会响应。

    上面已接收快照。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这是 pcap 文件,包括来自 LAN 和路由器的 ARP 数据包。

    e2e.ti.com/.../switch_5F00_router.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="449587" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response /4089745#4089745"]

    您可以看到局域网侧截屏。 数据包转发到192.168.10.110。 但 TM4C 器件无法接收任何数据包。

    在同一 LAN 网络中、我可以通过192.168.10.51[另一台 PC]发送数据包、此时 TM4C 器件可以接收来自 LAN 的所有数据包。

    [/报价]

    这意味着如果网络上有另一台 PC [192.168.10.51]、TM4C 器件可以接收来自 LAN 的所有数据包。  

    我建议您从 TivaWare 库中运行一个非 TI-RTOS 以太网示例。 您是否有机会尝试? 我想知道不同的 TCP/IP 堆栈是否存在相同的问题、或者这是 NDK 的特定问题、或者这是网络问题、我只是不知道如何理解和解决。 您是否还尝试了另一台路由器,而不是 Planet 路由器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="449587" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response /4089839#4089839"]此文件也包含来自 ARP 路由器的 pcap 文件[引用 pcap。]

    从这一捕获中可以看到、在 LAN 的情况下、TM4C 器件的 ARP 响应显示 TM4C 的 MAC 地址是以太网*广播*地址、根据 IEEE 规范、该地址无效:

    如何为 TM4C 器件设置 MAC 地址?

    默认情况下、MAC 地址从 USER0、1寄存器的内容中读取。

    在 TI Launchpad 上、TI 分配一个 MAC 地址并将其编程到 TM4C129器件的 USER0、1寄存器中。

    而在新的 TM4C129器件上、USRR0、1寄存器将处于所有寄存器的擦除状态、这可以解释您的问题。

    LM 闪存编程器可用于对 MAC 地址进行编程。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好。  

    这是成功完成的。这一切都与 MAC 地址有关。

    非常感谢您提供的宝贵信息。 也感谢 Charles。

    让我来解释一下它的工作原理。

    在我们的自定义 UDP 应用程序中、在 LAN 端、TM4C 器件的 ARP 响应显示 TM4C 的 MAC 地址是以太网*广播*地址、根据 IEEE 规范无效。这是正确的、因为:

    EMAC 未启动、我忘记     了在自定义 UDP 应用中取消注释"Board_initEMAC"函数。 我修复了。

    // Board_initEMAC();

    UDP 回显示例在 LAN 端发送 ARP 响应(如所示)。  

     发送 pcap 文件时、我可能已将 UDP 回显示例与自定义 UDP 应用程序交换。

    无论如何、UDP 回显和自定义 UDP 应用程序不能与 路由器配合使用、 而是与交换机配合使用。

    问题似乎在于 TM4C 器件未响应路由器发出的 ARP 请求。

    然后、我尝试 使用带路由器的 TM4C1294 Launchpad 运行 UDP 回显示例、成功运行。

    我像您所说的那样确定这是关于 MAC 地址的。

    我的定制板[例如、 MAC 地址= 11:22:33:44:55:66] 不能使用路由器。 但是、当 我替换为 launchpad MAC 地址[00-1A-B6-03-5C-5E ]时、它可以正常工作。

    我知道 MAC 地址在全球范围内是唯一的、因为存在数百万个网络设备、我们需要对每个设备进行唯一的标识。  MAC 地址是一个12位十六进制数(6字节二进制数)、主要用 Colon 十六进制表示法表示。 MAC 地址的前6位数(例如00:40:96)标识制造商、称为 OUI (组织唯一标识符)。 IEEE 注册机构委员会 将这些 MAC 前缀分配给其注册供应商。  

    在本例中、我有几个问题。

    NDK 中是否有任何 MAC 过滤器?

    如果没有有效的 MAC 地址,NDK 无法响应哪个代码段?

    此外,路由器 可能无法将数据包从 LAN 转发到 WAN,它没有有效的 MAC 地址?   

    如何生成有效的 MAC 地址?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="449587" URL" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response /4091548#4091548"]我的定制板[例如: MAC 地址= 11:22:33:44:55:66] 不能使用路由器。 [/报价]

    组地址和本地管理地址的范围 表示 MAC 地址是多播地址,而不是单播地址。 这可能是它无法与路由器配合使用的原因。

    [引用 userid="449587" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103433/tm4c1294ncpdt-arp-packet-wher-hus-no-response /4091548#4091548"]如何才能对 MAC 进行有效寻址[引用]

    我发现 随机本地管理的单播 MAC 地址 对于测试用途非常有用。 本地管理的 MAC 地址不会与制造商分配的 MAC 地址冲突。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢。

    这是我的最后一个.configuration [仅 NDK 器件]

    我认为最好能得到充分的注意。

    /*========================= 应用程序特定实例========================= *
    /*========================= NDK 配置=================== *
    VAR NDK = XDC.loadPackage ('ti.NDK.config');
    VAR Global = xdc.useModule('ti.ndk.config.Global');
    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    VAR UDP = xdc.useModule('ti.ndk.config.Udp');
    VAR ICMP = xdc.useModule('ti.ndk.config.Icmp');
    VAR EMAC = xdc.useModule('ti.ndk.config.Emac');
    VAR Route = xdc.useModule('ti.ndk.config.Route');

    global.ipv6 = false;
    global.stackLibType = Global. min;
    Global.networkOpenHook ="&netOpenHook";

    //自动调用 fdOpen/CloseSession 以执行套接字任务*/
    Global.autoOpenCloseFD = true;

    global.pktSizeFrameBuf = 2048;

    global.pktNumFrameBufs=60;
    global.memRawPageCount = 6;
    global.ndkThreadStackSize = 4096;
    global.lowTaskStackSize = 2048;
    Global.normTaskStackSize = 2048;
    global.highTaskStackSize = 2048;

    ip.ResolveIP = false;
    ip.CallByIP = false;
    Ip.autoIp = false;
    ip.enableFiltering = false;
    ip.address ="192.168.10.110";
    ip.mask ="255.255.255.0;
    ip.gatewayIpAddr ="192.168.10.1";
    //ip.ifIdx = 1;
    ip.socketTimeToLive = 64;
    ip.enableFiltering = true;
    ip.domainname ="tiva.net";
    Global.netSchedulerOpMode = Global. NC_OPMODE_INTERRUPT;
    Global.netSchedulerPri = Global. nc_priority_low;