深度探索Linux内核之离开一个多播组(最简单的情况)

    应用程序通过命令字IP_DROP_MEMBERSHIP使一个socket离开一个多播组,IP_DROP_MEMBERSHIP是一个IP层的命令字,其调用使用的参数是结构体struct ip_mreq。该结构体的两个成员分别用于指定所要离开的多播组的组IP地址,和所要离开组的那个本地接口的IP地址。
    ip_setsockopt实现了该命令字,它通过调用ip_mc_leave_group使socket离开一个多播组。
    表示INET域socket的结构体struct inet_sock的成员mc_list是该socket所加入的所有多播组的一个链表,ip_mc_leave_group从该链表中去匹配所要离开的组(匹配条件是组地址相同,本地网络接口相同),找到一个结构体struct ip_mc_socklist节点。
    首先要从该节点中删去源列表,同时把该节点从socket中删除,因为我们现在所关注的IP_DROP_MEMBERSHIP所要离开的组是通过IP_ADD_MEMBERSHIP加入的,没有源过滤机制,只要把节点从socket中删除即可。
    然后,还需要从网络接口struct in_device中删掉这个组,以使网络硬件设备以后可以过滤掉发往这个组的数据报。首先从struct in_device的成员mc_list链表中去匹配一个struct ip_mc_list结构体节点(匹配条件是组地址相同即可)。
    如果节点的成员loaded不为0,表示硬件过滤机制正接收该组的数据报。则调用ip_mc_filter_del从网络设备接口的结构体struct net_device的成员mc_list链表中删去相应的节点struct dev_mc_list,并通过调用网络设备接口的成员函数set_multicast_list来更新设备的过滤机制。
    如果所要离开的组不是IGMP_ALL_HOSTS(224.0.0.1),则首先停止节点本身的定时器(用于IGMPv1和IGMPv2的主动报告),然后把要删除的节点从struct in_device的mc_list链表移到mc_tomb链表上,表示这是将要删除的一个组,在稍后发送状态改变报告时有用。
    最后启用定时器struct in_device->mr_ifc_timer(接口状态改变定时器),发送主动成员报告。测试环境中要离开的多播组中是224.0.1.1,发出的IGMPv3报告如下:
    数据                含义
    22                  第3版成员关系报告
    00                  8bit保留,必须为0
    f9 fc               校验和
    00 00             16bit保留,必须为0
    00 01             组记录的数量,为1
    下面为一条组记录:
    03                  组记录类型为CHANGE_TO_INCLUDE_MODE,改变到INCLUDE模式
    00                  辅助数据长度
    00 00             源地址的数量
    e0 00 01 01    组地址224.0.1.1
    即:组224.0.1.1的过滤模式从原来的EXCLUDE(过滤的源为空)变到现在的INCLUDE(包含的源为空),也就是离开了多播组224.0.1.1。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值