器件型号: AM2611-Q1
您好、
我要在 LwIP 中启用 VLAN。 LwIP 协议栈应该取消标记 VLAN 标记的数据包并将其提供给应用程序。
在出口时、LwIP 应标记数据包并将其提供给硬件。 如何做到这一点?
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.
器件型号: 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