platform: add nm_platform_link_get_ifi_flags() helper

Add helper nm_platform_link_get_ifi_flags() to access the
ifi-flags.

This replaces the internal API _link_get_flags() and makes it public.
However, the return value also allows to distinguish between errors
and valid flags.

Also, consider non-visible links. These are links that are in netlink,
but not visible in udev. The ifi-flags are inherrently netlink specific,
so it seems wrong to pretend that the link doesn't exist.
This commit is contained in:
Thomas Haller
2018-11-29 11:31:50 +01:00
parent dc0cdbb57e
commit b445b1f8fe
2 changed files with 30 additions and 9 deletions

View File

@@ -1217,13 +1217,29 @@ nm_platform_link_refresh (NMPlatform *self, int ifindex)
return TRUE; return TRUE;
} }
static guint int
_link_get_flags (NMPlatform *self, int ifindex) nm_platform_link_get_ifi_flags (NMPlatform *self,
int ifindex,
guint requested_flags)
{ {
const NMPlatformLink *pllink; const NMPlatformLink *pllink;
pllink = nm_platform_link_get (self, ifindex); _CHECK_SELF (self, klass, -EINVAL);
return pllink ? pllink->n_ifi_flags : IFF_NOARP;
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 gboolean
nm_platform_link_is_up (NMPlatform *self, int ifindex) nm_platform_link_is_up (NMPlatform *self, int ifindex)
{ {
_CHECK_SELF (self, klass, FALSE); return nm_platform_link_get_ifi_flags (self, ifindex, IFF_UP) == IFF_UP;
return NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_UP);
} }
/** /**
@@ -1269,9 +1283,15 @@ nm_platform_link_is_connected (NMPlatform *self, int ifindex)
gboolean gboolean
nm_platform_link_uses_arp (NMPlatform *self, int ifindex) 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;
} }
/** /**

View File

@@ -1166,6 +1166,7 @@ int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
const char *nm_platform_link_get_name (NMPlatform *self, int ifindex); const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);
NMLinkType nm_platform_link_get_type (NMPlatform *self, int ifindex); NMLinkType nm_platform_link_get_type (NMPlatform *self, int ifindex);
gboolean nm_platform_link_is_software (NMPlatform *self, int ifindex); gboolean nm_platform_link_is_software (NMPlatform *self, int ifindex);
int nm_platform_link_get_ifi_flags (NMPlatform *self, int ifindex, guint requested_flags);
gboolean nm_platform_link_is_up (NMPlatform *self, int ifindex); gboolean nm_platform_link_is_up (NMPlatform *self, int ifindex);
gboolean nm_platform_link_is_connected (NMPlatform *self, int ifindex); gboolean nm_platform_link_is_connected (NMPlatform *self, int ifindex);
gboolean nm_platform_link_uses_arp (NMPlatform *self, int ifindex); gboolean nm_platform_link_uses_arp (NMPlatform *self, int ifindex);