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.

[参考译文] AM6442:通过 PRP 卸载实现 PRU-ICSSG 鹅脉冲数据包接收

Guru**** 2937100 points

Other Parts Discussed in Thread: AM6442, TMDS64EVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1645245/am6442-pru-icssg-goose-packet-reception-via-prp-offload

器件型号: AM6442
Thread 中讨论的其他器件: TMDS64EVM

我使用的是 AM6442 SDK 12.00.00.07。
我将硬件 PRP(PRP 卸载)与 PRU‑ICSSG 一起使用。
根据以下链接、我使用了 pruprp-fw.elf 并创建了 prp0。
https://software-dl.ti.com/processor-sdk-linux-rt/esd/AM64X/12_00_00_07_04/exports/docs/linux/Foundational_Components Network/Kernel/Network/PRP_Offload.html Kernel_Drivers

但是、我无法接收 IEC61850 鹅或采样值数据包。
我要接收的数据包的 VLAN ID 是 2。
我已使用 ip maddr add 添加了要接收的数据包的 MAC 地址。
 # ip maddr add 01:0c:cd:00:00:00 dev prp0.2   <-- GOOSE
 # ip maddr add 01:0c:cd:01:00:00 dev prp0.2   <-- Sampled Value

如果我运行:
 # ip link set dev prp0.2 allmulticast on

 # ip link set dev eth0 promisc on && ip link set dev eth1 promisc on

便能够接收数据包。

是否缺少任何配置?
请告诉我是否有我应该检查的要点。

