summary refs log tree commit diff
path: root/src/libnm-platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-platform')
-rw-r--r--src/libnm-platform/nm-linux-platform.c10
-rw-r--r--src/libnm-platform/nm-platform.c34
-rw-r--r--src/libnm-platform/nm-platform.h1
-rw-r--r--src/libnm-platform/nmp-ethtool-ioctl.c27
-rw-r--r--src/libnm-platform/nmp-ethtool-ioctl.h2
5 files changed, 22 insertions, 52 deletions
diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c
index b5df8b17..7d4a6f3d 100644
--- a/src/libnm-platform/nm-linux-platform.c
+++ b/src/libnm-platform/nm-linux-platform.c
@@ -1766,8 +1766,12 @@ _parse_lnk_bond(const char *kind, struct nlattr *info_data)
         props->num_grat_arp = nla_get_u8(tb[IFLA_BOND_NUM_PEER_NOTIF]);
     if (tb[IFLA_BOND_ALL_PORTS_ACTIVE])
         props->all_ports_active = nla_get_u8(tb[IFLA_BOND_ALL_PORTS_ACTIVE]);
-    if (tb[IFLA_BOND_MISSED_MAX])
-        props->arp_missed_max = nla_get_u8(tb[IFLA_BOND_MISSED_MAX]);
+    if (tb[IFLA_BOND_MISSED_MAX]) {
+        props->arp_missed_max     = nla_get_u8(tb[IFLA_BOND_MISSED_MAX]);
+        props->arp_missed_max_has = TRUE;
+    } else {
+        props->arp_missed_max_has = FALSE;
+    }
     if (tb[IFLA_BOND_MIN_LINKS])
         props->min_links = nla_get_u32(tb[IFLA_BOND_MIN_LINKS]);
     if (tb[IFLA_BOND_LP_INTERVAL])
@@ -5126,7 +5130,7 @@ _nl_msg_new_link_set_linkinfo(struct nl_msg *msg, NMLinkType link_type, gconstpo
                     &props->ad_actor_system);
         if (props->ad_select)
             NLA_PUT_U8(msg, IFLA_BOND_AD_SELECT, props->ad_select);
-        if (props->arp_missed_max)
+        if (props->arp_missed_max_has)
             NLA_PUT_U8(msg, IFLA_BOND_MISSED_MAX, props->arp_missed_max);
 
         NLA_PUT_U8(msg, IFLA_BOND_ALL_PORTS_ACTIVE, props->all_ports_active);
diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c
index 914dcd86..27888d6c 100644
--- a/src/libnm-platform/nm-platform.c
+++ b/src/libnm-platform/nm-platform.c
@@ -3223,7 +3223,6 @@ gboolean
 nm_platform_link_veth_get_properties(NMPlatform *self, int ifindex, int *out_peer_ifindex)
 {
     const NMPlatformLink *plink;
-    int                   peer_ifindex;
 
     plink = nm_platform_link_get(self, ifindex);
     if (!plink)
@@ -3232,23 +3231,10 @@ nm_platform_link_veth_get_properties(NMPlatform *self, int ifindex, int *out_pee
     if (plink->type != NM_LINK_TYPE_VETH)
         return FALSE;
 
-    if (plink->parent != 0) {
-        NM_SET_OUT(out_peer_ifindex, plink->parent);
-        return TRUE;
-    }
-
-    /* Pre-4.1 kernel did not expose the peer_ifindex as IFA_LINK. Lookup via ethtool. */
-    if (out_peer_ifindex) {
-        nm_auto_pop_netns NMPNetns *netns = NULL;
-
-        if (!nm_platform_netns_push(self, &netns))
-            return FALSE;
-        peer_ifindex = nmp_ethtool_ioctl_get_peer_ifindex(plink->ifindex);
-        if (peer_ifindex <= 0)
-            return FALSE;
+    if (plink->parent == 0)
+        return FALSE;
 
-        *out_peer_ifindex = peer_ifindex;
-    }
+    NM_SET_OUT(out_peer_ifindex, plink->parent);
     return TRUE;
 }
 
@@ -6387,6 +6373,7 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
     char sbuf_resend_igmp[30];
     char sbuf_lp_interval[30];
     char sbuf_tlb_dynamic_lb[30];
+    char sbuf_arp_missed_max[30];
     int  i;
 
     if (!nm_utils_to_string_buffer_init_null(lnk, &buf, &len))
@@ -6417,7 +6404,7 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
         " xmit_hash_policy %u"
         " num_gray_arp %u"
         " all_ports_active %u"
-        " arp_missed_max %u"
+        "%s" /* arp_missed_max %u */
         " lacp_rate %u"
         "%s" /* lacp_active */
         " ad_select %u"
@@ -6469,7 +6456,12 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
         lnk->xmit_hash_policy,
         lnk->num_grat_arp,
         lnk->all_ports_active,
-        lnk->arp_missed_max,
+        lnk->arp_missed_max_has || lnk->arp_missed_max != 0
+            ? nm_sprintf_buf(sbuf_arp_missed_max,
+                             " arp_missed_max%s %u",
+                             !lnk->arp_missed_max_has ? "?" : "",
+                             (int) lnk->arp_missed_max)
+            : "",
         lnk->lacp_rate,
         lnk->lacp_active_has || lnk->lacp_active != 0
             ? nm_sprintf_buf(sbuf_lacp_active,
@@ -8402,7 +8394,8 @@ nm_platform_lnk_bond_hash_update(const NMPlatformLnkBond *obj, NMHashState *h)
                                               obj->tlb_dynamic_lb,
                                               obj->tlb_dynamic_lb_has,
                                               obj->updelay_has,
-                                              obj->use_carrier));
+                                              obj->use_carrier,
+                                              obj->arp_missed_max_has));
 
     nm_hash_update(h, obj->arp_ip_target, obj->arp_ip_targets_num * sizeof(obj->arp_ip_target[0]));
     nm_hash_update(h, obj->ns_ip6_target, obj->ns_ip6_targets_num * sizeof(obj->ns_ip6_target[0]));
