主题中讨论的其他器件:AM2634
团队成员、您好!
我正在使用 AM2634上的引导加载程序 ETH。
在成功建立通信后、我遇到了 TCP Rx 帧丢失问题。
ARP 和 UDP 帧正在接收、只有 TCP 帧被丢弃。
且 TCP 握手失败且无 TCP 链路。
但当使用 NCAT 向 TCP 帧发送该帧时、硬件正在接收和响应。
您能就我的问题向我提供任何提示吗?
此致、
Hari
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.
团队成员、您好!
我正在使用 AM2634上的引导加载程序 ETH。
在成功建立通信后、我遇到了 TCP Rx 帧丢失问题。
ARP 和 UDP 帧正在接收、只有 TCP 帧被丢弃。
且 TCP 握手失败且无 TCP 链路。
但当使用 NCAT 向 TCP 帧发送该帧时、硬件正在接收和响应。
您能就我的问题向我提供任何提示吗?
此致、
Hari
嗨、Hari、
1.正在发送的 TCP 帧没有格式错误、正确吗? 您能否使用 GEL 脚本并共享 CPSW 统计信息? 完成应用程序运行并验证 TCP 是否正常工作后、停止内核并转到"Scripts"->"CPSW Stats"并运行 CPSW3G nonzero stats GEL 脚本。 请分享这些统计数据、以便我们能够理解问题。
2.如果我的理解正确、192.168.88.77是您的外部 PC、而192.168.88.73是 AM263x? 如果愿意、MCU 确实发回了 TCP 数据包的 ACK。 您能否确保外部世界 PC 不会因为某些防火墙设置而丢弃此数据包?
此致、
Shaunak
尊敬的 Shaunak:
1.正在发送的 TCP 帧没有格式错误、正确吗? 您能否使用 GEL 脚本并共享 CPSW 统计信息? 完成应用程序运行并验证 TCP 是否正常工作后、停止内核并转到"Scripts"->"CPSW Stats"并运行 CPSW3G nonzero stats GEL 脚本。 请分享这些统计数据、以便我们能够理解问题。
->否、TCP 帧没有格式错误。
->是否有任何特定的功能,从有必要读取统计?
制动执行时获得空的统计数据
从变量:
*当我在 T307C( Ip_Rx )保持制动点时,我可以看到 TCP 帧接收。
ETH 或 EthTrcv 中是否存在时序问题?
2.如果我的理解正确、192.168.88.77是您的外部 PC、而192.168.88.73是 AM263x? 如果愿意、MCU 确实发回了 TCP 数据包的 ACK。 您能否确保外部世界 PC 不会因为某些防火墙设置而丢弃此数据包?
->是的、 192.168.88.77/71是 外部 PC、192.168.88.73是 AM263x?
->不知道防火墙阻止,我会更新你。
当我在 T387ICA()中保持制动点时,我就能看到 Ip_Rx 帧的接收。
此致、
Hari
嗨、Hari、
1.从统计数据可以看出数据包会被丢弃(ALE_DROP)。 您能否验证 MAC 地址是否已添加到 ALE 表中? 您是否可以使用 GEL 脚本并共享 ALE 表的转储?
2.从统计数据中,我也看到 Rx 计数在递增。 我的观察结果是、您尝试建立 TCP 连接、第一个 SYN 数据包从外部世界发送到 MCU、MCU 以 ACK 进行响应(我可以在您的 Wireshark 片段中看到)、但随后其他 TCP 数据包似乎会被 ALE 丢弃、理想情况下应该不会这样。 您是否还可以并行使用任何其他数据流(确认丢弃的数据包不是某些意外数据包、而是 TCP 数据包)
此致、
Shaunak
尊敬的 Shaunak:
1.从统计数据可以看出数据包会被丢弃(ALE_DROP)。 您能否验证 MAC 地址是否已添加到 ALE 表中? 您是否可以使用 GEL 脚本并共享 ALE 表的转储?
->返回空值
->在什么时候,我必须阅读它。
->从那里我可以检查它的源代码来确认 ALE 表?
2.从统计数据中,我也看到 Rx 计数在递增。 我的观察结果是、您尝试建立 TCP 连接、第一个 SYN 数据包从外部世界发送到 MCU、MCU 以 ACK 进行响应(我可以在您的 Wireshark 片段中看到)、但随后其他 TCP 数据包似乎会被 ALE 丢弃、理想情况下应该不会这样。 您是否还可以并行使用任何其他数据流(确认丢弃的数据包不是某些意外数据包、而是 TCP 数据包)
->在实际用例中、AM2634没有 ACK
->这只是为了检查而不是实际的用例
对于以下请求、以上内容是可以的、 ncat -t 192.168.88.73 13400 -p 60020
嗨、Hari、
请确保您也使用的是最新的 CCS 版本。 很奇怪的是、ALE 和 CPSW 统计数据都返回为空。 有些设置问题。
请在您尝试建立 TCP 连接时暂停内核、它会失败。 然后运行 GEL 脚本。
[报价用户 id="592034" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1356305/tmdscncd263-am2634---ethernet-drops-rx-tcp-frames-while-reception/5174747 #517474747"]->这只是为了检查而不是实际的用例
[报价]我不明白这一点。 您能解释什么是"实际"案例与工作案例(ncat)
附加的上述屏幕截图(其中我看到 ACK 数据包)不是"实际"用例吗?
此致、
Shaunak
尊敬的 Shaunak:
实际用例:
以下请求序列从 PC 发送到 AM2634
-> ARP、ICMP、DoIP(UDP)和 TCP。
-> ARP -已确认。
-> ICMP (Ping)-无响应。
-> DoIP(UDP)-已响应。
-> TCP -无确认和无连接建立。
检查用例(ncat):
仅发送了一个 TCP 请求 ncat -t 192.168.88.73 13400 -p 60020
嗨、Hari、
运行1次
使用案例检查(ncat):
在这种情况下、可以看到来自 MCU 的响应是正确的?
实际使用案例:
在实际情况下、您能解释如何发送数据包吗? 如果驱动程序出现问题、NCAT 连接不应该成功、对吧? 您是否已建立 NCAT 终端连接日志?
该问题可能还与上层 TCP/IP 堆栈有关。 如果问题与驱动程序有关、我假设 UDP/ARP 数据包也将被丢弃。 我可能错了,但我必须进一步研究这一点。
同时、您能否进一步研究 ALE 丢弃帧。 您可以在每次发射后检查统计数据吗? (首先发送 ICMP、检查统计数据、然后发送 TCP、再检查统计数据、然后发送 ARP 和检查统计数据)
此致、
Shaunak
尊敬的 Shaunak:
我已经尝试过了、正如您建议的
同时、您能否进一步研究 ALE 丢弃帧。 您可以在每次发射后检查统计数据吗? (首先发送 ICMP、检查统计数据、然后发送 TCP、再检查统计数据、然后发送 ARP 和检查统计数据)
达到 Eth 时的统计数据 T452.42_rxIndicationIcmp() Ip_Ip function - ICMP frame
达到 Eth 时的统计数据 T452.45 Ip_Tcp_ Indication() 函数-tcp 帧
达到 Eth 时的统计数据 T452.45 Ip_Udp_ Indication() 函数- ARP 帧
未接收、按顺序发送 ARP - ICMP - UDP -TCP。
ICMP 和 TCP 没有响应。
*当我在 T307C( Ip_Rx )中保持制动点时,我可以看到 ICMP、 TCP 帧接收和响应。
据我所知、存在一些同步/时序问题。
您能告诉我、漏了什么地方。
此致、
Hari
嗨、Hari、
1.从上面分享的统计数据来看,我看不到任何下降,所以我们确定 CPSW 没有下降任何帧。 在 CPSW 之后、MCAL Eth 驱动程序将获取帧。 如果您查看 MCAL 的 TH 演示、我们可以使用"gAppObj.stats"来显示统计数据。 您是否有可能检查这些统计数据并查看是否存在任何溢出或其他错误?
2.如果我错了,请纠正我,这里的流程是
来自外部世界的数据包-> CPSW -> MCAL Eth 驱动程序->上层 TCP/IP 堆栈
无论帧类型如何(TCP/UDP/ARP/ICMP)、CPSW 和 MCAL Eth 驱动程序都不会以不同的方式处理它们、而是仅执行所需的基本处理并将其转发到上层堆栈
3. Im 不确定这是否是计时问题。 我会让其他专家对此发表评论。 但我再次理解、如果是计时问题、UDP 和 ARP 也应该有问题。
根据我的理解、存在一些同步/计时问题。
此致、
Shaunak
尊敬的 Shaunak:
只有当帧单独发送而不是按顺序发送时、才会接收到所有类型的帧。
我已在 Ethh 驱动器中添加了一个代码、以检查驱动器级的帧接收情况、如下所示
仅当帧单独发送而不是按顺序发送时、这些制动点才会发生撞击。
*即使是以上的制动点也不会对所有的单个请求进行撞击,有时 Eth 驱动器正在掉落框架。
来自外部世界的数据包-> CPSW -> MCAL Eth 驱动程序->上层 TCP/IP 堆栈
-> MCAL ETH 驱动程序-> EthIf ->您的上层 TCP/IP 堆栈
实际所需序列
对于上述序列、上述制动点未发生碰撞。
此致、
Hari
嗨、Hari、
只有在帧不按顺序单独发送时、才能收到所有类型的帧。
感谢您确认这一点。 现在我更好地理解了这个问题。
我需要一些时间来调查这件事。 我很快就会给您回复、介绍我们可以进一步调试的内容。
此致、
Shaunak
你(们)好、Hari
由于我们没有完整的 AUTOSAR 堆栈、因此我很难重新创建。 当我发送50,000个数据包间隔(10ms)时、仅在第2层进行测试未显示此问题。 这是因为 L2驱动程序将以相同的方式处理所有数据包。
对于时序和 EthTrcv 配置、您可以参考开箱即用演示。 我用同样的方法进行测试。 我可以帮助使用与 CPSW 相关的调试指针、但从 AutoSAR 堆栈的角度来看、我不确定 TCP/IP 调试情况。
1.要查看 DMA 状态、可以选中"0x52834024"以获取 DMA 状态。 如果是"80000000"、则表示它处于空闲状态。 如果有任何其他值、则会指示 DMA 被阻止。
2.检查 CPSW 统计数据是否存在跌落和溢出(在您按顺序发送所有数据包并且未收到电路板的响应后)。 按照前面提到的顺序发送所有数据包后执行此操作。
3.检查 FIFO 队列是否存在丢弃: 0x5283A04C (Tx SOF 溢出)、 0x5283A08C (FIFO 底部的 Rx 丢弃)(两者都应为零)
4. AutoSAR 堆栈的 TCP/IP 实现中是否有日志或调试统计信息? 我建议也检查一下。
此致、
Shaunak
嗨、Hari、
根据我们获得的调试调用、我们倾向于 PortMask 和 ALE 配置问题。
1.为了进一步测试,我们可以尝试绕过 ALE。
您能否将其添加到代码中:
嗨、Hari、
PORTMASK_DROP!= 0的原因有多种、但最可能的原因有:
"那你怎么又来了?" 此类操作通常可以解决此问题:
[报价 userid="534155" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1356305/tmdscncd263-am2634---ethernet-drops-rx-tcp-frames-while-reception/5201919 #5201919"]此致、
Shaunak
尊敬的 Shaunak:
"广播 MAC 地址将在 Init/SetPhys 地址 API 期间注册,我们应该知道数据包的目标 MAC 地址(从外部发送到控制器),我们应该在 ALE 表 Eth_Update 中注册 MAC 地址。"
我已经尝试获取广播 Mac 地址。
->根据我的理解、获取 外部广播 Mac 地址是不可能的、只能在外部 ARP 期间。
你能告诉我 ALE 表的地址/变量吗?
->在哪个函数中可以调用以下函数 Eth_Update AddrFilter
您能不能更详细地解释一下、我能从哪个函数获得广播 Mac?我能从哪个函数在 ALE 表中更新它?
嗨、Hari、
我昨天就不在办公室了,因为我的反应延迟了。
1.我们能够在 ALE 被绕过的情况下运行测试(不会由 ALE 评估/丢弃入口的任何数据包)。 我们在调试调用中注意到 ALE 端口掩码导致了问题。 ALE 将转发广播数据包、这就是我们能够看到 DoIP (UDP)和 ARP 数据包没有下降的原因。 这种广播转发是有效的、因为在 Init 期间、我们在 ALE 中添加了广播 MAC。
2.对于我们来说、ALE 中不存在单播地址。 我怀疑这是一个问题: 数据包的 DA 是 ALE 表中未包含的单播(即不是主机端口的 MAC 地址)
3.
->在哪个函数中我可以调用以下函数 Eth_Update AddrFilter
流程一般如下:
Eth_Init ()->45V App_Trcv 3015IT()->45V Eth_Set Mode()-> Eth_Set _Addr() 0 -> Eth_Update T.2001 AddrFilter()
首先初始化 ETH 和 ETH Trcv。 然后、我们在控制器模式下设置 AM263x、设置控制器地址、再将数据包的目标地址设置为 ALE。 粗体函数是 我认为在此例中缺少的并导致数据包丢失的函数。
您无需在 ALE 表中更新或添加广播 MAC。 请参阅点2。
->请告诉我 ALE 表的地址/变量。
很难从存储器浏览器直接读取 ALE 表。 ALE 表寄存器可在寄存器指南的第4.18.416节中找到: www.ti.com/.../spruj42d.pdf
ALE 表应由 GEL 脚本读取。 ALE 表的起始地址为 0x5283E020并且有512个条目。 每个条目将分为字0 (0x5283E03C)字1 (0x5283E038)和字2 (0x5283E034)。 那么我们可以进一步推断这一点。
GEL 脚本通过以下方式读取 ALE 表:
hotmenu cpsw_print_ale_table_3g() { uint32_t word0, word1, word2; uint32_t type; int i; GEL_TextOut("---------------------------------------------\n"); GEL_TextOut("-------CPSW3G ALE TABLE----------------------\n"); GEL_TextOut("---------------------------------------------\n"); for (i = 0; i < ALE_TABLE_DEPTH_3G; i++) { WR_MEM_32(ALE_TBLCTL_3G, i); word0 = RD_MEM_32(ALE_TBLW0_3G); word1 = RD_MEM_32(ALE_TBLW1_3G); word2 = RD_MEM_32(ALE_TBLW2_3G); if (0) { GEL_TextOut("WORD1 = %u\n",,,,, word0); GEL_TextOut("WORD1 = %u\n",,,,, word1); GEL_TextOut("WORD1 = %u\n",,,,, word2); } /* ENTRY_TYPE (bits 61:60) */ type = (word1 >> 28) & 0x3; if (type == ALE_ENTRY_EMTPY) { //GEL_TextOut(" Entry %u - Empty\n",,,,, i); } else if (type == ALE_ENTRY_ADDR) { if ((word1 >> 8) & 0x1) { show_ale_entry_multicast_3g(i, word0, word1, word2); // } else if ((word1 >> 30) & 0x3) { // show_ale_entry_oui_unicast(i, word0, word1, word2); } else { show_ale_entry_unicast_3g(i, word0, word1, word2); } } else if (type == ALE_ENTRY_VLAN) { show_ale_entry_vlan_3g(i, word0, word1, word2); } else if (type == ALE_ENTRY_VLAN_ADDR) { if ((word1 >> 8) & 0x1) { show_ale_entry_vlan_multicast_3g(i, word0, word1, word2); } else { show_ale_entry_vlan_unicast_3g(i, word0, word1, word2); } } } GEL_TextOut("Completed analysis of %u ALE entries\n",,,,, i); }
此致、
Shaunak
尊敬的 Shaunak:
我认为下面是非自动标记序列。
Eth_Init ()->45V App_Trcv 3015IT()->45V Eth_Set Mode()-> Eth_Set _Addr() 0 -> Eth_Update T.2001 AddrFilter()
在本例中、顺序略有不同、根本不调用这些函数 Eth_Set Addr()、 Eth_Update AddrFilter()
Eth_Init ()- 45ml Trcv_Init ()- Eth_Set 3079器模式()
因为问题长期以来一直未决
我的工作时间从1pm IST 开始。
明天是否可以有调试会话来结束和关闭问题?
此致、
Hari
嗨、Hari、
为了使调试更轻松、我尝试在 MCAL 的开箱即用 Eth 应用演示中复制此内容。 我不能这样做。 我请另一位专家也对其进行审查、但他们 都无法复制。
如果可能的话,你可以尝试复制它在你的终端只与 Eth 应用程序演示. 我们只需要用您的工具检查 MCAL 演示中的统计数据(检查 ICMP 和 TCP 滴点)。 驱动程序在第2层处理所有数据包。 运行 MCAL ETH 应用演示并使用您的工具发送数据包、如果我们看到 MCAL Eth 演示也显示下降、那么我可以确认这是 ALE 或 MCAL 产品的问题、否则这可能是测试或应用级问题、我没有自己的专业知识。
我还有一个建议、如果您使用的是 MCAL 09.01 SDK、请尝试对 MCAL 09.02 SDK 执行相同的操作、因为团队进行了一些更改。
此致、
Shaunak
尊敬的 Shaunak:
我尝试用 Mcal 演示测试相同的测试顺序、但无法测试。
工具期望 Mcal Demo 的 ARP 响应继续剩余的测试序列,而在 Demo 中则没有发生。
ALE 和 STAT 脚本结果:
在这种情况下、没有跌落、无法确认帧跌落。
因为完整的测试序列未完成。
从上面的 ALE 图像端口0具有 HW 和 Tester Mac 地址。
此处没有基于 MAC (而不是 IP 地址)的 ARP 和传输。
q)何时/从哪个功能测试仪 Mac 添加到 ALE 中?
q)何时接收帧?
问:通常、何时将测试仪 Mac 添加到 ALE 中?
*我会尝试可能性,测试相同的序列,但不确定。
嗨、Hari、
1.我也无法在我们的 SDK 中重现该问题。
[报价 userid="592034" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1356305/tmdscncd263-am2634---ethernet-drops-rx-tcp-frames-while-reception/5218615 #5218615"]此处没有基于 MAC (而不是 IP 地址)的 ARP 和传输。
[报价]是的、由于我们没有 TCP/IP AutoSAR 堆栈、因此我们无法测试基于 IP 的传输、但我知道一些使用的客户在通过 MCAL 集成其堆栈后成功实现了基于 IP 的通信。
2.
Q)何时/从哪种功能测试仪向 ALE 添加 Mac?
你可以参考 EthApp Demo,我们使用 Eth_Set 2001地址() 控制器 MAC 和使用 Eth_Update T.2001 AddrFilter() 添加测试 MAC 地址(这将是该工具所发送数据包的目标地址)。
所有 MAC 地址添加在之后发生 Eth_Init ()、Eth_Trcv 541IT()、 Eth_Set 3628erMode()、 Eth_Get 247erMode()。
[报价 userid="592034" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1356305/tmdscncd263-am2634---ethernet-drops-rx-tcp-frames-while-reception/5218615 #5218615"]Q)接收一帧?[/QUOT]不、它是在手头之前添加的
您可以参考 ALE.c、了解它是如何加入 Eth_Priv 的。
第一时间发送 Eth_Update T.2001 AddrFilter() 进行调用 Eth_Hw 骨灰阶滤波器()。
我建议在该函数中添加一个断点、同时添加测试仪 MAC 并检查的值 currPort . 如果该值为0、则 ALE 表端口号为0、如果为1、则将添加为端口号1。
您是否可以尝试此操作并确保其为零(出于测试目的、您可以尝试硬编码0)。 但是、由于在 SDK 中看不到压降、因此我不确定我可以在这里投入多少精力。 似乎是测试或配置问题。 因为当我们使用 ncat 独立测试 TCP 时、我们可以连接和执行 ICMP ping 操作。
此致、
Shaunak