From 05bba46198cfc4ccfe0aff2e67e76d78898bbd96 Mon Sep 17 00:00:00 2001 From: Hangbin Liu Date: Mon, 9 Oct 2017 22:31:41 +0800 Subject: [PATCH] rtnl: update rtgenmsg to ifinfomsg when request link info The previous function use general message and will dump all interfaces' information. Now update with ifinfomsg so we could get specific interface's information. We still could get all interfaces' info if set device to NULL. Signed-off-by: Hangbin Liu --- port.c | 2 +- rtnl.c | 12 +++++++----- rtnl.h | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/port.c b/port.c index 849a7c1..5b85d87 100644 --- a/port.c +++ b/port.c @@ -1512,7 +1512,7 @@ static int port_initialize(struct port *p) if (p->fda.fd[FD_RTNL] == -1) p->fda.fd[FD_RTNL] = rtnl_open(); if (p->fda.fd[FD_RTNL] >= 0) - rtnl_link_query(p->fda.fd[FD_RTNL]); + rtnl_link_query(p->fda.fd[FD_RTNL], p->iface->name); } port_nrate_initialize(p); diff --git a/rtnl.c b/rtnl.c index d7a430d..8ecf6fe 100644 --- a/rtnl.c +++ b/rtnl.c @@ -42,7 +42,7 @@ int rtnl_close(int fd) return close(fd); } -int rtnl_link_query(int fd) +int rtnl_link_query(int fd, char *device) { struct sockaddr_nl sa; struct msghdr msg; @@ -51,19 +51,21 @@ int rtnl_link_query(int fd) struct { struct nlmsghdr hdr; - struct rtgenmsg gen; + struct ifinfomsg ifm; } __attribute__((packed)) request; memset(&sa, 0, sizeof(sa)); sa.nl_family = AF_NETLINK; memset(&request, 0, sizeof(request)); - request.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(request.gen)); + request.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(request.ifm)); request.hdr.nlmsg_type = RTM_GETLINK; - request.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; + request.hdr.nlmsg_flags = NLM_F_REQUEST; request.hdr.nlmsg_seq = 1; request.hdr.nlmsg_pid = 0; - request.gen.rtgen_family = AF_UNSPEC; + request.ifm.ifi_family = AF_UNSPEC; + request.ifm.ifi_index = if_nametoindex(device ? device : ""); + request.ifm.ifi_change = 0xffffffff; iov.iov_base = &request; iov.iov_len = sizeof(request); diff --git a/rtnl.h b/rtnl.h index f1871f2..5c93eec 100644 --- a/rtnl.h +++ b/rtnl.h @@ -31,10 +31,11 @@ int rtnl_close(int fd); /** * Request the link status from the kernel. - * @param fd A socket obtained via rtnl_open(). - * @return Zero on success, non-zero otherwise. + * @param fd A socket obtained via rtnl_open(). + * @param device Interface name. Request all iface's status if set NULL. + * @return Zero on success, non-zero otherwise. */ -int rtnl_link_query(int fd); +int rtnl_link_query(int fd, char *device); /** * Read kernel messages looking for a link up/down events.