@@ -8480,6 +8473,7 @@ nm_platform_lnk_bond_cmp(const NMPlatformLnkBond *a, const NMPlatformLnkBond *b)
     NM_CMP_FIELD_BOOL(a, b, tlb_dynamic_lb_has);
     NM_CMP_FIELD_BOOL(a, b, updelay_has);
     NM_CMP_FIELD_BOOL(a, b, use_carrier);
+    NM_CMP_FIELD_BOOL(a, b, arp_missed_max_has);
 
     return 0;
 }
diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h
index ba37d3a2..4d46807b 100644
--- a/src/libnm-platform/nm-platform.h
+++ b/src/libnm-platform/nm-platform.h
@@ -840,6 +840,7 @@ typedef struct {
     bool            tlb_dynamic_lb_has : 1;
     bool            updelay_has : 1;
     bool            use_carrier : 1;
+    bool            arp_missed_max_has : 1;
 } _nm_alignas(NMPlatformObject) NMPlatformLnkBond;
 
 typedef struct {
diff --git a/src/libnm-platform/nmp-ethtool-ioctl.c b/src/libnm-platform/nmp-ethtool-ioctl.c
index 830b02f6..9694eaec 100644
--- a/src/libnm-platform/nmp-ethtool-ioctl.c
+++ b/src/libnm-platform/nmp-ethtool-ioctl.c
@@ -1190,33 +1190,6 @@ nmp_ethtool_ioctl_supports_vlans(int ifindex)
     return !(features->features[block].active & (1 << bit));
 }
 
-int
-nmp_ethtool_ioctl_get_peer_ifindex(int ifindex)
-{
-    nm_auto_socket_handle SocketHandle shandle = SOCKET_HANDLE_INIT(ifindex);
-    gsize                              stats_len;
-    gs_free struct ethtool_stats      *stats_free = NULL;
-    struct ethtool_stats              *stats;
-    int                                peer_ifindex_stat;
-
-    g_return_val_if_fail(ifindex > 0, 0);
-
-    peer_ifindex_stat = ethtool_get_stringset_index(&shandle, ETH_SS_STATS, "peer_ifindex");
-    if (peer_ifindex_stat < 0) {
-        nm_log_dbg(LOGD_PLATFORM, "ethtool[%d]: peer_ifindex stat does not exist?", ifindex);
-        return FALSE;
-    }
-
-    stats_len      = sizeof(*stats) + (peer_ifindex_stat + 1) * sizeof(guint64);
-    stats          = nm_malloc0_maybe_a(300, stats_len, &stats_free);
-    stats->cmd     = ETHTOOL_GSTATS;
-    stats->n_stats = peer_ifindex_stat + 1;
-    if (_ethtool_call_handle(&shandle, stats, stats_len) < 0)
-        return 0;
-
-    return stats->data[peer_ifindex_stat];
-}
-
 gboolean
 nmp_ethtool_ioctl_get_wake_on_lan(int ifindex)
 {
diff --git a/src/libnm-platform/nmp-ethtool-ioctl.h b/src/libnm-platform/nmp-ethtool-ioctl.h
index cb93e9cf..1c973649 100644
--- a/src/libnm-platform/nmp-ethtool-ioctl.h
+++ b/src/libnm-platform/nmp-ethtool-ioctl.h
@@ -9,8 +9,6 @@ gboolean nmp_ethtool_ioctl_supports_carrier_detect(int ifindex);
 
 gboolean nmp_ethtool_ioctl_supports_vlans(int ifindex);
 
-int nmp_ethtool_ioctl_get_peer_ifindex(int ifindex);
-
 gboolean nmp_ethtool_ioctl_get_wake_on_lan(int ifindex);
 
 gboolean nmp_ethtool_ioctl_set_wake_on_lan(int                      ifindex,