代码路径:https://github.com/haibbo/improxy
代码整体上比较清晰,量较少,同时也不具有太大的难度。不过要求阅读者对IGMP协议有一定程度的了解(要了解IGMP协议见我前一篇文章)以及linux内核对多播的接口(可参考mrouted的实现)。因此只总结了以下一些要点:
1、初始化的时候要给每个接口上个定时器,用来查询接口下面主机多播加入情况 地址是0xe0000001U
2、收到报文后要区分接收的来源,如果是上行端口,则需要进行相应处理。如下面这段代码
1 if (ip->protocol == 0 && p_if->type == INTERFACE_UPSTREAM) { 2 3 if_set ttls; 4 5 bzero(&ttls, sizeof(ttls)); 6 7 //获取生效的接口 8 if(imp_get_mfcc_ttls(&ttls, MAXVIFS, &pia, &pig) != 0){ 9 10 IMP_LOG_DEBUG("add MFC:src -- %s group -- %s\n\n", imp_pi_ntoa(&pia), imp_pi_ntoa(&pig)); 11 //生成对应的策略 12 imp_membership_db_mfc_add(&pig, &pia, &ttls); 13 } 14 return; 15 } else if (ip->protocol == 0) { 16 17 return; 18 }
3、收到相应的报告后,生成的组策略需要起定时器进行处理,做超时处理用
4、因为兼容v3,整个变得较复杂(引入了include和exclude以及状态转换),会让其生效一段时间(其实也就是在考察下面是否还有对该组的报告上来),超时则将其删除了
5、其实,没有策略就是不要转发。。。
6、要深入了解,还是看代码,里面还是有些需要仔细看的,很容易漏了。比如定时器就有好几种,还有个times的东西。
思考,如果默认做成全部转发(没有学习到策略)怎么处理?
1、刚开始没有策略,全部转发
2、学习到,生成策略,进行转发
3、超时,会全部删除。此时,策略又重新为空,该咋么处理?扫描是否还有对应的组?或者由路由自己处理得了,即找不到策略,全部转发。
ps:其实v3的支持很鸡肋,都没多少人使用。