Linux | 组播接收转发

发布于:2025-07-23 ⋅ 阅读:(14) ⋅ 点赞:(0)

注:本文为 “Linux | 组播” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。


跨网段组播数据转发

家有工程师 原创于 2013-03-05 20:21:46 发布

在实际项目中,组播通信面临的核心问题是组播跨网络路由。初期通过资料查询得知,可借助 PIMD 实现组播数据包转发。

尽管 PIMD 能达成组播数据包转发,但作为应用程序,其在组播数据量较大时会影响系统效率。结合实际项目中组播数据源与接收者处于同一局域网的情况,若交换机支持组播,可将组播发送者与接收者通过交换机连接,再通过修改驱动程序直接实现数据包在不同网段的 eth0 与 eth1 之间双向转发(即 eth0→eth1 或 eth1→eth0)。

数据交互框图如下:

img

单播数据处理

B 中的 DSP 只向 A 中的 DSP 发送单播数据,单播数据的转发可根据 iptable 规则实现。

A 上的单播数据转发配置如下:
WAN IP:10.10.104.221
LAN IP:192.168.119.7
DSP IP:192.168.119.3

iptables -t nat -A PREROUTING -d 10.10.104.221 -p udp --dport 5001 -j DNAT --to 192.168.119.3

上述 iptable 规则表示,当目的地址为 10.10.104.221 时,将此数据包的目的地址更改为 192.168.119.3,即数据转发给 A 中的 DSP。

B 上的单播数据转发配置如下:

WAN IP:10.10.104.219
LAN IP:192.168.197.1
DSP IP:192.168.197.244
iptables -t nat -A PREROUTING -d 192.168.197.1  -p udp --dport 5001 -j DNAT --to 10.10.104.221
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.197.244 -p udp --dport 5001  -j SNAT --to 10.10.104.219
insmod snull.ko 
ifconfig virt_net0 up
brctl addif br0 virt_net0
echo 192.168.197.1 > /proc/LanIpAddr
cat /proc/LanIpAddr

上面的命令中,两条 iptables 命令的含义如下:第一条,当 B 中的 DSP 发送单播数据且目的地址为 192.168.197.1 时,将目的地址改为 10.10.104.221,即表示发送给 A 的 eth0 接口;第二条,当从 eth0 出去的数据包的源地址为 192.168.197.244(即 DSP 的 IP 地址)时,将源地址改为 B 的 eth0 的 IP 地址。即首先进行 DNAT 转换,紧接着进行 SNAT 转换。
############################################################################

组播数据的处理

组播数据:

数据流向为 A 中 DSP 是组播的数据源,B 中的 DSP 是组播的接收者。A 中的 DSP 和 eth1 处于同一网段,A 中 DSP 的组播数据首先发送至 eth1,之后转发到 eth0,再通过网络发送给 B 设备的 eth0 接口。同理,当组播数据到达 B 设备的 eth0 接口后,通过驱动程序将数据转发到 eth1 接口,其中 eth1 与 DSP 处于同一网段(192.168.100.xx)。

img

现将上面的代码进行说明:

在 Linux 以太网驱动程序中,每个 ethN(eth0,eth1……)对应驱动中的一个 mac_unit。对于 eth0,mac_unit = 0;对于 eth1,mac_unit = 1。因此,可在驱动的接收函数中判断:一个特定的数据包来自哪个 mac_unit,或在特定的 mac_unit 中处理特定的数据包。此处为:在 mac_unit = 0(即 eth0)上对特定的组播数据进行处理,首先判断:if ((mac->mac_unit == 0) && (0 == memcmp(dest_mac, MUTICAST_MAC, ETH_ALEN)) && (iph->daddr == *(unsigned int *)MUTICAST_DEST_IP)),即目的 IP 为 224.1.2.3,目的 MAC 地址为 0100 5e01 0203。当收到的数据包满足此条件时,可判定该数据包为组播数据。将此数据包的目的地址更改为单播目的地址:

memcpy(ethh->h_dest, DSP_VX_MAC, ETH_ALEN); /* 为 192.168.197.244 对应的 MAC 地址 */
iph->daddr = *(unsigned int *)DSP_VX_IP; /* 192.168.197.244 */

之后:

if (virt_dev != NULL))
{
    is_muticast_package_flag = 0; 
    skb->dev = virt_dev;
    retskb = netif_receive_skb(skb);       
}

通过虚拟接口将 skb 的 dev 更改为 virt_dev。此后,数据包将通过协议栈进行处理。同时进行如下桥接配置:

insmod snull.ko // 为虚拟网卡,虚拟出 virt_net0 设备。
ifconfig virt_net0 up
brctl addif br0 virt_net0

经过上述处理,B 设备中的 DSP:192.168.197.244 将会收到一个组播数据(此时仅目的地址为单播目的地址,数据内容未发生变化)。

其代码类似如下:

