[2/4] batctl: neighbors: Get outgoing ifname from netlink
Commit Message
There is no need to gather the interface name for an outgoing interface
via a different syscall(s) when the kernel directly provides this
information in the netlink message for this neighbor table entry.
batman-adv provides this functionality with Linux 5.14/batman-adv 2021.2.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
neighbors.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
@@ -36,10 +36,12 @@ static int neighbors_callback(struct nl_msg *msg, void *arg)
struct nlmsghdr *nlh = nlmsg_hdr(msg);
int last_seen_msecs, last_seen_secs;
struct print_opts *opts = arg;
+ char ifname_buf[IF_NAMESIZE];
struct bat_host *bat_host;
- char ifname[IF_NAMESIZE];
struct genlmsghdr *ghdr;
+ uint32_t ifindex;
uint8_t *neigh;
+ char *ifname;
if (!genlmsg_valid_hdr(nlh, 0)) {
fputs("Received invalid data from kernel.\n", stderr);
@@ -66,9 +68,16 @@ static int neighbors_callback(struct nl_msg *msg, void *arg)
neigh = nla_data(attrs[BATADV_ATTR_NEIGH_ADDRESS]);
bat_host = bat_hosts_find_by_mac((char *)neigh);
- if (!if_indextoname(nla_get_u32(attrs[BATADV_ATTR_HARD_IFINDEX]),
- ifname))
- ifname[0] = '\0';
+ if (attrs[BATADV_ATTR_HARD_IFNAME]) {
+ ifname = nla_get_string(attrs[BATADV_ATTR_HARD_IFNAME]);
+ } else {
+ /* compatibility for Linux < 5.14/batman-adv < 2021.2 */
+ ifindex = nla_get_u32(attrs[BATADV_ATTR_HARD_IFINDEX]);
+ if (!if_indextoname(ifindex, ifname_buf))
+ ifname_buf[0] = '\0';
+
+ ifname = ifname_buf;
+ }
last_seen_msecs = nla_get_u32(attrs[BATADV_ATTR_LAST_SEEN_MSECS]);
last_seen_secs = last_seen_msecs / 1000;