Skip to content

Commit

Permalink
rtnl: update rtgenmsg to ifinfomsg when request link info
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
liuhangbin authored and richardcochran committed Oct 14, 2017
1 parent 7e294a4 commit 05bba46
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 9 deletions.
2 changes: 1 addition & 1 deletion port.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 7 additions & 5 deletions rtnl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
7 changes: 4 additions & 3 deletions rtnl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 05bba46

Please sign in to comment.