2016-05-24 4 views
1

私は自分のプロジェクトでpimdを使用しています。 https://github.com/troglobit/pimd。 PIMデーモンは、 'pimreg'仮想インターフェイスを作成します。 マルチキャストルーティングは完全に機能します。私はなぜ「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; 
} 

と私はすべてのPIM見つけ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_socketを通してユーザ空間に持ち上げられます。 なぜ最初にpimreg仮想インターフェイスが必要なのですか? Linuxカーネルのpimdの設計目標は何ですか? pimdが マルチキャストルーティングソケットをオープンし、そのioctl魔法を行う際

答えて

2

pimregインタフェースは、カーネルによって作成されます。

インターフェイスはレジスタトンネル、つまり マルチキャストストリームをランデブーポイント(RP)から指定された ルータ(DR)にトンネリングするときに使用されます。

この詳細については、RFC4601をご覧ください。

関連する問題