netlink: получение информации по конкретному интерфейсу

Модератор: Модераторы разделов

Ответить
IMB
Сообщения: 2561
ОС: Debian

netlink: получение информации по конкретному интерфейсу

Сообщение IMB »

Доброго дня и с наступающим Новым Годом!
Пытаюсь разобраться с netlink, в частности сейчас пытаюсь получить информацию по конкретному всем интерфейсам.

Код: Выделить всё

struct nl_req {
    struct nlmsghdr        nl;
    union {
        struct ifinfomsg    link;
    } data;
};

struct msghdr        msg;
struct sockaddr_nl    kern;
struct nl_req        req;
struct iovec        iov;
memset(&msg,    0, sizeof(msg));
memset(&kern,    0, sizeof(kern));
memset(&req,    0, sizeof(req));
memset(&iov,    0, sizeof(iov));

kern.nl_family            = AF_NETLINK;
req.nl.nlmsg_len        = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nl.nlmsg_type        = RTM_GETLINK;
if (ifname != NULL && strlen(ifname)) {
    req.nl.nlmsg_flags = NLM_F_REQUEST;
    if (0 == (req.data.link.ifi_index = if_nametoindex(ifname))) {
        close(sd);
        return -1;
    }
    fprintf(stderr, "interface index %d\n", req.data.link.ifi_index);
} else
    req.nl.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
req.data.link.ifi_family = AF_UNSPEC;
req.data.link.ifi_change = 0xFFFFFFFF;
req.nl.nlmsg_seq        = 1;
req.nl.nlmsg_pid        = getpid();
iov.iov_base            = &req;
iov.iov_len                = req.nl.nlmsg_len;
msg.msg_iov                = &iov;
msg.msg_iovlen            = 1;
msg.msg_name            = &kern;
msg.msg_namelen            = sizeof(kern);

И если с получением информации проблем не возникло, использовал в качестве примера http://iijean.blogspot.com/2010/03/howto-g...erfaces-in.html , то с получением инфомации по конкретному интерфейсу проблема - складывается впечатление, что в ответе отсутствует сообщение с типом NLMSG_DONE.
Предполагаю, что проблема в не совсем корректно построеном запросе, можете подсказать в чём проблема?
Спасибо.
Спасибо сказали:
Ответить