2013-01-16 3 views
0

J'utilise netlink pour obtenir des interfaces, ses noms, types, etc., mais je ne peux pas obtenir l'adresse L2 (ugly_data est nlmsghdr*):Comment obtenir l'adresse L2 du lien réseau via netlink?

struct ifinfomsg *iface; 
struct rtattr *attribute; 
int len; 

iface = (struct ifinfomsg *) NLMSG_DATA(ugly_data); 
len = ugly_data->nlmsg_len - NLMSG_LENGTH(sizeof(*iface)); 

for (attribute = IFLA_RTA(iface); 
    RTA_OK(attribute, len); 
    attribute = RTA_NEXT(attribute, len)) 
{ 
    id_ = iface->ifi_index; 

    // get type 
    switch (iface->ifi_type) 
    { 
    case ARPHRD_ETHER: 
    type_ = "Ethernet"; 
    break; 
    case ... 
    } 

    // get attributes 
    switch (attribute->rta_type) 
    { 
    case IFLA_IFNAME: 
    name_ = (char *) RTA_DATA(attribute); 
    break; 
    case IFLA_ADDRESS: 
    address_ = (char *) RTA_DATA(attribute); 
    break; 
    ... 
    } 
} 

type_, id_ et name_ contiennent des valeurs de droite, même que je obtenu à partir de ifconfig, mais address_ est toujours vide. Qu'est-ce que je fais de mal et comment obtenir des adresses?

Répondre

1

Peut-être que le problème est que l'adresse matérielle n'est pas une chaîne. Essayez d'obtenir address_ comme ceci:

case IFLA_ADDRESS: 
    char buffer[64]; 
    unsigned char* ptr = (unsigned char*)RTA_DATA(attribute); 
    snprintf(buffer, 64, " %02x:%02x:%02x:%02x:%02x:%02x", 
     ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); 
    std::cout << "address : " << buffer << std::endl; 

Cela fonctionne pour moi.

0

Voici un Python (Linux) 'solution' (pourrait aider quelqu'un):
Ceci est le premier exemple dans la bibliothèque Netlink Python:
voir: https://pypi.python.org/pypi/pyroute2/0.2.16
Installation très simple:

$ sudo pip install pyroute2 

Collez ceci dans un fichier (je l'ai appelé netlink1.py) et de le rendre exécutable:

#!/usr/bin/env python 
from pyroute2 import IPRoute 

# get access to the netlink socket 
ip = IPRoute() 

# print interfaces 
print ip.get_links() 

# stop working with netlink and release all sockets 
# ip.release() (deprecated) 
ip.close() 

Ceci affiche tous sur une ligne, puis:

$ ./netlink1.py | sed 's/\], /\n/g' | grep IFLA_ADD 
Questions connexes