你好
我有一台 S32G,配备运行 bsp43 的 SJA1110,正在尝试启用 IGMP 侦听以动态路由多播流。 我发现了一些与 IGMP 有关的特殊问题,但不知道如何解决。 我已经确认,禁用 IGMP 侦听会导致组播数据包涌入交换机,因此 IGMP 侦听选项正在发挥作用...... 但不是预期的行为。
我不清楚这是 Linux 配置的问题还是交换机硬件的限制。
谢谢您的建议。
恩智浦没有回复我的支持单,本帖也没有回复,因此我将在此记录我的发现。
在 BSP43 上。 当端口由网桥连接时,SJA1105 DSA 驱动程序似乎不支持 SJA1110 的 IGMP 侦听。 在驱动程序设置期间,sja1110 端口设置为独立组网 (SA) 模式,其中 dsa `tag_8021q` 在交换机的每个端口上安装不同的 vlan 查询规则。vlan-lookup 规则使用`tag_8021q`以太类型`0xDADB`和包含端口 ID 等元数据的 vlan标记入口数据包。 这就为主机处理器创建了一种机制,使其能够知道数据包是从哪个端口接收的,并在特定端口上输出数据包。 当端口在网桥中链接时,"tag_8021q "会用与网桥相关联的单一规则取代每个端口的 vlan-lookup规则。 主机处理器现在无法分辨数据包来自哪个端口,也就无法将数据包输出到特定端口。 我认为使用 `vlan-filtering` 也会破坏此处所述的机制(sja1110 显然属于第二种类型,因为它调用了 `dsa_tag_8021q_bridge_join`)。
主机处理器创建的 IGMP 查询器数据包仍然标记为每个端口的 vlan,但 vlan-lookup 只包含网桥的规则,因此 IGMP 查询器数据包会被发送到空白处。 它们被扔进了垃圾桶。 它们不会输出交换机。 可以通过修改 这一行来 改变这种行为 :
if (!dp->bridge) {
tx_vid = dsa_tag_8021q_standalone_vid(dp);
} else {
tx_vid = dsa_tag_8021q_bridge_vid(dp->bridge->num);
}现在,IGMP 查询器信息将从交换机输出,但仅此还不能启用 IGMP 侦听,因为主机处理器不知道 IGMP 加入/离开是在哪个端口上接收的,因为 "tag_8021q "仍然是全桥范围的,而不是端口特定的。 交换机必须捕获数据包并应用本地 sja1110 标记(ethertype 0xdadc),才能启用 IGMP 侦听。 交换机可通过两个 `mac_fltres` 捕捉数据包并添加标记,但驱动程序已将其用于 PTP 和 STP。 用户空间实用程序 `tc` 可以配置为捕获数据包,但这是通过虚拟链接实现的,虚拟链接不会将标记添加到捕获的数据包中。 最后两个选项是使用 l2- 查找或深度数据包检查。 l2-lookup 可用于通过设置陷阱位来捕获目标 mac 地址 01:00:5E:00:00:16,从而启用 IGMPv3。 这也会匹配任何以 *.0.0.22 结尾的组播 IP 组,因此不是一个好的解决方案。 使用网桥时,深度数据包检测似乎是启用 IGMP 侦听的唯一方法。 无论使用何种捕获机制,该提交都是必要的,否则 sja1110 标记将被 `tag_8021q` 覆盖,而 `tag_8021q` 也只代表桥接器。
请注意,上面建议的解决方案将为网桥上的每个 DSA 端口发送 IGMP 查询... 重新安装 vlan-lookup 规则从正确的端口输出数据包也是一种解决方案,但我认为端口 0 会与网桥安装的 vlan-lookup 发生冲突,因此也不是一个好的解决方案。 发送过多的 IGMP 查询除了会增加流量外,似乎没有任何副作用。