Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 多播路由,为什么我们需要pimreg接口?_Linux Kernel_Routing_Multicast - Fatal编程技术网

Linux kernel 多播路由,为什么我们需要pimreg接口?

Linux kernel 多播路由,为什么我们需要pimreg接口?,linux-kernel,routing,multicast,Linux Kernel,Routing,Multicast,我在我的项目中使用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]

我在我的项目中使用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
ifconfig-pimreg
pimreg:flags=193 mtu 1472
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 0(unspec)
接收数据包0字节0(0.0B)
接收错误0丢弃0超出0帧0
发送数据包0字节0(0.0B)
发送错误0丢弃0溢出0载波0冲突0
在进一步调试时,我发现所有PIM数据包都是通过PIM_套接字从内核传输到用户空间的。 那么为什么我们首先需要pimreg虚拟接口呢?
linux内核pimd的设计目标是什么。

pimd
打开时,
pimreg
接口由内核创建 多播路由套接字并执行其
ioctl
magic

该接口用于登记隧道,即隧道掘进时 从rendez vous点(RP)到指定服务器的多播流 路由器(DR)

有关这方面的更多信息,请访问