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.

[FAQ] [参考译文] 【常见问题解答】AM2611-Q1:如何在 LwIP 中启用 VLAN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1669318/faq-am2611-q1-how-to-enable-vlan-in-lwip

器件型号: AM2611-Q1

您好、

我要在 LwIP 中启用 VLAN。 LwIP 协议栈应该取消标记 VLAN 标记的数据包并将其提供给应用程序。

在出口时、LwIP 应标记数据包并将其提供给硬件。 如何做到这一点?

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

    我将介绍 此方法的 LwIP 方法。 支持 LwIP VLAN、但开箱即用。 需要在 lwipopts.h 中启用该选项

     在 lwipopts.h 文件中将 ETHARP_SUPPORT_VLAN 定义为 1。 在 MCU+SDK 中不存在这个宏。 但可以添加 I、然后将其定义为 1。  

    当在 LWIP 数据包接收流程中定义此功能时、会启用某些功能。  

    1.当数据包从外部世界接收时。 LwIP 协议栈会检查该数据包是否具有 VLAN 标签。 如果有 VLAN 标记、则会删除 VLAN 并向上层提供实际负载

    2.在此阶段、根据这些宏 LWIP_HOOK_VLAN_CHECK、ETHARP_VLAN_CHECK、ETHARP_VLAN_CHECK_FN 的配置、可以进行 VLAN 过滤。 如果需要丢弃某些 VLAN 数据包、则根据此配置、这些数据包将被静默地丢弃。

    3.执行此步骤后、VLAN 标记即被删除。 现在、数据包就像一个未标记的 VLAN IP 数据包。 上层软件现在可以对其进行处理、

    4.发送数据包时、需要重新标记 VLAN。 为此、我们需要先截取数据包、然后再将其提供给硬件、并将 VLAN 标记放在其中。 LwIP 还提供了挂钩来执行此操作。  

    5. 单独发送 ETHARP_SUPPORT_VLAN 时、不能帮助重新标记。 此时 需要正确定义 LWIP_HOOK_VLAN_SET。 这个宏是封装一个函数。 在此宏内部、可以定义如下所示的函数。 该功能的职责是返回此数据包所需的 VLAN 标记。 在这里,我使用的词 Mac 地址作为匹配的标准。

    6.这样,数据包将被标记并发送出去。  

    static const App_VlanTagRule gVlanTagRules[] =
    {
        { ETH_ADDR(0x00, 0xE0, 0x4C, 0x32, 0x79, 0x68), APP_CPSW_EXTDEV_VLAN_ID  }, /* VLAN 10 */
    };
    
    s32_t App_vlanSetHook(struct netif *netif, struct pbuf *p,
                          const struct eth_addr *src, const struct eth_addr *dst,
                          u16_t eth_type)
    {
        uint32_t i;
    
        LWIP_UNUSED_ARG(netif);
        LWIP_UNUSED_ARG(p);
        LWIP_UNUSED_ARG(src);
        LWIP_UNUSED_ARG(eth_type);
    
        for (i = 0U; i < (sizeof(gVlanTagRules) / sizeof(gVlanTagRules[0])); i++)
        {
            if (memcmp(dst->addr, gVlanTagRules[i].mac.addr, ETH_HWADDR_LEN) == 0)
            {
                return (s32_t)gVlanTagRules[i].vlanId;
            }
        }
    
        return -1;
    }

    在这里、我们使用 LwIp 取消入口标签(来自外部世界的数据包接收-> AM261)阶段。  

    我使用 UDG_IGMP_Example 对此进行测试。 我将发送一些带有 VLAN ID 的数据包 示例将接收该数据并回显该数据。 我正在测试数据包是否连接到设备并从设备发出 VLAN 标记。 此外、该示例还会在串行终端中打印有效载荷。 有效负载已正确打印、这意味着应用程序中的数据包处理也能正常工作。

    此致、

    Aswin