2016-04-20 4 views
0

Мое приложение должно получать обновления маршрутизации многоадресной сети Netlink из ядра. Я провел некоторое исследование и нашел, что mutlicast использует другое семейство: RTNL_FAMILY_IPMR и группа RTMGRP_IPV4_MROUTE.Обновления маршрутизации linlink netlink

Однако если я использую:

sfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 
    snl.nl_groups |= RTMGRP_IPV4_MROUTE 

я не получаю никаких обновлений.

Но

sfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 
    snl.nl_family = RTNL_FAMILY_IPMR; 
    snl.nl_groups |= RTMGRP_IPV4_MROUTE; 

Это дает ошибку связывания», связывают: Недопустимый аргумент

sfd = socket (RTNL_FAMILY_IPMR, SOCK_RAW, NETLINK_ROUTE); 

Это отдавания "Семейство адресов не поддерживается протоколом" ошибка

Я не знаю, как для получения обновлений из ядра для маршрутов mutlicast.

ответ

0

copy-paste из более ранних версий проект У меня есть:

struct sockaddr_nl naddr; 

    netlinkfd = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 
    naddr.nl_family = AF_NETLINK; 
    naddr.nl_groups = (1 << (RTNLGRP_LINK - 1)) | 
         (1 << (RTNLGRP_IPV4_ROUTE - 1)) | 
         (1 << (RTNLGRP_IPV6_ROUTE - 1)) | 
         (1 << (RTNLGRP_IPV4_IFADDR - 1)) | 
         (1 << (RTNLGRP_IPV6_IFADDR -1)); 
    if (bind (netlinkfd, (struct sockaddr *)&naddr, sizeof (naddr))) 
    { 
     error_foo(); 
     return; 
    } 

Это работает для меня, получая ссылку, ip и таблицу маршрутизации в целом. (нажимая на меня все изменения с этой точки - если я хочу получать текущий статус, мне также нужно их запросить). Попытайтесь использовать как ROUTE, так и MROUTE, поскольку вам нужны таблицы маршрутизации многоадресной рассылки, но они могут быть объединены в обычную таблицу маршрутизации