此致。

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

    启用`Ω`和`Ω`时、我的设备接收不需要的数据包。
    我只想接收通过`ip maddr add`添加的数据包。

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

    您好、Yamamamoto Harumi、

    对延迟的回复表示歉意。

    只需逐步检查每个阶段、

    1.如果没有 VLAN 配置、您是否在添加多播过滤器后看到预期接收的数据包?

    2.如果没有针对鹅和采样值的多播过滤器配置,您可以在 PRP VLAN 接口上接收通用数据包(可以是 TCP/UDP)吗?

    3.如果没有配置 PRP、在 VLAN 和组播过滤器配置下、您可以接收鹅和采样值吗?

    这三个测试/检查的目的是缩小您所看到的问题的范围、即 1) VLAN 特定 2) 组播过滤器特定 3) PRP 特定

    -道林

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

    感谢您的答复、Daolin。

    > 1. 如果没有 VLAN 配置、您是否会在添加多播过滤器后看到预期接收的数据包?
    无法接收数据包。

     # ip maddr add 01:0c:cd:00:00 dev prp0  <-- goose、无法接收
     # ip maddr add 01:0c:cd:01:00:00 dev prp0  <-采样值、无法接收


    > 2. 如果没有针对鹅和采样值的多播过滤器配置、您能否在 PRP VLAN 接口上接收通用数据包(可以是 TCP/UDP)?
    我已使用 SSH 从另一台计算机成功连接到 prp0.2。


    > 3. 如果未配置 PRP、使用 VLAN 和多播过滤器配置、您能否接收鹅和采样值?
    我在 eth0 上`了未配置 PRP 的` prueth-fw.elf。

    如果没有多播过滤器配置、则无法接收鹅和采样值数据包。
    配置多播筛选器后、成功接收到 goose 和采样值数据包。

     # ip maddr add 01:0c:cd:00:00 dev eth0.2  <-- goose、成功接收
     # ip maddr add 01:0c:cd:01:00:00 dev eth0.2  <--已成功接收到采样数据


    请查看以上内容。
    此致、
    Harumi

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

    尊敬的 Harumi:  

    再进行一次确认、好像您正在使用 eth0 进行 PRP 测试。 您是使用 TI TMDS64EVM 进行测试还是使用定制电路板? 如果使用 TMDS64EVM、eth0 通常是 CPSW 以太网端口。 仅在 TMDS64EVM 上 eth1 和 eth2 的 ICSSG 以太网端口上支持 PRP 卸载。

    此外、您的网络拓扑是什么?  

    是否使用 RT-Linux SDK 12.00.00.07 或常规 Linux SDK 12.00.07?

    我还尝试在两个连接的 TMDS64EVM (eth1 到 eth1、eth2 连接到 eth2) 上复制您的测试、以实现简单的 PRP 设置。 我正在使用 RT-Linux 6.18 内核(与 RT-Linux SDK 12.00.00.07 相同的内核)。 PRP 设置脚本与您使用的链接中的脚本相同。

    Linux am64xx-EVM 6.18.13-00779-gc2a0b0f74338 #8 SMP 抢占周四 4 月 2 日 14:07:53 CDT 2026 AArch64 GNU
    /Linux

    EVM1 eth1 <-> eth1 EVM2

    EVM1 eth2 <--> eth2 EVM2

    到目前为止、我可以通过我的测试得出结论  

    1. ping PRP 测试:从 EVM1 ping EVM2、断开 eth1、0 数据包丢失

    2. ping PRP 测试:从 EVM1 ping EVM2、断开 eth2、0 数据包丢失

    3.多播+ PRP 测试: 使用一个测试应用程序(下面是该测试应用程序的二进制文件)将 500 个数据包发送到 01:80:C4:00:00:0e ,在 ip maddr 添加 01:80:C4:00:0e 后,在 prp0 上配置,我无法看到数据包显示在 prp0 接口上。 但是、我能够看到 eth1 和 eth2 接口上显示 500 个数据包。  

    e2e.ti.com/.../send_5F00_modified_2800_1_2900_

    能否在测试设置中检查 eth1 和 eth2 接口上是否接收到数据包?

    我还可以观察到、如果我为 eth1 打开混杂模式、则会在 prp0 上的多播地址接收数据包。 我认为这与过去针对 HSR 卸载修复的类似问题有关、但可能无法针对 PRP 卸载修复该问题。 为了确认这一点、如果您能够重新编译 ICSSG 驱动程序、能否将以下调试语句(带有“debug_DQ:“的语句)添加到 icssg_prueth.c 驱动程序中的“emac_ndo_set_rx_mode_work“中?

    static void emac_ndo_set_rx_mode_work(struct work_struct *work)
    {
    	struct prueth_emac *emac = container_of(work, struct prueth_emac, rx_mode_work);
    	struct prueth *prueth = emac->prueth;
    	struct net_device *ndev = emac->ndev;
    	bool promisc, allmulti;
    
    	printk("DEBUG_DQ: !netif_running(ndev)=%d\n", !netif_running(ndev));
    
    	if (!netif_running(ndev))
    		return;
    
    	promisc = ndev->flags & IFF_PROMISC;
    	allmulti = ndev->flags & IFF_ALLMULTI;
    	emac_set_port_state(emac, ICSSG_EMAC_PORT_UC_FLOODING_DISABLE);
    	emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_DISABLE);
    
    	printk("DEBUG_DQ: promisc=%d, allmulti=%d\n",promisc,allmulti);
    
    	/*
    	if (promisc) {
    		emac_set_port_state(emac, ICSSG_EMAC_PORT_UC_FLOODING_ENABLE);
    		emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_ENABLE);
    		return;
    	}
    	*/
    
    	if (allmulti) {
    		emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_ENABLE);
    		return;
    	}
    
    	if (!prueth->is_switch_mode) {
    
    		printk("DEBUG_DQ: ENTER NOT IS_SWITCH_MODE\n");
    
    		emac_fdb_flush_multicast(emac);
    
    		if (!prueth->is_hsr_offload_mode) {
    
    			printk("DEBUG_DQ: ENTER NOT IS_HSR_OFFLOAD_MODE\n");
    
    			if (!netdev_mc_empty(ndev)) {
    
    				struct netdev_hw_addr *ha;
    
    				printk("DEBUG_DQ: ENTER NOT NETDEV_MC_EMPTY\n");
    
    				/* Program multicast address list into FDB Table */
    				netdev_for_each_mc_addr(ha, ndev) {
    					icssg_fdb_add_del(emac, ha->addr, 0,
    							  BIT(emac->port_id), true);
    					icssg_vtbl_modify(emac, 0, BIT(emac->port_id),
    							  BIT(emac->port_id), true);
    				}
    				return;
    			}
    		} else {
    			/* Now that the FDB entries are flushed, restore the
    			 * entries that were added during ndo_open
    			 */
    
    			printk("DEBUG_DQ: ENTER IS_HSR_OFFLOAD_MODE\n");
    
    			icssg_fdb_add_del(emac, eth_stp_addr, prueth->default_vlan,
    					  ICSSG_FDB_ENTRY_P0_MEMBERSHIP |
    					  ICSSG_FDB_ENTRY_P1_MEMBERSHIP |
    					  ICSSG_FDB_ENTRY_P2_MEMBERSHIP |
    					  ICSSG_FDB_ENTRY_BLOCK,
    					  true);
    			icssg_vtbl_modify(emac, emac->port_vlan, BIT(emac->port_id),
    					  BIT(emac->port_id), true);
    
    			/* In order for the packets to be received at host port, Both
    			 * HSR firmware requires VLAN ID = 1 to be present
    			 * in the VLAN table
    			 */
    			icssg_vtbl_modify(emac, DEFAULT_VID, DEFAULT_PORT_MASK,
    					  DEFAULT_UNTAG_MASK, true);
    
    			if (!netdev_mc_empty(ndev)) {
    				struct netdev_hw_addr *ha;
    
    				/* Program multicast address list into FDB Table */
    				netdev_for_each_mc_addr(ha, ndev) {
    					icssg_fdb_add_del(emac, ha->addr, prueth->default_vlan,
    							  ICSSG_FDB_ENTRY_P0_MEMBERSHIP |
    							  ICSSG_FDB_ENTRY_P1_MEMBERSHIP |
    							  ICSSG_FDB_ENTRY_P2_MEMBERSHIP |
    							  ICSSG_FDB_ENTRY_BLOCK,
    							  true);
    				}
    
    				icssg_vtbl_modify(emac, emac->port_vlan, BIT(emac->port_id),
    						  BIT(emac->port_id), true);
    				return;
    			}
    		}
    	}
    } 

    4. VLAN + PRP 测试: 使用以下命令在两个 EVM 上创建 prp0.2 后、我能够成功地从 EVM1 ping 到 EVM2 prp0.2。

    ip link add link prp0 name prp0.2 键入 vlan id 2

    ifconfig prp0.2 192.168.20.x(根据在每个 EVM 上配置的 prp0 更改 IP 地址的最后一位数)

    5、 多播+ VLAN + PRP 测试: 尚未测试,因为#3 是一个问题

    6、 Mutlicast 测试:在没有 PRP 的情况下,使用发送 500 个数据包到 01:80:C4:00:00:0e 的测试应用程序,在 ip maddr 添加 01:80:C4:00:00:0e 后在 eth1 上配置,我可以看到 500 个数据包显示在 eth1 接口上

    3 和 6 似乎表示多播仅适用于非 PRP 接口。 这似乎也与您的测试一致、表明多播+ VLAN + PRP 出现故障的原因是多播+ PRP 出现故障。  

    我已经将此问题报告为 PRP 卸载的错误、但可能需要一段时间才能完全修复。 同时、如果您的用例可行、请继续启用混杂模式作为权变措施。

    -道林

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

    尊敬的 Harumi:

    我谦卑地为延迟的回应道歉。

    [引述 userid=“346156“ url=“~/support/processors-group/processors/f/processors-forum/1645245/am6442-pru-icssg-goose-packet-reception-via-prp-offload/6361778

    >但是,我可以看到在 eth1 和 eth2 接口上显示 500 个数据包。

    您是如何确认的?
    在我的环境中、我无法从绑定到 eth0 (icssg0_emac0) 或 eth1 (icssg0_emac1) 的套接字接收数据包。

    [/报价]

    在发送数据包的 EVM 上运行 send_modified 应用程序后、我通过在接收 EVM 上检查“ifconfig eth1“和“ifconfig eth2“来确认这一点。

    虽然我无法从套接字接收数据包、  
    ifconfig 中的 RX 数据包计数器按 eth0 (icssg0_emac0) 和 eth1 (icssg0_emac1) 上发送的多播数据包数量增加。  
    无论“ip maddr add“是否应用。

    好的、这表明您还看到 eth0 和 eth1 也随着发送的多播数据包数量的增加而增加、但 prp0 在数据包数量方面没有看到同样的增加

    您共享的 icssg_prueth.c 代码似乎与 12.00.00.07 版本中的代码不同。
    git.ti.com/.../icssg_prueth.c

    是的、您是对的、我之前分享了一个旧版本的 icssg_prueth.c、我曾使用打印声明来确定几个 SDK 版本之前 HSR +多播的问题。 我认为类似的打印声明有助于确认 PRP +多播存在相同问题。  

    您能利用这些信息做点什么吗?

    我们的团队正在进一步调查此问题、打印件向我显示了以下内容

    1.混杂模式条件不在代码中执行

    2. PRP 卸载情形也会进入“emac->prueth->is_hsr_offload_mode“条件  

    首先、我认为混杂模式不应该是多播+ PRP 卸载功能的必要条件、因此一项检查是了解混杂模式条件下的逻辑为何会导致多播工作。  

    另一个问题是、我不完全确定是否有意让 PRP 卸载情况也应该进入 IS_HSR_Offload_mode 条件、尤其是因为 PRP 固件和 HSR 固件是单独的二进制文件。  

    我正在将此信息传送给内部软件开发团队、以查看这些要点是否有助于他们识别特定问题。

    我已将此问题报告为 PRP 卸载的错误、但可能需要一段时间才能获得完整的修复。 同时、如果您的用例可行、请继续启用混杂模式作为权变措施。

    您处于发展的哪个阶段? 在我们找到问题并解决之前、是否暂时使用混杂模式作为解决方法?

    -道林

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

    您好、Daolin。

    感谢您团队的帮助。  

    我目前处于开发阶段。 由于我正在使用混杂模式或全组播模式进行开发、因此即使组播过滤器 (ip maddr add) 不可用、也不会立即出现问题。

    但是、由于它允许我的设备过滤掉不必要的数据包、如果将来可以使用“ip maddr add“、我们将非常感激。

    如果您有任何疑问、请告诉我。 我期待与您合作。

    此致、
    Harumi

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

    您好 Harumi、  

    我目前正处于开发阶段。 由于我正在使用混杂模式或全组播模式进行开发、因此即使组播过滤器 (ip maddr add) 不可用、也不会立即出现问题。

    但是、由于它允许我的设备过滤掉不必要的数据包、如果将来可以使用“ip maddr add“将非常有用。

    感谢您提供这种背景信息、很高兴知道您目前未被阻止处理此问题。 我们的团队目前正在调查这一问题。

    [quote userid=“576780“ url=“~/support/processors-group/processors/f/processors-forum/1645245/am6442-pru-icssg-goose-packet-reception-via-prp-offload/6372552 PRP 卸载案例还会进入“emac->prueth->is_hsr_offload_mode“条件  

    我最近发现、可以对 HSR 和 prp 启用 is_hsr_offload 标志、因为无论是 HSR 还是 prp、HSR_prp_version 都会检测到它。  

    这告诉我 HSR 和 PRP 使用相同的多播处理逻辑、我认为在下一项测试中、我将尝试仔细检查 HSR +多播情况中是否存在回归。

    如果我在周末没有回复、请发送此主题。

    -道林

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

    您好、Daolin。

    如果我在周末没有回复、请 ping 通此主题。

    我懂了。 如果我当时没有听到、我将回复此主题。

    此致、
    Harumi

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

    嗨、Daolin。

    我正在与你联系、以检查此事的进展情况。 我期待您的更新。

    此致、
    Harumi