2016-04-20 1 views
0

Mon application doit obtenir des mises à jour de routage multicast netlink depuis le noyau. J'ai fait quelques recherches et trouvé mutlicast utilise une famille différente: RTNL_FAMILY_IPMR et le groupe est RTMGRP_IPV4_MROUTE.Mises à jour de routage mutlicast Linux netlink

Cependant, si j'utilise:

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

Je n'obtenir des mises à jour.

Mais

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

Cela donne bind erreur », se lient: Invalid argument

sfd = socket (RTNL_FAMILY_IPMR, SOCK_RAW, NETLINK_ROUTE); 

Cela donne "famille d'adresses non pris en charge par le protocole" d'erreur

Je ne sais pas comment pour obtenir des mises à jour du noyau pour les routes mutlicast

Répondre

0

copier-coller à partir de plus tôt projet J'ai:

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; 
    } 

Celui-ci fonctionne pour moi recevant le lien, l'ip et la table de routage en général. (en me poussant tous les changements de ce point de - si je veux recevoir le statut actuel, j'ai besoin de les demander aussi). Essayez d'avoir à la fois ROUTE et MROUTE car vous voulez des tables de routage de multidiffusion, mais elles peuvent être fusionnées dans la table de routage normale