Как получить сетевой адрес L2 через netlink?

я использую netlink чтобы получить интерфейсы, их имена, типы и т. д., но я не могу получить адрес L2 (ugly_data является nlmsghdr*):

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_ а также name_ содержат правильные значения, так же, как я получил от ifconfig, но address_ всегда пусто
Что я делаю не так и как получить адреса?

0

Решение

Возможно, проблема в том, что аппаратный адрес здесь не является строкой. Попробуйте получить address_ вот так:

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;

это работает для меня.

2

Другие решения

Вот Python (Linux) «решение» (может кому-то помочь):
Это из первого примера в библиотеке Python Netlink:
увидеть: https://pypi.python.org/pypi/pyroute2/0.2.16
Действительно простая установка:

$ sudo pip install pyroute2

Вставьте это в файл (я назвал его netlink1.py) и сделайте его исполняемым:

#!/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()

Это распечатывает все в одной строке, затем:

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

По вопросам рекламы [email protected]