这位大牛总结的很到位
原文:https://blog.csdn.net/lickylin/article/details/25241829
一、数据结构
对于实现一个子层功能,最主要的就是数据结构的建立。对于igmp snooping来说,我们需要建立的数据结构之间的关系是
1、一个组播组可以与多个桥端口关联
2、一个桥端口可以与多个组播组关联
3、一个桥端口只与一个桥关联
4、对于桥端口而言,有lan侧桥端口与wan侧桥端口之分
5、组播组数据项之间如何进行链接(可以通过链表实现等)
6、如何通过一个桥端口,快速的查找到其所加入的所有组播组
7、如何通过一个组播组数据项,快速的查找到加入到该组播组的所有桥端口
根据上面的条件我们就可以构造相应的组播组数据结构满足上述要求。对于一个子系统,数据结构最能体现功能的好坏,所以我们的数据结构就需要尽可能的去考虑
各种条件。
2、功能实现
1、对于igmp report报文的处理,对于igmp加入报文,我们就需要创建相应的组播组数据项,然后再将加入报文发送出去。
对于已创建的组播组项,我们需要相应的过期定时器,以及发送查询定时器,用于维护组播组数据库的更新操作。
2、对于leave报文,需要删除相应的组播组数据库项等。
3、对于lan侧桥端口与wan侧桥端口,其接收或者发送igmp 报文的类型限制等。
4、提供外部接口,对于二层接收到的组播流数据,判断是否需要转发到相应的一个或者多个端口
5、提供组播snooping功能开启或者关闭的接口函数供应用层调用
6、在/proc目录下创建子文档,用于查看目前已加入组播组的桥端口及组播组信息,以用于调试。
7、代码实现中使用宏严格隔开igmp snooping功能,当不编译igmp snooping功能时,保证内核可以正常工作。