platform: refactor virtual methods for link objects in NMPlatform

Change nm_platform_link_get() to return the cached NMPlatformLink
instance. Now what all our implementations (fake and linux) have such a
cache internal object, let's just expose it directly.
Note that the lifetime of the exposed link object is possibly quite
short. A caller must copy the returned value if he intends to preserve
it for later.
Also add nm_platform_link_get_by_ifname() and modify nm_platform_link_get_by_address()
to return the instance.

Certain functions, such as nm_platform_link_get_name(),
nm_platform_link_get_ifindex(), etc. are solely implemented based
on looking at the returned NMPlatformLink object. No longer implement
them as virtual functions but instead implement them in the base class
(nm-platform.c).
This removes code and eliminates the redundancy of the exposed
NMPlatformLink instance and the nm_platform_link_get_*() accessors.
Thereby also fix a bug in NMFakePlatform that tracked the link address
in a separate "address" field, instead of using "link.addr". That was
a case where the redundancy actually led to a bug in fake platform.

Also remove some stub implementations in NMFakePlatform that just
bail out. Instead allow for a missing virtual functions and perform
the "default" action in the accessor.
An example for that is nm_platform_link_get_permanent_address().
This commit is contained in:
Thomas Haller 2015-06-20 12:05:01 +02:00
parent ae824f582b
commit e8e455817b
13 changed files with 291 additions and 535 deletions

View file