#if DP_VERSION //DP
 //* muticast IP */   //30:22:7B:CA:CC:DB
 struct net_device* virt_dev;
 EXPORT_SYMBOL(virt_dev);
 #define LAN_DSP_UDP_PORT 6735
 #define LAN_LOCAL_PORT  2849
 static int muticast_dest_ipaddr = 0xE0010203;   /* 224.1.2.3  */ 
 static int LAN_ipaddr = 0xC0A8C541;   /* 192.168.197.7 */
 static int DSP_VX_ipaddr = 0xC0A8C5F4;   /* 192.168.197.244 */
 static int CP_ipaddr = 0x0;   /* 0.0.0.0 */
 static unsigned char *LAN_IP = (unsigned char *)&LAN_ipaddr;/* 192.168.197.7 */
 static unsigned char *DSP_VX_IP = (unsigned char *)&DSP_VX_ipaddr;/* 192.168.197.244 */
 static unsigned char *CP_SRC_IP = (unsigned char *)&CP_ipaddr;/* CP端,及组播源的IP地址 */
 
 
 static unsigned char *MUTICAST_DEST_IP = (unsigned char *)&muticast_dest_ipaddr; /* 224.1.2.3  */ 
 static unsigned char  MUTICAST_MAC[ETH_ALEN] = {0x01,0x00,0x5e,0x01,0x02,0x03};     /*  0100 5e01 0203 */
 static unsigned char LAN_MAC[ETH_ALEN] = {0x30,0x22,0x7B,0xCA,0xCC,0xDB };  /*HWaddr 00:27:1D:10:00:00 */
 static unsigned char DSP_VX_MAC[ETH_ALEN] = {0xAA,0xBB,0xCC,0x01,0x19,0x1C }; /*aa:bb:cc:01:19:1c */
 static unsigned char TEMP_MAC[ETH_ALEN] = {0x00,0x03,0x7F,0xFF,0xFF,0xFF };    /* 00:03:7F:FF:FF:FF */
 static unsigned char CP_SRC_MAC[ETH_ALEN] = {0xAA,0xBB,0xCC,0x01,0x19,0x1C }; /* CP端,及组播源的MAC地址 */
 static int Lan_Ipaddr_read (char *page, char **start, off_t off,int count, int *eof, void *data)
 {
 count = sprintf(page, "%d.%d.%d.%d\n", \
 (LAN_ipaddr>>24)&0x000000ff,(LAN_ipaddr>>16)&0x000000ff,\
 (LAN_ipaddr>>8)&0x000000ff,(LAN_ipaddr)&0x000000ff);
 
 
 count = sprintf(page, "%s%02x:%02x:%02x:%02x:%02x:%02x\n", page,\
 LAN_MAC[0],LAN_MAC[1],LAN_MAC[2],LAN_MAC[3],LAN_MAC[4],LAN_MAC[5]);
 
 *eof = 1;  /* Indicate completion */
 return count;
 }
 static int dp_muticastsrouce_Ipaddr_read (char *page, char **start, off_t off,int count, int *eof, void *data)
 {
 count = sprintf(page,"cp_wan_ip\ncp_wan_ip=%d.%d.%d.%d\n", \
 (CP_ipaddr>>24)&0x000000ff,(CP_ipaddr>>16)&0x000000ff,\
 (CP_ipaddr>>8)&0x000000ff,(CP_ipaddr)&0x000000ff);
 
 
 count = sprintf(page, "%s%02x:%02x:%02x:%02x:%02x:%02x\n", page,\
 CP_SRC_MAC[0],CP_SRC_MAC[1],CP_SRC_MAC[2],CP_SRC_MAC[3],CP_SRC_MAC[4],CP_SRC_MAC[5]);
 
 *eof = 1;  /* Indicate completion */
 return count;
 }
 
 
 static int Lan_Ipaddr_write (struct file *file, const char *buf,unsigned long count, void *data)
 {
 char *end;
 unsigned int u32temp,u32temp1;
 
 
 u32temp = (int)simple_strtoul(buf,&end,10);
 u32temp1 = (u32temp&0x000000ff) <<24;
 if(*end!='.') return 0;
 buf = end + 1;
 u32temp = (int)simple_strtoul(buf,&end,10);
 u32temp1 += (u32temp&0x000000ff) <<16;
 if(*end!='.') return 0;
 buf = end + 1;
 u32temp = (int)simple_strtoul(buf,&end,10);
 u32temp1 += (u32temp&0x000000ff) <<8;
 if(*end!='.') return 0;
 buf = end + 1;
 u32temp = (int)simple_strtoul(buf,&end,10);
 u32temp1 += (u32temp&0x000000ff);
 
 
 LAN_ipaddr = u32temp1;
 return count;
 }
 
 
 void init_dp_ip_addr()
 {
 static struct proc_dir_entry * dp_lan_proc_entry;
 static struct proc_dir_entry * dpside_cp_ip_proc_entry;
 mode_t mode =0444;
 dp_lan_proc_entry = create_proc_entry("dp_lanIpAddr",mode, NULL);
 dp_lan_proc_entry->read_proc = Lan_Ipaddr_read;
 dp_lan_proc_entry->write_proc = Lan_Ipaddr_write;
 dpside_cp_ip_proc_entry = create_proc_entry("cp_wan_ip",mode, NULL);
 dpside_cp_ip_proc_entry->read_proc = dp_muticastsrouce_Ipaddr_read;
 }
 #endif

在函数int athr_gmac_hard_start(struct sk_buff *skb, struct net_device *dev)

{//中自动学习MAC地址
     #if DP_VERSION
     {
  /* 修改目的,源MAC地址*/
 struct ethhdr *ethh;
 struct iphdr *  iph;
 unsigned char *dest_mac;
 ethh =(struct ethhdr*)skb->data;
 iph = (struct iphdr *)(skb->data + ETH_HLEN);  
 dest_mac = ethh->h_dest; 
 if(mac->mac_unit == 1)
  {
   if((ethh->h_proto == htons(ETH_P_ARP))||(ethh->h_proto == htons(ETH_P_RARP)))
   {  
 //   printk("arp ,rap .....\n")
     if(0 == memcmp(skb->data + 28,LAN_IP, 4))
     {
       if(0 != memcmp(skb->data + 22,LAN_MAC, 6))
       {
         memcpy(LAN_MAC, skb->data + 22, ETH_ALEN);
         printk(" LAN_MAC MAC changed by ARP, the new MAC is: %02X:%02X:%02X:%02X:%02X:%02X\n", \
         LAN_MAC[0],LAN_MAC[1],LAN_MAC[2],LAN_MAC[3],LAN_MAC[4],LAN_MAC[5]);
      }      
    }
   }   
  }
 
 } 
 #endif 

}

在函数有线口驱动接受函数

athr_receive_pkt()

