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.

[参考译文] TM4C129XNCZAD:MAC 滤波器(阻止除一个之外的所有滤波器)

Guru**** 2422620 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/681123/tm4c129xnczad-mac-filters-block-all-except-one

器件型号:TM4C129XNCZAD

我想使用 Mac 筛选器来允许来自单台 PC 的流量、并阻止来自所有其他 PC 的流量。
我尝试将不同的值编程到 Mac 地址寄存器和相应的控制寄存器中、但它要么会阻止所有流量、要么不会阻止任何流量。

EthernetMacAddr[0]=允许_MACADDR0;
EthernetMacAddr[1]=允许_MACADDR1;
EthernetMacAddr[2]=允许_MACADDR2;
EthernetMacAddr[3]=允许_MACADDR3;
EthernetMacAddr[4]=允许_MACADDR4;
EthernetMacAddr[5]=允许_MACADDR5;

EthernetMacCtrl   = 0xC0000000;

EMACAddrSet      (EMAC0_BASE、SNMP_MAC_FILTER_ADDR_01_ID、EthernetMacAddr);
EMACAddrFilterSet (EMAC0_BASE、SNMP_MAC_FILTER_ADDR_01_ID、EthernetMacCtrl);

EthernetFrameCtrl = 0x00000091;   EMACFrameFilterSet (EMAC0_BASE、u32Val);//不起作用
EthernetFrameCtrl = 0x00000190;   EMACFrameFilterSet (EMAC0_BASE、u32Val); //不起作用
EthernetFrameCtrl = 0x00000290;   EMACFrameFilterSet (EMAC0_BASE、u32Val);//不起作用
EthernetFrameCtrl = 0x00000291;   EMACFrameFilterSet (EMAC0_BASE、u32Val);//不起作用
EthernetFrameCtrl = 0x00000100;   EMACFrameFilterSet (EMAC0_BASE、u32Val);//不起作用
EthernetFrameCtrl = 0x00000200;  EMACFrameFilterSet (EMAC0_BASE、u32Val);//不起作用


它必须是一个简单的东西、但我无法使它正常工作。

谢谢。

