summaryrefslogtreecommitdiff
path: root/src/platform/nm-platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/nm-platform.c')
-rw-r--r--src/platform/nm-platform.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 494e2ddaf6..f0a80cb8b5 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -1217,13 +1217,29 @@ nm_platform_link_refresh (NMPlatform *self, int ifindex)
return TRUE;
}
-static guint
-_link_get_flags (NMPlatform *self, int ifindex)
+int
+nm_platform_link_get_ifi_flags (NMPlatform *self,
+ int ifindex,
+ guint requested_flags)
{
const NMPlatformLink *pllink;
- pllink = nm_platform_link_get (self, ifindex);
- return pllink ? pllink->n_ifi_flags : IFF_NOARP;
+ _CHECK_SELF (self, klass, -EINVAL);
+
+ if (ifindex <= 0)
+ return -EINVAL;
+
+ /* include invisible links (only in netlink, not udev). */
+ pllink = NMP_OBJECT_CAST_LINK (nm_platform_link_get_obj (self, ifindex, FALSE));
+ if (!pllink)
+ return -ENODEV;
+
+ /* Errors are signaled as negative values. That means, you cannot request
+ * the most significant bit (2^31) with this API. Assert against that. */
+ nm_assert ((int) requested_flags >= 0);
+ nm_assert (requested_flags < (guint) G_MAXINT);
+
+ return (int) (pllink->n_ifi_flags & requested_flags);
}
/**
@@ -1236,9 +1252,7 @@ _link_get_flags (NMPlatform *self, int ifindex)
gboolean
nm_platform_link_is_up (NMPlatform *self, int ifindex)
{
- _CHECK_SELF (self, klass, FALSE);
-
- return NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_UP);
+ return nm_platform_link_get_ifi_flags (self, ifindex, IFF_UP) == IFF_UP;
}
/**
@@ -1269,9 +1283,15 @@ nm_platform_link_is_connected (NMPlatform *self, int ifindex)
gboolean
nm_platform_link_uses_arp (NMPlatform *self, int ifindex)
{
- _CHECK_SELF (self, klass, FALSE);
+ int f;
- return !NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_NOARP);
+ f = nm_platform_link_get_ifi_flags (self, ifindex, IFF_NOARP);
+
+ if (f < 0)
+ return FALSE;
+ if (f == IFF_NOARP)
+ return FALSE;
+ return TRUE;
}
/**