@ -1408,7 +1408,7 @@ get_new_connection_ifname (const GSList *existing,
for (i = 0; i < 500; i++) {
name = g_strdup_printf ("%s%d", prefix, i);
if (nm_platform_link_exists (NM_PLATFORM_GET, name))
if (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, name))
goto next;
for (iter = existing, found = FALSE; iter; iter = g_slist_next (iter)) {

View file

@ -1346,14 +1346,18 @@ device_link_changed (NMDevice *self)
gboolean platform_unmanaged = FALSE;
const char *udi;
NMPlatformLink info;
const NMPlatformLink *pllink;
int ifindex;
priv->device_link_changed_id = 0;
ifindex = nm_device_get_ifindex (self);
if (!nm_platform_link_get (NM_PLATFORM_GET, ifindex, &info))
pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex);
if (!pllink)
return G_SOURCE_REMOVE;
info = *pllink;
udi = nm_platform_link_get_udi (NM_PLATFORM_GET, info.ifindex);
if (udi && g_strcmp0 (udi, priv->udi)) {
/* Update UDI to what udev gives us */
@ -1485,21 +1489,22 @@ static gboolean
device_ip_link_changed (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMPlatformLink info;
const NMPlatformLink *pllink;
int ip_ifindex;
priv->device_ip_link_changed_id = 0;
ip_ifindex = nm_device_get_ip_ifindex (self);
if (!nm_platform_link_get (NM_PLATFORM_GET, ip_ifindex, &info))
pllink = nm_platform_link_get (NM_PLATFORM_GET, ip_ifindex);
if (!pllink)
return G_SOURCE_REMOVE;
if (info.name[0] && g_strcmp0 (priv->ip_iface, info.name)) {
if (pllink->name[0] && g_strcmp0 (priv->ip_iface, pllink->name)) {
_LOGI (LOGD_DEVICE, "interface index %d renamed ip_iface (%d) from '%s' to '%s'",
priv->ifindex, nm_device_get_ip_ifindex (self),
priv->ip_iface, info.name);
priv->ip_iface, pllink->name);
g_free (priv->ip_iface);
priv->ip_iface = g_strdup (info.name);
priv->ip_iface = g_strdup (pllink->name);
g_object_notify (G_OBJECT (self), NM_DEVICE_IP_IFACE);
update_for_ip_ifname_change (self);

View file

@ -1038,7 +1038,7 @@ system_create_virtual_device (NMManager *self, NMConnection *connection, GError
*/
priv->ignore_link_added_cb++;
nm_owned = !nm_platform_link_exists (NM_PLATFORM_GET, iface);
nm_owned = !nm_platform_link_get_by_ifname (NM_PLATFORM_GET, iface);
device = nm_device_factory_create_virtual_device_for_connection (factory,
connection,

View file

@ -49,7 +49,6 @@ typedef struct {
NMPlatformLink link;
char *udi;
GBytes *address;
int vlan_id;
int ib_p_key;
struct in6_addr ip6_lladdr;
@ -142,7 +141,6 @@ link_init (NMFakePlatformLink *device, int ifindex, int type, const char *name)
device->link.flags = NM_FLAGS_UNSET (device->link.flags, IFF_NOARP);
break;
}
device->address = NULL;
}
static NMFakePlatformLink *
@ -177,21 +175,16 @@ link_get_all (NMPlatform *platform)
return links;
}
static gboolean
_nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *l)
static const NMPlatformLink *
_nm_platform_link_get (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
if (device && l)
*l = device->link;
return !!device;
return device ? &device->link : NULL;
}
static gboolean
_nm_platform_link_get_by_address (NMPlatform *platform,
gconstpointer address,
size_t length,
NMPlatformLink *l)
static const NMPlatformLink *
_nm_platform_link_get_by_ifname (NMPlatform *platform, const char *ifname)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
guint i;
@ -199,14 +192,34 @@ _nm_platform_link_get_by_address (NMPlatform *platform,
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
if ( device->address
&& g_bytes_get_size (device->address) == length
&& memcmp (g_bytes_get_data (device->address, NULL), address, length) == 0) {
*l = device->link;
return TRUE;
if (!strcmp (device->link.name, ifname))
return &device->link;
}
return NULL;
}
static const NMPlatformLink *
_nm_platform_link_get_by_address (NMPlatform *platform,
gconstpointer address,
size_t length)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
guint i;
if ( length == 0
|| length > NM_UTILS_HWADDR_LEN_MAX
|| !address)
g_return_val_if_reached (NULL);
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
if ( device->link.addr.len == length
&& memcmp (device->link.addr.data, address, length) == 0) {
return &device->link;
}
}
return FALSE;
return NULL;
}
static gboolean
@ -280,48 +293,10 @@ link_delete (NMPlatform *platform, int ifindex)
return TRUE;
}
static int
link_get_ifindex (NMPlatform *platform, const char *name)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
int i;
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
if (device && !g_strcmp0 (device->link.name, name))
return device->link.ifindex;
}
return 0;
}
static const char *
link_get_name (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? device->link.name : NULL;
}
static NMLinkType
link_get_type (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? device->link.type : NM_LINK_TYPE_NONE;
}
static const char *
link_get_type_name (NMPlatform *platform, int ifindex)
{
return type_to_type_name (link_get_type (platform, ifindex));
}
static gboolean
link_get_unmanaged (NMPlatform *platform, int ifindex, gboolean *managed)
{
return FALSE;
return type_to_type_name (nm_platform_link_get_type (platform, ifindex));
}
static void
@ -447,63 +422,25 @@ link_set_noarp (NMPlatform *platform, int ifindex)
return TRUE;
}
static gboolean
link_is_up (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? NM_FLAGS_HAS (device->link.flags, IFF_UP) : FALSE;
}
static gboolean
link_is_connected (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? device->link.connected : FALSE;
}
static gboolean
link_uses_arp (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? !NM_FLAGS_HAS (device->link.flags, IFF_NOARP) : FALSE;
}
static gboolean
link_set_address (NMPlatform *platform, int ifindex, gconstpointer addr, size_t len)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
if (device->address)
g_bytes_unref (device->address);
if ( len == 0
|| len > NM_UTILS_HWADDR_LEN_MAX
|| !addr)
g_return_val_if_reached (FALSE);
device->address = g_bytes_new (addr, len);
link_changed (platform, link_get (platform, ifindex), TRUE);
return TRUE;
}
static gconstpointer
link_get_address (NMPlatform *platform, int ifindex, size_t *length)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
if (!device || !device->address) {
if (length)
*length = 0;
return NULL;
if ( device->link.addr.len != len
|| ( len > 0
&& memcmp (device->link.addr.data, addr, len) != 0)) {
memcpy (device->link.addr.data, addr, len);
device->link.addr.len = len;
link_changed (platform, link_get (platform, ifindex), TRUE);
}
return g_bytes_get_data (device->address, length);
}
static gboolean
link_get_permanent_address (NMPlatform *platform, int ifindex, guint8 *buf, size_t *length)
{
return FALSE;
return TRUE;
}
static gboolean
@ -519,32 +456,6 @@ link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu)
return !!device;
}
static guint32
link_get_mtu (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
return device ? device->link.mtu : 0;
}
static char *
link_get_physical_port_id (NMPlatform *platform, int ifindex)
{
/* We call link_get just to cause an error to be set if @ifindex is bad. */
link_get (platform, ifindex);
return NULL;
}
static guint
link_get_dev_id (NMPlatform *platform, int ifindex)
{
/* We call link_get just to cause an error to be set if @ifindex is bad. */
link_get (platform, ifindex);
return 0;
}
static const char *
link_get_udi (NMPlatform *platform, int ifindex)
{
@ -555,15 +466,6 @@ link_get_udi (NMPlatform *platform, int ifindex)
return device->udi;
}
static gboolean
link_get_wake_on_lan (NMPlatform *platform, int ifindex)
{
/* We call link_get just to cause an error to be set if @ifindex is bad. */
link_get (platform, ifindex);
return FALSE;
}
static gboolean
link_get_driver_info (NMPlatform *platform,
int ifindex,
@ -578,9 +480,6 @@ link_get_driver_info (NMPlatform *platform,
if (out_fw_version)
*out_fw_version = NULL;
/* We call link_get just to cause an error to be set if @ifindex is bad. */
link_get (platform, ifindex);
return TRUE;
}
@ -659,16 +558,6 @@ link_release (NMPlatform *platform, int master_idx, int slave_idx)
return TRUE;
}
static int
link_get_master (NMPlatform *platform, int slave)
{
NMFakePlatformLink *device = link_get (platform, slave);
g_return_val_if_fail (device, FALSE);
return device->link.master;
}
static gboolean
master_set_option (NMPlatform *platform, int master, const char *option, const char *value)
{
@ -709,7 +598,7 @@ vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint
if (!link_add (platform, name, NM_LINK_TYPE_VLAN, NULL, 0, NULL))
return FALSE;
device = link_get (platform, link_get_ifindex (platform, name));
device = link_get (platform, nm_platform_link_get_ifindex (platform, name));
g_return_val_if_fail (device, FALSE);
@ -761,7 +650,7 @@ infiniband_partition_add (NMPlatform *platform, int parent, int p_key, NMPlatfor
if (!link_add (platform, name, NM_LINK_TYPE_INFINIBAND, NULL, 0, out_link))
return FALSE;
device = link_get (platform, link_get_ifindex (platform, name));
device = link_get (platform, nm_platform_link_get_ifindex (platform, name));
g_return_val_if_fail (device, FALSE);
device->ib_p_key = p_key;
@ -1484,7 +1373,6 @@ nm_fake_platform_finalize (GObject *object)
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
g_bytes_unref (device->address);
g_free (device->udi);
}
g_array_unref (priv->links);
@ -1511,15 +1399,12 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
platform_class->sysctl_get = sysctl_get;
platform_class->link_get = _nm_platform_link_get;
platform_class->link_get_by_ifname = _nm_platform_link_get_by_ifname;
platform_class->link_get_by_address = _nm_platform_link_get_by_address;
platform_class->link_get_all = link_get_all;
platform_class->link_add = link_add;
platform_class->link_delete = link_delete;
platform_class->link_get_ifindex = link_get_ifindex;
platform_class->link_get_name = link_get_name;
platform_class->link_get_type = link_get_type;
platform_class->link_get_type_name = link_get_type_name;
platform_class->link_get_unmanaged = link_get_unmanaged;
platform_class->link_get_udi = link_get_udi;
@ -1527,19 +1412,10 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
platform_class->link_set_down = link_set_down;
platform_class->link_set_arp = link_set_arp;
platform_class->link_set_noarp = link_set_noarp;
platform_class->link_is_up = link_is_up;
platform_class->link_is_connected = link_is_connected;
platform_class->link_uses_arp = link_uses_arp;
platform_class->link_set_address = link_set_address;
platform_class->link_get_address = link_get_address;
platform_class->link_get_permanent_address = link_get_permanent_address;
platform_class->link_get_mtu = link_get_mtu;
platform_class->link_set_mtu = link_set_mtu;
platform_class->link_get_physical_port_id = link_get_physical_port_id;
platform_class->link_get_dev_id = link_get_dev_id;
platform_class->link_get_wake_on_lan = link_get_wake_on_lan;
platform_class->link_get_driver_info = link_get_driver_info;
platform_class->link_supports_carrier_detect = link_supports_carrier_detect;
@ -1547,7 +1423,6 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
platform_class->link_enslave = link_enslave;
platform_class->link_release = link_release;
platform_class->link_get_master = link_get_master;
platform_class->master_set_option = master_set_option;
platform_class->master_get_option = master_get_option;
platform_class->slave_set_option = slave_set_option;

View file

@ -2508,15 +2508,26 @@ link_get_all (NMPlatform *platform)
nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, NMP_OBJECT_TYPE_LINK, TRUE));
}
static gboolean
_nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *l)
static const NMPlatformLink *
_nm_platform_link_get (NMPlatform *platform, int ifindex)
{
const NMPObject *obj;
obj = cache_lookup_link (platform, ifindex);
if (obj && l)
*l = obj->link;
return !!obj;
return obj ? &obj->link : NULL;
}
static const NMPlatformLink *
_nm_platform_link_get_by_ifname (NMPlatform *platform,
const char *ifname)
{
const NMPObject *obj = NULL;
if (ifname && *ifname) {
obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
0, ifname, TRUE, NM_LINK_TYPE_NONE, NULL, NULL);
}
return obj ? &obj->link : NULL;
}
struct _nm_platform_link_get_by_address_data {
@ -2530,11 +2541,10 @@ _nm_platform_link_get_by_address_match_link (const NMPObject *obj, struct _nm_pl
return obj->link.addr.len == d->length && !memcmp (obj->link.addr.data, d->address, d->length);
}
static gboolean
static const NMPlatformLink *
_nm_platform_link_get_by_address (NMPlatform *platform,
gconstpointer address,
size_t length,
NMPlatformLink *l)
size_t length)
{
const NMPObject *obj;
struct _nm_platform_link_get_by_address_data d = {
@ -2543,16 +2553,14 @@ _nm_platform_link_get_by_address (NMPlatform *platform,
};
if (length <= 0 || length > NM_UTILS_HWADDR_LEN_MAX)
return FALSE;
return NULL;
if (!address)
return FALSE;
return NULL;
obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
0, NULL, TRUE, NM_LINK_TYPE_NONE,
(NMPObjectMatchFn) _nm_platform_link_get_by_address_match_link, &d);
if (obj && l)
*l = obj->link;
return !!obj;
return obj ? &obj->link : NULL;
}
static struct nl_object *
@ -2798,34 +2806,6 @@ link_delete (NMPlatform *platform, int ifindex)
return do_delete_object (platform, &obj_needle, NULL);
}
static int
link_get_ifindex (NMPlatform *platform, const char *ifname)
{
const NMPObject *obj;
g_return_val_if_fail (ifname, 0);
obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
0, ifname, TRUE, NM_LINK_TYPE_NONE, NULL, NULL);
return obj ? obj->link.ifindex : 0;
}
static const char *
link_get_name (NMPlatform *platform, int ifindex)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
return obj ? obj->link.name : NULL;
}
static NMLinkType
link_get_type (NMPlatform *platform, int ifindex)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
return obj ? obj->link.type : NM_LINK_TYPE_NONE;
}
static const char *
link_get_type_name (NMPlatform *platform, int ifindex)
{
@ -2866,14 +2846,6 @@ link_get_unmanaged (NMPlatform *platform, int ifindex, gboolean *managed)
return FALSE;
}
static guint32
link_get_flags (NMPlatform *platform, int ifindex)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
return obj ? obj->link.flags : IFF_NOARP;
}
static gboolean
link_refresh (NMPlatform *platform, int ifindex)
{
@ -2881,26 +2853,6 @@ link_refresh (NMPlatform *platform, int ifindex)
return !!cache_lookup_link (platform, ifindex);
}
static gboolean
link_is_up (NMPlatform *platform, int ifindex)
{
return !!(link_get_flags (platform, ifindex) & IFF_UP);
}
static gboolean
link_is_connected (NMPlatform *platform, int ifindex)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
return obj ? obj->link.connected : FALSE;
}
static gboolean
link_uses_arp (NMPlatform *platform, int ifindex)
{
return !(link_get_flags (platform, ifindex) & IFF_NOARP);
}
static NMPlatformError
link_change_flags (NMPlatform *platform, int ifindex, unsigned int flags, gboolean value)
{
@ -2955,20 +2907,6 @@ link_set_noarp (NMPlatform *platform, int ifindex)
return link_change_flags (platform, ifindex, IFF_NOARP, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
link_get_ipv6_token (NMPlatform *platform, int ifindex, NMUtilsIPv6IfaceId *iid)
{
#if HAVE_LIBNL_INET6_TOKEN
const NMPObject *obj = cache_lookup_link (platform, ifindex);
if (obj && obj->link.inet6_token.is_valid) {
*iid = obj->link.inet6_token.iid;
return TRUE;
}
#endif
return FALSE;
}
static const char *
link_get_udi (NMPlatform *platform, int ifindex)
{
@ -2995,18 +2933,6 @@ link_get_udev_device (NMPlatform *platform, int ifindex)
return obj_cache ? (GObject *) obj_cache->_link.udev.device : NULL;
}
static gboolean
link_get_user_ipv6ll_enabled (NMPlatform *platform, int ifindex)
{
#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
const NMPObject *obj = cache_lookup_link (platform, ifindex);
if (obj && obj->link.inet6_addr_gen_mode_inv)
return (~obj->link.inet6_addr_gen_mode_inv) == IN6_ADDR_GEN_MODE_NONE;
#endif
return FALSE;
}
static gboolean
link_set_user_ipv6ll_enabled (NMPlatform *platform, int ifindex, gboolean enabled)
{
@ -3069,28 +2995,6 @@ link_set_address (NMPlatform *platform, int ifindex, gconstpointer address, size
return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gconstpointer
link_get_address (NMPlatform *platform, int ifindex, size_t *length)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
gconstpointer a = NULL;
guint8 l = 0;
if (obj && obj->link.addr.len > 0) {
if (obj->link.addr.len > NM_UTILS_HWADDR_LEN_MAX) {
if (length)
*length = 0;
g_return_val_if_reached (NULL);
}
a = obj->link.addr.data;
l = obj->link.addr.len;
}
if (length)
*length = l;
return a;
}
static gboolean
link_get_permanent_address (NMPlatform *platform,
int ifindex,
@ -3111,14 +3015,6 @@ link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu)
return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static guint32
link_get_mtu (NMPlatform *platform, int ifindex)
{
const NMPObject *obj = cache_lookup_link (platform, ifindex);
return obj ? obj->link.mtu : 0;
}
static char *
link_get_physical_port_id (NMPlatform *platform, int ifindex)
{
@ -3251,14 +3147,6 @@ link_release (NMPlatform *platform, int master, int slave)
return link_enslave (platform, 0, slave);
}
static int
link_get_master (NMPlatform *platform, int slave)
{
const NMPObject *obj = cache_lookup_link (platform, slave);
return obj ? obj->link.master : 0;
}
static char *
link_option_path (NMPlatform *platform, int master, const char *category, const char *option)
{
@ -3292,13 +3180,12 @@ link_get_option (NMPlatform *platform, int master, const char *category, const c
static const char *
master_category (NMPlatform *platform, int master)
{
switch (link_get_type (platform, master)) {
switch (nm_platform_link_get_type (platform, master)) {
case NM_LINK_TYPE_BRIDGE:
return "bridge";
case NM_LINK_TYPE_BOND:
return "bonding";
default:
g_return_val_if_reached (NULL);
return NULL;
}
}
@ -3306,16 +3193,15 @@ master_category (NMPlatform *platform, int master)
static const char *
slave_category (NMPlatform *platform, int slave)
{
int master = link_get_master (platform, slave);
int master = nm_platform_link_get_master (platform, slave);
if (master <= 0)
return NULL;
switch (link_get_type (platform, master)) {
switch (nm_platform_link_get_type (platform, master)) {
case NM_LINK_TYPE_BRIDGE:
return "brport";
default:
g_return_val_if_reached (NULL);
return NULL;
}
}
@ -3761,8 +3647,8 @@ vxlan_get_properties (NMPlatform *platform, int ifindex, NMPlatformVxlanProperti
err = _nl_link_parse_info_data (priv->nlh, ifindex,
vxlan_info_data_parser, props);
if (err != 0) {
warning ("(%s) could not read properties: %s",
link_get_name (platform, ifindex), nl_geterror (err));
warning ("(%s) could not read vxlan properties: %s",
nm_platform_link_get_name (platform, ifindex), nl_geterror (err));
}
return (err == 0);
}
@ -3815,8 +3701,8 @@ gre_get_properties (NMPlatform *platform, int ifindex, NMPlatformGreProperties *
err = _nl_link_parse_info_data (priv->nlh, ifindex,
gre_info_data_parser, props);
if (err != 0) {
warning ("(%s) could not read properties: %s",
link_get_name (platform, ifindex), nl_geterror (err));
warning ("(%s) could not read gre properties: %s",
nm_platform_link_get_name (platform, ifindex), nl_geterror (err));
}
return (err == 0);
}
@ -3829,26 +3715,25 @@ wifi_get_wifi_data (NMPlatform *platform, int ifindex)
wifi_data = g_hash_table_lookup (priv->wifi_data, GINT_TO_POINTER (ifindex));
if (!wifi_data) {
NMLinkType type;
const char *ifname;
const NMPlatformLink *pllink;
type = link_get_type (platform, ifindex);
ifname = link_get_name (platform, ifindex);
if (type == NM_LINK_TYPE_WIFI)
wifi_data = wifi_utils_init (ifname, ifindex, TRUE);
else if (type == NM_LINK_TYPE_OLPC_MESH) {
/* The kernel driver now uses nl80211, but we force use of WEXT because
* the cfg80211 interactions are not quite ready to support access to
* mesh control through nl80211 just yet.
*/
pllink = nm_platform_link_get (platform, ifindex);
if (pllink) {
if (pllink->type == NM_LINK_TYPE_WIFI)
wifi_data = wifi_utils_init (pllink->name, ifindex, TRUE);
else if (pllink->type == NM_LINK_TYPE_OLPC_MESH) {
/* The kernel driver now uses nl80211, but we force use of WEXT because
* the cfg80211 interactions are not quite ready to support access to
* mesh control through nl80211 just yet.
*/
#if HAVE_WEXT
wifi_data = wifi_wext_init (ifname, ifindex, FALSE);
wifi_data = wifi_wext_init (pllink->name, ifindex, FALSE);
#endif
}
}
if (wifi_data)
g_hash_table_insert (priv->wifi_data, GINT_TO_POINTER (ifindex), wifi_data);
if (wifi_data)
g_hash_table_insert (priv->wifi_data, GINT_TO_POINTER (ifindex), wifi_data);
}
}
return wifi_data;
@ -3993,10 +3878,10 @@ mesh_set_ssid (NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len)
static gboolean
link_get_wake_on_lan (NMPlatform *platform, int ifindex)
{
NMLinkType type = link_get_type (platform, ifindex);
NMLinkType type = nm_platform_link_get_type (platform, ifindex);
if (type == NM_LINK_TYPE_ETHERNET)
return nmp_utils_ethtool_get_wake_on_lan (link_get_name (platform, ifindex));
return nmp_utils_ethtool_get_wake_on_lan (nm_platform_link_get_name (platform, ifindex));
else if (type == NM_LINK_TYPE_WIFI) {
WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
@ -5039,13 +4924,11 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->sysctl_get = sysctl_get;
platform_class->link_get = _nm_platform_link_get;
platform_class->link_get_by_ifname = _nm_platform_link_get_by_ifname;
platform_class->link_get_by_address = _nm_platform_link_get_by_address;
platform_class->link_get_all = link_get_all;
platform_class->link_add = link_add;
platform_class->link_delete = link_delete;
platform_class->link_get_ifindex = link_get_ifindex;
platform_class->link_get_name = link_get_name;
platform_class->link_get_type = link_get_type;
platform_class->link_get_type_name = link_get_type_name;
platform_class->link_get_unmanaged = link_get_unmanaged;
@ -5055,21 +4938,14 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->link_set_down = link_set_down;
platform_class->link_set_arp = link_set_arp;
platform_class->link_set_noarp = link_set_noarp;
platform_class->link_is_up = link_is_up;
platform_class->link_is_connected = link_is_connected;
platform_class->link_uses_arp = link_uses_arp;
platform_class->link_get_udi = link_get_udi;
platform_class->link_get_udev_device = link_get_udev_device;
platform_class->link_get_ipv6_token = link_get_ipv6_token;
platform_class->link_get_user_ipv6ll_enabled = link_get_user_ipv6ll_enabled;
platform_class->link_set_user_ipv6ll_enabled = link_set_user_ipv6ll_enabled;
platform_class->link_get_address = link_get_address;
platform_class->link_set_address = link_set_address;
platform_class->link_get_permanent_address = link_get_permanent_address;
platform_class->link_get_mtu = link_get_mtu;
platform_class->link_set_mtu = link_set_mtu;
platform_class->link_get_physical_port_id = link_get_physical_port_id;
@ -5082,7 +4958,6 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->link_enslave = link_enslave;
platform_class->link_release = link_release;
platform_class->link_get_master = link_get_master;
platform_class->master_set_option = master_set_option;
platform_class->master_get_option = master_get_option;
platform_class->slave_set_option = slave_set_option;

View file

@ -487,23 +487,39 @@ nm_platform_link_get_all (NMPlatform *self)
* nm_platform_link_get:
* @self: platform instance
* @ifindex: ifindex of the link
* @link: (out): output NMPlatformLink structure.
*
* If a link with given @ifindex exists, fill the given NMPlatformLink
* structure.
* Lookup the internal NMPlatformLink object.
*
* Returns: %TRUE, if such a link exists, %FALSE otherwise.
* If the link does not exist, the content of @link is undefined.
* Returns: %NULL, if such a link exists or the internal
* platform link object. Do not modify the returned value.
* Also, be aware that any subsequent platform call might
* invalidated/modify the returned instance.
**/
gboolean
nm_platform_link_get (NMPlatform *self, int ifindex, NMPlatformLink *link)
const NMPlatformLink *
nm_platform_link_get (NMPlatform *self, int ifindex)
{
_CHECK_SELF (self, klass, FALSE);
_CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (ifindex > 0, NULL);
g_return_val_if_fail (klass->link_get, FALSE);
return !!klass->link_get (self, ifindex, link);
return klass->link_get (self, ifindex);
}
/**
* nm_platform_link_get_by_ifname:
* @self: platform instance
* @ifname: the ifname
*
* Returns: the first #NMPlatformLink instance with the given name.
**/
const NMPlatformLink *
nm_platform_link_get_by_ifname (NMPlatform *self, const char *ifname)
{
_CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifname && *ifname, NULL);
return klass->link_get_by_ifname (self, ifname);
}
/**
@ -511,55 +527,43 @@ nm_platform_link_get (NMPlatform *self, int ifindex, NMPlatformLink *link)
* @self: platform instance
* @address: a pointer to the binary hardware address
* @length: the size of @address in bytes
* @link: (out): output NMPlatformLink structure.
*
* If a link with given @address exists, fill the given NMPlatformLink
* structure.
*
* Returns: %TRUE, if such a link exists, %FALSE otherwise.
* If the link does not exist, the content of @link is undefined.
* Returns: the first #NMPlatformLink object with a matching
* address.
**/
gboolean
const NMPlatformLink *
nm_platform_link_get_by_address (NMPlatform *self,
gconstpointer address,
size_t length,
NMPlatformLink *link)
size_t length)
{
_CHECK_SELF (self, klass, FALSE);
_CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (address != NULL, FALSE);
g_return_val_if_fail (length > 0, FALSE);
g_return_val_if_fail (link, FALSE);
g_return_val_if_fail (address != NULL, NULL);
g_return_val_if_fail (length > 0, NULL);
g_return_val_if_fail (klass->link_get_by_address, FALSE);
return !!klass->link_get_by_address (self, address, length, link);
return klass->link_get_by_address (self, address, length);
}
static NMPlatformError
_link_add_check_existing (NMPlatform *self, const char *name, NMLinkType type, NMPlatformLink *out_link)
{
int ifindex;
NMPlatformLink pllink;
const NMPlatformLink *pllink;
ifindex = nm_platform_link_get_ifindex (self, name);
if (ifindex > 0) {
if (nm_platform_link_get (self, ifindex, &pllink)) {
gboolean wrong_type;
pllink = nm_platform_link_get_by_ifname (self, name);
if (pllink) {
gboolean wrong_type;
wrong_type = type != NM_LINK_TYPE_NONE && pllink.type != type;
debug ("link: skip adding link due to existing interface '%s' of type %s%s%s",
name,
nm_link_type_to_string (pllink.type),
wrong_type ? ", expected " : "",
wrong_type ? nm_link_type_to_string (type) : "");
if (out_link)
*out_link = pllink;
if (wrong_type)
return NM_PLATFORM_ERROR_WRONG_TYPE;
return NM_PLATFORM_ERROR_EXISTS;
}
/* strange, nm_platform_link_get_ifindex() returned a valid ifindex, but nm_platform_link_get() failed.
* This is unexpected... proceed with "SUCCESS". */
wrong_type = type != NM_LINK_TYPE_NONE && pllink->type != type;
debug ("link: skip adding link due to existing interface '%s' of type %s%s%s",
name,
nm_link_type_to_string (pllink->type),
wrong_type ? ", expected " : "",
wrong_type ? nm_link_type_to_string (type) : "");
if (out_link)
*out_link = *pllink;
if (wrong_type)
return NM_PLATFORM_ERROR_WRONG_TYPE;
return NM_PLATFORM_ERROR_EXISTS;
}
return NM_PLATFORM_ERROR_SUCCESS;
}
@ -623,25 +627,6 @@ nm_platform_dummy_add (NMPlatform *self, const char *name, NMPlatformLink *out_l
return nm_platform_link_add (self, name, NM_LINK_TYPE_DUMMY, NULL, 0, out_link);
}
/**
* nm_platform_link_exists:
* @self: platform instance
* @name: Interface name
*
* Returns: %TRUE if an interface of this name exists, %FALSE otherwise.
*/
gboolean
nm_platform_link_exists (NMPlatform *self, const char *name)
{
int ifindex;
_CHECK_SELF (self, klass, FALSE);
ifindex = nm_platform_link_get_ifindex (self, name);
return ifindex > 0;
}
/**
* nm_platform_link_delete:
* @self: platform instance
@ -650,18 +635,17 @@ nm_platform_link_exists (NMPlatform *self, const char *name)
gboolean
nm_platform_link_delete (NMPlatform *self, int ifindex)
{
const char *name;
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (klass->link_delete, FALSE);
name = nm_platform_link_get_name (self, ifindex);
if (!name)
if (ifindex <= 0)
return FALSE;
pllink = nm_platform_link_get (self, ifindex);
if (!pllink)
return FALSE;
debug ("link: deleting '%s' (%d)", name, ifindex);
debug ("link: deleting '%s' (%d)", pllink->name, ifindex);
return klass->link_delete (self, ifindex);
}
@ -676,19 +660,10 @@ nm_platform_link_delete (NMPlatform *self, int ifindex)
int
nm_platform_link_get_ifindex (NMPlatform *self, const char *name)
{
int ifindex;
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, 0);
g_return_val_if_fail (name, 0);
g_return_val_if_fail (klass->link_get_ifindex, 0);
ifindex = klass->link_get_ifindex (self, name);
if (!ifindex)
debug ("link not found: %s", name);
return ifindex;
pllink = nm_platform_link_get_by_ifname (self, name);
return pllink ? pllink->ifindex : 0;
}
/**
@ -702,20 +677,12 @@ nm_platform_link_get_ifindex (NMPlatform *self, const char *name)
const char *
nm_platform_link_get_name (NMPlatform *self, int ifindex)
{
const char *name;
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (klass->link_get_name, NULL);
name = klass->link_get_name (self, ifindex);
if (!name) {
debug ("link not found: %d", ifindex);
return FALSE;
}
return name;
pllink = nm_platform_link_get (self, ifindex);
return pllink ? pllink->name : NULL;
}
/**
@ -729,11 +696,12 @@ nm_platform_link_get_name (NMPlatform *self, int ifindex)
NMLinkType
nm_platform_link_get_type (NMPlatform *self, int ifindex)
{
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, NM_LINK_TYPE_NONE);
g_return_val_if_fail (klass->link_get_type, NM_LINK_TYPE_NONE);
return klass->link_get_type (self, ifindex);
pllink = nm_platform_link_get (self, ifindex);
return pllink ? pllink->type : NM_LINK_TYPE_NONE;
}
/**
@ -770,9 +738,9 @@ nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *managed
{
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (klass->link_get_unmanaged, FALSE);
return klass->link_get_unmanaged (self, ifindex, managed);
if (klass->link_get_unmanaged)
return klass->link_get_unmanaged (self, ifindex, managed);
return FALSE;
}
/**
@ -823,6 +791,15 @@ nm_platform_link_refresh (NMPlatform *self, int ifindex)
return TRUE;
}
static guint32
_link_get_flags (NMPlatform *self, int ifindex)
{
const NMPlatformLink *pllink;
pllink = nm_platform_link_get (self, ifindex);
return pllink ? pllink->flags : IFF_NOARP;
}
/**
* nm_platform_link_is_up:
* @self: platform instance
@ -835,10 +812,7 @@ nm_platform_link_is_up (NMPlatform *self, int ifindex)
{
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_is_up, FALSE);
return klass->link_is_up (self, ifindex);
return NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_UP);
}
/**
@ -851,12 +825,12 @@ nm_platform_link_is_up (NMPlatform *self, int ifindex)
gboolean
nm_platform_link_is_connected (NMPlatform *self, int ifindex)
{
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_is_connected, FALSE);
return klass->link_is_connected (self, ifindex);
pllink = nm_platform_link_get (self, ifindex);
return pllink ? pllink->connected : FALSE;
}
/**
@ -871,10 +845,7 @@ nm_platform_link_uses_arp (NMPlatform *self, int ifindex)
{
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_uses_arp, FALSE);
return klass->link_uses_arp (self, ifindex);
return !NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_NOARP);
}
/**
@ -897,8 +868,17 @@ nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6Iface
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (iid, FALSE);
if (klass->link_get_ipv6_token)
return klass->link_get_ipv6_token (self, ifindex, iid);
#if HAVE_LIBNL_INET6_TOKEN
{
const NMPlatformLink *pllink;
pllink = nm_platform_link_get (self, ifindex);
if (pllink && pllink->inet6_token.is_valid) {
*iid = pllink->inet6_token.iid;
return TRUE;
}
}
#endif
return FALSE;
}
@ -943,13 +923,20 @@ nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex)
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->check_support_user_ipv6ll, FALSE);
if (klass->link_get_user_ipv6ll_enabled)
return klass->link_get_user_ipv6ll_enabled (self, ifindex);
#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
{
const NMPlatformLink *pllink;
pllink = nm_platform_link_get (self, ifindex);
if (pllink && pllink->inet6_addr_gen_mode_inv)
return (~pllink->inet6_addr_gen_mode_inv) == IN6_ADDR_GEN_MODE_NONE;
}
#endif
return FALSE;
}
/**
* nm_platform_link_set_user_ip6vll_enabled:
* @self: platform instance
@ -1008,15 +995,31 @@ nm_platform_link_set_address (NMPlatform *self, int ifindex, gconstpointer addre
gconstpointer
nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length)
{
const NMPlatformLink *pllink;
gconstpointer a = NULL;
guint8 l = 0;
_CHECK_SELF (self, klass, NULL);
if (length)
*length = 0;
g_return_val_if_fail (ifindex > 0, NULL);
g_return_val_if_fail (klass->link_get_address, NULL);
return klass->link_get_address (self, ifindex, length);
pllink = nm_platform_link_get (self, ifindex);
if (pllink && pllink->addr.len > 0) {
if (pllink->addr.len > NM_UTILS_HWADDR_LEN_MAX) {
if (length)
*length = 0;
g_return_val_if_reached (NULL);
}
a = pllink->addr.data;
l = pllink->addr.len;
}
if (length)
*length = l;
return a;
}
/**
@ -1039,11 +1042,12 @@ nm_platform_link_get_permanent_address (NMPlatform *self, int ifindex, guint8 *b
*length = 0;
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (klass->link_get_permanent_address, FALSE);
g_return_val_if_fail (buf, FALSE);
g_return_val_if_fail (length, FALSE);
return klass->link_get_permanent_address (self, ifindex, buf, length);
if (klass->link_get_permanent_address)
return klass->link_get_permanent_address (self, ifindex, buf, length);
return FALSE;
}
gboolean
@ -1176,12 +1180,12 @@ nm_platform_link_set_mtu (NMPlatform *self, int ifindex, guint32 mtu)
guint32
nm_platform_link_get_mtu (NMPlatform *self, int ifindex)
{
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex >= 0, 0);
g_return_val_if_fail (klass->link_get_mtu, 0);
return klass->link_get_mtu (self, ifindex);
pllink = nm_platform_link_get (self, ifindex);
return pllink ? pllink->mtu : 0;
}
/**
@ -1204,9 +1208,10 @@ nm_platform_link_get_physical_port_id (NMPlatform *self, int ifindex)
_CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex >= 0, NULL);
g_return_val_if_fail (klass->link_get_physical_port_id, NULL);
return klass->link_get_physical_port_id (self, ifindex);
if (klass->link_get_physical_port_id)
return klass->link_get_physical_port_id (self, ifindex);
return NULL;
}
/**
@ -1227,9 +1232,10 @@ nm_platform_link_get_dev_id (NMPlatform *self, int ifindex)
_CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex >= 0, 0);
g_return_val_if_fail (klass->link_get_dev_id, 0);
return klass->link_get_dev_id (self, ifindex);
if (klass->link_get_dev_id)
return klass->link_get_dev_id (self, ifindex);
return 0;
}
/**
@ -1245,9 +1251,10 @@ nm_platform_link_get_wake_on_lan (NMPlatform *self, int ifindex)
_CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_get_wake_on_lan, FALSE);
return klass->link_get_wake_on_lan (self, ifindex);
if (klass->link_get_wake_on_lan)
return klass->link_get_wake_on_lan (self, ifindex);
return FALSE;
}
/**
@ -1340,14 +1347,14 @@ nm_platform_link_release (NMPlatform *self, int master, int slave)
int
nm_platform_link_get_master (NMPlatform *self, int slave)
{
const NMPlatformLink *pllink;
_CHECK_SELF (self, klass, 0);
g_return_val_if_fail (slave >= 0, FALSE);
g_return_val_if_fail (klass->link_get_master, FALSE);
if (!nm_platform_link_get_name (self, slave))
return 0;
return klass->link_get_master (self, slave);
pllink = nm_platform_link_get (self, slave);
return pllink ? pllink->master : 0;
}
/**

View file

@ -409,8 +409,10 @@ typedef struct {
gboolean (*sysctl_set) (NMPlatform *, const char *path, const char *value);
char * (*sysctl_get) (NMPlatform *, const char *path);
gboolean (*link_get) (NMPlatform *platform, int ifindex, NMPlatformLink *link);
gboolean (*link_get_by_address) (NMPlatform *platform, gconstpointer address, size_t length, NMPlatformLink *link);
const NMPlatformLink *(*link_get) (NMPlatform *platform, int ifindex);
const NMPlatformLink *(*link_get_by_ifname) (NMPlatform *platform, const char *ifname);
const NMPlatformLink *(*link_get_by_address) (NMPlatform *platform, gconstpointer address, size_t length);
GArray *(*link_get_all) (NMPlatform *);
gboolean (*link_add) (NMPlatform *,
const char *name,
@ -419,9 +421,6 @@ typedef struct {
size_t address_len,
NMPlatformLink *out_link);
gboolean (*link_delete) (NMPlatform *, int ifindex);
int (*link_get_ifindex) (NMPlatform *, const char *name);
const char *(*link_get_name) (NMPlatform *, int ifindex);
NMLinkType (*link_get_type) (NMPlatform *, int ifindex);
const char *(*link_get_type_name) (NMPlatform *, int ifindex);
gboolean (*link_get_unmanaged) (NMPlatform *, int ifindex, gboolean *managed);
@ -432,24 +431,17 @@ typedef struct {
gboolean (*link_set_down) (NMPlatform *, int ifindex);
gboolean (*link_set_arp) (NMPlatform *, int ifindex);
gboolean (*link_set_noarp) (NMPlatform *, int ifindex);
gboolean (*link_is_up) (NMPlatform *, int ifindex);
gboolean (*link_is_connected) (NMPlatform *, int ifindex);
gboolean (*link_uses_arp) (NMPlatform *, int ifindex);
const char *(*link_get_udi) (NMPlatform *self, int ifindex);
GObject *(*link_get_udev_device) (NMPlatform *self, int ifindex);
gboolean (*link_get_ipv6_token) (NMPlatform *, int ifindex, NMUtilsIPv6IfaceId *iid);
gboolean (*link_get_user_ipv6ll_enabled) (NMPlatform *, int ifindex);
gboolean (*link_set_user_ipv6ll_enabled) (NMPlatform *, int ifindex, gboolean enabled);
gconstpointer (*link_get_address) (NMPlatform *, int ifindex, size_t *length);
gboolean (*link_get_permanent_address) (NMPlatform *,
int ifindex,
guint8 *buf,
size_t *length);
gboolean (*link_set_address) (NMPlatform *, int ifindex, gconstpointer address, size_t length);
guint32 (*link_get_mtu) (NMPlatform *, int ifindex);
gboolean (*link_set_mtu) (NMPlatform *, int ifindex, guint32 mtu);
char * (*link_get_physical_port_id) (NMPlatform *, int ifindex);
@ -466,7 +458,6 @@ typedef struct {
gboolean (*link_enslave) (NMPlatform *, int master, int slave);
gboolean (*link_release) (NMPlatform *, int master, int slave);
gboolean (*link_get_master) (NMPlatform *, int slave);
gboolean (*master_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
char * (*master_get_option) (NMPlatform *, int ifindex, const char *option);
gboolean (*slave_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
@ -597,22 +588,34 @@ gint64 nm_platform_sysctl_get_int_checked (NMPlatform *self, const char *path, g
gboolean nm_platform_sysctl_set_ip6_hop_limit_safe (NMPlatform *self, const char *iface, int value);
gboolean nm_platform_link_get (NMPlatform *self, int ifindex, NMPlatformLink *link);
const NMPlatformLink *nm_platform_link_get (NMPlatform *self, int ifindex);
const NMPlatformLink *nm_platform_link_get_by_ifname (NMPlatform *self, const char *ifname);
const NMPlatformLink *nm_platform_link_get_by_address (NMPlatform *self, gconstpointer address, size_t length);
GArray *nm_platform_link_get_all (NMPlatform *self);
gboolean nm_platform_link_get_by_address (NMPlatform *self, gconstpointer address, size_t length, NMPlatformLink *link);
NMPlatformError nm_platform_dummy_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
NMPlatformError nm_platform_bridge_add (NMPlatform *self, const char *name, const void *address, size_t address_len, NMPlatformLink *out_link);
NMPlatformError nm_platform_bond_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
NMPlatformError nm_platform_team_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
gboolean nm_platform_link_exists (NMPlatform *self, const char *name);
gboolean nm_platform_link_delete (NMPlatform *self, int ifindex);
/* convienience methods to lookup the link and access fields of NMPlatformLink. */
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);
const char *nm_platform_link_get_type_name (NMPlatform *self, int ifindex);
gboolean nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *managed);
gboolean nm_platform_link_is_software (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_uses_arp (NMPlatform *self, int ifindex);
guint32 nm_platform_link_get_mtu (NMPlatform *self, int ifindex);
gboolean nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6IfaceId *iid);
gboolean nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex);
gconstpointer nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length);
int nm_platform_link_get_master (NMPlatform *self, int slave);
gboolean nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *managed);
gboolean nm_platform_link_supports_slaves (NMPlatform *self, int ifindex);
const char *nm_platform_link_get_type_name (NMPlatform *self, int ifindex);
gboolean nm_platform_link_refresh (NMPlatform *self, int ifindex);
void nm_platform_process_events (NMPlatform *self);
@ -621,22 +624,15 @@ gboolean nm_platform_link_set_up (NMPlatform *self, int ifindex, gboolean *out_n
gboolean nm_platform_link_set_down (NMPlatform *self, int ifindex);
gboolean nm_platform_link_set_arp (NMPlatform *self, int ifindex);
gboolean nm_platform_link_set_noarp (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_uses_arp (NMPlatform *self, int ifindex);
gboolean nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6IfaceId *iid);
const char *nm_platform_link_get_udi (NMPlatform *self, int ifindex);
GObject *nm_platform_link_get_udev_device (NMPlatform *self, int ifindex);
gboolean nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex);
gboolean nm_platform_link_set_user_ipv6ll_enabled (NMPlatform *self, int ifindex, gboolean enabled);
gconstpointer nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length);
gboolean nm_platform_link_get_permanent_address (NMPlatform *self, int ifindex, guint8 *buf, size_t *length);
gboolean nm_platform_link_set_address (NMPlatform *self, int ifindex, const void *address, size_t length);
guint32 nm_platform_link_get_mtu (NMPlatform *self, int ifindex);
gboolean nm_platform_link_set_mtu (NMPlatform *self, int ifindex, guint32 mtu);
char *nm_platform_link_get_physical_port_id (NMPlatform *self, int ifindex);
@ -653,7 +649,6 @@ gboolean nm_platform_link_supports_vlans (NMPlatform *self, int ifindex);
gboolean nm_platform_link_enslave (NMPlatform *self, int master, int slave);
gboolean nm_platform_link_release (NMPlatform *self, int master, int slave);
int nm_platform_link_get_master (NMPlatform *self, int slave);
gboolean nm_platform_master_set_option (NMPlatform *self, int ifindex, const char *option, const char *value);
char *nm_platform_master_get_option (NMPlatform *self, int ifindex, const char *option);
gboolean nm_platform_slave_set_option (NMPlatform *self, int ifindex, const char *option, const char *value);

View file

@ -128,7 +128,7 @@ do_vlan_add (char **argv)
static gboolean
do_link_exists (char **argv)
{
gboolean value = nm_platform_link_exists (NM_PLATFORM_GET, argv[0]);
gboolean value = !!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, argv[0]);
print_boolean (value);

View file

@ -236,7 +236,7 @@ setup_tests (void)
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);

View file

@ -96,7 +96,7 @@ void
setup_tests (void)
{
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_test_add_func ("/internal", test_cleanup_internal);
/* FIXME: add external cleanup check */

View file

@ -21,7 +21,7 @@ test_bogus(void)
{
size_t addrlen;
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, BOGUS_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, BOGUS_NAME));
g_assert (!nm_platform_link_delete (NM_PLATFORM_GET, BOGUS_IFINDEX));
g_assert (!nm_platform_link_get_ifindex (NM_PLATFORM_GET, BOGUS_NAME));
g_assert (!nm_platform_link_get_name (NM_PLATFORM_GET, BOGUS_IFINDEX));
@ -53,7 +53,7 @@ test_bogus(void)
static void
test_loopback (void)
{
g_assert (nm_platform_link_exists (NM_PLATFORM_GET, LO_NAME));
g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, LO_NAME));
g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, LO_INDEX), ==, NM_LINK_TYPE_LOOPBACK);
g_assert_cmpint (nm_platform_link_get_ifindex (NM_PLATFORM_GET, LO_NAME), ==, LO_INDEX);
g_assert_cmpstr (nm_platform_link_get_name (NM_PLATFORM_GET, LO_INDEX), ==, LO_NAME);
@ -73,14 +73,14 @@ software_add (NMLinkType link_type, const char *name)
return nm_platform_bridge_add (NM_PLATFORM_GET, name, NULL, 0, NULL) == NM_PLATFORM_ERROR_SUCCESS;
case NM_LINK_TYPE_BOND:
{
gboolean bond0_exists = nm_platform_link_exists (NM_PLATFORM_GET, "bond0");
gboolean bond0_exists = !!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "bond0");
NMPlatformError plerr;
plerr = nm_platform_bond_add (NM_PLATFORM_GET, name, NULL);
/* Check that bond0 is *not* automatically created. */
if (!bond0_exists)
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, "bond0"));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "bond0"));
return plerr == NM_PLATFORM_ERROR_SUCCESS;
}
case NM_LINK_TYPE_TEAM:
@ -269,7 +269,7 @@ test_software (NMLinkType link_type, const char *link_typename)
link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
g_assert (software_add (link_type, DEVICE_NAME));
accept_signal (link_added);
g_assert (nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex >= 0);
g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, link_type);
@ -333,7 +333,7 @@ test_software (NMLinkType link_type, const char *link_typename)
/* Delete */
g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, NM_LINK_TYPE_NONE);
g_assert (!nm_platform_link_get_type (NM_PLATFORM_GET, ifindex));
accept_signal (link_removed);
@ -397,7 +397,7 @@ test_internal (void)
int ifindex;
/* Check the functions for non-existent devices */
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
/* Add device */
@ -470,16 +470,15 @@ test_internal (void)
static void
test_external (void)
{
NMPlatformLink link;
const NMPlatformLink *pllink;
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
SignalData *link_changed, *link_removed;
int ifindex;
gboolean success;
run_command ("ip link add %s type %s", DEVICE_NAME, "dummy");
wait_signal (link_added);
g_assert (nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex > 0);
g_assert_cmpstr (nm_platform_link_get_name (NM_PLATFORM_GET, ifindex), ==, DEVICE_NAME);
@ -488,9 +487,9 @@ test_external (void)
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
success = nm_platform_link_get (NM_PLATFORM_GET, ifindex, &link);
g_assert (success);
if (!link.initialized) {
pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex);
g_assert (pllink);
if (!pllink->initialized) {
/* we still lack the notification via UDEV. Expect another link changed signal. */
wait_signal (link_changed);
}
@ -520,7 +519,7 @@ test_external (void)
run_command ("ip link del %s", DEVICE_NAME);
wait_signal (link_removed);
accept_signals (link_changed, 0, 1);
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
free_signal (link_added);
free_signal (link_changed);
@ -539,9 +538,9 @@ setup_tests (void)
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, SLAVE_NAME));
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, PARENT_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, SLAVE_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, PARENT_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, SLAVE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, PARENT_NAME));
g_test_add_func ("/link/bogus", test_bogus);
g_test_add_func ("/link/loopback", test_loopback);

View file

@ -294,7 +294,7 @@ setup_tests (void)
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);

View file

@ -647,7 +647,7 @@ fixture_setup (test_fixture *fixture, gconstpointer user_data)
link_callback,
"nm-test-device0");
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device0"));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, "nm-test-device0"));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "nm-test-device0"));
g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, "nm-test-device0", NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);
@ -659,7 +659,7 @@ fixture_setup (test_fixture *fixture, gconstpointer user_data)
link_callback,
"nm-test-device1");
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device1"));
g_assert (!nm_platform_link_exists (NM_PLATFORM_GET, "nm-test-device1"));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "nm-test-device1"));
g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, "nm-test-device1", NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);