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.

[参考译文] AM2434:仅 ARP 广播数据包转发

Guru**** 2427060 points
Other Parts Discussed in Thread: AM2434

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1247183/am2434-only-arp-broadcast-packets-forwarding

器件型号:AM2434
主题中讨论的其他器件: DP83869

我一直在使用 AM2434 CPU 和"AM243x MCU+ SDK 08.06.00"来开展网络项目。 具体来说、我将使用 SDK 中的"Enet Layer 2 CPSW switch example"。 在我的设置中、我已将 cpsw 端口1作为 MAC 连接到 MAC、并将 cpsw 端口2通过 PHY dp83869连接。

在使用 Wireshark 监视网络流量时,我注意到只有 ARP 广播数据包被转发。 我想了解这种行为背后的原因、以及是否存在任何配置或限制可能导致这种行为。

我已验证在 SDK 测试示例中是否启用了 CPSW_CUTTHRU 功能。 但是,似乎只转发 ARP 广播数据包,而不处理其他类型的数据包。

我的设置中的所有连接均为以太网千兆连接。

考虑到这种情况、我想问问、TX 线程中是否有必要对数据包进行操作、以确保转发所有数据包类型。 是否需要在 TX 线程中实施任何特定的逻辑或代码来处理和转发 ARP 广播以外的数据包?

具体而言、我想知道配置 CPSW 以向所有端口广播所有传入数据包是否可行、类似于集线器的行为。 这意味着在一个端口上接收到的任何数据包都将被复制并转发到所有其他端口、从而确保连接到 CPSW 的所有器件都收到该数据包的副本。

是否需要考虑任何其他配置或设置以确保转发所有数据包类型? AM2434 CPU 或我正在使用的特定 SDK 版本是否有任何可能导致此行为的限制?

提前感谢您的帮助和专业知识。

