IGMP+ 是一个 Linux 应用层守护进程,用于补齐硬件 offload 网桥的 IGMP Report/Leave 转发功能。
在开启 IGMP snooping 的网桥系统中,硬件 offload 路径能够:
- 广播 IGMP General Query
- 生成 multicast router port
- 从网桥从属接口接收 IGMP Report/Join/Leave
- 将这些报文上送到网桥层处理
但是不会按协议转发到 router port。IGMP+ 通过用户态 raw socket 补齐这一转发行为,确保上游组播路由器能够完整感知下游主机成员关系变化。
- ✅ 支持 IGMPv2/v3(Membership Report、Leave Group)
- ✅ 自动发现 bridge ports 和 router ports
- ✅ 5 秒刷新周期适配拓扑变化
- ✅ 支持 VLAN-tagged 以太网帧(802.1Q/802.1ad)
- ✅ 不转发 IGMP Query,避免回灌
- ✅ 不转发回接收端口,避免环路
- ✅ 支持 daemon 模式和前台调试模式
- ✅ 目标平台:arm64 Linux
igmp+ [-v] -b <bridge-name>选项:
-b <bridge-name>:指定网桥名称(必需)-v:verbose 模式,前台运行并打印调试信息
运行模式:
- 带
-v:前台运行,输出调试信息到终端 - 不带
-v:自动以 daemon 模式在后台运行
示例:
# 前台运行,带调试输出
igmp+ -v -b br-lan
# daemon 模式运行(无输出)
igmp+ -b br-lan
# 停止 daemon
pkill igmp+原生编译:
make
sudo make install PREFIX=/usr/localarm64 交叉编译:
make CROSS_COMPILE=aarch64-linux-gnu-显式指定编译器和 sysroot:
make CC=aarch64-linux-gnu-gcc CFLAGS="--sysroot=/path/to/sysroot -O2 -Wall -Wextra -std=c11"- 创建
AF_PACKET/SOCK_RAWsocket,协议为ETH_P_ALL - 接收从网桥从属端口进入的二层帧
- 解析以太网头、VLAN 标签、IPv4 头
- 识别 IGMP 报文类型(0x12、0x16、0x17、0x22)
- 从非 router port 收到的 IGMP Report/Leave 转发到所有 router port
- 跳过接收端口,避免环路
- 通过 rtnetlink
RTM_GETLINK获取网桥从属端口列表 - 通过 rtnetlink
RTM_GETMDB获取 router port 列表 - 每 5 秒刷新一次状态
- Linux 系统 API(netlink、AF_PACKET socket)
- 需要 root 权限或
CAP_NET_RAW、CAP_NET_ADMIN - 目标架构:arm64(aarch64)
- 不依赖外部命令(ip、bridge、brctl 等)
- 在带 IGMP snooping 的网桥上启动程序
- 下游主机加入/离开组播组
- 在 router port 对端抓包,确认 IGMPv2/v3 Report/Leave 被转发
- 确认 General Query 不被应用回灌
- 动态切换 multicast router port,确认刷新周期后转发目标变化
MIT License — 详见 LICENSE 文件。
详细需求和技术设计文档请参阅 docs/requirements.md