这两天被igmp proxy搞的焦头烂额,有时候工作,有时候又不工作。最后下了狠心,把代码翻出来啃了一遍,总算是找到了问题,简单的总结一下。
igmp proxy的原理其实就是通过在downstream的interface上接收igmp report,然后再从upstream的interface上广播出去;同时在router上添加对应的virtual interface(VIF)的路由信息(MFC)。最后,使得从upstream的interface收到的multicast包,能发送到downstream的interface对应的网络中去。
在标准的linux kernel实现中,MFC(multicast forward cache)表添加的时候是通过src ip和dest ip(也就是group ip)来产生一个hash值作为索引的。但由于igmp proxy必须对所有的src ip的multicast包进行处理(添加MFC entry),因此这个hash的方法就必须修改,比如在我的kernel中是通过dest ip和interface index来产生hash的。当然,也可以用别的,保持kernel和app对应就是了。
在测试的过程中,我发现可以使用的测试工具实在是太少了,只找到了一份微软的windows上的工具。为了方便以后的测试,我自己又写了一个。工具很简单,提供两个功能,一个发multicast udp包,一个收multicast udp包。需要注意的就是,在发包的时候必须通过设置IP_MULTICAST_TTL来修改ip包的ttl值,否则就会因为linux的默认ttl为1,跑到路由器就被丢掉了。还有就是,ethereal不可信,老是告诉我checksum错,其实又不错。