Khaled。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    其他有用的信息。
    我尝试了哈希滤波、但它也不起作用。

    设置哈希表位以接受所有 SA 和 DA Mac 地址、即 PC1、PC2、PC3、Modem1和 Modem2的0x40802000000800。
    将 Mac 滤波器帧控制设置为0x0606、即 EMAC_FRMFILTER_hash_and_Perfect | EMAC_FRMFILTER_SADDR | EMAC_FRMFILTER_hash_multicast | EMAC_FRMFILTER_hash_unicast
    在这种情况下,PC1可以 ping Modem1,但不能 ping Modem2或 PC2。

    已尝试 Mac 滤波器控制 EMAC_FRMFILTER_hash_and_Perfect | EMAC_FRMFILTER_SADDR 的另一个组合。 同样的行为,即 PC1可以 ping Modem1,但不能 ping Modem2或 PC2。

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

    您好 Khaled、
    您是否可以通过交换机连接 PC1、PC3和 modem1,并尝试在启用了过滤器的情况下从 PC1 ping PC3,并将 PC1和 PC3的地址都编程到过滤器列表中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我可以。
    是否希望我运行您之前指定的测试?
    但我不确定它将如何工作。 PC1和 PC3是否会直接通过交换机进行通信并同时绕过 Modem1?
    Khaled
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Khaled、
    你是对的。 我认为交换机只会将数据包从 PC1直接路由到 PC3。

    下面的代码将 PC1或 modem2地址添加为 DA 的位置如何?

    实验1:
    EMACAddrSet (EMAC0_BASE、1、PC1地址);
    EMACAddrSet (EMAC0_BASE、2、PC1地址);
    EMACAddrFilterSet (EMAC0_BASE,1,EMAC_FILTER_ADDR_ENABLE | EMAC_FILTER_SOURCE ADDR);
    EMACAddrFilterSet (EMAC0_BASE,2,EMAC_FILTER_ADDR_ENABLE);// PC1添加为 DA
    EMACFrameFilterSet (EMAC0_BASE、EMAC_FRMFILTER_SADDR);

    实验2:
    EMACAddrSet (EMAC0_BASE、1、PC1地址);
    EMACAddrSet (EMAC0_BASE、2、modem2地址);
    EMACAddrFilterSet (EMAC0_BASE,1,EMAC_FILTER_ADDR_ENABLE | EMAC_FILTER_SOURCE ADDR);
    EMACAddrFilterSet (EMAC0_BASE,2,EMAC_FILTER_ADDR_ENABLE);// modem2添加为 DA
    EMACFrameFilterSet (EMAC0_BASE、EMAC_FRMFILTER_SADDR);


    由于某种原因,在转发到 modem2时 PC1地址被阻止。 根据您之前的解释,PC1的数据包被 modem1划分为小块并发送到调制解调器2。 消息内容在任何步骤中都不应发生任何更改。 对于上述两个实验、如果未添加到筛选器列表中、我想知道哪个地址会导致 EMAC 阻塞。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,查尔斯

    实验1:PC1可以 ping Modem1,但不能 ping Modem2或 PC2

    实验2:PC1可以 ping Modem1和 Modem2,但不能 ping PC2。 已检查 Modem1日志,再次显示 EMAC 已阻止发往 PC2的以太网消息。

    Khaled。

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

    你(们)好,查尔斯

    校正了哈希滤波测试。 我的位移不正确。

    设置哈希表位以接受所有 SA 和 DA Mac 地址、即 PC1、PC2、PC3、Modem1和 Modem2的0x8081004000001000。

    将 Mac 滤波器帧控制设置为0x0606、即 EMAC_FRMFILTER_hash_and_Perfect | EMAC_FRMFILTER_SADDR | EMAC_FRMFILTER_hash_multicast | EMAC_FRMFILTER_hash_unicast

    在这种情况下,PC1可以 ping Modem1、Modem2和 PC2。

    如果从散列表中删除 Modem2并保留 PC1、PC2、PC3和 Modem1 (即0x8081004000000000),则 PC1能够 ping Modem1和 PC2,但不能 ping Modem2。

    Khaled。

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

    您好 Khaled、

     感谢您运行这些实验。

    [引述 USER="Khaled Saab"]实验1:PC1可以 ping Modem1,但不能 ping Modem2或 PC2 [/引述]

    这种方法验证了我先前的理论,即 PC1的地址将对照 SA 和 DA 过滤器进行检查。 感谢您的确认。

    我之所以要求运行实验1、是因为我想将 PC1地址与 SA 和 DA 滤波器同时检查。 原因是,如果您没有向 DA 过滤器添加任何地址(例如 PC1、modem2、PC2),ping 仍将通过(PC1->modem1->PC1),这意味着 modem1将回复/拒绝 ping 返回 PC1。 由于 PC1已添加到 SA 过滤器中,因此其作用就像 PC1也添加到 DA 过滤器中一样,因此 ping 应答将执行。 我不知道您是否理解我的一系列想法。 如果您对此行为有不同的理论、请随时分享您的想法。  

    [引述 USER="Khaled Saab]实验2:PC1可以 ping Modem1和 Modem2,但不能 ping PC2。 已检查 Modem1日志,再次显示 EMAC 已阻止发往 PC2的以太网消息。[/QUERP]

    我从您目前为止所做的所有实验中可以看出,根据实验1的结果,一旦启用了滤波器,就会对照 SA 和 DA 滤波器检查 PC1地址。 如果目标地址是 modem2或 PC2,则检查失败。 我认为只有 PC1可以成为允许的 DA、而不会将其实际添加到 DA 滤波器中。 将 PC2/modem2地址添加到过滤器后,即使不将 PC1的地址添加到 DA 过滤器中,回显应答数据包也会发送回 PC1。  

    最终、EMAC 不应首先检查 DA 滤波器、因为我们打算仅应用 SA 滤波器、我认为我们都同意这一点。 我将再次阅读数据表、以确保我是否错过了任何声明、即如果启用了滤波器、它将对照 SA 和 DA 进行检查。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我理解你的想法链:-)
    如果您有其他信息以及是否有硬件修复、请告诉我。
    请注意、客户要求太多、因为他必须将所有 DA 地址编程到调制解调器中。

    由于您将检查文档、您能否确认哈希滤波仅适用于 DA 地址!
    谢谢。
    Khaled。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Khaled、
    在仅为 PC1启用 SA 过滤器后、您能告诉我 EMACFRAMEFLTR 寄存器中存储的值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    0x00000291
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Khaled、

      

    0x00000291意味着启用带有 MAC 的 SA 筛选器、即使这些控制帧未通过地址筛选器、并且也处于混杂模式、也会将所有控制帧转发到应用程序。 我有点困惑。 如果 modem1仅允许 PC1作为源,那么为什么要处于允许所有传入帧(无论其 DA 和 SA 如何)的混杂模式。  

     您还可以转到接收描述符列表吗? RX 描述符由存储在 EMAC_RXDLADDR 寄存器中的地址指向。 检查 RX 描述符的 RDES0 (第一个字)。 RDES0中的位30指示 DA 过滤器是否失败。 但是、我不知道您为链接列表设置了多少个描述符。 您可能需要浏览 RX 描述符列表。 如果处于增强模式、则每个描述符的长度为8个字。  

     

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

    您好 Khaled、

     我应该在开头绘制了图。 我认为下图显示了滤波的工作原理。 从 PC1的 ping 请求中可以看到,DA 是 modem2,SA 是 PC1。 在 EMAC 设置中、有两个 MAC 地址编程到 EMACADDR0和 EMACADDR1寄存器中。 EMACADDR0使用 modem1的 MAC 地址进行编程、而 EMACADDR1使用 PC1的 MAC 地址进行编程。 通常、传入帧的 DA 会始终与 EMACADDR0进行比较、因此 modem1 EMAC 可以确定帧是否发往 modem1。 如果您转至数据表中的 EMACADDR0寄存器说明、则地址使能位始终置位、并且仅选择传入帧的 DA 字段进行比较。 在下图中、将传入帧的 DA 地址(modem2)与 EMACADDR0进行比较、将 SA (PC1)与 EMACADDR1进行比较。 当您在 EMACFRMEFLTR 寄存器中启用 SA 滤波(位9)时、它会将滤波器应用于所有启用的 EMACADDRx 寄存器。 在该图中、仅启用 EMACADDR0和 EMACADDR1。 SA (PC1)将通过滤波器标准、但 DA (modem2)将无法通过滤波器检查。 DA 出现故障的原因是因为在 DA 地址比较中 modem2不等于 modem1。 如果您启用/添加具有 modem2的第三个 EMACAD2进行 DA 比较、则 DA 将通过。

     同样,让我们来看看从 PC1 ping modem1的原因。 在这种情况下、DA (modem1)与将通过的 EMACADDR0进行比较、而 SA (PC1)与也将通过的 EMACADDR1进行比较。   

     我希望现在一切都很清楚。 我认为这就是它的行为方式、可以解释您在所有实验中看到的内容。 很抱歉、需要这么长时间才能澄清。

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

    查尔斯

    您说:"SA (PC1)将通过滤波器标准、但 DA (modem2)将无法通过滤波器检查。 DA 出现故障的原因是因为在 DA 地址比较中 modem2不等于 modem1。"

    这意味着这两个数据包中至少有一个已经通过、这意味着以太网数据包应该被转发到我的应用。 但事实并非如此。

    因此、如果我遵循您的推理、这是否意味着我必须对 EMACADDRx 进行编程、使其能够传递客户在其网络上的每个 SA 和 DA 地址?
    我认为 EMAC 有一个错误:传递以太网数据包应该是

    "如果任何 SA DA 过滤器通过、以太网数据包被标记为通过"、而当前设置为

    "如果所有 SA DA 滤波器通过、以太网数据包被标记为通过"

    Khaled。

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

    您好 Khaled、

     我尝试添加一点更详细的信息、说明数据(以太网数据包)是如何传递到 RX FIFO 的。 是的、如果启用了滤波器、SA 和 DA 滤波器都必须通过、这是正确的。 我认为这对我来说是有道理的。 如果 DA 不适用于 EMAC、为什么它会传递数据进行处理? 在根本不启用任何筛选器的情况下、EMAC 的第一个任务是检查 DA 是否已发送给它、除非帧是多播或广播数据。 我可以理解您的论点、为什么 EMAC 不是为了理解 EMAC 被用作透明链路的情况、在这种情况下、DA 将与 EMAC 本身不同。 但我认为这不是一个错误。 EMAC 不知道如何在应用中使用它、即作为一个透明链路、它应该忽略 DA 与 EMAC MAC 地址的对比。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查尔斯
    除非我缺少某些内容、否则您的理论不适用:在第一组试验中、仅启用 SA 筛选器(未启用 DA 筛选)、这不起作用。
    Khaled。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能不能提醒我第一组试验是什么。 PC1的帧中的 SA 和 DA 是什么? 您已经做了很多事情。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在第一组试用版中、Modem1仅针对 SA 过滤进行了编程。

    EMACADDR1编程时启用了 PC1 MAC 地址和 SA 过滤
    EMACAddrSet (EMAC0_BASE、1、PC1地址);
    EMACAddrFilterSet (EMAC0_BASE,1,EMAC_FILTER_ADDR_ENABLE | EMAC_FILTER_SOURCE ADDR);

    对 EMAC 帧控制寄存器进行编程以检查 SA 滤波器。
    EMACFrameFilterSet (EMAC0_BASE、EMAC_FRMFILTER_SADDR);

    在这种情况下,PC1可以 ping Modem1,但不能 ping PC2或 Modem2。
    Khaled。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Khaled、

     下面的图表可能会更加清晰。 我之前可能已经弄糊涂了一些逻辑符号极性。 抱歉、我不是逻辑设计器。 :-)

    如果 PC1只 ping modem1,则 SA 将是 PC1,DA 将是 modem1。 在这种情况下、SA 和 DA 都将通过滤波检查。 不是吗? SA 将通过 EMACADDR1传递、DA 将通过 EMACADDR0传递。

    假设您将 modem2的 MAC 地址作为 DA 添加到 EMACAD2中。   如果 PC1尝试 ping modem2,则 SA 将是 PC1,DA 将是 modem2。 SA 滤波器通过 EMACADDR1、而 DA 滤波器通过 EMACADDR2、即使 EMACADDR0的 DA 滤波器失败。 在更新的图表中、我尝试分离 SA 滤波器和 DA 滤波器。 如果进入的 DA modem2未通过 EMACADDR0、则至少将通过 EMACADR2。 如果您看图、会发现某种或门、其中所有 DA 滤波器比较的结果都是或、同样、用于 SA 滤波器比较。  

     我只能在这个高电平逻辑电路全部被拉高之前有有限的空间。 我假设所有这些器件都启用了地址滤波器、以减少图上的离合器。  请注意、图的绘制尽可能简单、以传达这一想法。 我无法绘制哈希/完美滤波器的工作方式以及所有各种滤波选项。  

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

    你(们)好,查尔斯

    我们同意你所说的话。

    我的问题是、以太网数据包需要同时通过 SA 和 DA、即使 DA 滤波器未处于活动状态。

    我的第二个问题是、仅使用3个 EMACADDRx 寄存器(需要使用它们对所有可能的 SA 和所有可能的 DA 进行编程)就很难实现正确的滤波。

    同样、在硬件问题中、图中的最后一个栅极是不受 EMACADDRx 寄存器中"活动"位控制的"与"栅极。

    Khaled。

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

    您好 Khaled、

     在 EMACADDR0上、DA 地址检查始终处于活动状态。 请参阅下面的内容。

    我认为您已经实现了使用具有虚拟地址的 EMACADDR2工作的权变措施、但在所有字节通道上启用屏蔽字节控制、因此允许使用所有 DA。  

     正如我在上次答复中提到的、我不能将每个选项都包含在图上、因此我特别提到、我假设滤波器已经启用。 如果滤波器(AE 位)未启用、则可以尝试使来自 SA 路径的输入始终为高电平、并且来自 DA 路径的输入仅取决于 EMACADDR0滤波结果。 如果我有更多的空间来绘制所有 AE 位、看起来就像这样。  

      

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

    您好、Charles、

    是的、将虚拟 DA 地址添加到 EMACADDR2中可以解决该问题。

    我的问题是我不想使用 DA 进行筛选。 帧筛选器设置为仅使用 SA 进行筛选

    EMACAddrSet (EMAC0_BASE、1、PC1地址);

    EMACAddrFilterSet (EMAC0_BASE,1,EMAC_FILTER_ADDR_ENABLE | EMAC_FILTER_SOURCE ADDR);

    EMACFrameFilterSet (EMAC0_BASE、EMAC_FRMFILTER_SADDR);

    为什么我必须在 EMACAD2中对 DA 地址进行编程?

    这不符合规格。 存在错误或文档需要更新!!!!!

    Khaled。

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

    您好 Khaled、

     也许我解释不够清楚。 让我们返回到非常基本的设置、其中没有启用任何滤波器。 这是什么意思? 当您尚未启用 DA 过滤器时、EMAC 是否会检查传入帧上的 DA? 答案是肯定的。 由于地址校验一直被启用、DA 由 EMACADDR0检查。 我之前提到过 EMAC 不知道您正在将 EMAC 作为透明链路运行。 让我们将 EMAC 置于正常使用情况下、在这种情况下、它只是 LAN 中的另一个节点。 有来自 LAN 上其他节点的数据包。 EMAC 如何知道数据包是否发往它。 除非数据包是互播帧或广播帧、否则它将检查 DA、如果 DA 不是目的地、则只会忽略它。 这不是您的理解吗? 当 PC1向 modem2发送 ping 时,DA 为 modem2,而 modem1的 MAC 为 modem1存储在 EMACADDR0 中,则检查将失败。 为了在 EMACADDR0上检查不会失败、您将使用其他 EMACADDRx 指定允许的 DA 地址。 就像告诉 EMAC 检查 EMACADDR0是否会使 DA 检查失败、如果是、 还会查看 DA 是否会在其他 EMACADDRx 寄存器中进行传递地址检查。

    如果您看一下今天的 EMACADDR0寄存器说明、就不存在像在其他 EMACADDRx 寄存器中那样指定字节掩码控制的字段。 如果 EMACADDR0中需要提供字节掩码控件、则无需使用其他 EMACADDRx 来指定允许的 DA 地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    好的,我现在就明白了:-)
    我缺少的部分是 EMACADDR0将过滤掉所有未寻址到调制解调器的数据、除非设置了混杂和/或多播位。

    感谢您在此问题上提供的出色支持。
    Khaled。