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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user