diff --git a/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch b/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch new file mode 100644 index 0000000..22d630b --- /dev/null +++ b/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch @@ -0,0 +1,117 @@ +From: Sven Eckelmann +Date: Mon, 10 May 2021 15:05:42 +0200 +Subject: batman-adv: Always send iface index+name in genlmsg + +The batman-adv netlink messages often contain the interface index and +interface name in the same message. This makes it easy for the receiver to +operate on the incoming data when it either needs to print something or +needs to operate on the interface index. + +But one of the attributes was missing for: + +* neighbor table dumps +* originator table dumps +* gateway list dumps +* query of hardif information +* query of vid information + +The userspace therefore had to implement special workarounds using +SIOCGIFNAME or SIOCGIFINDEX depending on what was actually provided. +Providing both information simplifies the userspace code massively without +adding a lot of extra overhead in the kernel portion. + +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/77c7d62618259f22f36427eaa62668e6e1c43090 + +diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c +index 789f257be24f36ace3e63628a3381a6d46dcccd9..680def809838097a9949de1dc9861923911f3d04 100644 +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -1849,6 +1849,8 @@ batadv_iv_ogm_orig_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq, + orig_node->orig) || + nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + neigh_node->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ neigh_node->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + neigh_node->if_incoming->net_dev->ifindex) || + nla_put_u8(msg, BATADV_ATTR_TQ, tq_avg) || +@@ -2078,6 +2080,8 @@ batadv_iv_ogm_neigh_dump_neigh(struct sk_buff *msg, u32 portid, u32 seq, + + if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + hardif_neigh->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ hardif_neigh->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + hardif_neigh->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, +@@ -2459,6 +2463,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, + router->addr) || + nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, + router->if_incoming->net_dev->name) || ++ nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, ++ router->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN, + gw_node->bandwidth_down) || + nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_UP, +diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c +index eeb3f6d00d8541b377c9703837ef76b05e8d061e..fd7f30f5f3033fd1a9e21518a71e66b557212374 100644 +--- a/net/batman-adv/bat_v.c ++++ b/net/batman-adv/bat_v.c +@@ -145,6 +145,8 @@ batadv_v_neigh_dump_neigh(struct sk_buff *msg, u32 portid, u32 seq, + + if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + hardif_neigh->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ hardif_neigh->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + hardif_neigh->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, +@@ -297,6 +299,8 @@ batadv_v_orig_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq, + if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN, orig_node->orig) || + nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + neigh_node->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ neigh_node->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + neigh_node->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_THROUGHPUT, throughput) || +@@ -738,6 +742,12 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, + goto out; + } + ++ if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, ++ router->if_incoming->net_dev->ifindex)) { ++ genlmsg_cancel(msg, hdr); ++ goto out; ++ } ++ + if (nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN, + gw_node->bandwidth_down)) { + genlmsg_cancel(msg, hdr); +diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c +index b6a703ddd8e97e6a02e8d73c5728802f090ab419..27f78f0c4aea025b964301e20f972031ab8ad478 100644 +--- a/net/batman-adv/netlink.c ++++ b/net/batman-adv/netlink.c +@@ -813,6 +813,10 @@ static int batadv_netlink_hardif_fill(struct sk_buff *msg, + bat_priv->soft_iface->ifindex)) + goto nla_put_failure; + ++ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME, ++ bat_priv->soft_iface->name)) ++ goto nla_put_failure; ++ + if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + net_dev->ifindex) || + nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, +@@ -1044,6 +1048,10 @@ static int batadv_netlink_vlan_fill(struct sk_buff *msg, + bat_priv->soft_iface->ifindex)) + goto nla_put_failure; + ++ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME, ++ bat_priv->soft_iface->name)) ++ goto nla_put_failure; ++ + if (nla_put_u32(msg, BATADV_ATTR_VLANID, vlan->vid & VLAN_VID_MASK)) + goto nla_put_failure; +