多播路由,为什么我们需要 pimreg 接口?
Multicast routing , why do we need pimreg interface?
我在我的项目中使用了 pimd。 https://github.com/troglobit/pimd。
PIM 守护程序创建一个 'pimreg' 虚拟接口。
多播路由工作完美。但我很好奇为什么我们需要 'pimreg' 接口。
在内核中处理虚拟接口创建的代码是:
static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
{
struct net_device *dev;
struct in_device *in_dev;
char name[IFNAMSIZ];
if (mrt->id == RT_TABLE_DEFAULT)
sprintf(name, "pimreg");
else
sprintf(name, "pimreg%u", mrt->id);
dev = alloc_netdev(0, name, reg_vif_setup);
if (dev == NULL)
return NULL;
dev_net_set(dev, net);
if (register_netdevice(dev)) {
free_netdev(dev);
return NULL;
}
dev->iflink = 0;
rcu_read_lock();
in_dev = __in_dev_get_rcu(dev);
if (!in_dev) {
rcu_read_unlock();
goto failure;
}
ipv4_devconf_setall(in_dev);
IPV4_DEVCONF(in_dev->cnf, RP_FILTER) = 0;
rcu_read_unlock();
if (dev_open(dev))
goto failure;
dev_hold(dev);
return dev;
failure:
/* allow the register to be completed before unregistering. */
rtnl_unlock();
rtnl_lock();
unregister_netdevice(dev);
return NULL;
}
而且我看到大部分时间 tx 和 rx 数据包都是 0。
ifconfig pimreg
pimreg: flags=193<UP,RUNNING,NOARP> mtu 1472
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在进一步调试时,我发现所有 PIM 数据包都通过 pim_socket 从内核提升到用户空间。
那么为什么我们首先需要 pimreg 虚拟接口呢?
linux 内核 pimd 设计 objective 是什么。
pimreg
接口在pimd
打开时由内核创建
多播路由套接字并执行其 ioctl
魔法。
该接口用于注册隧道,即当建立隧道时
从集合点(RP)到指定的组播流
路由器 (DR).
有关此内容的更多信息,请参阅 RFC4601。
我在我的项目中使用了 pimd。 https://github.com/troglobit/pimd。 PIM 守护程序创建一个 'pimreg' 虚拟接口。 多播路由工作完美。但我很好奇为什么我们需要 'pimreg' 接口。
在内核中处理虚拟接口创建的代码是:
static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt)
{
struct net_device *dev;
struct in_device *in_dev;
char name[IFNAMSIZ];
if (mrt->id == RT_TABLE_DEFAULT)
sprintf(name, "pimreg");
else
sprintf(name, "pimreg%u", mrt->id);
dev = alloc_netdev(0, name, reg_vif_setup);
if (dev == NULL)
return NULL;
dev_net_set(dev, net);
if (register_netdevice(dev)) {
free_netdev(dev);
return NULL;
}
dev->iflink = 0;
rcu_read_lock();
in_dev = __in_dev_get_rcu(dev);
if (!in_dev) {
rcu_read_unlock();
goto failure;
}
ipv4_devconf_setall(in_dev);
IPV4_DEVCONF(in_dev->cnf, RP_FILTER) = 0;
rcu_read_unlock();
if (dev_open(dev))
goto failure;
dev_hold(dev);
return dev;
failure:
/* allow the register to be completed before unregistering. */
rtnl_unlock();
rtnl_lock();
unregister_netdevice(dev);
return NULL;
}
而且我看到大部分时间 tx 和 rx 数据包都是 0。
ifconfig pimreg
pimreg: flags=193<UP,RUNNING,NOARP> mtu 1472
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在进一步调试时,我发现所有 PIM 数据包都通过 pim_socket 从内核提升到用户空间。 那么为什么我们首先需要 pimreg 虚拟接口呢? linux 内核 pimd 设计 objective 是什么。
pimreg
接口在pimd
打开时由内核创建
多播路由套接字并执行其 ioctl
魔法。
该接口用于注册隧道,即当建立隧道时 从集合点(RP)到指定的组播流 路由器 (DR).
有关此内容的更多信息,请参阅 RFC4601。