2016-05-24 3 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; 
} 

и я вижу большую часть времени ПРД и ПРМ пакеты 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 на первом месте? Какова цель проектирования pimd ядра linux для этого.

ответ

2

Интерфейс pimreg создается ядром при pimd открывает многоадресного сокета маршрутизации и выполняет свою ioctl магию.

Интерфейс используется для регистра туннелей, т.е. при проходке многоадресного потока (ов) из Рандеву точки (RP) к назначенному маршрутизатор (DR).

Дополнительная информация об этом доступна в RFC4601.