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.