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.

(cherry picked from commit b445b1f8fe)
(cherry picked from commit f8a13422f1)
This commit is contained in:
Thomas Haller 2018-11-29 11:31:50 +01:00
parent bff948b96d
commit cfa95ed9b0
2 changed files with 30 additions and 9 deletions

View file

@ -1191,13 +1191,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);
}
/**
@ -1210,9 +1226,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;
}
/**
@ -1243,9 +1257,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;
}
/**

View file

@ -1111,6 +1111,7 @@ int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);
NMLinkType nm_platform_link_get_type (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_connected (NMPlatform *self, int ifindex);
gboolean nm_platform_link_uses_arp (NMPlatform *self, int ifindex);