IMGP proxy代码分析要点

代码路径: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的支持很鸡肋,都没多少人使用。

转载于:https://www.cnblogs.com/findu/archive/2013/05/12/3074514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
proxy_qlen是一个Linux内核中的网络模块,其作用是限制网络数据包的队列长度。其源码位于文件路径为`net/sched/sch_api.c`和`include/net/sch_generic.h`。下面是其源码的分析: 1.在`sched/sch_api.c`中,proxy_qlen的实现是通过调用函数`qdisc_create_dflt()`来创建一个默认的队列规则,并将其作为子规则添加到给定的网络设备的根规则中。其中的`qdisc`是队列规则的数据结构,包含了队列的一些参数和操作函数。 2.`qdisc_create_dflt()`函数首先通过调用`qdisc_create()`函数来创建一个队列规则,并初始化其参数和操作函数。然后,它调用`qdisc_add()`函数将该队列规则添加到给定的父规则中。在proxy_qlen的实现中,父规则是网络设备的根规则。 3.`qdisc`的操作函数包括了队列的入队和出队操作,以及队列的状态查询等操作。在proxy_qlen中,其主要操作函数是`proxy_qlen_enqueue()`和`proxy_qlen_dequeue()`,用来限制数据包的队列长度。 4.`proxy_qlen_enqueue()`函数在将数据包加入队列之前,首先检查队列长度是否超过了设定的最大值。如果超过了,就将队列中最早的数据包删除。然后再将新的数据包加入队列。 5.`proxy_qlen_dequeue()`函数则是在从队列中取出数据包时,将队列长度减1。 6.在`include/net/sch_generic.h`中,定义了`struct Qdisc`和`struct sk_buff`等数据结构,以及`proxy_qlen_enqueue()`和`proxy_qlen_dequeue()`等操作函数的原型。 总之,proxy_qlen是一个简单但实用的网络模块,可以限制网络数据包的队列长度,避免过长的队列导致网络性能下降。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值