此致、Bernhard

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

    Christian、您好!

    CPSW 交换机具有 ALE (地址查找引擎)、其中存储了包含转发规则信息的查找表。 ALE 有一个学习过程、它会使用与其关联的 MAC 地址和端口号更新该表。  对于每个入口数据包、存在基于数据包目标地址的 ALE 查找过程。 此处不需要软件或 CPU 参与。 请查看 TRM 中 CPSW 外设的 ALE 部分、详细了解 ALE 的功能。
     
    所有广播数据包(不需要 ARP)和未知单播数据包、未知多播数据包(未知意味着 ALE 表中不存在目标地址)将被转发到除入口端口以外的所有端口。 (未知单播不会发送到 CPU (主机端口))。 如果你想要一个集线器的行为,你可以禁用 ALE 学习过程。 这可以通过在 SYSCFG、CPSW -> ALE Config -> ALE Port Config -> Learning Security Config 中启用"No Learning"选项来实现。

    CutThru 转发是 CPSW 的另一项功能、其中数据包转发不会等待整个数据包被接收、而是在接收到数据包标头的特定数据后即时开始转发。 这是为了解决低延迟用例。  

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

    您好、Venkata Susheel Voora、

    我已经为主机端口和两个 MAC 端口启用此标志、以尝试实现"网络集线器"的功能。 不过、尽管启用了该标志、数据包转发行为未按预期更改。 数据包仍不会转发到另一个端口。

    为了提供进一步的背景信息并帮助进行故障排除、我已经将 Windows PC 通过 PHY 连接到 CPSW 端口2、并将 Linux 机器通过 MAC 到 MAC 连接到 CPSW 端口1的 Wireshark 输出屏幕截图附加到了一起。 此外、我将共享应用程序的日志文件、其中包含数据包统计信息、用于说明在所有端口上发送和接收数据包。

    关于这个问题,我还有几个问题:

    1. 是否有必要实施 uDMA 连接以实现所需的功能? 尝试将 CPSW 配置为类似集线器的器件时、uDMA 连接是否需要任何具体注意事项或配置?

    2. RX、TX 和 ETH 队列对于此设置是否必不可少、还是可以手动修改这些队列中的数据包内容? 我是否应该对这些队列进行任何特定的修改以确保正确的数据包转发?

    ============================
     第2层 CPSW 切换测试
    ============================
    EnetApp_init
    EnetApp_open

    初始化所有外设时钟
    -------------------------------------------------------
    启用时钟!

    创建 RX 任务
    -------------------------------------------------------
    cpsw-3G:创建 RX 任务
    EnetApp_createRxTask
    EnetApp_rxTask

    打开所有外设
    -------------------------------------------------------
    TI_Enet_open_close.c EnetApp_driverInit。 仅一次
    cpsw-3G:打开 Enet
    TI_Enet_Open_Close.c EnetApp_driverOpen
    TI_enet_open_close.c EnetApp_getCpswInitCfg
    TI_enet_open_close.c EnetApp_initAleConfig
    主机 learningCfg.noLearn:1  
    MACPort1 learningCfg.noLearn:1  
    MACPort2 learningCfg.noLearn:1
    TI_enet_open_close.c EnetApp_initMdioConfig
    TI_enet_open_close.c EnetApp_initCptsConfig
    TI_enet_open_close.c EnetApp_initHostPortConfig
    EnetAppUtils_reuceCoreMacAllocation:将 CoreID:1的 Mac 地址分配从4减少为2
    EnetApp_updateCpswInitCfg

    初始化所有配置
    -------------------------------------------------------
    cpsw-3G:初始化配置
    l2_cpsw_cfg.c EnetApp_initEnetLinkCbPrms
    TI_enet_open_close.c EnetApp_doCpswOpen
    MDIO_open:MDIO Manual_Mode 已启用

    TI_Enet_Open_Close.c EnetApp_enablePorts
    TI_enet_open_close.c EnetApp_getMacPortInitConfig
    l2_cpsw_cfg.c EnetApp_initLinkArgs
    cpsw-3G:打开端口1
    TI_Enet_open_close.c EnetApp_enablePorts ()打开 MAC 端口:0
    TI_enet_open_close.c EnetApp_getMacPortInitConfig
    l2_cpsw_cfg.c EnetApp_initLinkArgs
    cpsw-3G:打开端口2
    TI_Enet_open_close.c EnetApp_enablePorts ()将打开 MAC 端口:1
    TI_Enet_open_close.c EnetApp_enablePorts () CPSW_ALE_IOCTL_SET_PORT_STATE
    TI_Enet_open_close.c EnetApp_enablePorts ()将启用主机端口
    TI_Enet_OPEN_CLOSE.c EnetApp_enablePorts PHY 3已激活

    在所有外设上连接内核 id 1
    -------------------------------------------------------
    cpsw-3G:连接内核
    cpsw-3G:打开 DMA
    EnetApp_openDma
    EnetApp_initTxFreePktQ
    initQs()以16个 pkts 初始化 txFreePktInfoQ
    EnetApp_initRxReadyPktQ
    分配项目编号0
    分配项目编号1
    分配项目编号2
    分配项目编号3
    分配项目编号4
    分配项目编号5
    分配项目编号6
    分配项目编号7
    分配项目编号8
    分配项目编号9
    分配项目编号10
    分配项目编号11
    分配项目编号12
    分配项目编号13
    分配项目编号14
    分配项目编号15
    CPSW-3G:启用 CPSW_CUTTHRU
    EnetApp_setCutThruParams
    l2_cpsw_cfg.c EnetApp_waitForLinkUp
    cpsw-3G:正在等待链路建立... RGMII MAC 1
    cpsw-3g: MAC 到 MAC 链路建立!
    cpsw-3G:主机端口 MAC 地址:70:ff:76:1D:92:C1

    l2_cpsw_cfg.c EnetApp_addMCastEntry
    L2_cpsw_cfg.c EnetApp_createPhyRegisterPollingTask
    l2_cpsw_cfg.c EnetApp_initPhyLinkHandlerCtx
    l2_cpsw_cfg.c EnetApp_phyRegPollHandler
    cpsw-3G:初始化 MAC 端口2和 PHY
    l2_cpsw_cfg.c EnetApp_waitForPhyAlive
    l2_cpsw_cfg.c EnetApp_waitForPhyAvive () PHY#:3 macPort:1   
    l2_cpsw_cfg.c EnetApp_initExtPhy MacPort 1
    l2_cpsw_cfg.c EnetApp_initExtPhyArgs
    cpsw-3G:PHY 掩码0x08
    enetextphy.c EnetExtPhy_WaitForLinkUp PHY2链路 LED = 0
    完成= EnetExtPhy_nwayWait PHY2链路 LED = 1
    isLinkUp = EnetExtPhy_IsLinked  PHY2链路 LED = 1
    L2_cpsw_cfg.c EnetApp_enablePhyLinkPollingMask
    EnetApp_open
    l2_cpsw_cfg.c EnetApp_getExtPhyLinkCfgInfo
    Cpsw_handleExternalPhyLinkUp:端口2:链路建立:1Gbps 全双工

    打印统计信息
    -------------------------------------------------------
     rxGoodFrame           = 40
     aleDrop                = 17
     rxOctets               = 5925
     txGoodFrame           = 57
     txBcastFrame          = 41
     txMcastFrame          = 16
     TXOctets               = 7776
     四框架64         = 2
     四边框65to127    = 73
     四个框架128to255   = 14
     四边框256to511   = 8
     净八位字节              = 13701
     portMaskDrop           = 40
     aleDAEqSADrop          = 23
     aleUnknownUcast        = 40
     aleUnknownUcastBcnt    = 5925
     txPri[0]               = 57
     txPriBcn[0]           = 7776

     cpsw-3G -端口1统计信息
    -------------------------------------------------------
     rxGoodFrames           = 73
     rxBcastFrames          = 53
     rxMcastFrame          = 20
     aleDrop                = 4
     rxOctets               = 10723
     四边框64         = 3
     四边框65to127    = 51
     四边框128to255   = 11
     四边框256to511   = 8
     netOctets              = 10723
     portMaskDrop           = 4
     aleUnknownMcast        = 20
     aleUnknownMcastBcnt    = 4633
     aleUnknownBcast        = 53
     aleUnknownBcastBcnt    = 6090


     cpsw-3G -端口2统计信息
    -------------------------------------------------------
     rxGoodFrame           = 32
     rxBcastFrames          = 14
     rxMcastFrame          = 18
     rxOctets               = 2678
     四边框64         = 5
     四个框架65to127    = 27
     净八位字节              = 2678
     aleUnknownMcast        = 18
     aleUnknownMcastBcnt    = 1494
     aleUnknownBcast        = 14
     aleUnknownBcastBcnt    = 1184


    重置统计信息
    -------------------------------------------------------
    cpsw-3G:重置统计信息

    分配的 MAC 地址
    -------------------------------------------------------
    cpsw-3G:   70:ff:76:1D:92:C1

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

    Christian、您好!

    很抱歉 耽误你的时间。  

    从端口统计信息中可以看出、在端口1或端口2上都没有意外的 txGoodFrame。 为了帮助我们找到问题的根本原因、您可以尝试以下  

    1.您是否可以在 CPSW 端口1和 CPSW 端口2上通过 PHY 连接来运行相同的示例? 这是我们开箱即用测试的默认配置。 如果在 此处观察到相同的行为、我们将更容易在结束时重现并进行调试。

    2.您能从像 Paceth 这样的任何 Linux 工具中注入一些第2层广播帧流量,并提供 CPSW 端口统计数据和 Wireshark pcap 文件吗?


    >> 是否有必要实施 uDMA 连接以实现所需的功能? 尝试将 CPSW 配置为类似集线器的器件时、uDMA 连接是否需要任何具体注意事项或配置?
    -否,只有 R5内核接收数据包才需要 uDMA 路径。 交换机功能完全由 CPSW 硬件执行、无需 CPU 干预。

    >> RX、TX 和 ETH 队列对于此设置是否必不可少、还是可以手动修改这些队列中的数据包内容? 我是否应该对这些队列进行任何特定的修改以确保正确的数据包转发?
    -不需要对数据包转发进行特殊修改。 切换由 CPSW 硬件内部队列进行。   

    此致

    苏珊德

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

    你好,Susheel

    我对你的支持和建议表示感谢。
    我已设法找到解决我之前问题的方案。
    通过删除"TI 系统配置工具"生成的配置并仅设置 learningCfg.noLearn"标志、我实现了所需的行为。
    现在、我还可以在统计信息中看到 TX 数据包、并且 ping 功能运行正常。

    不过、我还有几个未决问题、希望您可以帮助我回答:

       在"集线器"操作模式下、是否需要处理 MDIO、链路建立和链路断开? 目前由于"i2329 MDIO:MDIO 接口损坏(CPSW 和 PRU-ICSS)"问题、我使用的是手动模式。 在此设置中处理 MDIO 时、是否有任何具体的注意事项?

       你们中是否有人用最少的配置和初始化进行了类似 CPSW 集线器的操作示例实现?

    再次感谢您的支持。

    此致

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

    Christian、您好!

    是的、必须处理链路建立和链路断开事件、以避免不必要的丢弃。 在这些"链路建立"和"链路断开"事件中、我们会在内部更新 MacPort 的状态(如"禁用"状态、"转发"状态)、这对于数据包转发至关重要。 由于我们有 MDIO 的硬件勘误表、因此还需要 MDIO 手动模式。  

    >>  你们中是否有任何人在配置和初始化最少的情况下进行类似 CPSW 集线器的操作的示例实现?
    抱歉、目前我们没有任何特定于类似集线器的操作的示例实现、因为它不是通用用例。 如果您遇到任何问题、敬请告知。

    此致

    苏珊德

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

    首先, 我要对所提供的宝贵信息表示感谢。

    我还有一个问题:

    在采用 MAC-PHY 连接的配置中、所有数据包看起来都通过了、没有任何问题。

    但是、使用 MAC 到 MAC 连接时、数据包丢失范围为1%到3%。

    我正在寻求帮助、以确定此次丢包的可能原因。

    您能提供可能促成此行为的任何见解或潜在原因吗?

    此致

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

    我很高兴地通知您,问题已成功解决。 经过彻底的调查和调试、似乎数据包丢失问题是由示例代码中的 Rx-Tx 任务的实现引起的。 删除这段特定代码后、完全消除了数据包丢失。

    再次感谢您的帮助。

    此致