{



#if DP_VERSION
     {
  /* 修改目的,源MAC地址*/
 struct ethhdr *ethh;
 struct iphdr *  iph;
 struct udp_hdr *udph;
 unsigned char *dest_mac,*src_mac;
 ethh =(struct ethhdr*)skb->data;
 iph = (struct iphdr *)(skb->data + ETH_HLEN);  
 dest_mac = ethh->h_dest;
 src_mac = ethh->h_source; 
 if(virt_dev != NULL)
 {  
 if((mac->mac_unit ==  0)&&(0==memcmp(dest_mac,  MUTICAST_MAC,  ETH_ALEN))&&(iph->daddr == *(unsigned int  *)MUTICAST_DEST_IP))
 {
   //printk("**********muticast data package**************************************************\n");
 memcpy(CP_SRC_MAC,ethh->h_source,  ETH_ALEN);  
 *(unsigned int *)CP_SRC_IP =iph->saddr;
 memcpy(ethh->h_dest,DSP_VX_MAC,  ETH_ALEN);
 iph->daddr   =  *(unsigned int *)DSP_VX_IP;
 ip_send_check(iph); 
 udph = (struct udp_hdr *)(skb->data + ETH_HLEN + 20);  
 udph->check = 0;
 is_muticast_package_flag =1;
 }  
 }
 if((mac->mac_unit == 1)&&(0==memcmp(src_mac,  DSP_VX_MAC,  ETH_ALEN))&&(iph->saddr == *(unsigned int *)DSP_VX_IP))
 {
   memcpy(ethh->h_dest,LAN_MAC,  ETH_ALEN);
   iph->daddr   =  *(unsigned int *)LAN_IP;
   ip_send_check(iph); 
 udph = (struct udp_hdr *)(skb->data + ETH_HLEN + 20);  //udp 8 bytes
  udph->check = 0;
 }  
 }
 #endif  
 {
   #if DP_VERSION
 if((mac->mac_unit == 0)&&(is_muticast_package_flag ==1)&&(virt_dev != NULL))
 {
     //  print_ip_buffer1(skb, (char *)"umtical", __LINE__);
     //  printk("----------------------------------------------------------------------\n"); 
      is_muticast_package_flag =0; 
      skb->dev =virt_dev;
      retskb =netif_receive_skb(skb);       
 }
 else
 {
 retskb =netif_receive_skb(skb);
 } 
 #endif  

}



\------------------------------------------------------------------------

#if CP_7240_ON_OFF_VERSION2
    if((mac->mac_unit == 1)&&(0==memcmp(dest_mac,  MUTICAST_MAC, ETH_ALEN))&&(iph->daddr == *(unsigned int  *)MUTICAST_DEST_IP))
 //if((mac->mac_unit == 1)&&(is_multicast_ether_addr(dest_mac)))
 {
 //athr_gmacs[i]->mac_dev
   skb->dev =athr_gmacs[0]->mac_dev;
   printk("----------------------------------------------------------------------\n");

 memcpy(ethh->h_source, WAN_MAC, ETH_ALEN); 
 iph->saddr   =  *(unsigned int *)WAN_IP_ADDR;  
   ip_send_check(iph); 
   udph = (struct udp_hdr *)(skb->data + ETH_HLEN + 20);  
 udph->check = 0; 
 if(athr_gmacs[0]->mac_ifup) //athr_gmac_hard_start(struct sk_buff *skb, struct net_device *dev)
  {
  athr_gmacs[0]->mac_dev->netdev_ops->ndo_start_xmit(skb, athr_gmacs[0]->mac_dev);
  } 
 } 
 else
 {     
  netif_receive_skb(skb); //这个地方注意。 
 }
 #else
 { 
 netif_receive_skb(skb); //这个地方注意。
 }
 #endif  

Linux 下组播接收转发 + Linux TC 处理组播数据

一、需求

首先简要说明初始需求及环境。

img

环境如上所示,采用 Linux 进行转发的原因在于,需利用 Linux TC(traffic control)模块对组播数据进行延时、丢包等处理,以测试接收端对组播数据的恢复处理能力。

二、前期准备

初始任务为搭建 Linux TC 测试环境,未提供其他相关信息。通过网络资料查询,完成了虚拟机 Linux 的安装及 TC 模块的搭建(Windows 系统下存在一款较好的网络流量控制工具“NEWT”)。

TC 模块可正常使用后,初期误以为工作已完成,未考虑如何将数据转发至接收端。当将 PC 加入整个测试环境时,该问题显现,即无法将经 Linux 处理的数据发送至接收端。经资料查询,发现 iptables 可实现 IP 转发,似乎能满足需求(此时尚未意识到组播数据与非组播数据在转发上的差异)。最初未考虑测试组播,认为只要对输入的 IP 流进行处理即可,且单播在该环境中很快实现了正常使用,但组播未能成功,而实际应用中多数数据为组播。

三、Linux 组播转发的实现

3.1 组播接收问题及解决

在开始组播测试时,遇到无法接收发送端(虚拟机)发送的组播数据的问题,但主机的 Wireshark 可接收到,原因如下:

出于安全考虑,Linux 不会自动接收组播数据,系统会依据 rp_filter 的值对数据包进行检查。当 rp_filter 为 1 时,会检查数据包的目的地址,若目的 IP 非本机 IP,则直接丢弃数据包。由于组播数据包的目的地址为组播 IP,与本机 IP 不匹配,因此数据包会被丢弃。当将 rp_filter 改为 0 时,系统不进行检查,所有数据包均可被接收,应用程序从而能收到组播消息。

Linux 系统无法收到组播消息的问题解决办法:

需进行以下 3 项修改:

  1. /etc/sysctl.conf 文件中的 net.ipv4.conf.all.rp_filter 设置为 0。
  2. 执行 sysctl -w net.ipv4.conf.all.rp_filter=0
  3. 执行 echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter

原理:

Linux 系统基于 rp_filter 的值对数据包进行安全检查,rp_filter 为 1 时会丢弃目的 IP 非本机 IP 的数据包,而组播数据包的目的地址为组播 IP,故会被丢弃;将其改为 0 后,系统不进行检查,组播消息可被接收。

posted @ 2019-06-13 13:52 jiexianzhu

另外可参考:https://github.com/troglobit/pimd

img

/proc/sys/net/ipv4/conf/all/rp_filter 设置为 0 的具体方式:

  1. 执行 sysctl -w net.ipv4.conf.all.rp_filter=0echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter,这两种方式均为临时生效,Linux 重启或网络重启后失效。
  2. 若要使参数更改永久生效,需将 net.ipv4.conf.all.rp_filter = 0 写入 /etc/sysctl.conf 文件,再执行 sysctl -p 加载(-p 表示从指定文件加载系统参数,若不指定则从 /etc/sysctl.conf 加载)。

3.2 组播转发开关设置

完成上述操作后,可正常接收组播数据,但实现组播转发还需开启组播转发开关:

  1. /proc/sys/net/ipv4/ip_forward 设置为 1(开启 IP 转发开关),设置方法参考上述 rp_filter 的设置。
  2. /proc/sys/net/ipv4/conf/all/mc_forwarding 设置为 1(开启组播转发开关),设置方法同样参考上述 rp_filter 的设置。

该步骤曾耗费较多时间,因无论如何修改,mc_forwarding 的值始终为 0。经查询英文讨论区(名称已遗忘)得知,若设置正确,仅在启用转发时,mc_forwarding 的值才会变为“1”。

最初使用虚拟机单网卡搭建测试环境(后考虑单网卡可能无法实现转发,添加了一个 USB 网卡)。资料显示,虚拟机采用桥接模式无法转发组播,另有资料提及需使用 host - only 模式,但相关描述仅两句话,故需自行多次尝试。随后研究了虚拟机的 3 种模式,发现桥接模式下可接收组播但无法转发,NAT 和 Host only 模式下甚至无法接收组播。曾在网站付费提问,但未获得准确回复,调试过程一度陷入困境。

3.3 基于 Linux 系统的组播转发配置

最终决定放弃虚拟机环境,重新安装 Linux 系统进行测试。所使用的 Linux 版本为 Linux fedora29 4.18.16 - 300.fc29.x86_64,pimd 版本为 pimd version 2.3.2。

  1. 查看 Linux 路由表:
    网上部分环境需配置发送端与接收端的组播路由,本环境无需配置,具体需根据实际需求和环境确定。

img

  1. 检查 Linux 版本是否支持组播:
    执行 ifconfig 命令,若输出中包含“UP BROADCAST RUNNING MULTICAST MTU:1500 Metric”,则表示系统支持组播;若不支持,需编译内核。

  2. 安装 PIMD:
    执行 sudo yum install pimd,等待安装完成。pimd 的配置信息位于 /etc/pimd.conf,本环境使用默认配置。输入 pimd - h 可查看 pimd 的使用方法。

  3. 运行 pimd:

  • 执行 [xx@localhost~]$:sudo pimd,此时无任何信息显示。
  • 查看 pimd 运行信息,执行 [xx@localhost~]$:sudo pimd -d

img

虽显示信息不完整,但可看出转发模块已建立,并选取输出网卡(192.168.1.56)作为汇聚点。

若需查看 pimd 的全部运行状态,可先执行 pimd - q 退出,再运行 pimd - d 查看。

需注意,pimd - d 命令会持续运行,若需使用终端,建议重新打开一个窗口,不要通过 ctrl + c 退出。最初曾错误地认为执行 pimd - d 后 pimd 会在后台运行,实际上这只是一个调试信息中断,不影响程序运行。

实际上,直接在终端输入 pimd 即可运行程序,由于处于调试阶段且新手对仅输入 pimd 无信息输出存在疑虑,故使用 pimd - d

  1. 查看路由信息:
    执行 [xx@localhost~]$:sudo pimd -r

img

  1. 查看组播路由表:
    执行 [xx@localhost~]$:sudo ip mroute show,显示为 (10.10.50.12, 238.1.1.10) Iif:enp0s25 Oifs:enp0s26f7u1u3 State:resolved

若显示 Iif:unresolved State:unresolved,其中 iif 为接收多播数据包的网络接口,若设备名为“unresolved”,表示路由监控进程无法解析该条目;oif 后跟随输出网络接口,接口之间用空格分隔。

  1. 查看 Linux 路由转发节点的组播虚拟转发接口信息:
    执行 [xx@localhost~]$:more /proc/net/ip_mr_vif

img

由此可知,发送端 A 的数据从 Linux 网卡 enp0s25 进入,从另一网卡 enp0s26f7u1u3 发出。

  1. 配置接收端 B:
    设置发送端组播的地址和端口号,即可正常接收组播数据。

注意:若转发接口信息显示正常,输入输出数据稳定增长,组播路由表也正常,但接收端仍无法接收数据,可尝试关闭防火墙。

  • 启动防火墙:systemctl start firewalld
  • 暂时关闭防火墙(重启后失效):systemctl stop firewalld
  • 永久关闭防火墙:systemctl disable firewalld

四、Linux TC 模块与组播转发的结合使用

结合 Linux TC 模块对组播数据进行处理相对简单,因前期已实现组播数据的正常转发,只需搭配使用即可。

需注意的是,最初在接收组播的 enp0s25 网卡上使用 TC 模块进行处理,未达到预期效果。经分析,应在组播数据输出前对其进行控制,即在 enp0s26f7u1u3 网卡上使用 TC 模块。

img

在接收端可观测到组播信息,表明 TC 模块使用正常。

尽管本文描述较为简洁,但对于缺乏基础知识的人员而言,调试过程并非易事。若能遇到与自身环境相符的教程,可能一次即可成功,但多数情况下环境存在差异。在整个过程中,需查阅大量资料,不放过任何有用信息,期间难免走弯路,但解决问题的过程能让人学到诸多知识。有时,当感觉无路可走时,或许已接近成功。

以上内容为凭回忆记录,可能存在遗漏,欢迎纠正与讨论。

另外,附上 pimd 运行时的打印信息:

sudo pimd -d
debug level 0xffffffff (dvmrp_detail,dvmrp_prunes,dvmrp_routes,dvmrp_neighbors,dvmrp_timers,igmp_proto,igmp_timers,igmp_members,trace,timeout,packets,interfaces,kernel,cache,rsrr,pim_detail,pim_hello,pim_register,pim_join_prune,pim_bootstrap,pim_asserts,pim_cand_rp,pim_routes,pim_timers,pim_rpf)
22:49:46.521 pimd version 2.3.2 starting ...
22:49:46.521 Got 262144 byte send buffer size in 0 iterations
22:49:46.521 Got 262144 byte recv buffer size in 0 iterations
22:49:46.521 Got 262144 byte send buffer size in 0 iterations
22:49:46.521 Got 262144 byte recv buffer size in 0 iterations
22:49:46.522 Getting vifs from kernel
22:49:46.522 Installing enp0s25 (10.10.50.36 on subnet 10.10.50/24) as vif #0-2 - rate 0
22:49:46.522 Installing enp0s26f7u1u3 (192.168.1.56 on subnet 192.168.1) as vif #1-9 - rate 0
22:49:46.522 Getting vifs from /etc/pimd.conf
22:49:46.522 Local static RP: 192.168.1.56, group 224.0.0.0/4
22:49:46.522 Local Cand-BSR address 192.168.1.56, priority 5
22:49:46.522 Local Cand-RP address 192.168.1.56, priority 20, interval 30 sec
22:49:46.522 spt-threshold packets 0 interval 100
22:49:46.522 Local static RP: 169.254.0.1, group 232.0.0.0/8
22:49:46.522 IGMP query interval : 12 sec
22:49:46.522 IGMP querier timeout : 41 sec
22:49:46.522 Another multicast routing application is already running.
[pbi@localhost pimdLog]$ sudo pimd -q
[pbi@localhost pimdLog]$ sudo pimd -d
debug level 0xffffffff (dvmrp_detail,dvmrp_prunes,dvmrp_routes,dvmrp_neighbors,dvmrp_timers,igmp_proto,igmp_timers,igmp_members,trace,timeout,packets,interfaces,kernel,cache,rsrr,pim_detail,pim_hello,pim_register,pim_join_prune,pim_bootstrap,pim_asserts,pim_cand_rp,pim_routes,pim_timers,pim_rpf)
22:50:07.387 pimd version 2.3.2 starting ...
22:50:07.387 Got 262144 byte send buffer size in 0 iterations
22:50:07.387 Got 262144 byte recv buffer size in 0 iterations
22:50:07.387 Got 262144 byte send buffer size in 0 iterations
22:50:07.387 Got 262144 byte recv buffer size in 0 iterations
22:50:07.387 Getting vifs from kernel
22:50:07.387 Installing enp0s25 (10.10.50.36 on subnet 10.10.50/24) as vif #0-2 - rate 0
22:50:07.387 Installing enp0s26f7u1u3 (192.168.1.56 on subnet 192.168.1) as vif #1-9 - rate 0
22:50:07.387 Getting vifs from /etc/pimd.conf
22:50:07.387 Local static RP: 192.168.1.56, group 224.0.0.0/4
22:50:07.388 Local Cand-BSR address 192.168.1.56, priority 5
22:50:07.388 Local Cand-RP address 192.168.1.56, priority 20, interval 30 sec
22:50:07.388 spt-threshold packets 0 interval 100
22:50:07.388 Local static RP: 169.254.0.1, group 232.0.0.0/8
22:50:07.388 IGMP query interval : 12 sec
22:50:07.388 IGMP querier timeout : 41 sec
22:50:07.388 Interface enp0s25 comes up; vif #0 now in service
22:50:07.388 query_groups(): Sending IGMP v3 query on enp0s25
22:50:07.388 Send IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:07.388 SENT  36 bytes IGMP Membership Query   from 10.10.50.36   to 224.0.0.1
22:50:07.388 SENT  46 bytes PIM v2 Hello       from 10.10.50.36   to 224.0.0.13
22:50:07.388 Interface enp0s26f7u1u3 comes up; vif #1 now in service
22:50:07.388 query_groups(): Sending IGMP v3 query on enp0s26f7u1u3
22:50:07.388 Send IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:07.388 SENT  36 bytes IGMP Membership Query   from 192.168.1.56  to 224.0.0.1
22:50:07.388 SENT  46 bytes PIM v2 Hello       from 192.168.1.56  to 224.0.0.13
22:50:07.411 Interface register_vif0 comes up; vif #2 now in service
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 0
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
22:50:07.411 Received IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:07.411 RECV  46 bytes PIM v2 Hello       from 10.10.50.36   to 224.0.0.13
22:50:07.411 Cache miss, src 10.10.50.12, dst 238.1.1.10, iif 0
22:50:07.411 create group entry, group 238.1.1.10
22:50:07.411 RECV  46 bytes PIM v2 Hello       from 192.168.1.56  to 224.0.0.13
22:50:07.411 Received IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:07.411 Received IGMP v3 Membership Report from 10.10.50.36 to 224.0.0.22
22:50:07.411 accept_membership_report(): IGMP v3 report, 32 bytes, from 10.10.50.36 to 224.0.0.22 with 3 group records.
22:50:07.411 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:07.411 Set delete timer for group: 224.0.0.22
22:50:07.411 SM group order from 10.10.50.36 (*,224.0.0.22)
22:50:07.411 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:07.411 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:07.411 Set delete timer for group: 224.0.0.2
22:50:07.411 SM group order from 10.10.50.36 (*,224.0.0.2)
22:50:07.411 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:07.411 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:07.411 Set delete timer for group: 224.0.0.13
22:50:07.411 SM group order from 10.10.50.36 (*,224.0.0.13)
22:50:07.411 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:07.411 Received IGMP v3 Membership Report from 192.168.1.56 to 224.0.0.22
22:50:07.411 accept_membership_report(): IGMP v3 report, 32 bytes, from 192.168.1.56 to 224.0.0.22 with 3 group records.
22:50:07.411 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:07.411 Set delete timer for group: 224.0.0.22
22:50:07.411 SM group order from 192.168.1.56 (*,224.0.0.22)
22:50:07.411 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:07.411 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:07.411 Set delete timer for group: 224.0.0.2
22:50:07.411 SM group order from 192.168.1.56 (*,224.0.0.2)
22:50:07.411 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:07.412 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:07.412 Set delete timer for group: 224.0.0.13
22:50:07.412 SM group order from 192.168.1.56 (*,224.0.0.13)
22:50:07.412 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:08.086 Received IGMP v3 Membership Report from 10.10.50.36 to 224.0.0.22
22:50:08.086 accept_membership_report(): IGMP v3 report, 32 bytes, from 10.10.50.36 to 224.0.0.22 with 3 group records.
22:50:08.086 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:08.086 Set delete timer for group: 224.0.0.22
22:50:08.086 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:08.086 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:08.086 Set delete timer for group: 224.0.0.2
22:50:08.086 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:08.086 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:08.086 Set delete timer for group: 224.0.0.13
22:50:08.086 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:08.405 Received IGMP v3 Membership Report from 192.168.1.56 to 224.0.0.22
22:50:08.405 accept_membership_report(): IGMP v3 report, 32 bytes, from 192.168.1.56 to 224.0.0.22 with 3 group records.
22:50:08.405 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:08.405 Set delete timer for group: 224.0.0.22
22:50:08.405 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:08.405 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:08.405 Set delete timer for group: 224.0.0.2
22:50:08.405 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:08.405 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:08.405 Set delete timer for group: 224.0.0.13
22:50:08.405 Not creating routing entry for LAN scoped group 224.0.0.13
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 0
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
22:50:13.410 SENT  34 bytes PIM v2 Bootstrap     from 10.10.50.36   to 224.0.0.13
22:50:13.410 SENT  34 bytes PIM v2 Bootstrap     from 192.168.1.56  to 224.0.0.13
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:13.410 RECV  34 bytes PIM v2 Bootstrap     from 10.10.50.36   to 224.0.0.13
22:50:13.410 RECV  34 bytes PIM v2 Bootstrap     from 192.168.1.56  to 224.0.0.13
22:50:16.214 Received IGMP v3 Membership Report from 192.168.1.56 to 224.0.0.22
22:50:16.214 accept_membership_report(): IGMP v3 report, 40 bytes, from 192.168.1.56 to 224.0.0.22 with 4 group records.
22:50:16.214 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:16.214 Set delete timer for group: 224.0.0.22
22:50:16.214 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:16.214 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:16.214 Set delete timer for group: 224.0.0.2
22:50:16.214 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:16.214 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:16.214 Set delete timer for group: 224.0.0.13
22:50:16.214 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:16.214 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.251 report_type 34
22:50:16.215 Set delete timer for group: 224.0.0.251
22:50:16.215 SM group order from 192.168.1.56 (*,224.0.0.251)
22:50:16.215 Not creating routing entry for LAN scoped group 224.0.0.251
22:50:17.749 Received IGMP v3 Membership Report from 10.10.50.36 to 224.0.0.22
22:50:17.749 accept_membership_report(): IGMP v3 report, 40 bytes, from 10.10.50.36 to 224.0.0.22 with 4 group records.
22:50:17.749 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:17.749 Set delete timer for group: 224.0.0.22
22:50:17.749 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:17.749 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:17.749 Set delete timer for group: 224.0.0.2
22:50:17.749 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:17.749 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:17.749 Set delete timer for group: 224.0.0.13
22:50:17.749 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:17.749 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.251 report_type 34
22:50:17.749 Set delete timer for group: 224.0.0.251
22:50:17.749 SM group order from 10.10.50.36 (*,224.0.0.251)
22:50:17.750 Not creating routing entry for LAN scoped group 224.0.0.251
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 0
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:17.750 Cache miss, src 10.10.50.12, dst 238.1.1.10, iif 0
22:50:17.750 create group entry, group 238.1.1.10
22:50:20.494 Received IGMP v2 Membership Report from 192.168.1.100 to 238.1.1.10
22:50:20.495 accept_group_report(): igmp_src 192.168.1.100 ssm_src 238.1.1.10 group 238.1.1.10 report_type 22
22:50:20.495 Change IGMP compatibility mode to v2 for group 238.1.1.10
22:50:20.495 Set delete timer for group: 238.1.1.10
22:50:20.495 SM group order from 192.168.1.100 (*,238.1.1.10)
22:50:20.495 create group entry, group 238.1.1.10
22:50:21.227 Received IGMP v2 Membership Report from 10.10.50.12 to 224.1.1.1
22:50:21.227 accept_group_report(): igmp_src 10.10.50.12 ssm_src 224.1.1.1 group 224.1.1.1 report_type 22
22:50:21.227 Change IGMP compatibility mode to v2 for group 224.1.1.1
22:50:21.227 Set delete timer for group: 224.1.1.1
22:50:21.227 SM group order from 10.10.50.12 (*,224.1.1.1)
22:50:21.227 create group entry, group 224.1.1.1
22:50:23.229 query_groups(): Sending IGMP v3 query on enp0s25
22:50:23.229 Send IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:23.229 SENT  36 bytes IGMP Membership Query   from 10.10.50.36   to 224.0.0.1
22:50:23.229 query_groups(): Sending IGMP v3 query on enp0s26f7u1u3
22:50:23.229 Send IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:23.229 SENT  36 bytes IGMP Membership Query   from 192.168.1.56  to 224.0.0.1
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 0
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
22:50:23.229 New RP candidate 192.168.1.56 for group 224.0.0.0/4, priority 20
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
192.168.1.56   2     224/4        20    75
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:23.230 NETLINK: vif 1, ifindex=9
22:50:23.230 NETLINK: gateway is 192.168.1.1
22:50:23.230 For src 169.254.0.1, iif is 1, next hop router is 192.168.1.1: NOT A PIM ROUTER
22:50:23.230 New RP candidate 192.168.1.56 for group 224.0.0.0/4, priority 1
22:50:23.230 Received IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:23.230 Received IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:23.237 Received IGMP v2 Membership Report from 10.10.50.12 to 224.1.1.1
22:50:23.237 accept_group_report(): igmp_src 10.10.50.12 ssm_src 224.1.1.1 group 224.1.1.1 report_type 22
22:50:23.237 accept_group_report(): al_pv=2
22:50:23.237 Set delete timer for group: 224.1.1.1
22:50:23.237 create group entry, group 224.1.1.1
22:50:23.237 Adding vif 0 for group 224.1.1.1
22:50:23.662 Received IGMP v3 Membership Report from 10.10.50.36 to 224.0.0.22
22:50:23.662 accept_membership_report(): IGMP v3 report, 40 bytes, from 10.10.50.36 to 224.0.0.22 with 4 group records.
22:50:23.662 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:23.662 Set delete timer for group: 224.0.0.22
22:50:23.662 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:23.662 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:23.662 Set delete timer for group: 224.0.0.2
22:50:23.662 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:23.662 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:23.662 Set delete timer for group: 224.0.0.13
22:50:23.662 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:23.662 accept_group_report(): igmp_src 10.10.50.36 ssm_src 0.0.0.0 group 224.0.0.251 report_type 34
22:50:23.662 Set delete timer for group: 224.0.0.251
22:50:23.662 Not creating routing entry for LAN scoped group 224.0.0.251
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
22:50:27.666 NETLINK: vif 1, ifindex=9
22:50:27.666 NETLINK: gateway is 192.168.1.1
22:50:27.666 For src 169.254.0.1, iif is 1, next hop router is 192.168.1.1: NOT A PIM ROUTER
Multicast Routing Table ======================================================
----------------------------------- (*,G) ------------------------------------
Source      Group      RP Address    Flags
--------------- --------------- --------------- ---------------------------
INADDR_ANY    224.1.1.1    192.168.1.56   WC RP
Joined  oifs: ...
Pruned  oifs: ...
Leaves  oifs: l..
Asserted oifs: ...
Outgoing oifs: o..
Incoming   : ..I
TIMERS: Entry  JP  RS Assert VIFS: 0 1 2
0  60   0    0    0 0 0
----------------------------------- (S,G) ------------------------------------
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 1
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
192.168.1.56   2     224/4        1     65535
224/4        20    70
169.254.0.1   1     232/8        1     65535
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:27.989 Cache miss, src 10.10.50.12, dst 238.1.1.10, iif 0
22:50:27.989 create group entry, group 238.1.1.10
22:50:27.989 create source entry, source 10.10.50.12
22:50:27.989 move_kernel_cache: SG
22:50:29.308 Received IGMP v2 Membership Report from 192.168.1.100 to 238.1.1.10
22:50:29.308 accept_group_report(): igmp_src 192.168.1.100 ssm_src 238.1.1.10 group 238.1.1.10 report_type 22
22:50:29.308 accept_group_report(): al_pv=2
22:50:29.308 Set delete timer for group: 238.1.1.10
22:50:29.308 Adding vif 1 for group 238.1.1.10
22:50:30.549 Received IGMP v3 Membership Report from 192.168.1.56 to 224.0.0.22
22:50:30.549 accept_membership_report(): IGMP v3 report, 40 bytes, from 192.168.1.56 to 224.0.0.22 with 4 group records.
22:50:30.549 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:30.549 Set delete timer for group: 224.0.0.22
22:50:30.549 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:30.549 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:30.549 Set delete timer for group: 224.0.0.2
22:50:30.549 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:30.549 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:30.549 Set delete timer for group: 224.0.0.13
22:50:30.549 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:30.550 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.251 report_type 34
22:50:30.550 Set delete timer for group: 224.0.0.251
22:50:30.550 Not creating routing entry for LAN scoped group 224.0.0.251
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
----------------------------------- (*,G) ------------------------------------
Source      Group      RP Address    Flags
--------------- --------------- --------------- ---------------------------
INADDR_ANY    224.1.1.1    192.168.1.56   WC RP
Joined  oifs: ...
Pruned  oifs: ...
Leaves  oifs: l..
Asserted oifs: ...
Outgoing oifs: o..
Incoming   : ..I
TIMERS: Entry  JP  RS Assert VIFS: 0 1 2
0  55   0    0    0 0 0
----------------------------------- (S,G) ------------------------------------
----------------------------------- (*,G) ------------------------------------
Source      Group      RP Address    Flags
--------------- --------------- --------------- ---------------------------
INADDR_ANY    238.1.1.10    192.168.1.56   WC RP
Joined  oifs: ...
Pruned  oifs: ...
Leaves  oifs: .l.
Asserted oifs: ...
Outgoing oifs: .o.
Incoming   : ..I
TIMERS: Entry  JP  RS Assert VIFS: 0 1 2
0  60   0    0    0 0 0
----------------------------------- (S,G) ------------------------------------
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 2
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
192.168.1.56   2     224/4        1     65535
224/4        20    65
169.254.0.1   1     232/8        1     65535
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:37.556 SENT  46 bytes PIM v2 Hello       from 10.10.50.36   to 224.0.0.13
22:50:37.556 query_groups(): Sending IGMP v3 query on enp0s25
22:50:37.556 Send IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:37.556 SENT  36 bytes IGMP Membership Query   from 10.10.50.36   to 224.0.0.1
22:50:37.556 SENT  46 bytes PIM v2 Hello       from 192.168.1.56  to 224.0.0.13
22:50:37.556 query_groups(): Sending IGMP v3 query on enp0s26f7u1u3
22:50:37.556 Send IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:37.556 SENT  36 bytes IGMP Membership Query   from 192.168.1.56  to 224.0.0.1
Virtual Interface Table ======================================================
Vif Local Address  Subnet       Thresh Flags   Neighbors
--- --------------- ------------------ ------ --------- -----------------
0 10.10.50.36   10.10.50/24       1 DR NO-NBR
1 192.168.1.56   192.168.1        1 DR NO-NBR
2 10.10.50.36   register_vif0      1
Vif SSM Group    Sources
Multicast Routing Table ======================================================
----------------------------------- (*,G) ------------------------------------
Source      Group      RP Address    Flags
--------------- --------------- --------------- ---------------------------
INADDR_ANY    224.1.1.1    192.168.1.56   WC RP
Joined  oifs: ...
Pruned  oifs: ...
Leaves  oifs: l..
Asserted oifs: ...
Outgoing oifs: o..
Incoming   : ..I
TIMERS: Entry  JP  RS Assert VIFS: 0 1 2
0  50   0    0    0 0 0
----------------------------------- (S,G) ------------------------------------
----------------------------------- (*,G) ------------------------------------
Source      Group      RP Address    Flags
--------------- --------------- --------------- ---------------------------
INADDR_ANY    238.1.1.10    192.168.1.56   WC RP
Joined  oifs: ...
Pruned  oifs: ...
Leaves  oifs: .l.
Asserted oifs: ...
Outgoing oifs: .o.
Incoming   : ..I
TIMERS: Entry  JP  RS Assert VIFS: 0 1 2
0  55   0    0    0 0 0
----------------------------------- (S,G) ------------------------------------
--------------------------------- (*,*,G) ------------------------------------
Number of Groups: 2
Number of Cache MIRRORs: 0
\------------------------------------------------------------------------------
Candidate Rendezvous-Point Set ===============================================
RP address    Incoming Group Prefix    Priority Holdtime
--------------- -------- ------------------ -------- ---------------------
192.168.1.56   2     224/4        1     65535
224/4        20    60
169.254.0.1   1     232/8        1     65535
\------------------------------------------------------------------------------
Current BSR address: 192.168.1.56
22:50:37.557 Received IGMP Membership Query   from 10.10.50.36 to 224.0.0.1
22:50:37.557 RECV  46 bytes PIM v2 Hello       from 10.10.50.36   to 224.0.0.13
22:50:37.557 Received IGMP Membership Query   from 192.168.1.56 to 224.0.0.1
22:50:37.557 RECV  46 bytes PIM v2 Hello       from 192.168.1.56  to 224.0.0.13
22:50:37.757 Received IGMP v3 Membership Report from 192.168.1.56 to 224.0.0.22
22:50:37.757 accept_membership_report(): IGMP v3 report, 40 bytes, from 192.168.1.56 to 224.0.0.22 with 4 group records.
22:50:37.757 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.22 report_type 34
22:50:37.757 Set delete timer for group: 224.0.0.22
22:50:37.757 Not creating routing entry for LAN scoped group 224.0.0.22
22:50:37.757 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.2 report_type 34
22:50:37.757 Set delete timer for group: 224.0.0.2
22:50:37.757 Not creating routing entry for LAN scoped group 224.0.0.2
22:50:37.757 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.13 report_type 34
22:50:37.757 Set delete timer for group: 224.0.0.13
22:50:37.757 Not creating routing entry for LAN scoped group 224.0.0.13
22:50:37.758 accept_group_report(): igmp_src 192.168.1.56 ssm_src 0.0.0.0 group 224.0.0.251 report_type 34
22:50:37.758 Set delete timer for group: 224.0.0.251
22:50:37.758 Not creating routing entry for LAN scoped group 224.0.0.251
22:50:38.230 Cache miss, src 10.10.50.12, dst 238.1.1.10, iif 0
22:50:38.230 create source entry, source 10.10.50.12
22:50:38.230 move_kernel_cache: SG
22:50:38.230 move_kernel_cache: SG
**22:50:38.230 Added kernel MFC entry src 10.10.50.12 grp 238.1.1.10 from enp0s25 to enp0s26f7u1u3**
22:50:38.997 Received IGMP v2 Membership Report from 10.10.50.12 to 224.1.1.1
22:50:38.997 accept_group_report(): igmp_src 10.10.50.12 ssm_src 224.1.1.1 group 224.1.1.1 report_type 22
22:50:38.997 accept_group_report(): al_pv=2
22:50:38.997 Set delete timer for group: 224.1.1.1
22:50:38.997 Adding vif 0 for group 224.1.1.1

posted @ 2019-10-21 15:20 vicky_scj


无线多跳网组播网络搭建

GeekerLou 关注 IP 属地:重庆
2017.07.25 20:07:33

搭建的目标网络描述

单个源节点 S,一个中间路由转发节点 M,两个组播目的节点 D1 和 D2。

img

S 通过非组播组成员 M 的路由转发向 D1 和 D2 发送组播消息,网络中存在两个虚拟局域网 vlan,其中 vlan1 包含源节点 S 和中间路由器节点 M,vlan2 包含中间路由器节点 M 以及两个组播目的节点 D1 和 D2。

他们的 IP 地址配置如下所示:

节点编号 Vlan1 Vlan2
S wlan0:10.10.10.1
M wlan2:10.10.10.2 wlan6:192.168.3.1
D1 wlan1:192.168.3.2
D2 wlan1:192.168.3.3

这里的关键点是中间路由转发节点 M 配备有两张网卡,这两张网卡分别工作在 vlan1 和 vlan2 中,使得 M 节点能够同时与 vlan1 中的源节点 S 以及 vlan2 中的接收节点 D1、D2 同时进行通信,进而实现数据转发的任务。

所有节点都需要运行单播路由协议,使得每个节点在本地生成单播路由表,这是组播路由表生成的前提,也可以通过手动配置静态路由的方式加以设定,这里我们采用的是自组网路由协议 olsrd 辅助生成静态路由,在每一个节点上运行,包括 S、M、D1 和 D2。

关于组播,可以为 S、D1 和 D2 上配置组播转发路由,在中间路由器节点运行 pimd,组播网络就能开始运行。

在 D1、D2 节点上开启组播数据接收程序./receiver 加入组播组 224.5.5.5,并且等待接收组播数据,然后在源节点 S 无需加入组播组,只需要启动发送数据程序./sender 即可。

网络搭建

查看本机是否支持组播操作

广播需要在局域网内才能实现,另外得查看 linux 系统是否支持组播和广播。

查看本机是否支持组播操作,有两种可选方法:

方法 A:输入命令:ifconfig

如果出现

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

则说明本机支持组播。

方法 B:查看 /boot/config-x.x.xx 文件中是否有如下内容

CONFIG_IP_MULTICAST=y
CONFIG_NET_IPIP=m
CONFIG_IP_MROUTE=y

由于从 linux 2.4 内核开始,linux 操作系统默认添加了对组播操作的支持,如果使用老版本的 linux 操作系统的话,可能会存在不支持的情况,此时可以选择更新操作系统,如果不想更新操作系统,就需要重新编译内核了,具体编译步骤如下:

运行

make menuconfig

进 Networking support -> Networking options 里面就有选项:

IP: multicasting
IP: tunneling
IP: multicast routing
IP: PIM-SM version 1 support
IP: PIM-SM version 2 support

选中这几项,保存退出

make && make modules_install && make install

重启,用新内核启动。

启动主机转发功能

使得普通的 linux 主机也具有路由器的数据包转发功能

echo 1 >/proc/sys/net/ipv4/ip_forward

解释:出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的 ip 地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

配置 Linux 系统的 ip 转发功能,首先保证硬件连通,然后打开系统的转发功能

less /proc/sys/net/ipv4/ip_forward

该文件内容为 0,表示禁止数据包转发,1 表示允许,将其修改为 1。可使用命令

echo "1" > /proc/sys/net/ipv4/ip_forward

修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令

echo "1" > /proc/sys/net/ipv4/ip_forward

写入脚本 /etc/rc.d/rc.local 或者 在 /etc/sysconfig/network 脚本中添加

FORWARD_IPV4="YES"

设置网关

发送多播包的主机需要设置网关,否则运行 sendto () 会出现 “network is unreachable”,网卡可以随便设置,但是一定要设。

接收多播包的主机也需要设置网关,否则运行时会出现 IP_ADD_MEMBERSHIP 错误。

下面以为无线网卡 wlan0 添加静态组播路由为例进行说明:

sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev wlan0
sudo route add default gw "192.168.2.20" dev wlan0

实际上只需要配置如下路由即可,默认网关的配置可有可无.

下面进行 S 节点的组播静态路由配置:

sudo route add -net 224.0.0.0 gw "10.10.10.2" netmask 240.0.0.0 dev wlan0

下面进行接收节点 D1 的组播静态路由配置:

sudo route add -net 224.0.0.0 gw "192.168.3.1" netmask 240.0.0.0 dev wlan1

D2 配置与 D1 完全相同,故而不再赘述。

另外:

sudo route del -net 224.0.0.0 netmask 240.0.0.0 wlan0 #删除添加的组播路由

配置 pimd,运行 PIM 协议

将下载的 pimd-2.1.8.tar.bz2 解压,进入解压目录,并进行编译和安装

# tar -jxvf pimd-2.1.8.tar.bz2
# cd pimd-2.1.8
# make
# make install

组播转发前提条件

IP 组播模块提供了创建和删除转发缓存的基本功能,但只有通过组播路由协议守护进程(通常是 mrouted),依靠路由协议(如静态路由、OSPF、RIP、PIM)来生成转发缓存,才能真正实现组播功能。

因此,IP 组播模块提供用于创建和删除转发缓存和虚拟接口套接口选项,供组播路由协议守护进程来操作。创建转发缓存过程通常如下:当接收到组播报文后,便根据组播报文的源和目的地址为其创建一个临时的转发缓存,然后给组播路由协议守护进程发送 IGMPMSG_NOCACHE 报告。当组播路由协议守护进程收到 IGMPMSG_NOCACHE 报告后,便在协议维护的组播路由表里选路,然后通过套接口选项创建新的转发缓存,完成后组播报文便可以转发了。

因此,如果要实现组播路由,必须具备的前提条件为:路由转发缓存和组播路由协议守护进程。由于我们在本次测试中使用的是 PIM-SM 协议,因此其对应的守护进程为 pimd。

实验过程及现象

源节点 s 启动组播发送程序

# ./sender

当中间路由转发节点 M 未运行 pimd 守护进程时,此时目的节点 D1 和 D2 启动组播接收程序后无法接收到组播数据包(原因很简单,此时还无路由信息,所以中间节点 M 不会转发源节点 s 发送的组播数据包)

查看中间路由转发节点 M 的组播虚拟转发接口信息如下:

查看命令:

# more /proc/net/ip_mr_vif

img

节点 M 的虚拟转发接口上也无任何数据。

在中间路由转发节点 M 上运行 pimd 守护进程,查看组播路由协议 pimd 运行状态

通过如下指令显示的调试信息:

# pimd -d

img

从调试信息可以看出,pimd 以密集模式启动,并且选举 IP 地址为 192.168.3.1 的节点为汇聚点。

通过如下指令显示的路由信息:

# pimd -r

img

查看中间路由转发节点 M 的单播路由表

img

查看中间路由转发节点 M 的组播路由表

img

查看中间路由转发节点 M 的组播虚拟转发接口信息

img

从上图可知,中间路由转发节点 wlan2 接口有组播数据包的接收,然后组播数据包从 M 节点的 wlan6 节点转发,即建立了组播虚拟转发接口。

查看组播转发缓存表:

img

上图显示的是,组播源节点 IP 为 10.10.10.1 即 s 节点。组播组 IP 地址为 224.5.5.5,组播转发缓存已建立。

最后目的节点 D1 和 D2 都能正确接收到组播数据包

img

总结

从上面的测试结果和分析可以知道,为了实现组播源和组播成员之间通信,必须建立起来正确的输入输出通道(即组播转发表)。即

img

同时在 linux 内核中必须要有正确的路由表支持,linux 内核中的路由表是不会自动建立的,需要借助组播路由守护进程。如 pimd。

再者,需要加入组播组的组播成员本身要支持 IGMP 协议,来实现对自身状态的管理和报告。

参考资料

1. 使用如下命令来查看当前网卡上加入的组播组

#netstat -gn
IPv4/IPv6 Group Memberships
Interface   RefCnt  Group

2. 查看本机内核 IP 路由表

route -ne
内核 IP 路由表
Destination Gateway     Genmask     Flags   MSS Window  irtt    Iface
0.0.0.0     192.168.2.20    0.0.0.0     UG  0   0   0   wlan0
192.168.2.0 0.0.0.0     255.255.255.0   U   0   0   0   wlan0
192.168.2.60    192.168.2.60    255.255.255.255 UGH 0   0   0   wlan0
224.0.0.0       192.168.2.20    255.255.255.0       UG      0   0   0   wlan0

3. 查看多播转发缓存表

[root@linux ~]# more /proc/net/ip_mr_cache
Group    Origin     Iif     Pkts    Bytes    Wrong Oifs
010101E0 010A0A0A   0      17637 18695220     0  1:1
FAFFFFEF 010A0A0A   0      30    12393        0

4.查看多播虚拟转发接口

[root@linux ~]# more /proc/net/ip_mr_vif
Interface      BytesIn  PktsIn  BytesOut PktsOut Flags Local    Remote
0 eth0       18348036   17362   9784860    9231 00000 020A0A0A 00000000
1 eth 1       113304460  106891  18009400   16990 00000 016FA8C0 00000000
2 pimreg            0       0         0       0 00004 020A0A0A 00000000

5. 列出多播路由表

[root@linux ~]# ip mroute
(10.10.10.1, 224.1.1.1)          Iif: eth0       Oifs: eth1

6.重要的组播 IP 地址

224.0.0.0 - Base address
224.0.0.1 - 网段中所有支持多播的主机,即任何具有多播功能的主机在接口启动后都会自动加入该组。因此该地址不需要设置的,只要开启组播功能就会自动加入该组.
224.0.0.2 - 网段中所有支持多播的路由器,任何具有组播功能的路由器在接口启动后都会自动加入该组.
224.0.0.4 - 网段中所有的 DVMRP 路由器
224.0.0.5 - 所有的 OSPF 路由器
224.0.0.6 - 所有的 OSPF 指派路由器
224.0.0.7 - 所有的 ST 路由器
224.0.0.8 - 所有的 ST 主机
224.0.0.9 - 所有 RIPv2 路由器
224.0.0.10 - 网段中所有支的路由器
224.0.0.11 - Mobile-Agents
224.0.0.12 - DHCP server /relay agent.
224.0.0.13 - 所有的 PIM 路由器
224.0.0.22 - 所有的 IGMP 路由器
224.0.0.251 - 所有的支持组播的 DNS 服务器

最后编辑于 :2017.12.09 02:27:51


via:


网站公告

今日签到

点亮在社区的每一天
去签到