2013-03-27 22:23:24 +01:00
|
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
|
|
|
/* nm-platform.c - Handle runtime kernel networking configuration
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2012 Red Hat, Inc.
|
|
|
|
|
*/
|
|
|
|
|
|
2016-02-19 14:57:48 +01:00
|
|
|
#include "nm-default.h"
|
2014-11-13 10:07:02 -05:00
|
|
|
|
2016-03-01 09:56:51 +01:00
|
|
|
#include "nm-platform.h"
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <netinet/in.h>
|
2013-03-27 22:23:24 +01:00
|
|
|
#include <arpa/inet.h>
|
2013-04-03 16:10:38 +02:00
|
|
|
#include <string.h>
|
2015-10-12 15:15:21 +02:00
|
|
|
#include <linux/ip.h>
|
2015-10-13 16:08:30 +02:00
|
|
|
#include <linux/if_tun.h>
|
2015-10-12 15:15:21 +02:00
|
|
|
#include <linux/if_tunnel.h>
|
2016-10-07 21:35:58 +02:00
|
|
|
#include <linux/rtnetlink.h>
|
2017-07-04 12:49:47 +02:00
|
|
|
#include <libudev.h>
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2014-01-30 20:31:29 +01:00
|
|
|
#include "nm-utils.h"
|
2016-03-01 09:56:51 +01:00
|
|
|
#include "nm-core-internal.h"
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
#include "nm-utils/nm-dedup-multi.h"
|
2017-07-04 12:49:47 +02:00
|
|
|
#include "nm-utils/nm-udev-utils.h"
|
2016-03-01 09:56:51 +01:00
|
|
|
|
|
|
|
|
#include "nm-core-utils.h"
|
2015-06-22 15:45:10 +02:00
|
|
|
#include "nm-platform-utils.h"
|
2017-06-29 11:18:10 +02:00
|
|
|
#include "nm-platform-private.h"
|
2015-10-29 11:27:55 +01:00
|
|
|
#include "nmp-object.h"
|
2016-02-19 01:06:28 +01:00
|
|
|
#include "nmp-netns.h"
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2016-02-18 20:21:27 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-04-27 18:06:59 +02:00
|
|
|
G_STATIC_ASSERT (sizeof ( ((NMPlatformLink *) NULL)->addr.data ) == NM_UTILS_HWADDR_LEN_MAX);
|
2015-10-20 14:08:04 +02:00
|
|
|
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPAddress, address_ptr) == G_STRUCT_OFFSET (NMPlatformIP4Address, address));
|
|
|
|
|
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPAddress, address_ptr) == G_STRUCT_OFFSET (NMPlatformIP6Address, address));
|
|
|
|
|
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OFFSET (NMPlatformIP4Route, network));
|
|
|
|
|
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OFFSET (NMPlatformIP6Route, network));
|
2015-04-27 18:06:59 +02:00
|
|
|
|
2015-08-20 00:07:14 +02:00
|
|
|
#define _NMLOG_DOMAIN LOGD_PLATFORM
|
|
|
|
|
#define _NMLOG_PREFIX_NAME "platform"
|
|
|
|
|
#define _NMLOG(level, ...) \
|
2015-07-02 14:33:37 +02:00
|
|
|
G_STMT_START { \
|
|
|
|
|
const NMLogLevel __level = (level); \
|
|
|
|
|
\
|
2015-08-20 00:07:14 +02:00
|
|
|
if (nm_logging_enabled (__level, _NMLOG_DOMAIN)) { \
|
2015-07-02 14:33:37 +02:00
|
|
|
char __prefix[32]; \
|
2015-08-20 00:07:14 +02:00
|
|
|
const char *__p_prefix = _NMLOG_PREFIX_NAME; \
|
2017-04-17 18:40:52 +02:00
|
|
|
const NMPlatform *const __self = (self); \
|
2015-07-02 14:33:37 +02:00
|
|
|
\
|
2017-04-17 18:40:52 +02:00
|
|
|
if (__self && NM_PLATFORM_GET_PRIVATE (__self)->log_with_ptr) { \
|
2015-08-20 00:07:14 +02:00
|
|
|
g_snprintf (__prefix, sizeof (__prefix), "%s[%p]", _NMLOG_PREFIX_NAME, __self); \
|
2015-07-02 14:33:37 +02:00
|
|
|
__p_prefix = __prefix; \
|
|
|
|
|
} \
|
2017-03-01 10:20:01 +00:00
|
|
|
_nm_log (__level, _NMLOG_DOMAIN, 0, NULL, NULL, \
|
2015-07-02 14:33:37 +02:00
|
|
|
"%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
|
|
|
|
|
__p_prefix _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
|
|
|
|
|
} \
|
|
|
|
|
} G_STMT_END
|
|
|
|
|
|
2015-09-01 22:11:47 +02:00
|
|
|
#define LOG_FMT_IP_TUNNEL "adding %s '%s' parent %u local %s remote %s"
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-11-27 12:54:31 +01:00
|
|
|
static guint signals[_NM_PLATFORM_SIGNAL_ID_LAST] = { 0 };
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-05-12 07:34:56 +02:00
|
|
|
enum {
|
|
|
|
|
PROP_0,
|
2016-02-19 01:06:28 +01:00
|
|
|
PROP_NETNS_SUPPORT,
|
2017-06-29 10:51:38 +02:00
|
|
|
PROP_USE_UDEV,
|
2017-04-17 18:40:52 +02:00
|
|
|
PROP_LOG_WITH_PTR,
|
2015-05-12 07:34:56 +02:00
|
|
|
LAST_PROP,
|
|
|
|
|
};
|
|
|
|
|
|
2016-09-28 15:58:24 +02:00
|
|
|
typedef struct _NMPlatformPrivate {
|
2017-06-29 10:51:38 +02:00
|
|
|
bool use_udev:1;
|
2017-04-17 18:40:52 +02:00
|
|
|
bool log_with_ptr:1;
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
|
|
|
|
|
gint8 check_support_kernel_extended_ifa_flags_cached;
|
|
|
|
|
gint8 check_support_user_ipv6ll_cached;
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
guint ip4_dev_route_blacklist_check_id;
|
|
|
|
|
guint ip4_dev_route_blacklist_gc_timeout_id;
|
|
|
|
|
GHashTable *ip4_dev_route_blacklist_hash;
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NMDedupMultiIndex *multi_idx;
|
2017-06-29 11:18:10 +02:00
|
|
|
NMPCache *cache;
|
2015-05-12 07:34:56 +02:00
|
|
|
} NMPlatformPrivate;
|
|
|
|
|
|
2016-09-28 15:58:24 +02:00
|
|
|
G_DEFINE_TYPE (NMPlatform, nm_platform, G_TYPE_OBJECT)
|
|
|
|
|
|
|
|
|
|
#define NM_PLATFORM_GET_PRIVATE(self) _NM_GET_PRIVATE_PTR (self, NMPlatform, NM_IS_PLATFORM)
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
static void _ip4_dev_route_blacklist_schedule (NMPlatform *self);
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-06-29 10:51:38 +02:00
|
|
|
gboolean
|
|
|
|
|
nm_platform_get_use_udev (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
return NM_PLATFORM_GET_PRIVATE (self)->use_udev;
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-17 18:40:52 +02:00
|
|
|
gboolean
|
|
|
|
|
nm_platform_get_log_with_ptr (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
return NM_PLATFORM_GET_PRIVATE (self)->log_with_ptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-11-27 12:54:31 +01:00
|
|
|
guint
|
|
|
|
|
_nm_platform_signal_id_get (NMPlatformSignalIdType signal_type)
|
|
|
|
|
{
|
|
|
|
|
nm_assert ( signal_type > 0
|
|
|
|
|
&& signal_type != NM_PLATFORM_SIGNAL_ID_NONE
|
|
|
|
|
&& signal_type < _NM_PLATFORM_SIGNAL_ID_LAST);
|
|
|
|
|
|
|
|
|
|
return signals[signal_type];
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-11-27 12:54:31 +01:00
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/* Singleton NMPlatform subclass instance and cached class object */
|
2015-04-18 14:00:45 +02:00
|
|
|
NM_DEFINE_SINGLETON_INSTANCE (NMPlatform);
|
|
|
|
|
|
2015-07-24 18:54:13 +02:00
|
|
|
NM_DEFINE_SINGLETON_REGISTER (NMPlatform);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
|
|
|
|
|
/* Just always initialize a @klass instance. NM_PLATFORM_GET_CLASS()
|
|
|
|
|
* is only a plain read on the self instance, which the compiler
|
|
|
|
|
* like can optimize out.
|
|
|
|
|
*/
|
|
|
|
|
#define _CHECK_SELF_VOID(self, klass) \
|
|
|
|
|
NMPlatformClass *klass; \
|
|
|
|
|
do { \
|
|
|
|
|
g_return_if_fail (NM_IS_PLATFORM (self)); \
|
|
|
|
|
klass = NM_PLATFORM_GET_CLASS (self); \
|
|
|
|
|
(void) klass; \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
#define _CHECK_SELF(self, klass, err_val) \
|
|
|
|
|
NMPlatformClass *klass; \
|
|
|
|
|
do { \
|
|
|
|
|
g_return_val_if_fail (NM_IS_PLATFORM (self), err_val); \
|
|
|
|
|
klass = NM_PLATFORM_GET_CLASS (self); \
|
|
|
|
|
(void) klass; \
|
|
|
|
|
} while (0)
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2016-09-10 16:48:01 +02:00
|
|
|
#define _CHECK_SELF_NETNS(self, klass, netns, err_val) \
|
|
|
|
|
nm_auto_pop_netns NMPNetns *netns = NULL; \
|
|
|
|
|
NMPlatformClass *klass; \
|
|
|
|
|
do { \
|
|
|
|
|
g_return_val_if_fail (NM_IS_PLATFORM (self), err_val); \
|
|
|
|
|
klass = NM_PLATFORM_GET_CLASS (self); \
|
|
|
|
|
(void) klass; \
|
|
|
|
|
if (!nm_platform_netns_push (self, &netns)) \
|
|
|
|
|
return (err_val); \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_setup:
|
2015-04-18 13:37:36 +02:00
|
|
|
* @instance: the #NMPlatform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Failing to set up #NMPlatform singleton results in a fatal error,
|
|
|
|
|
* as well as trying to initialize it multiple times without freeing
|
|
|
|
|
* it.
|
|
|
|
|
*
|
|
|
|
|
* NetworkManager will typically use only one platform object during
|
|
|
|
|
* its run. Test programs might want to switch platform implementations,
|
2015-04-18 14:00:45 +02:00
|
|
|
* though.
|
2013-03-27 22:23:24 +01:00
|
|
|
*/
|
|
|
|
|
void
|
2015-04-18 13:37:36 +02:00
|
|
|
nm_platform_setup (NMPlatform *instance)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-04-18 13:37:36 +02:00
|
|
|
g_return_if_fail (NM_IS_PLATFORM (instance));
|
|
|
|
|
g_return_if_fail (!singleton_instance);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-04-18 13:37:36 +02:00
|
|
|
singleton_instance = instance;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-07-24 18:54:13 +02:00
|
|
|
nm_singleton_instance_register ();
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-07-26 11:48:05 +02:00
|
|
|
nm_log_dbg (LOGD_CORE, "setup %s singleton (%p, %s)", "NMPlatform", singleton_instance, G_OBJECT_TYPE_NAME (instance));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_get:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Retrieve #NMPlatform singleton. Use this whenever you want to connect to
|
2015-04-18 14:00:45 +02:00
|
|
|
* #NMPlatform signals. It is an error to call it before nm_platform_setup().
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): The #NMPlatform singleton reference.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatform *
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_get ()
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
g_assert (singleton_instance);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return singleton_instance;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NMDedupMultiIndex *
|
|
|
|
|
nm_platform_get_multi_idx (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (NM_IS_PLATFORM (self), NULL);
|
|
|
|
|
|
2017-06-29 11:18:10 +02:00
|
|
|
return NM_PLATFORM_GET_PRIVATE (self)->multi_idx;
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-08-21 19:18:45 +02:00
|
|
|
NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_nm_platform_error_to_string, NMPlatformError,
|
|
|
|
|
NM_UTILS_LOOKUP_DEFAULT (NULL),
|
2016-01-24 11:30:36 +01:00
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_SUCCESS, "success"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_BUG, "bug"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_UNSPECIFIED, "unspecified"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_NOT_FOUND, "not-found"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_EXISTS, "exists"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_WRONG_TYPE, "wrong-type"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_NOT_SLAVE, "not-slave"),
|
|
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_NO_FIRMWARE, "no-firmware"),
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_OPNOTSUPP, "not-supported"),
|
2017-08-21 15:33:57 +02:00
|
|
|
NM_UTILS_LOOKUP_STR_ITEM (NM_PLATFORM_ERROR_NETLINK, "netlink"),
|
2016-02-01 14:02:39 +01:00
|
|
|
NM_UTILS_LOOKUP_ITEM_IGNORE (_NM_PLATFORM_ERROR_MININT),
|
2016-01-24 11:30:36 +01:00
|
|
|
);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-08-21 19:18:45 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_error_to_string:
|
|
|
|
|
* @error_code: the error code to stringify.
|
|
|
|
|
* @buf: (allow-none): buffer
|
|
|
|
|
* @buf_len: size of buffer
|
|
|
|
|
*
|
|
|
|
|
* Returns: A string representation of the error.
|
|
|
|
|
* For negative numbers, this function interprets
|
|
|
|
|
* the code as -errno.
|
|
|
|
|
* For invalid (positive) numbers it returns NULL.
|
|
|
|
|
*/
|
|
|
|
|
const char *
|
|
|
|
|
nm_platform_error_to_string (NMPlatformError error_code, char *buf, gsize buf_len)
|
|
|
|
|
{
|
|
|
|
|
const char *s;
|
|
|
|
|
|
|
|
|
|
if (error_code < 0) {
|
|
|
|
|
int errsv = -((int) error_code);
|
|
|
|
|
|
|
|
|
|
nm_utils_to_string_buffer_init (&buf, &buf_len);
|
|
|
|
|
g_snprintf (buf, buf_len, "%s (%d)", g_strerror (errsv), errsv);
|
|
|
|
|
} else {
|
|
|
|
|
s = _nm_platform_error_to_string (error_code);
|
|
|
|
|
if (s) {
|
|
|
|
|
if (!buf)
|
|
|
|
|
return s;
|
|
|
|
|
g_strlcpy (buf, s, buf_len);
|
|
|
|
|
} else {
|
|
|
|
|
nm_utils_to_string_buffer_init (&buf, &buf_len);
|
|
|
|
|
g_snprintf (buf, buf_len, "(%d)", (int) error_code);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 14:35:04 +02:00
|
|
|
NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_nmp_nlm_flag_to_string_lookup, NMPNlmFlags,
|
|
|
|
|
NM_UTILS_LOOKUP_DEFAULT (NULL),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_ADD, "add"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_CHANGE, "change"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_REPLACE, "replace"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_PREPEND, "prepend"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_APPEND, "append"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM (NMP_NLM_FLAG_TEST, "test"),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM_IGNORE (NMP_NLM_FLAG_F_APPEND),
|
2017-08-21 18:02:08 +02:00
|
|
|
NM_UTILS_LOOKUP_ITEM_IGNORE (NMP_NLM_FLAG_FMASK),
|
|
|
|
|
NM_UTILS_LOOKUP_ITEM_IGNORE (NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE),
|
2017-08-21 14:35:04 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
#define _nmp_nlm_flag_to_string(flags) \
|
|
|
|
|
({ \
|
|
|
|
|
NMPNlmFlags _flags = (flags); \
|
|
|
|
|
\
|
|
|
|
|
_nmp_nlm_flag_to_string_lookup (flags) ?: nm_sprintf_bufa (100, "new[0x%x]", (unsigned) _flags); \
|
|
|
|
|
})
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2014-01-07 17:21:12 +01:00
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self)
|
2014-01-07 17:21:12 +01:00
|
|
|
{
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
NMPlatformPrivate *priv;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, TRUE);
|
2014-01-07 17:21:12 +01:00
|
|
|
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
priv = NM_PLATFORM_GET_PRIVATE (self);
|
2014-01-07 17:21:12 +01:00
|
|
|
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
if (G_UNLIKELY (priv->check_support_kernel_extended_ifa_flags_cached == 0)) {
|
|
|
|
|
priv->check_support_kernel_extended_ifa_flags_cached = ( klass->check_support_kernel_extended_ifa_flags
|
|
|
|
|
&& klass->check_support_kernel_extended_ifa_flags (self))
|
|
|
|
|
? 1 : -1;
|
|
|
|
|
}
|
|
|
|
|
return priv->check_support_kernel_extended_ifa_flags_cached >= 0;
|
2014-01-07 17:21:12 +01:00
|
|
|
}
|
|
|
|
|
|
2014-07-24 15:57:08 -05:00
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_check_support_user_ipv6ll (NMPlatform *self)
|
2014-07-24 15:57:08 -05:00
|
|
|
{
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
NMPlatformPrivate *priv;
|
2014-07-24 15:57:08 -05:00
|
|
|
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
_CHECK_SELF (self, klass, TRUE);
|
2014-07-24 15:57:08 -05:00
|
|
|
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
priv = NM_PLATFORM_GET_PRIVATE (self);
|
2014-07-24 15:57:08 -05:00
|
|
|
|
platform: cleanup detecting kernel support for IFA_FLAGS and IPv6LL
- cache the result in NMPlatformPrivate. No need to call the virtual
function every time. The result is not ever going to change.
- if we are unable to detect support, assume support. Those features
were added quite a while ago to kernel, we should default to "support".
Note, that we detect support based on the presence of the absence of
certain netlink flags. That means, we will still detect no support.
The only moment when we actually use the fallback value, is when we
didn't encounter an RTM_NEWADDR or AF_INET6-IFLA_AF_SPEC message yet,
which would be very unusual, because we fill the cache initially and
usually will have some addresses there.
- for no strong reason, track "undetected" as numerical value zero,
and "support"/"no-support" as 1/-1. We already did that previously for
_support_user_ipv6ll, so this just unifies the implementations.
The minor reason is that this puts @_support_user_ipv6ll to the BSS
section and allows us to omit initializing priv->check_support_user_ipv6ll_cached
in platforms constructor.
- detect _support_kernel_extended_ifa_flags also based on IPv4
RTM_NEWADDR messages. Originally, extended flags were added for IPv6,
and later to IPv4 as well. Once we see an IPv4 message with IFA_FLAGS,
we know we have support.
2017-08-16 11:58:57 +02:00
|
|
|
if (G_UNLIKELY (priv->check_support_user_ipv6ll_cached == 0)) {
|
|
|
|
|
priv->check_support_user_ipv6ll_cached = ( klass->check_support_user_ipv6ll
|
|
|
|
|
&& klass->check_support_user_ipv6ll (self))
|
|
|
|
|
? 1 : -1;
|
|
|
|
|
}
|
|
|
|
|
return priv->check_support_user_ipv6ll_cached >= 0;
|
2014-07-24 15:57:08 -05:00
|
|
|
}
|
|
|
|
|
|
2015-06-19 15:38:41 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_process_events:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
*
|
|
|
|
|
* Process pending events or handle pending delayed-actions.
|
|
|
|
|
* Effectively, this reads the netlink socket and processes
|
|
|
|
|
* new netlink messages. Possibly it will raise change signals.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
nm_platform_process_events (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF_VOID (self, klass);
|
|
|
|
|
|
|
|
|
|
if (klass->process_events)
|
|
|
|
|
klass->process_events (self);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2016-12-08 15:12:52 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_sysctl_open_netdir:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: the ifindex for which to open /sys/class/net/%s
|
|
|
|
|
* @out_ifname: optional output argument of the found ifname.
|
|
|
|
|
*
|
|
|
|
|
* Wraps nmp_utils_sysctl_open_netdir() by first changing into the right
|
|
|
|
|
* network-namespace.
|
|
|
|
|
*
|
|
|
|
|
* Returns: on success, the open file descriptor to the /sys/class/net/%s
|
|
|
|
|
* directory.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
nm_platform_sysctl_open_netdir (NMPlatform *self, int ifindex, char *out_ifname)
|
|
|
|
|
{
|
|
|
|
|
const char*ifname_guess;
|
|
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, -1);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, -1);
|
|
|
|
|
|
|
|
|
|
/* we don't have an @ifname_guess argument to make the API nicer.
|
|
|
|
|
* But still do a cache-lookup first. Chances are good that we have
|
|
|
|
|
* the right ifname cached and save if_indextoname() */
|
|
|
|
|
ifname_guess = nm_platform_link_get_name (self, ifindex);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_sysctl_open_netdir (ifindex, ifname_guess, out_ifname);
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-03 16:10:38 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_sysctl_set:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2016-12-08 14:29:00 +01:00
|
|
|
* @pathid: if @dirfd is present, this must be the full path that is looked up.
|
|
|
|
|
* It is required for logging.
|
|
|
|
|
* @dirfd: optional file descriptor for parent directory for openat()
|
2013-04-03 16:10:38 +02:00
|
|
|
* @path: Absolute option path
|
|
|
|
|
* @value: Value to write
|
|
|
|
|
*
|
|
|
|
|
* This function is intended to be used for writing values to sysctl-style
|
|
|
|
|
* virtual runtime configuration files. This includes not only /proc/sys
|
|
|
|
|
* but also for example /sys/class.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2016-12-08 14:29:00 +01:00
|
|
|
nm_platform_sysctl_set (NMPlatform *self, const char *pathid, int dirfd, const char *path, const char *value)
|
2013-04-03 16:10:38 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-04-03 16:10:38 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (path, FALSE);
|
|
|
|
|
g_return_val_if_fail (value, FALSE);
|
|
|
|
|
|
2016-12-08 14:29:00 +01:00
|
|
|
return klass->sysctl_set (self, pathid, dirfd, path, value);
|
2013-04-03 16:10:38 +02:00
|
|
|
}
|
|
|
|
|
|
2015-04-08 15:54:30 +02:00
|
|
|
gboolean
|
|
|
|
|
nm_platform_sysctl_set_ip6_hop_limit_safe (NMPlatform *self, const char *iface, int value)
|
|
|
|
|
{
|
|
|
|
|
const char *path;
|
|
|
|
|
gint64 cur;
|
|
|
|
|
|
2015-06-17 15:00:10 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2015-04-08 15:54:30 +02:00
|
|
|
/* the hop-limit provided via RA is uint8. */
|
|
|
|
|
if (value > 0xFF)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
/* don't allow unreasonable small values */
|
|
|
|
|
if (value < 10)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
path = nm_utils_ip6_property_path (iface, "hop_limit");
|
2016-12-08 14:29:00 +01:00
|
|
|
cur = nm_platform_sysctl_get_int_checked (self, NMP_SYSCTL_PATHID_ABSOLUTE (path), 10, 1, G_MAXINT32, -1);
|
2015-04-08 15:54:30 +02:00
|
|
|
|
|
|
|
|
/* only allow increasing the hop-limit to avoid DOS by an attacker
|
|
|
|
|
* setting a low hop-limit (CVE-2015-2924, rh#1209902) */
|
|
|
|
|
|
|
|
|
|
if (value < cur)
|
|
|
|
|
return FALSE;
|
|
|
|
|
if (value != cur) {
|
|
|
|
|
char svalue[20];
|
|
|
|
|
|
|
|
|
|
sprintf (svalue, "%d", value);
|
2016-12-08 14:29:00 +01:00
|
|
|
nm_platform_sysctl_set (self, NMP_SYSCTL_PATHID_ABSOLUTE (path), svalue);
|
2015-04-08 15:54:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-03 16:10:38 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_sysctl_get:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2016-12-08 14:29:00 +01:00
|
|
|
* @dirfd: if non-negative, used to lookup the path via openat().
|
|
|
|
|
* @pathid: if @dirfd is present, this must be the full path that is looked up.
|
|
|
|
|
* It is required for logging.
|
2013-04-03 16:10:38 +02:00
|
|
|
* @path: Absolute path to sysctl
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer full): Contents of the virtual sysctl file.
|
|
|
|
|
*/
|
|
|
|
|
char *
|
2016-12-08 14:29:00 +01:00
|
|
|
nm_platform_sysctl_get (NMPlatform *self, const char *pathid, int dirfd, const char *path)
|
2013-04-03 16:10:38 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-04-03 16:10:38 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (path, NULL);
|
|
|
|
|
|
2016-12-08 14:29:00 +01:00
|
|
|
return klass->sysctl_get (self, pathid, dirfd, path);
|
2013-04-03 16:10:38 +02:00
|
|
|
}
|
|
|
|
|
|
2013-11-08 08:49:06 -05:00
|
|
|
/**
|
2014-01-06 19:59:17 +01:00
|
|
|
* nm_platform_sysctl_get_int32:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2016-12-08 14:29:00 +01:00
|
|
|
* @pathid: if @dirfd is present, this must be the full path that is looked up.
|
|
|
|
|
* It is required for logging.
|
|
|
|
|
* @dirfd: if non-negative, used to lookup the path via openat().
|
2013-11-08 08:49:06 -05:00
|
|
|
* @path: Absolute path to sysctl
|
2014-01-06 19:59:17 +01:00
|
|
|
* @fallback: default value, if the content of path could not be read
|
|
|
|
|
* as decimal integer.
|
2013-11-08 08:49:06 -05:00
|
|
|
*
|
2014-01-06 19:59:17 +01:00
|
|
|
* Returns: contents of the sysctl file parsed as s32 integer, or
|
2014-03-23 14:57:39 +01:00
|
|
|
* @fallback on error. On error, %errno will be set to a non-zero
|
|
|
|
|
* value, on success %errno will be set to zero.
|
2013-11-08 08:49:06 -05:00
|
|
|
*/
|
2014-01-06 19:59:17 +01:00
|
|
|
gint32
|
2016-12-08 14:29:00 +01:00
|
|
|
nm_platform_sysctl_get_int32 (NMPlatform *self, const char *pathid, int dirfd, const char *path, gint32 fallback)
|
2014-03-12 12:27:58 +01:00
|
|
|
{
|
2016-12-08 14:29:00 +01:00
|
|
|
return nm_platform_sysctl_get_int_checked (self, pathid, dirfd, path, 10, G_MININT32, G_MAXINT32, fallback);
|
2014-03-12 12:27:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_sysctl_get_int_checked:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2016-12-08 14:29:00 +01:00
|
|
|
* @pathid: if @dirfd is present, this must be the full path that is looked up.
|
|
|
|
|
* It is required for logging.
|
|
|
|
|
* @dirfd: if non-negative, used to lookup the path via openat().
|
2014-03-12 12:27:58 +01:00
|
|
|
* @path: Absolute path to sysctl
|
|
|
|
|
* @base: base of numeric conversion
|
|
|
|
|
* @min: minimal value that is still valid
|
|
|
|
|
* @max: maximal value that is still valid
|
|
|
|
|
* @fallback: default value, if the content of path could not be read
|
|
|
|
|
* as valid integer.
|
|
|
|
|
*
|
|
|
|
|
* Returns: contents of the sysctl file parsed as s64 integer, or
|
|
|
|
|
* @fallback on error. On error, %errno will be set to a non-zero
|
|
|
|
|
* value. On success, %errno will be set to zero. The returned value
|
|
|
|
|
* will always be in the range between @min and @max
|
|
|
|
|
* (inclusive) or @fallback.
|
|
|
|
|
*/
|
|
|
|
|
gint64
|
2016-12-08 14:29:00 +01:00
|
|
|
nm_platform_sysctl_get_int_checked (NMPlatform *self, const char *pathid, int dirfd, const char *path, guint base, gint64 min, gint64 max, gint64 fallback)
|
2013-11-08 08:49:06 -05:00
|
|
|
{
|
2014-01-06 19:59:17 +01:00
|
|
|
char *value = NULL;
|
|
|
|
|
gint32 ret;
|
2013-11-08 08:49:06 -05:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, fallback);
|
|
|
|
|
|
2014-01-06 19:59:17 +01:00
|
|
|
g_return_val_if_fail (path, fallback);
|
2013-11-08 08:49:06 -05:00
|
|
|
|
2014-01-06 19:59:17 +01:00
|
|
|
if (path)
|
2016-12-08 14:29:00 +01:00
|
|
|
value = nm_platform_sysctl_get (self, pathid, dirfd, path);
|
2014-01-06 19:59:17 +01:00
|
|
|
|
|
|
|
|
if (!value) {
|
|
|
|
|
errno = EINVAL;
|
|
|
|
|
return fallback;
|
|
|
|
|
}
|
2013-11-08 08:49:06 -05:00
|
|
|
|
2015-02-22 11:55:31 +01:00
|
|
|
ret = _nm_utils_ascii_str_to_int64 (value, base, min, max, fallback);
|
2014-01-06 19:59:17 +01:00
|
|
|
g_free (value);
|
2013-11-08 08:49:06 -05:00
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-04-03 16:10:38 +02:00
|
|
|
|
2016-04-13 18:36:23 +02:00
|
|
|
static int
|
|
|
|
|
_link_get_all_presort (gconstpointer p_a,
|
2017-05-15 17:17:26 +02:00
|
|
|
gconstpointer p_b,
|
|
|
|
|
gpointer sort_by_name)
|
2016-04-13 18:36:23 +02:00
|
|
|
{
|
2017-07-04 22:29:27 +02:00
|
|
|
const NMPlatformLink *a = NMP_OBJECT_CAST_LINK (*((const NMPObject **) p_a));
|
|
|
|
|
const NMPlatformLink *b = NMP_OBJECT_CAST_LINK (*((const NMPObject **) p_b));
|
2016-04-13 18:36:23 +02:00
|
|
|
|
2017-02-23 18:26:02 +01:00
|
|
|
/* Loopback always first */
|
|
|
|
|
if (a->ifindex == 1)
|
2016-04-13 18:36:23 +02:00
|
|
|
return -1;
|
2017-02-23 18:26:02 +01:00
|
|
|
if (b->ifindex == 1)
|
2016-04-13 18:36:23 +02:00
|
|
|
return 1;
|
2017-02-23 18:26:02 +01:00
|
|
|
|
2017-05-15 17:17:26 +02:00
|
|
|
if (GPOINTER_TO_INT (sort_by_name)) {
|
|
|
|
|
/* Initialized links first */
|
|
|
|
|
if (a->initialized > b->initialized)
|
|
|
|
|
return -1;
|
|
|
|
|
if (a->initialized < b->initialized)
|
|
|
|
|
return 1;
|
2017-02-23 18:26:02 +01:00
|
|
|
|
2017-05-15 17:17:26 +02:00
|
|
|
return strcmp (a->name, b->name);
|
|
|
|
|
} else
|
|
|
|
|
return a->ifindex - b->ifindex;
|
2016-04-13 18:36:23 +02:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_all:
|
2017-07-04 22:29:27 +02:00
|
|
|
* @self: platform instance
|
|
|
|
|
* @sort_by_name: whether to sort by name or ifindex.
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Retrieve a snapshot of configuration for all links at once. The result is
|
2017-07-04 22:29:27 +02:00
|
|
|
* owned by the caller and should be freed with g_ptr_array_unref().
|
2013-03-27 22:23:24 +01:00
|
|
|
*/
|
2017-07-04 22:29:27 +02:00
|
|
|
GPtrArray *
|
2017-05-15 17:17:26 +02:00
|
|
|
nm_platform_link_get_all (NMPlatform *self, gboolean sort_by_name)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-07-04 22:29:27 +02:00
|
|
|
gs_unref_ptrarray GPtrArray *links = NULL;
|
|
|
|
|
GPtrArray *result;
|
|
|
|
|
guint i, nresult;
|
|
|
|
|
gs_unref_hashtable GHashTable *unseen = NULL;
|
|
|
|
|
const NMPlatformLink *item;
|
2017-07-04 12:49:47 +02:00
|
|
|
NMPLookup lookup;
|
2013-06-03 11:49:55 -03:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
nmp_lookup_init_obj_type (&lookup, NMP_OBJECT_TYPE_LINK);
|
2017-07-04 22:29:27 +02:00
|
|
|
links = nm_dedup_multi_objs_to_ptr_array_head (nm_platform_lookup (self, &lookup),
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
if (!links)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < links->len; ) {
|
|
|
|
|
if (!nmp_object_is_visible (links->pdata[i]))
|
|
|
|
|
g_ptr_array_remove_index_fast (links, i);
|
|
|
|
|
else
|
|
|
|
|
i++;
|
|
|
|
|
}
|
2013-11-06 22:15:03 -06:00
|
|
|
|
2017-07-04 22:29:27 +02:00
|
|
|
if (links->len == 0)
|
|
|
|
|
return NULL;
|
2013-11-06 22:15:03 -06:00
|
|
|
|
2017-05-15 17:17:26 +02:00
|
|
|
/* first sort the links by their ifindex or name. Below we will sort
|
|
|
|
|
* further by moving children/slaves to the end. */
|
2017-07-04 22:29:27 +02:00
|
|
|
g_ptr_array_sort_with_data (links, _link_get_all_presort, GINT_TO_POINTER (sort_by_name));
|
2016-04-13 18:36:23 +02:00
|
|
|
|
2013-11-06 22:15:03 -06:00
|
|
|
unseen = g_hash_table_new (g_direct_hash, g_direct_equal);
|
|
|
|
|
for (i = 0; i < links->len; i++) {
|
2017-07-05 11:12:59 +02:00
|
|
|
item = NMP_OBJECT_CAST_LINK (links->pdata[i]);
|
2016-04-13 18:36:23 +02:00
|
|
|
nm_assert (item->ifindex > 0);
|
|
|
|
|
if (!nm_g_hash_table_insert (unseen, GINT_TO_POINTER (item->ifindex), NULL))
|
|
|
|
|
nm_assert_not_reached ();
|
2013-11-06 22:15:03 -06:00
|
|
|
}
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
#if NM_MORE_ASSERTS
|
2013-11-06 22:15:03 -06:00
|
|
|
/* Ensure that link_get_all returns a consistent and valid result. */
|
|
|
|
|
for (i = 0; i < links->len; i++) {
|
2017-07-05 11:12:59 +02:00
|
|
|
item = NMP_OBJECT_CAST_LINK (links->pdata[i]);
|
2013-11-06 22:15:03 -06:00
|
|
|
|
|
|
|
|
if (!item->ifindex)
|
|
|
|
|
continue;
|
|
|
|
|
if (item->master != 0) {
|
|
|
|
|
g_warn_if_fail (item->master > 0);
|
|
|
|
|
g_warn_if_fail (item->master != item->ifindex);
|
|
|
|
|
g_warn_if_fail (g_hash_table_contains (unseen, GINT_TO_POINTER (item->master)));
|
|
|
|
|
}
|
|
|
|
|
if (item->parent != 0) {
|
2015-08-17 17:48:37 +02:00
|
|
|
if (item->parent != NM_PLATFORM_LINK_OTHER_NETNS) {
|
|
|
|
|
g_warn_if_fail (item->parent > 0);
|
|
|
|
|
g_warn_if_fail (item->parent != item->ifindex);
|
2015-10-12 16:07:01 +02:00
|
|
|
g_warn_if_fail (g_hash_table_contains (unseen, GINT_TO_POINTER (item->parent)));
|
2015-08-17 17:48:37 +02:00
|
|
|
}
|
2013-11-06 22:15:03 -06:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Re-order the links list such that children/slaves come after all ancestors */
|
2017-07-04 22:29:27 +02:00
|
|
|
nm_assert (g_hash_table_size (unseen) == links->len);
|
|
|
|
|
nresult = links->len;
|
|
|
|
|
result = g_ptr_array_new_full (nresult, (GDestroyNotify) nmp_object_unref);
|
2013-11-06 22:15:03 -06:00
|
|
|
|
2017-07-04 22:29:27 +02:00
|
|
|
while (TRUE) {
|
2013-11-06 22:15:03 -06:00
|
|
|
gboolean found_something = FALSE;
|
|
|
|
|
guint first_idx = G_MAXUINT;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < links->len; i++) {
|
2017-07-05 11:12:59 +02:00
|
|
|
item = NMP_OBJECT_CAST_LINK (links->pdata[i]);
|
2013-11-06 22:15:03 -06:00
|
|
|
|
2017-07-04 22:29:27 +02:00
|
|
|
if (!item)
|
2013-11-06 22:15:03 -06:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
g_assert (g_hash_table_contains (unseen, GINT_TO_POINTER (item->ifindex)));
|
|
|
|
|
|
|
|
|
|
if (item->master > 0 && g_hash_table_contains (unseen, GINT_TO_POINTER (item->master)))
|
2017-07-04 22:29:27 +02:00
|
|
|
goto skip;
|
2013-11-06 22:15:03 -06:00
|
|
|
if (item->parent > 0 && g_hash_table_contains (unseen, GINT_TO_POINTER (item->parent)))
|
2017-07-04 22:29:27 +02:00
|
|
|
goto skip;
|
2013-11-06 22:15:03 -06:00
|
|
|
|
|
|
|
|
g_hash_table_remove (unseen, GINT_TO_POINTER (item->ifindex));
|
2017-07-04 22:29:27 +02:00
|
|
|
g_ptr_array_add (result, links->pdata[i]);
|
|
|
|
|
links->pdata[i] = NULL;
|
2013-11-06 22:15:03 -06:00
|
|
|
found_something = TRUE;
|
2017-07-04 22:29:27 +02:00
|
|
|
continue;
|
|
|
|
|
skip:
|
|
|
|
|
if (first_idx == G_MAXUINT)
|
|
|
|
|
first_idx = i;
|
2013-11-06 22:15:03 -06:00
|
|
|
}
|
|
|
|
|
|
2017-07-04 22:29:27 +02:00
|
|
|
if (found_something) {
|
|
|
|
|
if (first_idx == G_MAXUINT)
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
nm_assert (first_idx != G_MAXUINT);
|
2015-07-14 11:47:51 +02:00
|
|
|
/* There is a loop, pop the first (remaining) element from the list.
|
|
|
|
|
* This can happen for veth pairs where each peer is parent of the other end. */
|
2017-07-05 11:12:59 +02:00
|
|
|
item = NMP_OBJECT_CAST_LINK (links->pdata[first_idx]);
|
2013-11-06 22:15:03 -06:00
|
|
|
g_hash_table_remove (unseen, GINT_TO_POINTER (item->ifindex));
|
2017-07-04 22:29:27 +02:00
|
|
|
g_ptr_array_add (result, links->pdata[first_idx]);
|
|
|
|
|
links->pdata[first_idx] = NULL;
|
2013-11-06 22:15:03 -06:00
|
|
|
}
|
2017-07-04 22:29:27 +02:00
|
|
|
nm_assert (result->len < nresult);
|
|
|
|
|
}
|
|
|
|
|
nm_assert (result->len == nresult);
|
2013-11-06 22:15:03 -06:00
|
|
|
|
|
|
|
|
return result;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
const NMPObject *
|
|
|
|
|
nm_platform_link_get_obj (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
gboolean visible_only)
|
|
|
|
|
{
|
|
|
|
|
const NMPObject *obj_cache;
|
|
|
|
|
|
|
|
|
|
obj_cache = nmp_cache_lookup_link (nm_platform_get_cache (self), ifindex);
|
|
|
|
|
if ( !obj_cache
|
|
|
|
|
|| ( visible_only
|
|
|
|
|
&& !nmp_object_is_visible (obj_cache)))
|
|
|
|
|
return NULL;
|
|
|
|
|
return obj_cache;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2014-04-22 16:02:15 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2014-04-22 16:02:15 +02:00
|
|
|
* @ifindex: ifindex of the link
|
|
|
|
|
*
|
2015-06-20 12:05:01 +02:00
|
|
|
* Lookup the internal NMPlatformLink object.
|
2014-04-22 16:02:15 +02:00
|
|
|
*
|
2015-06-20 12:05:01 +02:00
|
|
|
* 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
|
2017-05-11 12:08:02 +02:00
|
|
|
* invalidate/modify the returned instance.
|
2014-04-22 16:02:15 +02:00
|
|
|
**/
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *
|
|
|
|
|
nm_platform_link_get (NMPlatform *self, int ifindex)
|
2014-04-22 16:02:15 +02:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
if (ifindex <= 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
obj = nm_platform_link_get_obj (self, ifindex, TRUE);
|
|
|
|
|
return NMP_OBJECT_CAST_LINK (obj);
|
2015-06-20 12:05:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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)
|
|
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
if (!ifname || !*ifname)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
obj = nmp_cache_lookup_link_full (nm_platform_get_cache (self),
|
|
|
|
|
0, ifname, TRUE, NM_LINK_TYPE_NONE, NULL, NULL);
|
|
|
|
|
return NMP_OBJECT_CAST_LINK (obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct _nm_platform_link_get_by_address_data {
|
|
|
|
|
gconstpointer address;
|
|
|
|
|
guint8 length;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
_nm_platform_link_get_by_address_match_link (const NMPObject *obj, struct _nm_platform_link_get_by_address_data *d)
|
|
|
|
|
{
|
|
|
|
|
return obj->link.addr.len == d->length && !memcmp (obj->link.addr.data, d->address, d->length);
|
2014-04-22 16:02:15 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-18 12:16:11 -05:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_by_address:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @address: a pointer to the binary hardware address
|
|
|
|
|
* @length: the size of @address in bytes
|
|
|
|
|
*
|
2015-06-20 12:05:01 +02:00
|
|
|
* Returns: the first #NMPlatformLink object with a matching
|
|
|
|
|
* address.
|
2014-09-18 12:16:11 -05:00
|
|
|
**/
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *
|
2014-09-18 12:16:11 -05:00
|
|
|
nm_platform_link_get_by_address (NMPlatform *self,
|
|
|
|
|
gconstpointer address,
|
2015-06-20 12:05:01 +02:00
|
|
|
size_t length)
|
2014-09-18 12:16:11 -05:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj;
|
|
|
|
|
struct _nm_platform_link_get_by_address_data d = {
|
|
|
|
|
.address = address,
|
|
|
|
|
.length = length,
|
|
|
|
|
};
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2014-09-18 12:16:11 -05:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
if (length == 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (length > NM_UTILS_HWADDR_LEN_MAX)
|
|
|
|
|
g_return_val_if_reached (NULL);
|
|
|
|
|
if (!address)
|
|
|
|
|
g_return_val_if_reached (NULL);
|
|
|
|
|
|
|
|
|
|
obj = nmp_cache_lookup_link_full (nm_platform_get_cache (self),
|
|
|
|
|
0, NULL, TRUE, NM_LINK_TYPE_NONE,
|
|
|
|
|
(NMPObjectMatchFn) _nm_platform_link_get_by_address_match_link, &d);
|
|
|
|
|
return NMP_OBJECT_CAST_LINK (obj);
|
2014-09-18 12:16:11 -05:00
|
|
|
}
|
|
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
static NMPlatformError
|
2015-12-09 15:13:57 +01:00
|
|
|
_link_add_check_existing (NMPlatform *self, const char *name, NMLinkType type, const NMPlatformLink **out_link)
|
2015-06-15 16:19:19 +02:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
|
|
|
|
|
pllink = nm_platform_link_get_by_ifname (self, name);
|
|
|
|
|
if (pllink) {
|
|
|
|
|
gboolean wrong_type;
|
|
|
|
|
|
|
|
|
|
wrong_type = type != NM_LINK_TYPE_NONE && pllink->type != type;
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: skip adding link due to existing interface '%s' of type %s%s%s",
|
2015-06-20 12:05:01 +02:00
|
|
|
name,
|
|
|
|
|
nm_link_type_to_string (pllink->type),
|
|
|
|
|
wrong_type ? ", expected " : "",
|
|
|
|
|
wrong_type ? nm_link_type_to_string (type) : "");
|
|
|
|
|
if (out_link)
|
2015-12-09 15:13:57 +01:00
|
|
|
*out_link = pllink;
|
2015-06-20 12:05:01 +02:00
|
|
|
if (wrong_type)
|
|
|
|
|
return NM_PLATFORM_ERROR_WRONG_TYPE;
|
|
|
|
|
return NM_PLATFORM_ERROR_EXISTS;
|
2015-06-15 16:19:19 +02:00
|
|
|
}
|
2015-12-09 15:13:57 +01:00
|
|
|
if (out_link)
|
|
|
|
|
*out_link = NULL;
|
2015-06-15 16:19:19 +02:00
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @name: Interface name
|
|
|
|
|
* @type: Interface type
|
2017-05-26 14:00:29 +02:00
|
|
|
* @veth_peer: For veths, the peer name
|
2014-05-13 18:13:52 +02:00
|
|
|
* @address: (allow-none): set the mac address of the link
|
|
|
|
|
* @address_len: the length of the @address
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
2014-09-18 12:53:19 -05:00
|
|
|
* Add a software interface. If the interface already exists and is of type
|
2015-06-15 16:19:19 +02:00
|
|
|
* @type, return NM_PLATFORM_ERROR_EXISTS and returns the link
|
2014-09-18 12:53:19 -05:00
|
|
|
* in @out_link. If the interface already exists and is not of type @type,
|
2015-06-15 16:19:19 +02:00
|
|
|
* return NM_PLATFORM_ERROR_WRONG_TYPE.
|
|
|
|
|
*
|
|
|
|
|
* Any link-changed ADDED signal will be emitted directly, before this
|
|
|
|
|
* function finishes.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the error reason or NM_PLATFORM_ERROR_SUCCESS.
|
2013-03-27 22:23:24 +01:00
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
static NMPlatformError
|
2014-09-18 12:53:19 -05:00
|
|
|
nm_platform_link_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
NMLinkType type,
|
2017-05-26 14:00:29 +02:00
|
|
|
const char *veth_peer,
|
2014-09-18 12:53:19 -05:00
|
|
|
const void *address,
|
|
|
|
|
size_t address_len,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError plerr;
|
2017-07-25 13:33:02 +02:00
|
|
|
char addr_buf[NM_UTILS_HWADDR_LEN_MAX * 3];
|
2014-09-18 12:53:19 -05:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
2017-07-25 13:33:02 +02:00
|
|
|
g_return_val_if_fail ((address != NULL) ^ (address_len == 0) , NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (address_len <= NM_UTILS_HWADDR_LEN_MAX, NM_PLATFORM_ERROR_BUG);
|
2017-05-26 14:00:29 +02:00
|
|
|
g_return_val_if_fail ((!!veth_peer) == (type == NM_LINK_TYPE_VETH), NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
plerr = _link_add_check_existing (self, name, type, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-09-25 14:49:43 +02:00
|
|
|
_LOGD ("link: adding link '%s' of type '%s' (%d)"
|
2017-07-25 13:33:02 +02:00
|
|
|
"%s%s" /* address */
|
|
|
|
|
"%s%s" /* veth peer */
|
|
|
|
|
"",
|
|
|
|
|
name,
|
|
|
|
|
nm_link_type_to_string (type),
|
|
|
|
|
(int) type,
|
|
|
|
|
address ? ", address: " : "",
|
|
|
|
|
address ? nm_utils_hwaddr_ntoa_buf (address, address_len, FALSE, addr_buf, sizeof (addr_buf)) : "",
|
|
|
|
|
veth_peer ? ", veth-peer: " : "",
|
|
|
|
|
veth_peer ?: "");
|
|
|
|
|
|
2017-05-26 14:00:29 +02:00
|
|
|
if (!klass->link_add (self, name, type, veth_peer, address, address_len, out_link))
|
2015-06-15 16:19:19 +02:00
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-05-26 14:00:29 +02:00
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_veth_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
const char *peer,
|
|
|
|
|
const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return nm_platform_link_add (self, name, NM_LINK_TYPE_VETH, peer, NULL, 0, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_dummy_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @name: New interface name
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Create a software ethernet-like interface
|
|
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError
|
2015-12-11 13:34:50 +01:00
|
|
|
nm_platform_link_dummy_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-05-26 14:00:29 +02:00
|
|
|
return nm_platform_link_add (self, name, NM_LINK_TYPE_DUMMY, NULL, NULL, 0, out_link);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_delete:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_delete (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
if (!pllink)
|
2013-03-27 22:23:24 +01:00
|
|
|
return FALSE;
|
|
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: deleting '%s' (%d)", pllink->name, ifindex);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_delete (self, ifindex);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-03-08 13:02:58 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_netns:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @netns_fd: the file descriptor for the new netns.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_set_netns (NMPlatform *self, int ifindex, int netns_fd)
|
|
|
|
|
{
|
|
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (netns_fd > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
if (!pllink)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: ifindex %d changing network namespace to %d", ifindex, netns_fd);
|
|
|
|
|
return klass->link_set_netns (self, ifindex, netns_fd);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_index:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @name: Interface name
|
|
|
|
|
*
|
|
|
|
|
* Returns: The interface index corresponding to the given interface name
|
|
|
|
|
* or 0. Inteface name is owned by #NMPlatform, don't free it.
|
|
|
|
|
*/
|
|
|
|
|
int
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_ifindex (NMPlatform *self, const char *name)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get_by_ifname (self, name);
|
|
|
|
|
return pllink ? pllink->ifindex : 0;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-12-26 11:54:30 +01:00
|
|
|
const char *
|
|
|
|
|
nm_platform_if_indextoname (NMPlatform *self, int ifindex, char *out_ifname/* of size IFNAMSIZ */)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_if_indextoname (ifindex, out_ifname);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
nm_platform_if_nametoindex (NMPlatform *self, const char *ifname)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_if_nametoindex (ifname);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_name:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @name: Interface name
|
|
|
|
|
*
|
|
|
|
|
* Returns: The interface name corresponding to the given interface index
|
2013-04-19 15:48:01 +02:00
|
|
|
* or %NULL.
|
2013-03-27 22:23:24 +01:00
|
|
|
*/
|
|
|
|
|
const char *
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_name (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
return pllink ? pllink->name : NULL;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_type:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index.
|
|
|
|
|
*
|
|
|
|
|
* Returns: Link type constant as defined in nm-platform.h. On error,
|
|
|
|
|
* NM_LINK_TYPE_NONE is returned.
|
|
|
|
|
*/
|
|
|
|
|
NMLinkType
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_type (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_LINK_TYPE_NONE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
return pllink ? pllink->type : NM_LINK_TYPE_NONE;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2013-04-26 11:43:08 -04:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_type_name:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-04-26 11:43:08 -04:00
|
|
|
* @ifindex: Interface index.
|
|
|
|
|
*
|
|
|
|
|
* Returns: A string describing the type of link. In some cases this
|
|
|
|
|
* may be more specific than nm_platform_link_get_type(), but in
|
|
|
|
|
* other cases it may not. On error, %NULL is returned.
|
|
|
|
|
*/
|
|
|
|
|
const char *
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_type_name (NMPlatform *self, int ifindex)
|
2013-04-26 11:43:08 -04:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-04-26 11:43:08 -04:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
obj = nm_platform_link_get_obj (self, ifindex, TRUE);
|
|
|
|
|
|
|
|
|
|
if (!obj)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (obj->link.type != NM_LINK_TYPE_UNKNOWN) {
|
|
|
|
|
/* We could detect the @link_type. In this case the function returns
|
|
|
|
|
* our internel module names, which differs from rtnl_link_get_type():
|
|
|
|
|
* - NM_LINK_TYPE_INFINIBAND (gives "infiniband", instead of "ipoib")
|
|
|
|
|
* - NM_LINK_TYPE_TAP (gives "tap", instead of "tun").
|
|
|
|
|
* Note that this functions is only used by NMDeviceGeneric to
|
|
|
|
|
* set type_description. */
|
|
|
|
|
return nm_link_type_to_string (obj->link.type);
|
|
|
|
|
}
|
|
|
|
|
/* Link type not detected. Fallback to rtnl_link_get_type()/IFLA_INFO_KIND. */
|
|
|
|
|
return obj->link.kind ?: "unknown";
|
2013-04-26 11:43:08 -04:00
|
|
|
}
|
|
|
|
|
|
2015-01-22 16:41:15 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_unmanaged:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2015-06-24 14:21:27 +02:00
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @unmanaged: management status (in case %TRUE is returned)
|
2015-01-22 16:41:15 +01:00
|
|
|
*
|
2015-06-24 14:21:27 +02:00
|
|
|
* Returns: %TRUE if platform overrides NM default-unmanaged status,
|
|
|
|
|
* %FALSE otherwise (with @unmanaged unmodified).
|
2015-01-22 16:41:15 +01:00
|
|
|
*/
|
|
|
|
|
gboolean
|
2015-06-24 14:21:27 +02:00
|
|
|
nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *unmanaged)
|
2015-01-22 16:41:15 +01:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *link;
|
|
|
|
|
struct udev_device *udevice = NULL;
|
|
|
|
|
const char *uproperty;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2015-01-22 16:41:15 +01:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
link = nmp_cache_lookup_link (nm_platform_get_cache (self), ifindex);
|
|
|
|
|
if (!link)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
udevice = link->_link.udev.device;
|
|
|
|
|
if (!udevice)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
uproperty = udev_device_get_property_value (udevice, "NM_UNMANAGED");
|
|
|
|
|
if (!uproperty)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
*unmanaged = nm_udev_utils_property_as_boolean (uproperty);
|
|
|
|
|
return TRUE;
|
2015-01-22 16:41:15 +01:00
|
|
|
}
|
|
|
|
|
|
2013-06-20 12:48:44 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_is_software:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-06-20 12:48:44 +02:00
|
|
|
* @ifindex: Interface index.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if ifindex belongs to a software interface, not backed by
|
|
|
|
|
* a physical device.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_is_software (NMPlatform *self, int ifindex)
|
2013-06-20 12:48:44 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return (nm_platform_link_get_type (self, ifindex) & 0x10000);
|
2013-06-20 12:48:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_supports_slaves:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-06-20 12:48:44 +02:00
|
|
|
* @ifindex: Interface index.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if ifindex belongs to an interface capable of enslaving
|
|
|
|
|
* other interfaces.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_supports_slaves (NMPlatform *self, int ifindex)
|
2013-06-20 12:48:44 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return (nm_platform_link_get_type (self, ifindex) & 0x20000);
|
2013-06-20 12:48:44 +02:00
|
|
|
}
|
2013-04-26 11:43:08 -04:00
|
|
|
|
2014-02-11 13:58:00 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_refresh:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2014-02-11 13:58:00 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Reload the cache for ifindex synchronously.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_refresh (NMPlatform *self, int ifindex)
|
2014-02-11 13:58:00 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-11 13:58:00 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
if (klass->link_refresh)
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_refresh (self, ifindex);
|
2014-02-11 13:58:00 +01:00
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-29 15:36:12 +01:00
|
|
|
static guint
|
2015-06-20 12:05:01 +02:00
|
|
|
_link_get_flags (NMPlatform *self, int ifindex)
|
|
|
|
|
{
|
|
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
|
|
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
2016-02-29 15:52:27 +01:00
|
|
|
return pllink ? pllink->n_ifi_flags : IFF_NOARP;
|
2015-06-20 12:05:01 +02:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_is_up:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Check if the interface is up.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_is_up (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
return NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_UP);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_is_connected:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Check if the interface is connected.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_is_connected (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
return pllink ? pllink->connected : FALSE;
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_uses_arp:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Check if the interface is configured to use ARP.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_uses_arp (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
return !NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_NOARP);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-04-30 16:48:32 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_ipv6_token:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @iid: Tokenized interface identifier
|
|
|
|
|
*
|
|
|
|
|
* Sets then IPv6 tokenized interface identifier.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE a tokenized identifier was available
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_set_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6IfaceId iid)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (iid.id, FALSE);
|
|
|
|
|
|
|
|
|
|
if (klass->link_set_token)
|
|
|
|
|
return klass->link_set_token (self, ifindex, iid);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-15 14:41:35 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_link_get_udi (NMPlatform *self, int ifindex)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, NULL);
|
|
|
|
|
|
|
|
|
|
if (klass->link_get_udi)
|
|
|
|
|
return klass->link_get_udi (self, ifindex);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2014-09-27 09:03:56 +02:00
|
|
|
|
2017-03-12 15:54:02 +01:00
|
|
|
struct udev_device *
|
2015-06-15 15:19:28 +02:00
|
|
|
nm_platform_link_get_udev_device (NMPlatform *self, int ifindex)
|
|
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj_cache;
|
|
|
|
|
|
2015-06-15 15:19:28 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, NULL);
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
obj_cache = nm_platform_link_get_obj (self, ifindex, FALSE);
|
|
|
|
|
return obj_cache ? obj_cache->_link.udev.device : NULL;
|
2015-06-15 15:19:28 +02:00
|
|
|
}
|
|
|
|
|
|
2014-07-24 15:57:08 -05:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_user_ip6vll_enabled:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2014-07-24 15:57:08 -05:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Check whether NM handles IPv6LL address creation for the link. If the
|
|
|
|
|
* platform or OS doesn't support changing the IPv6LL address mode, this call
|
|
|
|
|
* will fail and return %FALSE.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if NM handles the IPv6LL address for @ifindex
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex)
|
2014-07-24 15:57:08 -05:00
|
|
|
{
|
2015-10-12 16:07:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-07-24 15:57:08 -05:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
2015-10-12 16:07:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
if (pllink && pllink->inet6_addr_gen_mode_inv)
|
|
|
|
|
return _nm_platform_uint8_inv (pllink->inet6_addr_gen_mode_inv) == NM_IN6_ADDR_GEN_MODE_NONE;
|
2014-07-24 15:57:08 -05:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_user_ip6vll_enabled:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2014-07-24 15:57:08 -05:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Set whether NM handles IPv6LL address creation for the link. If the
|
|
|
|
|
* platform or OS doesn't support changing the IPv6LL address mode, this call
|
|
|
|
|
* will fail and return %FALSE.
|
|
|
|
|
*
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
* Returns: %NM_PLATFORM_ERROR_SUCCESS if the operation was successful or an error code otherwise.
|
2014-07-24 15:57:08 -05:00
|
|
|
*/
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
NMPlatformError
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_user_ipv6ll_enabled (NMPlatform *self, int ifindex, gboolean enabled)
|
2014-07-24 15:57:08 -05:00
|
|
|
{
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
2014-07-24 15:57:08 -05:00
|
|
|
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
g_return_val_if_fail (ifindex > 0, NM_PLATFORM_ERROR_BUG);
|
2014-07-24 15:57:08 -05:00
|
|
|
|
device: tune down warning about failure to set userspace IPv6LL on non-existing device
When a device gets removed externally, we still try to clear userspace IPv6LL address handling.
That fails, due to non-existing device. Such a failure should not be logged as warning.
<debug> [1467723214.2078] device[0x558c59335ca0] (enp0s25): disposing
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'dhcp6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): remove_pending_action (0): 'autoconf6' not pending (expected)
<debug> [1467723214.2079] device[0x558c59335ca0] (enp0s25): will disable userland IPv6LL
<debug> [1467723214.2079] platform-linux: link: change 20: user-ipv6ll: set IPv6 address generation mode to eui64
<trace> [1467723214.2080] platform-linux: delayed-action: schedule wait-for-nl-response (seq 92, timeout in 0.199998611)
<trace> [1467723214.2080] platform-linux: delayed-action: schedule refresh-link (ifindex 20)
<trace> [1467723214.2080] platform-linux: delayed-action: handle refresh-link (ifindex 20)
<debug> [1467723214.2080] platform-linux: do-request-link: 20
<trace> [1467723214.2080] platform-linux: netlink: recvmsg: new message type 2, seq 92
<debug> [1467723214.2080] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 92
<trace> [1467723214.2081] platform-linux: delayed-action: complete wait-for-nl-response (seq 92, timeout in 0.199895684, failure 19 (No such device))
<trace> [1467723214.2081] platform-linux: delayed-action: schedule wait-for-nl-response (seq 93, timeout in 0.199999306)
<trace> [1467723214.2081] platform-linux: delayed-action: handle wait-for-nl-response (any)
<trace> [1467723214.2081] platform-linux: netlink: recvmsg: new message type 2, seq 93
<debug> [1467723214.2081] platform-linux: netlink: recvmsg: error message from kernel: No such device (19) for request 93
<trace> [1467723214.2082] platform-linux: delayed-action: complete wait-for-nl-response (seq 93, timeout in 0.199921142, failure 19 (No such device))
<debug> [1467723214.2082] platform-linux: do-change-link[20]: failure changing link: failure 19 (No such device)
<warn> [1467723214.2082] device (enp0s25): failed to disable userspace IPv6LL address handling
https://bugzilla.redhat.com/show_bug.cgi?id=1323571
2016-07-05 15:04:37 +02:00
|
|
|
return klass->link_set_user_ipv6ll_enabled (self, ifindex, enabled);
|
2014-07-24 15:57:08 -05:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_address:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @address: The new MAC address
|
|
|
|
|
*
|
|
|
|
|
* Set interface MAC address.
|
|
|
|
|
*/
|
2016-07-05 10:41:18 +02:00
|
|
|
NMPlatformError
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_address (NMPlatform *self, int ifindex, gconstpointer address, size_t length)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2016-07-05 10:41:18 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2016-07-05 10:41:18 +02:00
|
|
|
g_return_val_if_fail (ifindex > 0, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (address, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (length > 0, NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2016-07-05 10:41:18 +02:00
|
|
|
_LOGD ("link: setting %s (%d) hardware address",
|
|
|
|
|
nm_strquote_a (20, nm_platform_link_get_name (self, ifindex)),
|
|
|
|
|
ifindex);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_set_address (self, ifindex, address, length);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_address:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @length: Pointer to a variable to store address length
|
|
|
|
|
*
|
2014-10-03 17:37:26 -05:00
|
|
|
* Returns: the interface hardware address as an array of bytes of
|
|
|
|
|
* length @length.
|
2013-03-27 22:53:55 +01:00
|
|
|
*/
|
|
|
|
|
gconstpointer
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
gconstpointer a = NULL;
|
|
|
|
|
guint8 l = 0;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
|
|
|
|
if (length)
|
|
|
|
|
*length = 0;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, NULL);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
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;
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 17:37:26 -05:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_permanent_address:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @buf: buffer of at least %NM_UTILS_HWADDR_LEN_MAX bytes, on success
|
|
|
|
|
* the permanent hardware address
|
|
|
|
|
* @length: Pointer to a variable to store address length
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on failure to read the permanent hardware
|
|
|
|
|
* address.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_get_permanent_address (NMPlatform *self, int ifindex, guint8 *buf, size_t *length)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
if (length)
|
|
|
|
|
*length = 0;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (buf, FALSE);
|
|
|
|
|
g_return_val_if_fail (length, FALSE);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
if (klass->link_get_permanent_address)
|
|
|
|
|
return klass->link_get_permanent_address (self, ifindex, buf, length);
|
|
|
|
|
return FALSE;
|
2014-10-03 17:37:26 -05:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_supports_carrier_detect (NMPlatform *self, int ifindex)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_supports_carrier_detect (self, ifindex);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_supports_vlans (NMPlatform *self, int ifindex)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_supports_vlans (self, ifindex);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2017-04-14 23:03:33 +02:00
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_supports_sriov (NMPlatform *self, int ifindex)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
|
|
|
|
return klass->link_supports_sriov (self, ifindex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_set_sriov_num_vfs (NMPlatform *self, int ifindex, guint num_vfs)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: setting %u VFs for %s (%d)",
|
|
|
|
|
num_vfs,
|
|
|
|
|
nm_strquote_a (25, nm_platform_link_get_name (self, ifindex)),
|
|
|
|
|
ifindex);
|
|
|
|
|
return klass->link_set_sriov_num_vfs (self, ifindex, num_vfs);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_up:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
2015-06-15 17:41:27 +02:00
|
|
|
* @out_no_firmware: (allow-none): if the failure reason is due to missing firmware.
|
2013-03-27 22:23:24 +01:00
|
|
|
*
|
|
|
|
|
* Bring the interface up.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2015-06-15 17:41:27 +02:00
|
|
|
nm_platform_link_set_up (NMPlatform *self, int ifindex, gboolean *out_no_firmware)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
2017-02-10 17:15:03 +01:00
|
|
|
_LOGD ("link: setting up %s (%d)", nm_strquote_a (25, nm_platform_link_get_name (self, ifindex)), ifindex);
|
2015-06-15 17:41:27 +02:00
|
|
|
return klass->link_set_up (self, ifindex, out_no_firmware);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_down:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Take the interface down.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_down (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
2017-02-10 17:15:03 +01:00
|
|
|
_LOGD ("link: setting down %s (%d)", nm_strquote_a (25, nm_platform_link_get_name (self, ifindex)), ifindex);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_set_down (self, ifindex);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_arp:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Enable ARP on the interface.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_arp (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
2017-02-10 17:15:03 +01:00
|
|
|
_LOGD ("link: setting arp %s (%d)", nm_strquote_a (25, nm_platform_link_get_name (self, ifindex)), ifindex);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_set_arp (self, ifindex);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_noarp:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:23:24 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Disable ARP on the interface.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_noarp (NMPlatform *self, int ifindex)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: setting noarp '%s' (%d)", nm_platform_link_get_name (self, ifindex), ifindex);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_set_noarp (self, ifindex);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2013-04-15 21:48:12 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_mtu:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-04-15 21:48:12 +02:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @mtu: The new MTU value
|
|
|
|
|
*
|
|
|
|
|
* Set interface MTU.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_set_mtu (NMPlatform *self, int ifindex, guint32 mtu)
|
2013-04-15 21:48:12 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-04-15 21:48:12 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (mtu > 0, FALSE);
|
|
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: setting '%s' (%d) mtu %"G_GUINT32_FORMAT, nm_platform_link_get_name (self, ifindex), ifindex, mtu);
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->link_set_mtu (self, ifindex, mtu);
|
2013-04-15 21:48:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_mtu:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-04-15 21:48:12 +02:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Returns: MTU value for the interface or 0 on error.
|
|
|
|
|
*/
|
|
|
|
|
guint32
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_mtu (NMPlatform *self, int ifindex)
|
2013-04-15 21:48:12 +02:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
2013-04-15 21:48:12 +02:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2013-04-15 21:48:12 +02:00
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
return pllink ? pllink->mtu : 0;
|
2013-04-15 21:48:12 +02:00
|
|
|
}
|
|
|
|
|
|
2017-07-03 10:10:34 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_set_name:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @name: The new interface name
|
|
|
|
|
*
|
|
|
|
|
* Set interface name.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_set_name (NMPlatform *self, int ifindex, const char *name)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (name, FALSE);
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: setting '%s' (%d) name %s", nm_platform_link_get_name (self, ifindex), ifindex, name);
|
|
|
|
|
|
|
|
|
|
if (strlen (name) + 1 > IFNAMSIZ)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
return klass->link_set_name (self, ifindex, name);
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-11 14:59:26 -04:00
|
|
|
/**
|
2015-03-24 12:18:48 -05:00
|
|
|
* nm_platform_link_get_physical_port_id:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-10-11 14:59:26 -04:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
2015-03-24 12:18:48 -05:00
|
|
|
* The physical port ID, if present, indicates some unique identifier of
|
|
|
|
|
* the parent interface (eg, the physical port of which this link is a child).
|
|
|
|
|
* Two links that report the same physical port ID can be assumed to be
|
|
|
|
|
* children of the same physical port and may share resources that limit
|
|
|
|
|
* their abilities.
|
|
|
|
|
*
|
2013-10-11 14:59:26 -04:00
|
|
|
* Returns: physical port ID for the interface, or %NULL on error
|
|
|
|
|
* or if the interface has no physical port ID.
|
|
|
|
|
*/
|
|
|
|
|
char *
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_physical_port_id (NMPlatform *self, int ifindex)
|
2013-10-11 14:59:26 -04:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-10-11 14:59:26 -04:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, NULL);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
if (klass->link_get_physical_port_id)
|
|
|
|
|
return klass->link_get_physical_port_id (self, ifindex);
|
|
|
|
|
return NULL;
|
2013-10-11 14:59:26 -04:00
|
|
|
}
|
|
|
|
|
|
2015-03-24 12:35:36 -05:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_dev_id:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2015-03-24 12:35:36 -05:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* In contrast to the physical device ID (which indicates which parent a
|
|
|
|
|
* child has) the device ID differentiates sibling devices that may share
|
|
|
|
|
* the same MAC address.
|
|
|
|
|
*
|
|
|
|
|
* Returns: device ID for the interface, or 0 on error or if the
|
|
|
|
|
* interface has no device ID.
|
|
|
|
|
*/
|
|
|
|
|
guint
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_dev_id (NMPlatform *self, int ifindex)
|
2015-03-24 12:35:36 -05:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2015-03-24 12:35:36 -05:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, 0);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
if (klass->link_get_dev_id)
|
|
|
|
|
return klass->link_get_dev_id (self, ifindex);
|
|
|
|
|
return 0;
|
2015-03-24 12:35:36 -05:00
|
|
|
}
|
|
|
|
|
|
2014-02-05 11:56:44 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_wake_onlan:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2014-02-05 11:56:44 +01:00
|
|
|
* @ifindex: Interface index
|
|
|
|
|
*
|
|
|
|
|
* Returns: the "Wake-on-LAN" status for @ifindex.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_wake_on_lan (NMPlatform *self, int ifindex)
|
2014-02-05 11:56:44 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-05 11:56:44 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
if (klass->link_get_wake_on_lan)
|
|
|
|
|
return klass->link_get_wake_on_lan (self, ifindex);
|
|
|
|
|
return FALSE;
|
2014-02-05 11:56:44 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 13:41:49 -05:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_driver_info:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @ifindex: Interface index
|
|
|
|
|
* @out_driver_name: (transfer full): on success, the driver name if available
|
|
|
|
|
* @out_driver_version: (transfer full): on success, the driver version if available
|
|
|
|
|
* @out_fw_version: (transfer full): on success, the firmware version if available
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success (though @out_driver_name, @out_driver_version and
|
|
|
|
|
* @out_fw_version can be %NULL if no information was available), %FALSE on
|
|
|
|
|
* failure.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_get_driver_info (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
char **out_driver_name,
|
|
|
|
|
char **out_driver_version,
|
|
|
|
|
char **out_fw_version)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex >= 0, FALSE);
|
|
|
|
|
|
|
|
|
|
return klass->link_get_driver_info (self,
|
|
|
|
|
ifindex,
|
|
|
|
|
out_driver_name,
|
|
|
|
|
out_driver_version,
|
|
|
|
|
out_fw_version);
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_enslave:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @master: Interface index of the master
|
|
|
|
|
* @slave: Interface index of the slave
|
|
|
|
|
*
|
|
|
|
|
* Enslave @slave to @master.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_enslave (NMPlatform *self, int master, int slave)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (master > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (slave> 0, FALSE);
|
|
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: enslaving '%s' (%d) to master '%s' (%d)",
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_name (self, slave), slave,
|
|
|
|
|
nm_platform_link_get_name (self, master), master);
|
|
|
|
|
return klass->link_enslave (self, master, slave);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_release:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @master: Interface index of the master
|
|
|
|
|
* @slave: Interface index of the slave
|
|
|
|
|
*
|
|
|
|
|
* Release @slave from @master.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_release (NMPlatform *self, int master, int slave)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (master > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (slave > 0, FALSE);
|
|
|
|
|
|
platform: drop nm_platform_get_error()
For NMPlatform instances we had an error reporting mechanism
which stores the last error reason in a private field. Later we
would check it via nm_platform_get_error().
Remove this. It was not used much, and it is not a great way
to report errors.
One problem is that at the point where the error happens, you don't
know whether anybody cares about an error code. So, you add code to set
the error reason because somebody *might* need it (but in realitiy, almost
no caller cares).
Also, we tested this functionality which is hardly used in non-testing code.
While this was a burden to maintain in the tests, it was likely still buggy
because there were no real use-cases, beside the tests.
Then, sometimes platform functions call each other which might overwrite the
error reason. So, every function must be cautious to preserve/set
the error reason according to it's own meaning. This can involve storing
the error code, calling another function, and restoring it afterwards.
This is harder to get right compared to a "return-error-code" pattern, where
every function manages its error code independently.
It is better to return the error reason whenever due. For that we already
have our common glib patterns
(1) gboolean fcn (...);
(2) gboolean fcn (..., GError **error);
In few cases, we need more details then a #gboolean, but don't want
to bother constructing a #GError. Then we should do instead:
(3) NMPlatformError fcn (...);
2015-06-15 17:58:36 +02:00
|
|
|
if (nm_platform_link_get_master (self, slave) != master)
|
2013-03-27 22:53:55 +01:00
|
|
|
return FALSE;
|
|
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: releasing '%s' (%d) from master '%s' (%d)",
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_name (self, slave), slave,
|
|
|
|
|
nm_platform_link_get_name (self, master), master);
|
|
|
|
|
return klass->link_release (self, master, slave);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_master:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @slave: Interface index of the slave.
|
|
|
|
|
*
|
2017-05-11 12:08:02 +02:00
|
|
|
* Returns: Interface index of the slave's master.
|
2013-03-27 22:53:55 +01:00
|
|
|
*/
|
|
|
|
|
int
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_link_get_master (NMPlatform *self, int slave)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2015-06-20 12:05:01 +02:00
|
|
|
const NMPlatformLink *pllink;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (slave >= 0, FALSE);
|
|
|
|
|
|
2015-06-20 12:05:01 +02:00
|
|
|
pllink = nm_platform_link_get (self, slave);
|
|
|
|
|
return pllink ? pllink->master : 0;
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2016-03-21 15:22:10 +01:00
|
|
|
gboolean
|
|
|
|
|
nm_platform_link_can_assume (NMPlatform *self, int ifindex)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
if (klass->link_can_assume)
|
|
|
|
|
return klass->link_can_assume (self, ifindex);
|
|
|
|
|
g_return_val_if_reached (FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-10-29 11:27:55 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_get_lnk:
|
|
|
|
|
* @self: the platform instance
|
|
|
|
|
* @ifindex: the link ifindex to lookup
|
|
|
|
|
* @link_type: filter by link-type.
|
|
|
|
|
* @out_link: (allow-none): returns the platform link instance
|
|
|
|
|
*
|
|
|
|
|
* If the function returns %NULL, that could mean that no such ifindex
|
|
|
|
|
* exists, of that the link has no lnk data. You can find that out
|
|
|
|
|
* by checking @out_link. @out_link will always be set if a link
|
|
|
|
|
* with @ifindex exists.
|
|
|
|
|
*
|
|
|
|
|
* If @link_type is %NM_LINK_TYPE_NONE, the function returns the lnk
|
|
|
|
|
* object if it is present. If you set link-type, you can be sure
|
|
|
|
|
* that only a link type of the matching type is returned (or %NULL).
|
|
|
|
|
*
|
|
|
|
|
* Returns: the internal link lnk object. The returned object
|
|
|
|
|
* is owned by the platform cache and must not be modified. Note
|
|
|
|
|
* however, that the object is guaranteed to be immutable, so
|
|
|
|
|
* you can savely take a reference and keep it for yourself
|
|
|
|
|
* (but don't modify it).
|
|
|
|
|
*/
|
|
|
|
|
const NMPObject *
|
2015-10-12 13:44:44 +02:00
|
|
|
nm_platform_link_get_lnk (NMPlatform *self, int ifindex, NMLinkType link_type, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
NM_SET_OUT (out_link, NULL);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, NULL);
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
obj = nm_platform_link_get_obj (self, ifindex, TRUE);
|
|
|
|
|
if (!obj)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
NM_SET_OUT (out_link, &obj->link);
|
|
|
|
|
|
|
|
|
|
if (!obj->_link.netlink.lnk)
|
|
|
|
|
return NULL;
|
|
|
|
|
if ( link_type != NM_LINK_TYPE_NONE
|
|
|
|
|
&& ( link_type != obj->link.type
|
|
|
|
|
|| link_type != NMP_OBJECT_GET_CLASS (obj->_link.netlink.lnk)->lnk_link_type))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
return obj->_link.netlink.lnk;
|
2015-10-12 13:44:44 +02:00
|
|
|
}
|
|
|
|
|
|
2015-10-29 11:27:55 +01:00
|
|
|
static gconstpointer
|
|
|
|
|
_link_get_lnk (NMPlatform *self, int ifindex, NMLinkType link_type, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
const NMPObject *lnk;
|
|
|
|
|
|
|
|
|
|
lnk = nm_platform_link_get_lnk (self, ifindex, link_type, out_link);
|
|
|
|
|
return lnk ? &lnk->object : NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const NMPlatformLnkGre *
|
|
|
|
|
nm_platform_link_get_lnk_gre (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2015-10-29 11:27:55 +01:00
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_GRE, out_link);
|
2015-10-12 15:15:21 +02:00
|
|
|
}
|
|
|
|
|
|
2015-10-15 15:47:14 +02:00
|
|
|
const NMPlatformLnkInfiniband *
|
|
|
|
|
nm_platform_link_get_lnk_infiniband (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2015-10-29 11:27:55 +01:00
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_INFINIBAND, out_link);
|
2015-10-15 15:47:14 +02:00
|
|
|
}
|
|
|
|
|
|
2015-11-27 22:22:25 +01:00
|
|
|
const NMPlatformLnkIp6Tnl *
|
|
|
|
|
nm_platform_link_get_lnk_ip6tnl (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IP6TNL, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 14:01:56 +01:00
|
|
|
const NMPlatformLnkIpIp *
|
|
|
|
|
nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IPIP, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-30 18:20:09 +02:00
|
|
|
const NMPlatformLnkMacsec *
|
|
|
|
|
nm_platform_link_get_lnk_macsec (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_MACSEC, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const NMPlatformLnkMacvlan *
|
|
|
|
|
nm_platform_link_get_lnk_macvlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2015-10-29 11:27:55 +01:00
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_MACVLAN, out_link);
|
2015-10-12 15:15:21 +02:00
|
|
|
}
|
|
|
|
|
|
2015-12-04 09:49:39 +01:00
|
|
|
const NMPlatformLnkMacvtap *
|
|
|
|
|
nm_platform_link_get_lnk_macvtap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_MACVTAP, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-11 18:41:48 +01:00
|
|
|
const NMPlatformLnkSit *
|
|
|
|
|
nm_platform_link_get_lnk_sit (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_SIT, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
const NMPlatformLnkVlan *
|
|
|
|
|
nm_platform_link_get_lnk_vlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2015-10-29 11:27:55 +01:00
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_VLAN, out_link);
|
2015-10-12 13:44:44 +02:00
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const NMPlatformLnkVxlan *
|
|
|
|
|
nm_platform_link_get_lnk_vxlan (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
|
|
|
|
{
|
2015-10-29 11:27:55 +01:00
|
|
|
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_VXLAN, out_link);
|
2015-10-12 15:15:21 +02:00
|
|
|
}
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_bridge_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @name: New interface name
|
2014-05-13 18:13:52 +02:00
|
|
|
* @address: (allow-none): set the mac address of the new bridge
|
|
|
|
|
* @address_len: the length of the @address
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:53:55 +01:00
|
|
|
*
|
2013-06-26 21:23:25 +02:00
|
|
|
* Create a software bridge.
|
2013-03-27 22:53:55 +01:00
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_bridge_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
const void *address,
|
|
|
|
|
size_t address_len,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2017-05-26 14:00:29 +02:00
|
|
|
return nm_platform_link_add (self, name, NM_LINK_TYPE_BRIDGE, NULL, address, address_len, out_link);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_bond_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @name: New interface name
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:53:55 +01:00
|
|
|
*
|
2013-06-26 21:23:25 +02:00
|
|
|
* Create a software bonding device.
|
2013-03-27 22:53:55 +01:00
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError
|
2015-12-11 13:34:50 +01:00
|
|
|
nm_platform_link_bond_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2017-05-26 14:00:29 +02:00
|
|
|
return nm_platform_link_add (self, name, NM_LINK_TYPE_BOND, NULL, NULL, 0, out_link);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_team_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @name: New interface name
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:53:55 +01:00
|
|
|
*
|
2013-06-26 21:23:25 +02:00
|
|
|
* Create a software teaming device.
|
2013-03-27 22:53:55 +01:00
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError
|
2015-12-11 13:34:50 +01:00
|
|
|
nm_platform_link_team_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2017-05-26 14:00:29 +02:00
|
|
|
return nm_platform_link_add (self, name, NM_LINK_TYPE_TEAM, NULL, NULL, 0, out_link);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_vlan_add:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-03-27 22:53:55 +01:00
|
|
|
* @name: New interface name
|
|
|
|
|
* @vlanid: VLAN identifier
|
2014-05-19 13:44:02 -04:00
|
|
|
* @vlanflags: VLAN flags from libnm
|
2014-09-18 12:53:19 -05:00
|
|
|
* @out_link: on success, the link object
|
2013-03-27 22:53:55 +01:00
|
|
|
*
|
|
|
|
|
* Create a software VLAN device.
|
|
|
|
|
*/
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_vlan_add (NMPlatform *self,
|
2015-12-11 13:34:50 +01:00
|
|
|
const char *name,
|
|
|
|
|
int parent,
|
|
|
|
|
int vlanid,
|
|
|
|
|
guint32 vlanflags,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError plerr;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
g_return_val_if_fail (parent >= 0, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (vlanid >= 0, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_VLAN, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("link: adding vlan '%s' parent %d vlanid %d vlanflags %x",
|
2015-06-15 16:19:19 +02:00
|
|
|
name, parent, vlanid, vlanflags);
|
|
|
|
|
if (!klass->vlan_add (self, name, parent, vlanid, vlanflags, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2015-10-14 10:01:48 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_vxlan_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: New interface name
|
|
|
|
|
* @props: properties of the new link
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create a VXLAN device.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_vxlan_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkVxlan *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-10-14 10:01:48 +02:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_VXLAN, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: adding vxlan '%s' parent %d id %d",
|
|
|
|
|
name, props->parent_ifindex, props->id);
|
|
|
|
|
if (!klass->link_vxlan_add (self, name, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 15:07:37 +02:00
|
|
|
/**
|
2015-12-09 16:14:49 +01:00
|
|
|
* nm_platform_link_tun_add:
|
2015-09-15 15:07:37 +02:00
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: new interface name
|
|
|
|
|
* @tap: whether the interface is a TAP
|
|
|
|
|
* @owner: interface owner or -1
|
|
|
|
|
* @group: interface group or -1
|
|
|
|
|
* @pi: whether to clear the IFF_NO_PI flag
|
|
|
|
|
* @vnet_hdr: whether to set the IFF_VNET_HDR flag
|
|
|
|
|
* @multi_queue: whether to set the IFF_MULTI_QUEUE flag
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create a TUN or TAP interface.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_tun_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
gboolean tap,
|
|
|
|
|
gint64 owner,
|
|
|
|
|
gint64 group,
|
|
|
|
|
gboolean pi,
|
|
|
|
|
gboolean vnet_hdr,
|
|
|
|
|
gboolean multi_queue,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2015-09-15 15:07:37 +02:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, tap ? NM_LINK_TYPE_TAP : NM_LINK_TYPE_TUN, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: adding %s '%s' owner %" G_GINT64_FORMAT " group %" G_GINT64_FORMAT,
|
|
|
|
|
tap ? "tap" : "tun", name, owner, group);
|
|
|
|
|
if (!klass->tun_add (self, name, tap, owner, group, pi, vnet_hdr, multi_queue, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-09 17:29:46 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2016-12-09 13:03:43 +01:00
|
|
|
static gboolean
|
|
|
|
|
link_set_option (NMPlatform *self, int ifindex, const char *category, const char *option, const char *value)
|
2015-12-09 17:29:46 +01:00
|
|
|
{
|
2016-12-09 13:03:43 +01:00
|
|
|
nm_auto_close int dirfd = -1;
|
|
|
|
|
char ifname_verified[IFNAMSIZ];
|
|
|
|
|
const char *path;
|
2015-12-09 17:29:46 +01:00
|
|
|
|
2016-12-09 13:03:43 +01:00
|
|
|
if (!category || !option)
|
|
|
|
|
return FALSE;
|
2015-12-09 17:29:46 +01:00
|
|
|
|
2016-12-09 13:03:43 +01:00
|
|
|
dirfd = nm_platform_sysctl_open_netdir (self, ifindex, ifname_verified);
|
|
|
|
|
if (dirfd < 0)
|
|
|
|
|
return FALSE;
|
2015-12-09 17:29:46 +01:00
|
|
|
|
2016-12-09 13:03:43 +01:00
|
|
|
path = nm_sprintf_bufa (strlen (category) + strlen (option) + 2,
|
|
|
|
|
"%s/%s",
|
|
|
|
|
category, option);
|
|
|
|
|
return nm_platform_sysctl_set (self, NMP_SYSCTL_PATHID_NETDIR_unsafe (dirfd, ifname_verified, path), value);
|
2015-12-09 17:29:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char *
|
2016-12-09 13:03:43 +01:00
|
|
|
link_get_option (NMPlatform *self, int ifindex, const char *category, const char *option)
|
2015-12-09 17:29:46 +01:00
|
|
|
{
|
2016-12-09 13:03:43 +01:00
|
|
|
nm_auto_close int dirfd = -1;
|
|
|
|
|
char ifname_verified[IFNAMSIZ];
|
|
|
|
|
const char *path;
|
|
|
|
|
|
|
|
|
|
if (!category || !option)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
dirfd = nm_platform_sysctl_open_netdir (self, ifindex, ifname_verified);
|
|
|
|
|
if (dirfd < 0)
|
|
|
|
|
return NULL;
|
2015-12-09 17:29:46 +01:00
|
|
|
|
2016-12-09 13:03:43 +01:00
|
|
|
path = nm_sprintf_bufa (strlen (category) + strlen (option) + 2,
|
|
|
|
|
"%s/%s",
|
|
|
|
|
category, option);
|
|
|
|
|
return nm_platform_sysctl_get (self, NMP_SYSCTL_PATHID_NETDIR_unsafe (dirfd, ifname_verified, path));
|
2015-12-09 17:29:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
|
master_category (NMPlatform *self, int master)
|
|
|
|
|
{
|
|
|
|
|
switch (nm_platform_link_get_type (self, master)) {
|
|
|
|
|
case NM_LINK_TYPE_BRIDGE:
|
|
|
|
|
return "bridge";
|
|
|
|
|
case NM_LINK_TYPE_BOND:
|
|
|
|
|
return "bonding";
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
|
slave_category (NMPlatform *self, int slave)
|
|
|
|
|
{
|
|
|
|
|
int master = nm_platform_link_get_master (self, slave);
|
|
|
|
|
|
|
|
|
|
if (master <= 0)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
switch (nm_platform_link_get_type (self, master)) {
|
|
|
|
|
case NM_LINK_TYPE_BRIDGE:
|
|
|
|
|
return "brport";
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-04 17:07:47 +02:00
|
|
|
gboolean
|
2015-12-09 17:33:30 +01:00
|
|
|
nm_platform_sysctl_master_set_option (NMPlatform *self, int ifindex, const char *option, const char *value)
|
2013-04-04 17:07:47 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-04-04 17:07:47 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (option, FALSE);
|
|
|
|
|
g_return_val_if_fail (value, FALSE);
|
|
|
|
|
|
2015-12-09 17:29:46 +01:00
|
|
|
return link_set_option (self, ifindex, master_category (self, ifindex), option, value);
|
2013-04-04 17:07:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *
|
2015-12-09 17:33:30 +01:00
|
|
|
nm_platform_sysctl_master_get_option (NMPlatform *self, int ifindex, const char *option)
|
2013-04-04 17:07:47 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-04-04 17:07:47 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (option, FALSE);
|
|
|
|
|
|
2015-12-09 17:29:46 +01:00
|
|
|
return link_get_option (self, ifindex, master_category (self, ifindex), option);
|
2013-04-04 17:07:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2015-12-09 17:33:30 +01:00
|
|
|
nm_platform_sysctl_slave_set_option (NMPlatform *self, int ifindex, const char *option, const char *value)
|
2013-04-04 17:07:47 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-04-04 17:07:47 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (option, FALSE);
|
|
|
|
|
g_return_val_if_fail (value, FALSE);
|
|
|
|
|
|
2015-12-09 17:29:46 +01:00
|
|
|
return link_set_option (self, ifindex, slave_category (self, ifindex), option, value);
|
2013-04-04 17:07:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *
|
2015-12-09 17:33:30 +01:00
|
|
|
nm_platform_sysctl_slave_get_option (NMPlatform *self, int ifindex, const char *option)
|
2013-04-04 17:07:47 +02:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-04-04 17:07:47 +02:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (option, FALSE);
|
|
|
|
|
|
2015-12-09 17:29:46 +01:00
|
|
|
return link_get_option (self, ifindex, slave_category (self, ifindex), option);
|
2013-04-04 17:07:47 +02:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-12-09 17:29:46 +01:00
|
|
|
|
2013-03-27 22:53:55 +01:00
|
|
|
gboolean
|
2015-10-27 16:14:54 +01:00
|
|
|
nm_platform_link_vlan_change (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
NMVlanFlags flags_mask,
|
|
|
|
|
NMVlanFlags flags_set,
|
|
|
|
|
gboolean ingress_reset_all,
|
|
|
|
|
const NMVlanQosMapping *ingress_map,
|
|
|
|
|
gsize n_ingress_map,
|
|
|
|
|
gboolean egress_reset_all,
|
|
|
|
|
const NMVlanQosMapping *egress_map,
|
|
|
|
|
gsize n_egress_map)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
nm_assert (klass->link_vlan_change);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (!n_ingress_map || ingress_map, FALSE);
|
|
|
|
|
g_return_val_if_fail (!n_egress_map || egress_map, FALSE);
|
|
|
|
|
|
|
|
|
|
flags_set &= flags_mask;
|
|
|
|
|
|
|
|
|
|
if (_LOGD_ENABLED ()) {
|
|
|
|
|
char buf[512];
|
|
|
|
|
char *b = buf;
|
|
|
|
|
gsize len, i;
|
|
|
|
|
|
|
|
|
|
b[0] = '\0';
|
|
|
|
|
len = sizeof (buf);
|
|
|
|
|
|
|
|
|
|
if (flags_mask)
|
|
|
|
|
nm_utils_strbuf_append (&b, &len, " flags 0x%x/0x%x", (unsigned) flags_set, (unsigned) flags_mask);
|
|
|
|
|
|
|
|
|
|
if (ingress_reset_all || n_ingress_map) {
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " ingress-qos-map");
|
|
|
|
|
nm_platform_vlan_qos_mapping_to_string ("", ingress_map, n_ingress_map, b, len);
|
|
|
|
|
i = strlen (b);
|
|
|
|
|
b += i;
|
|
|
|
|
len -= i;
|
|
|
|
|
if (ingress_reset_all)
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " (reset-all)");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (egress_reset_all || n_egress_map) {
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " egress-qos-map");
|
|
|
|
|
nm_platform_vlan_qos_mapping_to_string ("", egress_map, n_egress_map, b, len);
|
|
|
|
|
i = strlen (b);
|
|
|
|
|
b += i;
|
|
|
|
|
len -= i;
|
|
|
|
|
if (egress_reset_all)
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " (reset-all)");
|
|
|
|
|
}
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
_LOGD ("link: change vlan %d:%s", ifindex, buf);
|
|
|
|
|
}
|
|
|
|
|
return klass->link_vlan_change (self,
|
|
|
|
|
ifindex,
|
|
|
|
|
flags_mask,
|
|
|
|
|
flags_set,
|
|
|
|
|
ingress_reset_all,
|
|
|
|
|
ingress_map,
|
|
|
|
|
n_ingress_map,
|
|
|
|
|
egress_reset_all,
|
|
|
|
|
egress_map,
|
|
|
|
|
n_egress_map);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_vlan_set_ingress_map (NMPlatform *self, int ifindex, int from, int to)
|
2013-03-27 22:53:55 +01:00
|
|
|
{
|
2015-10-27 16:14:54 +01:00
|
|
|
NMVlanQosMapping map = {
|
|
|
|
|
.from = from,
|
|
|
|
|
.to = to,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return nm_platform_link_vlan_change (self, ifindex, 0, 0, FALSE, &map, 1, FALSE, NULL, 0);
|
|
|
|
|
}
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
gboolean
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_vlan_set_egress_map (NMPlatform *self, int ifindex, int from, int to)
|
2015-10-27 16:14:54 +01:00
|
|
|
{
|
|
|
|
|
NMVlanQosMapping map = {
|
|
|
|
|
.from = from,
|
|
|
|
|
.to = to,
|
|
|
|
|
};
|
2013-03-27 22:53:55 +01:00
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
return nm_platform_link_vlan_change (self, ifindex, 0, 0, FALSE, NULL, 0, FALSE, &map, 1);
|
2013-03-27 22:53:55 +01:00
|
|
|
}
|
|
|
|
|
|
2015-09-01 22:11:47 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_gre_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create a software GRE device.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_gre_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkGre *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-09-01 22:11:47 +02:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
char buffer[INET_ADDRSTRLEN];
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_GRE, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD (LOG_FMT_IP_TUNNEL,
|
|
|
|
|
"gre",
|
|
|
|
|
name,
|
|
|
|
|
props->parent_ifindex,
|
|
|
|
|
nm_utils_inet4_ntop (props->local, NULL),
|
|
|
|
|
nm_utils_inet4_ntop (props->remote, buffer));
|
|
|
|
|
|
|
|
|
|
if (!klass->link_gre_add (self, name, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-20 09:16:21 +02:00
|
|
|
static NMPlatformError
|
|
|
|
|
_infiniband_add_add_or_delete (NMPlatform *self,
|
|
|
|
|
int parent,
|
|
|
|
|
int p_key,
|
|
|
|
|
gboolean add,
|
|
|
|
|
const NMPlatformLink **out_link)
|
2013-06-10 16:21:08 -03:00
|
|
|
{
|
2016-04-20 11:28:38 +02:00
|
|
|
char name[IFNAMSIZ];
|
2016-04-20 10:07:03 +02:00
|
|
|
const NMPlatformLink *parent_link;
|
2015-06-15 16:19:19 +02:00
|
|
|
NMPlatformError plerr;
|
2013-06-10 16:21:08 -03:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
2013-06-10 16:21:08 -03:00
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
g_return_val_if_fail (parent >= 0, NM_PLATFORM_ERROR_BUG);
|
2016-04-20 11:44:23 +02:00
|
|
|
g_return_val_if_fail (p_key >= 0 && p_key <= 0xffff, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
/* the special keys 0x0000 and 0x8000 are not allowed. */
|
|
|
|
|
if (NM_IN_SET (p_key, 0, 0x8000))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
2013-06-10 16:21:08 -03:00
|
|
|
|
2016-04-20 10:07:03 +02:00
|
|
|
parent_link = nm_platform_link_get (self, parent);
|
|
|
|
|
if (!parent_link)
|
|
|
|
|
return NM_PLATFORM_ERROR_NOT_FOUND;
|
|
|
|
|
|
|
|
|
|
if (parent_link->type != NM_LINK_TYPE_INFINIBAND)
|
2015-06-15 16:19:19 +02:00
|
|
|
return NM_PLATFORM_ERROR_WRONG_TYPE;
|
2013-06-10 16:21:08 -03:00
|
|
|
|
2016-04-20 11:28:38 +02:00
|
|
|
nm_utils_new_infiniband_name (name, parent_link->name, p_key);
|
2015-06-15 16:19:19 +02:00
|
|
|
|
2016-04-20 09:16:21 +02:00
|
|
|
if (add) {
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_INFINIBAND, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD ("link: adding infiniband partition %s for parent '%s' (%d), key %d",
|
2016-04-20 10:07:03 +02:00
|
|
|
name, parent_link->name, parent, p_key);
|
2016-04-20 09:16:21 +02:00
|
|
|
if (!klass->infiniband_partition_add (self, parent, p_key, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
} else {
|
|
|
|
|
if (!klass->infiniband_partition_delete (self, parent, p_key))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-15 16:19:19 +02:00
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
2013-06-10 16:21:08 -03:00
|
|
|
}
|
|
|
|
|
|
2016-04-20 09:16:21 +02:00
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_infiniband_add (NMPlatform *self,
|
|
|
|
|
int parent,
|
|
|
|
|
int p_key,
|
|
|
|
|
const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
return _infiniband_add_add_or_delete (self, parent, p_key, TRUE, out_link);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_infiniband_delete (NMPlatform *self,
|
|
|
|
|
int parent,
|
|
|
|
|
int p_key)
|
|
|
|
|
{
|
|
|
|
|
return _infiniband_add_add_or_delete (self, parent, p_key, FALSE, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-10-06 09:37:34 -05:00
|
|
|
gboolean
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_infiniband_get_properties (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
int *out_parent,
|
|
|
|
|
int *out_p_key,
|
|
|
|
|
const char **out_mode)
|
2014-10-06 09:37:34 -05:00
|
|
|
{
|
2016-12-08 15:05:15 +01:00
|
|
|
nm_auto_close int dirfd = -1;
|
|
|
|
|
char ifname_verified[IFNAMSIZ];
|
2015-10-15 15:47:14 +02:00
|
|
|
const NMPlatformLnkInfiniband *plnk;
|
|
|
|
|
const NMPlatformLink *plink;
|
2016-12-08 15:05:15 +01:00
|
|
|
char *contents;
|
2015-10-15 15:47:14 +02:00
|
|
|
const char *mode;
|
|
|
|
|
int p_key = 0;
|
|
|
|
|
|
2014-10-06 09:37:34 -05:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
2015-10-15 15:47:14 +02:00
|
|
|
plnk = nm_platform_link_get_lnk_infiniband (self, ifindex, &plink);
|
|
|
|
|
|
|
|
|
|
if ( !plink
|
|
|
|
|
|| plink->type != NM_LINK_TYPE_INFINIBAND)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (plnk) {
|
|
|
|
|
NM_SET_OUT (out_parent, plink->parent);
|
|
|
|
|
NM_SET_OUT (out_p_key, plnk->p_key);
|
|
|
|
|
NM_SET_OUT (out_mode, plnk->mode);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Could not get the link information via netlink. To support older kernels,
|
|
|
|
|
* fallback to reading sysfs. */
|
|
|
|
|
|
2016-12-08 15:05:15 +01:00
|
|
|
dirfd = nm_platform_sysctl_open_netdir (self, ifindex, ifname_verified);
|
|
|
|
|
if (dirfd < 0)
|
|
|
|
|
return FALSE;
|
2015-10-15 15:47:14 +02:00
|
|
|
|
2016-12-08 15:05:15 +01:00
|
|
|
contents = nm_platform_sysctl_get (self, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_verified, "mode"));
|
2015-10-15 15:47:14 +02:00
|
|
|
if (!contents)
|
|
|
|
|
return FALSE;
|
|
|
|
|
if (strstr (contents, "datagram"))
|
|
|
|
|
mode = "datagram";
|
|
|
|
|
else if (strstr (contents, "connected"))
|
|
|
|
|
mode = "connected";
|
|
|
|
|
else
|
|
|
|
|
mode = NULL;
|
|
|
|
|
g_free (contents);
|
|
|
|
|
|
2016-12-08 15:05:15 +01:00
|
|
|
p_key = nm_platform_sysctl_get_int_checked (self, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname_verified, "pkey"), 16, 0, 0xFFFF, -1);
|
2015-10-15 15:47:14 +02:00
|
|
|
if (p_key < 0)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
NM_SET_OUT (out_parent, plink->parent);
|
|
|
|
|
NM_SET_OUT (out_p_key, p_key);
|
|
|
|
|
NM_SET_OUT (out_mode, mode);
|
|
|
|
|
return TRUE;
|
2014-10-06 09:37:34 -05:00
|
|
|
}
|
|
|
|
|
|
2015-11-27 22:22:25 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip6tnl_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create an IPv6 tunnel.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_ip6tnl_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkIp6Tnl *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-11-27 22:22:25 +01:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
char buffer[INET6_ADDRSTRLEN];
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_IP6TNL, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD (LOG_FMT_IP_TUNNEL,
|
|
|
|
|
"ip6tnl",
|
|
|
|
|
name,
|
|
|
|
|
props->parent_ifindex,
|
|
|
|
|
nm_utils_inet6_ntop (&props->local, NULL),
|
|
|
|
|
nm_utils_inet6_ntop (&props->remote, buffer));
|
|
|
|
|
|
|
|
|
|
if (!klass->link_ip6tnl_add (self, name, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 14:01:56 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ipip_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create an IPIP tunnel.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_ipip_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkIpIp *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-11-27 14:01:56 +01:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
char buffer[INET_ADDRSTRLEN];
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_IPIP, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD (LOG_FMT_IP_TUNNEL,
|
|
|
|
|
"ipip",
|
|
|
|
|
name,
|
|
|
|
|
props->parent_ifindex,
|
|
|
|
|
nm_utils_inet4_ntop (props->local, NULL),
|
|
|
|
|
nm_utils_inet4_ntop (props->remote, buffer));
|
|
|
|
|
|
|
|
|
|
if (!klass->link_ipip_add (self, name, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-30 18:20:09 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_macsec_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create a MACsec interface.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_macsec_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
int parent,
|
|
|
|
|
const NMPlatformLnkMacsec *props,
|
|
|
|
|
const NMPlatformLink **out_link)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_MACSEC, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD ("adding macsec '%s' parent %u sci %llx",
|
|
|
|
|
name,
|
|
|
|
|
parent,
|
|
|
|
|
(unsigned long long) props->sci);
|
|
|
|
|
|
|
|
|
|
if (!klass->link_macsec_add (self, name, parent, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-03 17:09:50 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_macvlan_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
2015-12-04 09:49:39 +01:00
|
|
|
* Create a MACVLAN or MACVTAP device.
|
2015-12-03 17:09:50 +01:00
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_macvlan_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
|
|
|
|
int parent,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkMacvlan *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-12-03 17:09:50 +01:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
2015-12-04 09:49:39 +01:00
|
|
|
NMLinkType type;
|
2015-12-03 17:09:50 +01:00
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
2015-12-04 09:49:39 +01:00
|
|
|
type = props->tap ? NM_LINK_TYPE_MACVTAP : NM_LINK_TYPE_MACVLAN;
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, type, out_link);
|
2015-12-03 17:09:50 +01:00
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
2015-12-04 09:49:39 +01:00
|
|
|
_LOGD ("adding %s '%s' parent %u mode %u",
|
|
|
|
|
props->tap ? "macvtap" : "macvlan",
|
2015-12-03 17:09:50 +01:00
|
|
|
name,
|
|
|
|
|
parent,
|
|
|
|
|
props->mode);
|
|
|
|
|
|
|
|
|
|
if (!klass->link_macvlan_add (self, name, parent, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-11 18:41:48 +01:00
|
|
|
/**
|
|
|
|
|
* nm_platform_sit_add:
|
|
|
|
|
* @self: platform instance
|
|
|
|
|
* @name: name of the new interface
|
|
|
|
|
* @props: interface properties
|
|
|
|
|
* @out_link: on success, the link object
|
|
|
|
|
*
|
|
|
|
|
* Create a software SIT device.
|
|
|
|
|
*/
|
|
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_link_sit_add (NMPlatform *self,
|
|
|
|
|
const char *name,
|
2015-12-11 13:34:50 +01:00
|
|
|
const NMPlatformLnkSit *props,
|
2015-12-09 15:13:57 +01:00
|
|
|
const NMPlatformLink **out_link)
|
2015-11-11 18:41:48 +01:00
|
|
|
{
|
|
|
|
|
NMPlatformError plerr;
|
|
|
|
|
char buffer[INET_ADDRSTRLEN];
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
|
|
|
|
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_SIT, out_link);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
|
|
|
|
return plerr;
|
|
|
|
|
|
|
|
|
|
_LOGD (LOG_FMT_IP_TUNNEL,
|
|
|
|
|
"sit",
|
|
|
|
|
name,
|
|
|
|
|
props->parent_ifindex,
|
|
|
|
|
nm_utils_inet4_ntop (props->local, NULL),
|
|
|
|
|
nm_utils_inet4_ntop (props->remote, buffer));
|
|
|
|
|
|
|
|
|
|
if (!klass->link_sit_add (self, name, props, out_link))
|
|
|
|
|
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
|
|
|
|
return NM_PLATFORM_ERROR_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-03 13:55:51 -04:00
|
|
|
gboolean
|
2015-12-09 16:14:49 +01:00
|
|
|
nm_platform_link_veth_get_properties (NMPlatform *self, int ifindex, int *out_peer_ifindex)
|
2013-05-03 13:55:51 -04:00
|
|
|
{
|
2015-10-16 17:53:33 +02:00
|
|
|
const NMPlatformLink *plink;
|
|
|
|
|
int peer_ifindex;
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-05-03 13:55:51 -04:00
|
|
|
|
2015-10-16 17:53:33 +02:00
|
|
|
plink = nm_platform_link_get (self, ifindex);
|
|
|
|
|
|
|
|
|
|
if (!plink)
|
|
|
|
|
return FALSE;
|
|
|
|
|
if (plink->type != NM_LINK_TYPE_VETH)
|
|
|
|
|
return FALSE;
|
2013-05-03 13:55:51 -04:00
|
|
|
|
2015-10-16 17:53:33 +02:00
|
|
|
if (plink->parent != 0) {
|
|
|
|
|
NM_SET_OUT (out_peer_ifindex, plink->parent);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Pre-4.1 kernel did not expose the peer_ifindex as IFA_LINK. Lookup via ethtool. */
|
|
|
|
|
if (out_peer_ifindex) {
|
2016-02-19 01:06:28 +01:00
|
|
|
nm_auto_pop_netns NMPNetns *netns = NULL;
|
|
|
|
|
|
|
|
|
|
if (!nm_platform_netns_push (self, &netns))
|
|
|
|
|
return FALSE;
|
2016-12-11 22:46:14 +01:00
|
|
|
peer_ifindex = nmp_utils_ethtool_get_peer_ifindex (plink->ifindex);
|
2015-10-16 17:53:33 +02:00
|
|
|
if (peer_ifindex <= 0)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
*out_peer_ifindex = peer_ifindex;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
2013-05-03 13:55:51 -04:00
|
|
|
}
|
|
|
|
|
|
2015-10-13 16:08:30 +02:00
|
|
|
gboolean
|
2017-01-16 15:51:05 +01:00
|
|
|
nm_platform_link_tun_get_properties (NMPlatform *self, int ifindex, NMPlatformTunProperties *props)
|
2015-10-13 16:08:30 +02:00
|
|
|
{
|
2016-12-09 10:43:06 +01:00
|
|
|
nm_auto_close int dirfd = -1;
|
2017-01-16 15:51:05 +01:00
|
|
|
char ifname[IFNAMSIZ];
|
2016-12-09 10:43:06 +01:00
|
|
|
gint64 flags;
|
2015-10-13 16:08:30 +02:00
|
|
|
gboolean success = TRUE;
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2016-12-09 10:43:06 +01:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2015-10-13 16:08:30 +02:00
|
|
|
g_return_val_if_fail (props, FALSE);
|
|
|
|
|
|
|
|
|
|
memset (props, 0, sizeof (*props));
|
|
|
|
|
props->owner = -1;
|
|
|
|
|
props->group = -1;
|
|
|
|
|
|
2017-01-16 15:51:05 +01:00
|
|
|
dirfd = nm_platform_sysctl_open_netdir (self, ifindex, ifname);
|
2016-12-09 10:43:06 +01:00
|
|
|
if (dirfd < 0)
|
2015-10-13 16:08:30 +02:00
|
|
|
return FALSE;
|
|
|
|
|
|
2016-12-09 10:43:06 +01:00
|
|
|
props->owner = nm_platform_sysctl_get_int_checked (self, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname, "owner"), 10, -1, G_MAXINT64, -1);
|
|
|
|
|
if (errno)
|
2015-10-13 16:08:30 +02:00
|
|
|
success = FALSE;
|
|
|
|
|
|
2016-12-09 10:43:06 +01:00
|
|
|
props->group = nm_platform_sysctl_get_int_checked (self, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname, "group"), 10, -1, G_MAXINT64, -1);
|
|
|
|
|
if (errno)
|
2015-10-13 16:08:30 +02:00
|
|
|
success = FALSE;
|
|
|
|
|
|
2016-12-09 10:43:06 +01:00
|
|
|
flags = nm_platform_sysctl_get_int_checked (self, NMP_SYSCTL_PATHID_NETDIR (dirfd, ifname, "tun_flags"), 16, 0, G_MAXINT64, -1);
|
|
|
|
|
if (flags >= 0) {
|
|
|
|
|
props->mode = ((flags & (IFF_TUN | IFF_TAP)) == IFF_TUN) ? "tun" : "tap";
|
|
|
|
|
props->no_pi = !!(flags & IFF_NO_PI);
|
|
|
|
|
props->vnet_hdr = !!(flags & IFF_VNET_HDR);
|
|
|
|
|
props->multi_queue = !!(flags & NM_IFF_MULTI_QUEUE);
|
2015-10-13 16:08:30 +02:00
|
|
|
} else
|
|
|
|
|
success = FALSE;
|
|
|
|
|
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-04 14:27:03 +01:00
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_capabilities (NMPlatform *self, int ifindex, NMDeviceWifiCapabilities *caps)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_capabilities (self, ifindex, caps);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_bssid (NMPlatform *self, int ifindex, guint8 *bssid)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_bssid (self, ifindex, bssid);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guint32
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_frequency (NMPlatform *self, int ifindex)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_frequency (self, ifindex);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_quality (NMPlatform *self, int ifindex)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_quality (self, ifindex);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guint32
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_rate (NMPlatform *self, int ifindex)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_rate (self, ifindex);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NM80211Mode
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_get_mode (NMPlatform *self, int ifindex)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, NM_802_11_MODE_UNKNOWN);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, NM_802_11_MODE_UNKNOWN);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_get_mode (self, ifindex);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_set_mode (NMPlatform *self, int ifindex, NM80211Mode mode)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF_VOID (self, klass);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_if_fail (ifindex > 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
klass->wifi_set_mode (self, ifindex, mode);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-23 14:19:59 -04:00
|
|
|
static void
|
|
|
|
|
wifi_set_powersave (NMPlatform *p, int ifindex, guint32 powersave)
|
|
|
|
|
{
|
|
|
|
|
/* empty */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_set_powersave (NMPlatform *self, int ifindex, guint32 powersave)
|
2014-10-23 14:19:59 -04:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF_VOID (self, klass);
|
2014-10-23 14:19:59 -04:00
|
|
|
|
|
|
|
|
g_return_if_fail (ifindex > 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
klass->wifi_set_powersave (self, ifindex, powersave);
|
2014-10-23 14:19:59 -04:00
|
|
|
}
|
|
|
|
|
|
2014-02-04 14:27:03 +01:00
|
|
|
guint32
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_find_frequency (NMPlatform *self, int ifindex, const guint32 *freqs)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, 0);
|
|
|
|
|
g_return_val_if_fail (freqs != NULL, 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->wifi_find_frequency (self, ifindex, freqs);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_wifi_indicate_addressing_running (NMPlatform *self, int ifindex, gboolean running)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF_VOID (self, klass);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_if_fail (ifindex > 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
klass->wifi_indicate_addressing_running (self, ifindex, running);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guint32
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_mesh_get_channel (NMPlatform *self, int ifindex)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, 0);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, 0);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->mesh_get_channel (self, ifindex);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_mesh_set_channel (NMPlatform *self, int ifindex, guint32 channel)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->mesh_set_channel (self, ifindex, channel);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_mesh_set_ssid (NMPlatform *self, int ifindex, const guint8 *ssid, gsize len)
|
2014-02-04 14:27:03 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2014-02-04 14:27:03 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (ssid != NULL, FALSE);
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
return klass->mesh_set_ssid (self, ifindex, ssid, len);
|
2014-02-04 14:27:03 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-11 21:32:47 +02:00
|
|
|
#define TO_STRING_DEV_BUF_SIZE (5+15+1)
|
2014-08-11 21:40:52 +02:00
|
|
|
static const char *
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (NMPlatform *self, int ifindex, char *buf, size_t size)
|
2014-08-11 21:32:47 +02:00
|
|
|
{
|
|
|
|
|
g_assert (buf && size >= TO_STRING_DEV_BUF_SIZE);
|
|
|
|
|
|
|
|
|
|
if (ifindex) {
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
const char *name = ifindex > 0 && self ? nm_platform_link_get_name (self, ifindex) : NULL;
|
2014-08-11 21:40:52 +02:00
|
|
|
char *buf2;
|
2014-08-11 21:32:47 +02:00
|
|
|
|
|
|
|
|
strcpy (buf, " dev ");
|
2014-08-11 21:40:52 +02:00
|
|
|
buf2 = buf + 5;
|
2014-08-11 21:32:47 +02:00
|
|
|
size -= 5;
|
|
|
|
|
|
|
|
|
|
if (name)
|
2014-08-11 21:40:52 +02:00
|
|
|
g_strlcpy (buf2, name, size);
|
2014-08-11 21:32:47 +02:00
|
|
|
else
|
2014-08-11 21:40:52 +02:00
|
|
|
g_snprintf (buf2, size, "%d", ifindex);
|
2014-08-11 21:32:47 +02:00
|
|
|
} else
|
|
|
|
|
buf[0] = 0;
|
2014-08-11 21:40:52 +02:00
|
|
|
|
|
|
|
|
return buf;
|
2014-08-11 21:32:47 +02:00
|
|
|
}
|
|
|
|
|
|
2016-02-29 16:50:55 +01:00
|
|
|
#define TO_STRING_IFA_FLAGS_BUF_SIZE 256
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
|
_to_string_ifa_flags (guint32 ifa_flags, char *buf, gsize size)
|
|
|
|
|
{
|
|
|
|
|
#define S_FLAGS_PREFIX " flags "
|
|
|
|
|
nm_assert (buf && size >= TO_STRING_IFA_FLAGS_BUF_SIZE && size > NM_STRLEN (S_FLAGS_PREFIX));
|
|
|
|
|
|
|
|
|
|
if (!ifa_flags)
|
|
|
|
|
buf[0] = '\0';
|
|
|
|
|
else {
|
|
|
|
|
nm_platform_addr_flags2str (ifa_flags, &buf[NM_STRLEN (S_FLAGS_PREFIX)], size - NM_STRLEN (S_FLAGS_PREFIX));
|
|
|
|
|
if (buf[NM_STRLEN (S_FLAGS_PREFIX)] == '\0')
|
|
|
|
|
buf[0] = '\0';
|
|
|
|
|
else
|
|
|
|
|
memcpy (buf, S_FLAGS_PREFIX, NM_STRLEN (S_FLAGS_PREFIX));
|
|
|
|
|
}
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2016-02-19 23:34:25 +01:00
|
|
|
gboolean
|
2016-12-11 22:46:14 +01:00
|
|
|
nm_platform_ethtool_set_wake_on_lan (NMPlatform *self, int ifindex, NMSettingWiredWakeOnLan wol, const char *wol_password)
|
2016-02-19 23:34:25 +01:00
|
|
|
{
|
2016-09-10 16:48:01 +02:00
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
|
2016-02-19 01:06:28 +01:00
|
|
|
|
2016-12-11 22:46:14 +01:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_ethtool_set_wake_on_lan (ifindex, wol, wol_password);
|
2016-02-19 23:34:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2016-12-11 22:46:14 +01:00
|
|
|
nm_platform_ethtool_set_link_settings (NMPlatform *self, int ifindex, gboolean autoneg, guint32 speed, NMPlatformLinkDuplexType duplex)
|
2016-02-19 23:34:25 +01:00
|
|
|
{
|
2016-09-10 16:48:01 +02:00
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
|
2016-02-19 23:34:25 +01:00
|
|
|
|
2016-12-11 22:46:14 +01:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_ethtool_set_link_settings (ifindex, autoneg, speed, duplex);
|
2016-09-10 16:48:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2016-12-11 22:46:14 +01:00
|
|
|
nm_platform_ethtool_get_link_settings (NMPlatform *self, int ifindex, gboolean *out_autoneg, guint32 *out_speed, NMPlatformLinkDuplexType *out_duplex)
|
2016-09-10 16:48:01 +02:00
|
|
|
{
|
|
|
|
|
_CHECK_SELF_NETNS (self, klass, netns, FALSE);
|
2016-02-19 01:06:28 +01:00
|
|
|
|
2016-12-11 22:46:14 +01:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
return nmp_utils_ethtool_get_link_settings (ifindex, out_autoneg, out_speed, out_duplex);
|
2016-02-19 23:34:25 +01:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2016-02-19 23:34:25 +01:00
|
|
|
|
platform: fix cache to use kernel's notion for equality of routes
Until now, NetworkManager's platform cache for routes used the quadruple
network/plen,metric,ifindex for equaliy. That is not kernel's
understanding of how routes behave. For example, with `ip route append`
you can add two IPv4 routes that only differ by their gateway. To
the previous form of platform cache, these two routes would wrongly
look identical, as the cache could not contain both routes. This also
easily leads to cache-inconsistencies.
Now that we have NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, fix the route's
compare operator to match kernel's.
Well, not entirely. Kernel understands more properties for routes then
NetworkManager. Some of these properties may also be part of the ID according
to kernel. To NetworkManager such routes would still look identical as
they only differ in a property that is not understood. This can still
cause cache-inconsistencies. The only fix here is to add support for
all these properties in NetworkManager as well. However, it's less serious,
because with this commit we support several of the more important properties.
See also the related bug rh#1337855 for kernel.
Another difficulty is that `ip route replace` and `ip route change`
changes an existing route. The replaced route has the same
NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, but differ in the actual
NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
# ip -d -4 route show dev v
# ip monitor route &
# ip route add 192.168.5.0/24 dev v
192.168.5.0/24 dev v scope link
# ip route change 192.168.5.0/24 dev v scope 10
192.168.5.0/24 dev v scope 10
# ip -d -4 route show dev v
unicast 192.168.5.0/24 proto boot scope 10
Note that we only got one RTM_NEWROUTE message, although from NMPCache's
point of view, a new route (with a particular ID) was added and another
route (with a different ID) was deleted. The cumbersome workaround is,
to keep an ordered list of the routes, and figure out which route was
replaced in response to an RTM_NEWROUTE. In absence of bugs, this should
work fine. However, as we only rely on events, we might wrongly
introduce a cache-inconsistancy as well. See the related bug rh#1337860.
Also drop nm_platform_ip4_route_get() and the like. The ID of routes
is complex, so it makes little sense to look up a route directly.
2017-08-02 07:55:05 +02:00
|
|
|
const NMDedupMultiHeadEntry *
|
|
|
|
|
nm_platform_lookup_all (NMPlatform *platform,
|
|
|
|
|
NMPCacheIdType cache_id_type,
|
2017-08-14 14:16:20 +02:00
|
|
|
const NMPObject *obj)
|
platform: fix cache to use kernel's notion for equality of routes
Until now, NetworkManager's platform cache for routes used the quadruple
network/plen,metric,ifindex for equaliy. That is not kernel's
understanding of how routes behave. For example, with `ip route append`
you can add two IPv4 routes that only differ by their gateway. To
the previous form of platform cache, these two routes would wrongly
look identical, as the cache could not contain both routes. This also
easily leads to cache-inconsistencies.
Now that we have NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, fix the route's
compare operator to match kernel's.
Well, not entirely. Kernel understands more properties for routes then
NetworkManager. Some of these properties may also be part of the ID according
to kernel. To NetworkManager such routes would still look identical as
they only differ in a property that is not understood. This can still
cause cache-inconsistencies. The only fix here is to add support for
all these properties in NetworkManager as well. However, it's less serious,
because with this commit we support several of the more important properties.
See also the related bug rh#1337855 for kernel.
Another difficulty is that `ip route replace` and `ip route change`
changes an existing route. The replaced route has the same
NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, but differ in the actual
NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
# ip -d -4 route show dev v
# ip monitor route &
# ip route add 192.168.5.0/24 dev v
192.168.5.0/24 dev v scope link
# ip route change 192.168.5.0/24 dev v scope 10
192.168.5.0/24 dev v scope 10
# ip -d -4 route show dev v
unicast 192.168.5.0/24 proto boot scope 10
Note that we only got one RTM_NEWROUTE message, although from NMPCache's
point of view, a new route (with a particular ID) was added and another
route (with a different ID) was deleted. The cumbersome workaround is,
to keep an ordered list of the routes, and figure out which route was
replaced in response to an RTM_NEWROUTE. In absence of bugs, this should
work fine. However, as we only rely on events, we might wrongly
introduce a cache-inconsistancy as well. See the related bug rh#1337860.
Also drop nm_platform_ip4_route_get() and the like. The ID of routes
is complex, so it makes little sense to look up a route directly.
2017-08-02 07:55:05 +02:00
|
|
|
{
|
|
|
|
|
return nmp_cache_lookup_all (nm_platform_get_cache (platform),
|
|
|
|
|
cache_id_type,
|
|
|
|
|
obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const NMDedupMultiEntry *
|
|
|
|
|
nm_platform_lookup_entry (NMPlatform *platform,
|
|
|
|
|
NMPCacheIdType cache_id_type,
|
2017-08-14 14:16:20 +02:00
|
|
|
const NMPObject *obj)
|
platform: fix cache to use kernel's notion for equality of routes
Until now, NetworkManager's platform cache for routes used the quadruple
network/plen,metric,ifindex for equaliy. That is not kernel's
understanding of how routes behave. For example, with `ip route append`
you can add two IPv4 routes that only differ by their gateway. To
the previous form of platform cache, these two routes would wrongly
look identical, as the cache could not contain both routes. This also
easily leads to cache-inconsistencies.
Now that we have NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID, fix the route's
compare operator to match kernel's.
Well, not entirely. Kernel understands more properties for routes then
NetworkManager. Some of these properties may also be part of the ID according
to kernel. To NetworkManager such routes would still look identical as
they only differ in a property that is not understood. This can still
cause cache-inconsistencies. The only fix here is to add support for
all these properties in NetworkManager as well. However, it's less serious,
because with this commit we support several of the more important properties.
See also the related bug rh#1337855 for kernel.
Another difficulty is that `ip route replace` and `ip route change`
changes an existing route. The replaced route has the same
NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID, but differ in the actual
NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
# ip -d -4 route show dev v
# ip monitor route &
# ip route add 192.168.5.0/24 dev v
192.168.5.0/24 dev v scope link
# ip route change 192.168.5.0/24 dev v scope 10
192.168.5.0/24 dev v scope 10
# ip -d -4 route show dev v
unicast 192.168.5.0/24 proto boot scope 10
Note that we only got one RTM_NEWROUTE message, although from NMPCache's
point of view, a new route (with a particular ID) was added and another
route (with a different ID) was deleted. The cumbersome workaround is,
to keep an ordered list of the routes, and figure out which route was
replaced in response to an RTM_NEWROUTE. In absence of bugs, this should
work fine. However, as we only rely on events, we might wrongly
introduce a cache-inconsistancy as well. See the related bug rh#1337860.
Also drop nm_platform_ip4_route_get() and the like. The ID of routes
is complex, so it makes little sense to look up a route directly.
2017-08-02 07:55:05 +02:00
|
|
|
{
|
|
|
|
|
return nmp_cache_lookup_entry_with_idx_type (nm_platform_get_cache (platform),
|
|
|
|
|
cache_id_type,
|
|
|
|
|
obj);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-29 14:46:32 +02:00
|
|
|
const NMDedupMultiHeadEntry *
|
2017-07-04 12:49:47 +02:00
|
|
|
nm_platform_lookup (NMPlatform *self,
|
2017-06-29 14:46:32 +02:00
|
|
|
const NMPLookup *lookup)
|
|
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
return nmp_cache_lookup (nm_platform_get_cache (self),
|
2017-06-29 14:46:32 +02:00
|
|
|
lookup);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 23:17:12 +02:00
|
|
|
gboolean
|
2017-09-12 15:27:59 +02:00
|
|
|
nm_platform_lookup_predicate_routes_main (const NMPObject *obj,
|
|
|
|
|
gpointer user_data)
|
2017-08-21 23:17:12 +02:00
|
|
|
{
|
|
|
|
|
nm_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj), NMP_OBJECT_TYPE_IP4_ROUTE,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ROUTE));
|
2017-09-22 15:26:56 +02:00
|
|
|
return nm_platform_route_table_is_main (obj->ip_route.table_coerced);
|
2017-08-21 23:17:12 +02:00
|
|
|
}
|
|
|
|
|
|
2017-06-29 15:19:35 +02:00
|
|
|
gboolean
|
2017-09-12 15:27:59 +02:00
|
|
|
nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel (const NMPObject *obj,
|
|
|
|
|
gpointer user_data)
|
2017-06-29 15:19:35 +02:00
|
|
|
{
|
|
|
|
|
nm_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj), NMP_OBJECT_TYPE_IP4_ROUTE,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ROUTE));
|
2017-09-22 15:26:56 +02:00
|
|
|
return nm_platform_route_table_is_main (obj->ip_route.table_coerced)
|
2017-09-12 15:27:59 +02:00
|
|
|
&& obj->ip_route.rt_source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL;
|
2017-06-29 15:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_lookup_clone:
|
2017-07-04 12:49:47 +02:00
|
|
|
* @self:
|
2017-06-29 15:19:35 +02:00
|
|
|
* @lookup:
|
|
|
|
|
* @predicate: if given, only objects for which @predicate returns %TRUE are included
|
|
|
|
|
* in the result.
|
|
|
|
|
* @user_data: user data for @predicate
|
|
|
|
|
*
|
|
|
|
|
* Returns the result of lookup in a GPtrArray. The result array contains
|
|
|
|
|
* references objects from the cache, it's destroy function will unref them.
|
|
|
|
|
*
|
|
|
|
|
* The user must unref the GPtrArray, which will also unref the NMPObject
|
|
|
|
|
* elements.
|
|
|
|
|
*
|
|
|
|
|
* The elements in the array *must* not be modified.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the result of the lookup.
|
|
|
|
|
*/
|
|
|
|
|
GPtrArray *
|
2017-07-04 12:49:47 +02:00
|
|
|
nm_platform_lookup_clone (NMPlatform *self,
|
2017-06-29 15:19:35 +02:00
|
|
|
const NMPLookup *lookup,
|
2017-08-14 14:52:55 +02:00
|
|
|
NMPObjectPredicateFunc predicate,
|
2017-06-29 15:19:35 +02:00
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
return nm_dedup_multi_objs_to_ptr_array_head (nm_platform_lookup (self, lookup),
|
2017-07-04 09:57:06 +02:00
|
|
|
(NMDedupMultiFcnSelectPredicate) predicate,
|
|
|
|
|
user_data);
|
2017-06-29 15:19:35 +02:00
|
|
|
}
|
|
|
|
|
|
2015-10-21 23:17:11 +02:00
|
|
|
void
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_platform_ip4_address_set_addr (NMPlatformIP4Address *addr, in_addr_t address, guint8 plen)
|
2015-10-10 17:48:32 +02:00
|
|
|
{
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_assert (plen <= 32);
|
|
|
|
|
|
2015-10-21 23:17:11 +02:00
|
|
|
addr->address = address;
|
|
|
|
|
addr->peer_address = address;
|
|
|
|
|
addr->plen = plen;
|
2015-10-10 17:48:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const struct in6_addr *
|
|
|
|
|
nm_platform_ip6_address_get_peer (const NMPlatformIP6Address *addr)
|
|
|
|
|
{
|
|
|
|
|
if ( IN6_IS_ADDR_UNSPECIFIED (&addr->peer_address)
|
|
|
|
|
|| IN6_ARE_ADDR_EQUAL (&addr->peer_address, &addr->address))
|
|
|
|
|
return &addr->address;
|
|
|
|
|
return &addr->peer_address;
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_ip4_address_add (NMPlatform *self,
|
2015-10-10 17:41:49 +02:00
|
|
|
int ifindex,
|
2013-12-02 10:20:26 -05:00
|
|
|
in_addr_t address,
|
2016-04-06 18:04:26 +02:00
|
|
|
guint8 plen,
|
2015-10-10 19:58:59 +02:00
|
|
|
in_addr_t peer_address,
|
2013-12-02 10:20:26 -05:00
|
|
|
guint32 lifetime,
|
2014-02-19 16:10:59 -05:00
|
|
|
guint32 preferred,
|
2016-02-29 17:06:21 +01:00
|
|
|
guint32 flags,
|
2014-02-19 16:10:59 -05:00
|
|
|
const char *label)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2016-04-06 18:04:26 +02:00
|
|
|
g_return_val_if_fail (plen <= 32, FALSE);
|
2013-06-29 11:30:11 +02:00
|
|
|
g_return_val_if_fail (lifetime > 0, FALSE);
|
2014-04-01 22:46:46 +02:00
|
|
|
g_return_val_if_fail (preferred <= lifetime, FALSE);
|
2014-02-19 16:10:59 -05:00
|
|
|
g_return_val_if_fail (!label || strlen (label) < sizeof (((NMPlatformIP4Address *) NULL)->label), FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-08-20 00:07:14 +02:00
|
|
|
if (_LOGD_ENABLED ()) {
|
2014-01-30 20:31:29 +01:00
|
|
|
NMPlatformIP4Address addr = { 0 };
|
|
|
|
|
|
|
|
|
|
addr.ifindex = ifindex;
|
|
|
|
|
addr.address = address;
|
|
|
|
|
addr.peer_address = peer_address;
|
|
|
|
|
addr.plen = plen;
|
2014-06-09 10:03:01 +02:00
|
|
|
addr.timestamp = 0; /* set it at zero, which to_string will treat as *now* */
|
2014-01-30 20:31:29 +01:00
|
|
|
addr.lifetime = lifetime;
|
|
|
|
|
addr.preferred = preferred;
|
2016-02-29 17:06:21 +01:00
|
|
|
addr.n_ifa_flags = flags;
|
2014-02-19 16:10:59 -05:00
|
|
|
if (label)
|
|
|
|
|
g_strlcpy (addr.label, label, sizeof (addr.label));
|
2014-01-30 20:31:29 +01:00
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("address: adding or updating IPv4 address: %s", nm_platform_ip4_address_to_string (&addr, NULL, 0));
|
2014-01-30 20:31:29 +01:00
|
|
|
}
|
2016-02-29 17:06:21 +01:00
|
|
|
return klass->ip4_address_add (self, ifindex, address, plen, peer_address, lifetime, preferred, flags, label);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
nm_platform_ip6_address_add (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
2013-12-02 10:20:26 -05:00
|
|
|
struct in6_addr address,
|
2016-04-06 18:04:26 +02:00
|
|
|
guint8 plen,
|
2015-10-10 19:58:59 +02:00
|
|
|
struct in6_addr peer_address,
|
2013-12-02 10:20:26 -05:00
|
|
|
guint32 lifetime,
|
|
|
|
|
guint32 preferred,
|
2016-02-29 15:36:12 +01:00
|
|
|
guint32 flags)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2016-04-06 18:04:26 +02:00
|
|
|
g_return_val_if_fail (plen <= 128, FALSE);
|
2013-06-29 11:30:11 +02:00
|
|
|
g_return_val_if_fail (lifetime > 0, FALSE);
|
2014-04-01 22:46:46 +02:00
|
|
|
g_return_val_if_fail (preferred <= lifetime, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-08-20 00:07:14 +02:00
|
|
|
if (_LOGD_ENABLED ()) {
|
2014-01-30 20:31:29 +01:00
|
|
|
NMPlatformIP6Address addr = { 0 };
|
|
|
|
|
|
|
|
|
|
addr.ifindex = ifindex;
|
|
|
|
|
addr.address = address;
|
|
|
|
|
addr.peer_address = peer_address;
|
|
|
|
|
addr.plen = plen;
|
2014-06-09 10:03:01 +02:00
|
|
|
addr.timestamp = 0; /* set it to zero, which to_string will treat as *now* */
|
2014-01-30 20:31:29 +01:00
|
|
|
addr.lifetime = lifetime;
|
|
|
|
|
addr.preferred = preferred;
|
2016-02-29 16:23:16 +01:00
|
|
|
addr.n_ifa_flags = flags;
|
2014-01-30 20:31:29 +01:00
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("address: adding or updating IPv6 address: %s", nm_platform_ip6_address_to_string (&addr, NULL, 0));
|
2014-01-30 20:31:29 +01:00
|
|
|
}
|
2015-10-10 19:58:59 +02:00
|
|
|
return klass->ip6_address_add (self, ifindex, address, plen, peer_address, lifetime, preferred, flags);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_platform_ip4_address_delete (NMPlatform *self, int ifindex, in_addr_t address, guint8 plen, in_addr_t peer_address)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2014-08-11 21:40:52 +02:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE];
|
2015-10-21 23:17:11 +02:00
|
|
|
char str_peer2[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_peer[100];
|
2014-08-11 21:40:52 +02:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2016-04-06 18:04:26 +02:00
|
|
|
g_return_val_if_fail (plen <= 32, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-10-21 23:17:11 +02:00
|
|
|
_LOGD ("address: deleting IPv4 address %s/%d, %sifindex %d%s",
|
2014-08-12 01:31:00 +02:00
|
|
|
nm_utils_inet4_ntop (address, NULL), plen,
|
2015-10-21 23:17:11 +02:00
|
|
|
peer_address != address
|
|
|
|
|
? nm_sprintf_buf (str_peer, "peer %s, ", nm_utils_inet4_ntop (peer_address, str_peer2)) : "",
|
2014-08-12 01:31:00 +02:00
|
|
|
ifindex,
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
|
|
|
|
|
return klass->ip4_address_delete (self, ifindex, address, plen, peer_address);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_platform_ip6_address_delete (NMPlatform *self, int ifindex, struct in6_addr address, guint8 plen)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2014-08-11 21:40:52 +02:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE];
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2016-04-06 18:04:26 +02:00
|
|
|
g_return_val_if_fail (plen <= 128, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2015-07-02 14:35:38 +02:00
|
|
|
_LOGD ("address: deleting IPv6 address %s/%d, ifindex %d%s",
|
2014-08-11 21:40:52 +02:00
|
|
|
nm_utils_inet6_ntop (&address, NULL), plen, ifindex,
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
|
|
|
|
|
return klass->ip6_address_delete (self, ifindex, address, plen);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-14 12:37:58 +02:00
|
|
|
const NMPlatformIP4Address *
|
2016-04-06 18:04:26 +02:00
|
|
|
nm_platform_ip4_address_get (NMPlatform *self, int ifindex, in_addr_t address, guint8 plen, guint32 peer_address)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
NMPObject obj_id;
|
|
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
2015-10-10 17:41:49 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2016-04-06 18:04:26 +02:00
|
|
|
g_return_val_if_fail (plen <= 32, NULL);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
nmp_object_stackinit_id_ip4_address (&obj_id, ifindex, address, plen, peer_address);
|
|
|
|
|
obj = nmp_cache_lookup_obj (nm_platform_get_cache (self), &obj_id);
|
2017-07-04 12:49:47 +02:00
|
|
|
nm_assert (!obj || nmp_object_is_visible (obj));
|
|
|
|
|
return NMP_OBJECT_CAST_IP4_ADDRESS (obj);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-14 12:37:58 +02:00
|
|
|
const NMPlatformIP6Address *
|
2017-05-26 21:49:00 +02:00
|
|
|
nm_platform_ip6_address_get (NMPlatform *self, int ifindex, struct in6_addr address)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
NMPObject obj_id;
|
|
|
|
|
const NMPObject *obj;
|
|
|
|
|
|
2015-10-10 17:41:49 +02:00
|
|
|
_CHECK_SELF (self, klass, NULL);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
nmp_object_stackinit_id_ip6_address (&obj_id, ifindex, &address);
|
|
|
|
|
obj = nmp_cache_lookup_obj (nm_platform_get_cache (self), &obj_id);
|
2017-07-04 12:49:47 +02:00
|
|
|
nm_assert (!obj || nmp_object_is_visible (obj));
|
|
|
|
|
return NMP_OBJECT_CAST_IP6_ADDRESS (obj);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2013-04-16 14:24:46 +02:00
|
|
|
static gboolean
|
2017-07-11 14:25:08 +02:00
|
|
|
array_contains_ip6_address (const GPtrArray *addresses, const NMPlatformIP6Address *address, gint32 now)
|
2013-04-16 14:24:46 +02:00
|
|
|
{
|
2013-07-29 23:00:44 +02:00
|
|
|
guint len = addresses ? addresses->len : 0;
|
|
|
|
|
guint i;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
2013-07-29 23:00:44 +02:00
|
|
|
for (i = 0; i < len; i++) {
|
2017-07-11 14:25:08 +02:00
|
|
|
NMPlatformIP6Address *candidate = NMP_OBJECT_CAST_IP6_ADDRESS (addresses->pdata[i]);
|
2013-07-29 14:54:25 -05:00
|
|
|
|
2015-06-24 12:00:22 +02:00
|
|
|
if (IN6_ARE_ADDR_EQUAL (&candidate->address, &address->address) && candidate->plen == address->plen) {
|
|
|
|
|
guint32 lifetime, preferred;
|
|
|
|
|
|
2016-03-07 11:45:44 +01:00
|
|
|
if (nm_utils_lifetime_get (candidate->timestamp, candidate->lifetime, candidate->preferred,
|
2016-03-15 17:29:58 +01:00
|
|
|
now, &lifetime, &preferred))
|
2015-06-24 12:00:22 +02:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-14 20:52:24 +01:00
|
|
|
static gboolean
|
2017-07-11 14:25:08 +02:00
|
|
|
ip4_addr_subnets_is_plain_address (const GPtrArray *addresses, gconstpointer needle)
|
2016-11-14 20:52:24 +01:00
|
|
|
{
|
2017-07-11 14:25:08 +02:00
|
|
|
return needle >= (gconstpointer) &addresses->pdata[0]
|
|
|
|
|
&& needle < (gconstpointer) &addresses->pdata[addresses->len];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const NMPObject **
|
|
|
|
|
ip4_addr_subnets_addr_list_get (const GPtrArray *addr_list, guint idx)
|
|
|
|
|
{
|
|
|
|
|
nm_assert (addr_list);
|
|
|
|
|
nm_assert (addr_list->len > 1);
|
|
|
|
|
nm_assert (idx < addr_list->len);
|
|
|
|
|
nm_assert (addr_list->pdata[idx]);
|
|
|
|
|
nm_assert ( !(*((gpointer *) addr_list->pdata[idx]))
|
|
|
|
|
|| NMP_OBJECT_CAST_IP4_ADDRESS (*((gpointer *) addr_list->pdata[idx])));
|
|
|
|
|
nm_assert (idx == 0 || ip4_addr_subnets_addr_list_get (addr_list, idx - 1));
|
|
|
|
|
return addr_list->pdata[idx];
|
2016-11-14 20:52:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2017-07-11 14:25:08 +02:00
|
|
|
ip4_addr_subnets_destroy_index (GHashTable *subnets, const GPtrArray *addresses)
|
2016-11-14 20:52:24 +01:00
|
|
|
{
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer p;
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
if (!subnets)
|
|
|
|
|
return;
|
2016-11-14 20:52:24 +01:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
g_hash_table_iter_init (&iter, subnets);
|
2016-11-14 20:52:24 +01:00
|
|
|
while (g_hash_table_iter_next (&iter, NULL, &p)) {
|
2017-07-11 14:25:08 +02:00
|
|
|
if (!ip4_addr_subnets_is_plain_address (addresses, p))
|
2016-11-14 20:52:24 +01:00
|
|
|
g_ptr_array_free ((GPtrArray *) p, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
g_hash_table_unref (subnets);
|
2016-11-14 20:52:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static GHashTable *
|
2017-07-11 14:25:08 +02:00
|
|
|
ip4_addr_subnets_build_index (const GPtrArray *addresses,
|
|
|
|
|
gboolean consider_flags,
|
|
|
|
|
gboolean full_index)
|
2016-11-14 20:52:24 +01:00
|
|
|
{
|
|
|
|
|
GHashTable *subnets;
|
|
|
|
|
guint i;
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_assert (addresses && addresses->len);
|
2016-11-14 20:52:24 +01:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
subnets = g_hash_table_new (NULL, NULL);
|
2016-11-14 20:52:24 +01:00
|
|
|
|
|
|
|
|
/* Build a hash table of all addresses per subnet */
|
|
|
|
|
for (i = 0; i < addresses->len; i++) {
|
2017-07-11 14:25:08 +02:00
|
|
|
const NMPlatformIP4Address *address;
|
|
|
|
|
gpointer p_address;
|
|
|
|
|
GPtrArray *addr_list;
|
|
|
|
|
guint32 net;
|
|
|
|
|
int position;
|
|
|
|
|
gpointer p;
|
|
|
|
|
|
|
|
|
|
if (!addresses->pdata[i])
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
p_address = &addresses->pdata[i];
|
|
|
|
|
address = NMP_OBJECT_CAST_IP4_ADDRESS (addresses->pdata[i]);
|
|
|
|
|
|
2017-09-05 15:25:34 +02:00
|
|
|
net = address->address & _nm_utils_ip4_prefix_to_netmask (address->plen);
|
2016-11-14 20:52:24 +01:00
|
|
|
if (!g_hash_table_lookup_extended (subnets, GUINT_TO_POINTER (net), NULL, &p)) {
|
2017-07-11 14:25:08 +02:00
|
|
|
g_hash_table_insert (subnets, GUINT_TO_POINTER (net), p_address);
|
2016-11-14 20:52:24 +01:00
|
|
|
continue;
|
|
|
|
|
}
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_assert (p);
|
|
|
|
|
|
|
|
|
|
if (full_index) {
|
|
|
|
|
if (ip4_addr_subnets_is_plain_address (addresses, p)) {
|
|
|
|
|
addr_list = g_ptr_array_new ();
|
|
|
|
|
g_hash_table_insert (subnets, GUINT_TO_POINTER (net), addr_list);
|
|
|
|
|
g_ptr_array_add (addr_list, p);
|
|
|
|
|
} else
|
|
|
|
|
addr_list = p;
|
|
|
|
|
|
|
|
|
|
if ( !consider_flags
|
|
|
|
|
|| NM_FLAGS_HAS (address->n_ifa_flags, IFA_F_SECONDARY))
|
|
|
|
|
position = -1; /* append */
|
|
|
|
|
else
|
|
|
|
|
position = 0; /* prepend */
|
|
|
|
|
g_ptr_array_insert (addr_list, position, p_address);
|
|
|
|
|
} else {
|
2017-07-27 10:59:43 +02:00
|
|
|
/* we only care about the primary. No need to track the secondaries
|
2017-07-11 14:25:08 +02:00
|
|
|
* as a GPtrArray. */
|
|
|
|
|
nm_assert (ip4_addr_subnets_is_plain_address (addresses, p));
|
|
|
|
|
if ( consider_flags
|
|
|
|
|
&& !NM_FLAGS_HAS (address->n_ifa_flags, IFA_F_SECONDARY)) {
|
|
|
|
|
g_hash_table_insert (subnets, GUINT_TO_POINTER (net), p_address);
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-11-14 20:52:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return subnets;
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-08 14:47:14 +01:00
|
|
|
/**
|
|
|
|
|
* ip4_addr_subnets_is_secondary:
|
|
|
|
|
* @address: an address
|
|
|
|
|
* @subnets: the hash table mapping subnets to addresses
|
|
|
|
|
* @addresses: array of addresses in the hash table
|
|
|
|
|
* @out_addr_list: array of addresses belonging to the same subnet
|
|
|
|
|
*
|
|
|
|
|
* Checks whether @address is secondary and returns in @out_addr_list the list of addresses
|
|
|
|
|
* belonging to the same subnet, if it contains other elements.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the address is secondary, %FALSE otherwise
|
|
|
|
|
*/
|
2016-11-14 20:52:24 +01:00
|
|
|
static gboolean
|
2017-07-11 14:25:08 +02:00
|
|
|
ip4_addr_subnets_is_secondary (const NMPObject *address,
|
|
|
|
|
GHashTable *subnets,
|
|
|
|
|
const GPtrArray *addresses,
|
|
|
|
|
const GPtrArray **out_addr_list)
|
|
|
|
|
{
|
|
|
|
|
const NMPlatformIP4Address *a;
|
|
|
|
|
const GPtrArray *addr_list;
|
|
|
|
|
gconstpointer p;
|
2016-11-14 20:52:24 +01:00
|
|
|
guint32 net;
|
2017-07-11 14:25:08 +02:00
|
|
|
const NMPObject **o;
|
|
|
|
|
|
|
|
|
|
a = NMP_OBJECT_CAST_IP4_ADDRESS (address);
|
2016-11-14 20:52:24 +01:00
|
|
|
|
2017-09-05 15:25:34 +02:00
|
|
|
net = a->address & _nm_utils_ip4_prefix_to_netmask (a->plen);
|
2016-11-14 20:52:24 +01:00
|
|
|
p = g_hash_table_lookup (subnets, GUINT_TO_POINTER (net));
|
|
|
|
|
nm_assert (p);
|
2017-07-11 14:25:08 +02:00
|
|
|
if (!ip4_addr_subnets_is_plain_address (addresses, p)) {
|
2016-11-14 20:52:24 +01:00
|
|
|
addr_list = p;
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_assert (addr_list->len > 1);
|
2017-02-08 14:47:14 +01:00
|
|
|
NM_SET_OUT (out_addr_list, addr_list);
|
2017-07-11 14:25:08 +02:00
|
|
|
o = ip4_addr_subnets_addr_list_get (addr_list, 0);
|
|
|
|
|
nm_assert (o && *o);
|
|
|
|
|
if (*o != address)
|
2016-11-14 20:52:24 +01:00
|
|
|
return TRUE;
|
2017-02-08 14:47:14 +01:00
|
|
|
} else {
|
|
|
|
|
NM_SET_OUT (out_addr_list, NULL);
|
2017-07-27 10:59:43 +02:00
|
|
|
return address != *((gconstpointer *) p);
|
2017-02-08 14:47:14 +01:00
|
|
|
}
|
2016-11-14 20:52:24 +01:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-16 14:24:46 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip4_address_sync:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-04-16 14:24:46 +02:00
|
|
|
* @ifindex: Interface index
|
2017-07-11 14:25:08 +02:00
|
|
|
* @known_addresses: List of addresses. The list will be modified and only
|
|
|
|
|
* addresses that were successfully added will be kept in the list.
|
|
|
|
|
* That means, expired addresses and addresses that could not be added
|
|
|
|
|
* will be dropped.
|
|
|
|
|
* Hence, the input argument @known_addresses is also an output argument
|
|
|
|
|
* telling which addresses were succesfully added.
|
|
|
|
|
* Addresses are removed by unrefing the instance via nmp_object_unref()
|
|
|
|
|
* and leaving a NULL tombstone.
|
2013-04-16 14:24:46 +02:00
|
|
|
*
|
|
|
|
|
* A convenience function to synchronize addresses for a specific interface
|
|
|
|
|
* with the least possible disturbance. It simply removes addresses that are
|
|
|
|
|
* not listed and adds addresses that are.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_platform_ip4_address_sync (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
GPtrArray *known_addresses)
|
2013-04-16 14:24:46 +02:00
|
|
|
{
|
2017-07-11 14:25:08 +02:00
|
|
|
gs_unref_ptrarray GPtrArray *plat_addresses = NULL;
|
2016-11-14 20:52:24 +01:00
|
|
|
const NMPlatformIP4Address *known_address;
|
2016-03-15 17:40:43 +01:00
|
|
|
gint32 now = nm_utils_get_monotonic_timestamp_s ();
|
2017-07-11 14:25:08 +02:00
|
|
|
GHashTable *plat_subnets = NULL;
|
|
|
|
|
GHashTable *known_subnets = NULL;
|
|
|
|
|
gs_unref_hashtable GHashTable *known_addresses_idx = NULL;
|
|
|
|
|
guint i, j, len;
|
|
|
|
|
NMPLookup lookup;
|
|
|
|
|
guint32 lifetime, preferred;
|
2017-08-17 17:20:14 +02:00
|
|
|
guint32 ifa_flags;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
if (known_addresses) {
|
|
|
|
|
/* remove all addresses that are already expired. */
|
|
|
|
|
for (i = 0; i < known_addresses->len; i++) {
|
|
|
|
|
const NMPObject *o;
|
|
|
|
|
|
|
|
|
|
o = known_addresses->pdata[i];
|
|
|
|
|
nm_assert (o);
|
|
|
|
|
|
|
|
|
|
known_address = NMP_OBJECT_CAST_IP4_ADDRESS (known_addresses->pdata[i]);
|
|
|
|
|
|
|
|
|
|
if (!nm_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred,
|
|
|
|
|
now, &lifetime, &preferred))
|
|
|
|
|
goto delete_and_next;
|
|
|
|
|
|
|
|
|
|
if (G_UNLIKELY (!known_addresses_idx)) {
|
2017-07-26 13:54:04 +02:00
|
|
|
known_addresses_idx = g_hash_table_new ((GHashFunc) nmp_object_id_hash,
|
|
|
|
|
(GEqualFunc) nmp_object_id_equal);
|
2017-07-11 14:25:08 +02:00
|
|
|
}
|
|
|
|
|
if (!nm_g_hash_table_insert (known_addresses_idx, (gpointer) o, (gpointer) o)) {
|
|
|
|
|
/* duplicate? Keep only the first instance. */
|
|
|
|
|
goto delete_and_next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
delete_and_next:
|
|
|
|
|
nmp_object_unref (o);
|
|
|
|
|
known_addresses->pdata[i] = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( !known_addresses_idx
|
|
|
|
|
|| g_hash_table_size (known_addresses_idx) == 0)
|
|
|
|
|
known_addresses = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
plat_addresses = nm_platform_lookup_clone (self,
|
|
|
|
|
nmp_lookup_init_addrroute (&lookup,
|
|
|
|
|
NMP_OBJECT_TYPE_IP4_ADDRESS,
|
|
|
|
|
ifindex),
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
if (plat_addresses)
|
|
|
|
|
plat_subnets = ip4_addr_subnets_build_index (plat_addresses, TRUE, TRUE);
|
2016-11-14 20:52:24 +01:00
|
|
|
|
|
|
|
|
/* Delete unknown addresses */
|
2017-07-11 14:25:08 +02:00
|
|
|
len = plat_addresses ? plat_addresses->len : 0;
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
|
const NMPObject *plat_obj;
|
|
|
|
|
const NMPlatformIP4Address *plat_address;
|
|
|
|
|
const GPtrArray *addr_list;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
plat_obj = plat_addresses->pdata[i];
|
|
|
|
|
if (!plat_obj) {
|
2016-11-14 20:52:24 +01:00
|
|
|
/* Already deleted */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
plat_address = NMP_OBJECT_CAST_IP4_ADDRESS (plat_obj);
|
|
|
|
|
|
|
|
|
|
if (known_addresses) {
|
|
|
|
|
const NMPObject *o;
|
2016-11-14 20:52:24 +01:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
o = g_hash_table_lookup (known_addresses_idx, plat_obj);
|
|
|
|
|
if (o) {
|
|
|
|
|
gboolean secondary;
|
|
|
|
|
|
|
|
|
|
if (!known_subnets)
|
|
|
|
|
known_subnets = ip4_addr_subnets_build_index (known_addresses, FALSE, FALSE);
|
|
|
|
|
|
|
|
|
|
secondary = ip4_addr_subnets_is_secondary (o, known_subnets, known_addresses, NULL);
|
|
|
|
|
if (secondary == NM_FLAGS_HAS (plat_address->n_ifa_flags, IFA_F_SECONDARY)) {
|
|
|
|
|
/* if we have an existing known-address, with matching secondary role,
|
|
|
|
|
* do not delete the platform-address. */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-11-14 20:52:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_platform_ip4_address_delete (self, ifindex,
|
|
|
|
|
plat_address->address,
|
|
|
|
|
plat_address->plen,
|
|
|
|
|
plat_address->peer_address);
|
|
|
|
|
|
|
|
|
|
if ( !ip4_addr_subnets_is_secondary (plat_obj, plat_subnets, plat_addresses, &addr_list)
|
|
|
|
|
&& addr_list) {
|
|
|
|
|
/* If we just deleted a primary addresses and there were
|
|
|
|
|
* secondary ones the kernel can do two things, depending on
|
|
|
|
|
* version and sysctl setting: delete also secondary addresses
|
|
|
|
|
* or promote a secondary to primary. Ensure that secondary
|
|
|
|
|
* addresses are deleted, so that we can start with a clean
|
|
|
|
|
* slate and add addresses in the right order. */
|
|
|
|
|
for (j = 1; j < addr_list->len; j++) {
|
|
|
|
|
const NMPObject **o;
|
|
|
|
|
|
|
|
|
|
o = ip4_addr_subnets_addr_list_get (addr_list, j);
|
|
|
|
|
nm_assert (o);
|
|
|
|
|
|
|
|
|
|
if (*o) {
|
|
|
|
|
const NMPlatformIP4Address *a;
|
|
|
|
|
|
|
|
|
|
a = NMP_OBJECT_CAST_IP4_ADDRESS (*o);
|
2016-11-14 20:52:24 +01:00
|
|
|
nm_platform_ip4_address_delete (self, ifindex,
|
2017-07-11 14:25:08 +02:00
|
|
|
a->address,
|
|
|
|
|
a->plen,
|
|
|
|
|
a->peer_address);
|
|
|
|
|
nmp_object_unref (*o);
|
|
|
|
|
*o = NULL;
|
2016-11-14 20:52:24 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
2017-07-11 14:25:08 +02:00
|
|
|
ip4_addr_subnets_destroy_index (plat_subnets, plat_addresses);
|
|
|
|
|
ip4_addr_subnets_destroy_index (known_subnets, known_addresses);
|
route-manager: manage IPv4 device-routes with NMRouteManager
When adding an IPv4 address, kernel will also add a device-route.
We don't want that route because it has the wrong metric. Instead,
we add our own route (with a different metric) and remove the
kernel-added one.
This could be avoided if kernel would support an IPv4 address flag
IFA_F_NOPREFIXROUTE like it does for IPv6 (see related bug rh#1221311).
One important thing is, that we want don't want to manage the
device-route on assumed devices. Note that this is correct behavior
if "assumed" means "do-not-touch".
If "assumed" means "seamlessly-takeover", then this is wrong.
Imagine we get a new DHCP address. In this case, we would not manage
the device-route on the assumed device. This cannot be fixed without
splitting unmanaged/assumed with related bug bgo 746440.
This is no regression as we would also not manage device-routes
for assumed devices previously.
We also don't want to remove the device-route if the user added
it externally. Note that here we behave wrongly too, because we
don't record externally added kernel routes in update_ip_config().
This still needs fixing.
Let IPv4 device-routes also be managed by NMRouteManager. NMRouteManager
has a list of all routes and can properly add, remove, and restore
the device route as needed.
One problem is, that the device-route does not get added immediately
with the address. It only appears some time later. This is solved
by NMRouteManager watching platform and if a matchin device-route shows up
within a short time after configuring addresses, remove it.
If the route appears after the short timeout, assume they were added for
other reasons (e.g. by the user) and don't remove them.
https://bugzilla.gnome.org/show_bug.cgi?id=751264
https://bugzilla.redhat.com/show_bug.cgi?id=1211287
2015-06-22 18:21:53 +02:00
|
|
|
|
2013-04-16 14:24:46 +02:00
|
|
|
if (!known_addresses)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
2017-08-17 17:20:14 +02:00
|
|
|
ifa_flags = nm_platform_check_support_kernel_extended_ifa_flags (self)
|
|
|
|
|
? IFA_F_NOPREFIXROUTE
|
|
|
|
|
: 0;
|
|
|
|
|
|
2013-04-16 14:24:46 +02:00
|
|
|
/* Add missing addresses */
|
|
|
|
|
for (i = 0; i < known_addresses->len; i++) {
|
2017-07-11 14:25:08 +02:00
|
|
|
const NMPObject *o;
|
|
|
|
|
|
|
|
|
|
o = known_addresses->pdata[i];
|
|
|
|
|
if (!o)
|
|
|
|
|
continue;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
known_address = NMP_OBJECT_CAST_IP4_ADDRESS (o);
|
2016-11-14 20:52:24 +01:00
|
|
|
|
2016-03-07 11:45:44 +01:00
|
|
|
if (!nm_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred,
|
2016-03-15 17:29:58 +01:00
|
|
|
now, &lifetime, &preferred))
|
2017-07-11 14:25:08 +02:00
|
|
|
goto delete_and_next2;
|
2013-06-29 11:30:11 +02:00
|
|
|
|
2016-02-29 17:06:21 +01:00
|
|
|
if (!nm_platform_ip4_address_add (self, ifindex, known_address->address, known_address->plen,
|
|
|
|
|
known_address->peer_address, lifetime, preferred,
|
2017-08-17 17:20:14 +02:00
|
|
|
ifa_flags,
|
|
|
|
|
known_address->label))
|
2017-07-11 14:25:08 +02:00
|
|
|
goto delete_and_next2;
|
2014-11-11 14:55:07 +01:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
continue;
|
|
|
|
|
delete_and_next2:
|
|
|
|
|
nmp_object_unref (o);
|
|
|
|
|
known_addresses->pdata[i] = NULL;
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_ip6_address_sync:
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
* @self: platform instance
|
2013-04-16 14:24:46 +02:00
|
|
|
* @ifindex: Interface index
|
2017-07-11 14:25:08 +02:00
|
|
|
* @known_addresses: List of IPv6 addresses, as NMPObject. The list
|
|
|
|
|
* is not modified.
|
2015-01-28 12:00:00 +01:00
|
|
|
* @keep_link_local: Don't remove link-local address
|
2013-04-16 14:24:46 +02:00
|
|
|
*
|
|
|
|
|
* A convenience function to synchronize addresses for a specific interface
|
|
|
|
|
* with the least possible disturbance. It simply removes addresses that are
|
|
|
|
|
* not listed and adds addresses that are.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2017-07-11 14:25:08 +02:00
|
|
|
nm_platform_ip6_address_sync (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
const GPtrArray *known_addresses,
|
|
|
|
|
gboolean keep_link_local)
|
2013-04-16 14:24:46 +02:00
|
|
|
{
|
2017-07-11 14:25:08 +02:00
|
|
|
gs_unref_ptrarray GPtrArray *plat_addresses = NULL;
|
2013-04-16 14:24:46 +02:00
|
|
|
NMPlatformIP6Address *address;
|
2016-03-15 17:40:43 +01:00
|
|
|
gint32 now = nm_utils_get_monotonic_timestamp_s ();
|
2017-07-11 14:25:08 +02:00
|
|
|
guint i;
|
|
|
|
|
NMPLookup lookup;
|
2017-09-19 09:40:13 +02:00
|
|
|
guint32 ifa_flags;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
|
|
|
|
/* Delete unknown addresses */
|
2017-07-11 14:25:08 +02:00
|
|
|
plat_addresses = nm_platform_lookup_clone (self,
|
|
|
|
|
nmp_lookup_init_addrroute (&lookup,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ADDRESS,
|
|
|
|
|
ifindex),
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
if (plat_addresses) {
|
|
|
|
|
for (i = 0; i < plat_addresses->len; i++) {
|
|
|
|
|
address = NMP_OBJECT_CAST_IP6_ADDRESS (plat_addresses->pdata[i]);
|
|
|
|
|
|
|
|
|
|
/* Leave link local address management to the kernel */
|
|
|
|
|
if (keep_link_local && IN6_IS_ADDR_LINKLOCAL (&address->address))
|
|
|
|
|
continue;
|
2013-04-16 14:24:46 +02:00
|
|
|
|
2017-07-11 14:25:08 +02:00
|
|
|
if (!array_contains_ip6_address (known_addresses, address, now))
|
|
|
|
|
nm_platform_ip6_address_delete (self, ifindex, address->address, address->plen);
|
|
|
|
|
}
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!known_addresses)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
2017-09-19 09:40:13 +02:00
|
|
|
ifa_flags = nm_platform_check_support_kernel_extended_ifa_flags (self)
|
|
|
|
|
? IFA_F_NOPREFIXROUTE
|
|
|
|
|
: 0;
|
|
|
|
|
|
2013-04-16 14:24:46 +02:00
|
|
|
/* Add missing addresses */
|
|
|
|
|
for (i = 0; i < known_addresses->len; i++) {
|
2017-07-11 14:25:08 +02:00
|
|
|
const NMPlatformIP6Address *known_address = NMP_OBJECT_CAST_IP6_ADDRESS (known_addresses->pdata[i]);
|
2013-07-30 00:03:48 +02:00
|
|
|
guint32 lifetime, preferred;
|
2013-06-29 11:30:11 +02:00
|
|
|
|
2017-01-09 17:57:45 +01:00
|
|
|
if (NM_FLAGS_HAS (known_address->n_ifa_flags, IFA_F_TEMPORARY)) {
|
|
|
|
|
/* Kernel manages these */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-07 11:45:44 +01:00
|
|
|
if (!nm_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred,
|
2016-03-15 17:29:58 +01:00
|
|
|
now, &lifetime, &preferred))
|
2014-03-31 11:19:45 +02:00
|
|
|
continue;
|
2013-06-29 11:30:11 +02:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
if (!nm_platform_ip6_address_add (self, ifindex, known_address->address,
|
2015-10-10 19:58:59 +02:00
|
|
|
known_address->plen, known_address->peer_address,
|
2017-09-19 09:40:13 +02:00
|
|
|
lifetime, preferred,
|
|
|
|
|
ifa_flags | known_address->n_ifa_flags))
|
2013-07-30 00:03:48 +02:00
|
|
|
return FALSE;
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2017-08-14 18:13:10 +02:00
|
|
|
nm_platform_ip_address_flush (NMPlatform *self,
|
|
|
|
|
int addr_family,
|
|
|
|
|
int ifindex)
|
2013-04-16 14:24:46 +02:00
|
|
|
{
|
2017-08-14 18:13:10 +02:00
|
|
|
gboolean success = TRUE;
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
2017-08-14 18:13:10 +02:00
|
|
|
nm_assert (NM_IN_SET (addr_family, AF_UNSPEC,
|
|
|
|
|
AF_INET,
|
|
|
|
|
AF_INET6));
|
|
|
|
|
|
|
|
|
|
if (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET))
|
|
|
|
|
success &= nm_platform_ip4_address_sync (self, ifindex, NULL);
|
|
|
|
|
if (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET6))
|
|
|
|
|
success &= nm_platform_ip6_address_sync (self, ifindex, NULL, FALSE);
|
|
|
|
|
return success;
|
2013-04-16 14:24:46 +02:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-04-16 14:24:46 +02:00
|
|
|
|
2017-09-13 16:45:22 +02:00
|
|
|
static gboolean
|
|
|
|
|
_err_inval_due_to_ipv6_tentative_pref_src (NMPlatform *self, const NMPObject *obj)
|
|
|
|
|
{
|
|
|
|
|
const NMPlatformIP6Route *r;
|
|
|
|
|
const NMPlatformIP6Address *a;
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IS_PLATFORM (self));
|
|
|
|
|
nm_assert (NMP_OBJECT_IS_VALID (obj));
|
|
|
|
|
|
|
|
|
|
/* trying to add an IPv6 route with pref-src fails, if the address is
|
|
|
|
|
* still tentative (rh#1452684). We need to hack around that.
|
|
|
|
|
*
|
|
|
|
|
* Detect it, by guessing whether that's the case. */
|
|
|
|
|
|
|
|
|
|
if (NMP_OBJECT_GET_TYPE (obj) != NMP_OBJECT_TYPE_IP6_ROUTE)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
r = NMP_OBJECT_CAST_IP6_ROUTE (obj);
|
|
|
|
|
|
|
|
|
|
/* we only allow this workaround for routes added manually by the user. */
|
|
|
|
|
if (r->rt_source != NM_IP_CONFIG_SOURCE_USER)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (IN6_IS_ADDR_UNSPECIFIED (&r->pref_src))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
a = nm_platform_ip6_address_get (self, r->ifindex, r->pref_src);
|
|
|
|
|
if (!a)
|
|
|
|
|
return FALSE;
|
|
|
|
|
if ( !NM_FLAGS_HAS (a->n_ifa_flags, IFA_F_TENTATIVE)
|
|
|
|
|
|| NM_FLAGS_HAS (a->n_ifa_flags, IFA_F_DADFAILED))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip_route_sync:
|
|
|
|
|
* @self: the #NMPlatform instance.
|
|
|
|
|
* @addr_family: AF_INET or AF_INET6.
|
|
|
|
|
* @ifindex: the @ifindex for which the routes are to be added.
|
|
|
|
|
* @routes: (allow-none): a list of routes to configure. Must contain
|
|
|
|
|
* NMPObject instances of routes, according to @addr_family.
|
|
|
|
|
* @kernel_delete_predicate: (allow-none): if not %NULL, previously
|
|
|
|
|
* existing routes already configured will only be deleted if the
|
|
|
|
|
* predicate returns TRUE. This allows to preserve/ignore some
|
2017-08-21 23:17:12 +02:00
|
|
|
* routes. For example by passing @nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
* routes with "proto kernel" will be left untouched.
|
|
|
|
|
* @kernel_delete_userdata: user data for @kernel_delete_predicate.
|
2017-09-13 16:45:22 +02:00
|
|
|
* @out_temporary_not_available: (allow-none): (out): routes that could
|
|
|
|
|
* currently not be synced. The caller shall keep them and try later again.
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_ip_route_sync (NMPlatform *self,
|
|
|
|
|
int addr_family,
|
|
|
|
|
int ifindex,
|
|
|
|
|
GPtrArray *routes,
|
|
|
|
|
NMPObjectPredicateFunc kernel_delete_predicate,
|
2017-09-13 16:45:22 +02:00
|
|
|
gpointer kernel_delete_userdata,
|
|
|
|
|
GPtrArray **out_temporary_not_available)
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
{
|
|
|
|
|
const NMPlatformVTableRoute *vt;
|
|
|
|
|
gs_unref_ptrarray GPtrArray *plat_routes = NULL;
|
|
|
|
|
gs_unref_hashtable GHashTable *routes_idx = NULL;
|
|
|
|
|
const NMPObject *plat_o;
|
|
|
|
|
const NMPObject *conf_o;
|
|
|
|
|
const NMDedupMultiEntry *plat_entry;
|
|
|
|
|
guint i;
|
|
|
|
|
int i_type;
|
2017-08-21 19:03:35 +02:00
|
|
|
gboolean success = TRUE;
|
|
|
|
|
char sbuf1[sizeof (_nm_utils_to_string_buffer)];
|
|
|
|
|
char sbuf2[sizeof (_nm_utils_to_string_buffer)];
|
|
|
|
|
char sbuf_err[60];
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
|
|
|
|
|
nm_assert (NM_IS_PLATFORM (self));
|
|
|
|
|
nm_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6));
|
|
|
|
|
nm_assert (ifindex > 0);
|
|
|
|
|
|
|
|
|
|
vt = addr_family == AF_INET
|
|
|
|
|
? &nm_platform_vtable_route_v4
|
|
|
|
|
: &nm_platform_vtable_route_v6;
|
|
|
|
|
|
2017-09-04 07:10:42 +02:00
|
|
|
for (i_type = 0; routes && i_type < 2; i_type++) {
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
for (i = 0; i < routes->len; i++) {
|
2017-08-21 15:33:57 +02:00
|
|
|
NMPlatformError plerr;
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
conf_o = routes->pdata[i];
|
|
|
|
|
|
|
|
|
|
#define VTABLE_IS_DEVICE_ROUTE(vt, o) (vt->is_ip4 \
|
|
|
|
|
? (NMP_OBJECT_CAST_IP4_ROUTE (o)->gateway == 0) \
|
|
|
|
|
: IN6_IS_ADDR_UNSPECIFIED (&NMP_OBJECT_CAST_IP6_ROUTE (o)->gateway) )
|
|
|
|
|
|
|
|
|
|
if ( (i_type == 0 && !VTABLE_IS_DEVICE_ROUTE (vt, conf_o))
|
|
|
|
|
|| (i_type == 1 && VTABLE_IS_DEVICE_ROUTE (vt, conf_o))) {
|
|
|
|
|
/* we add routes in two runs over @i_type.
|
|
|
|
|
*
|
|
|
|
|
* First device routes, then gateway routes. */
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 07:10:42 +02:00
|
|
|
if (!routes_idx) {
|
|
|
|
|
routes_idx = g_hash_table_new ((GHashFunc) nmp_object_id_hash,
|
|
|
|
|
(GEqualFunc) nmp_object_id_equal);
|
|
|
|
|
}
|
|
|
|
|
if (!nm_g_hash_table_insert (routes_idx, (gpointer) conf_o, (gpointer) conf_o)) {
|
|
|
|
|
_LOGD ("route-sync: skip adding duplicate route %s",
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
plat_entry = nm_platform_lookup_entry (self,
|
|
|
|
|
NMP_CACHE_ID_TYPE_OBJECT_TYPE,
|
|
|
|
|
conf_o);
|
|
|
|
|
if (plat_entry) {
|
2017-09-04 07:10:42 +02:00
|
|
|
plat_o = plat_entry->obj;
|
|
|
|
|
|
|
|
|
|
if (vt->route_cmp (NMP_OBJECT_CAST_IPX_ROUTE (conf_o),
|
|
|
|
|
NMP_OBJECT_CAST_IPX_ROUTE (plat_o),
|
|
|
|
|
NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) == 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* we need to replace the existing route with a (slightly) differnt
|
|
|
|
|
* one. Delete it first. */
|
|
|
|
|
if (!nm_platform_ip_route_delete (self, plat_o)) {
|
|
|
|
|
/* ignore error. */
|
2017-08-21 19:03:35 +02:00
|
|
|
}
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-21 15:33:57 +02:00
|
|
|
plerr = nm_platform_ip_route_add (self,
|
2017-08-21 19:03:35 +02:00
|
|
|
NMP_NLM_FLAG_APPEND
|
|
|
|
|
| NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE,
|
2017-08-21 15:33:57 +02:00
|
|
|
conf_o);
|
|
|
|
|
if (plerr != NM_PLATFORM_ERROR_SUCCESS) {
|
2017-08-21 19:03:35 +02:00
|
|
|
if (-((int) plerr) == EEXIST) {
|
|
|
|
|
/* Don't fail for EEXIST. It's not clear that the existing route
|
|
|
|
|
* is identical to the one that we were about to add. However,
|
|
|
|
|
* above we should have deleted conflicting (non-identical) routes. */
|
|
|
|
|
if (_LOGD_ENABLED ()) {
|
|
|
|
|
plat_entry = nm_platform_lookup_entry (self,
|
|
|
|
|
NMP_CACHE_ID_TYPE_OBJECT_TYPE,
|
|
|
|
|
conf_o);
|
|
|
|
|
if (!plat_entry) {
|
|
|
|
|
_LOGD ("route-sync: adding route %s failed with EEXIST, however we cannot find such a route",
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)));
|
|
|
|
|
} else if (vt->route_cmp (NMP_OBJECT_CAST_IPX_ROUTE (conf_o),
|
|
|
|
|
NMP_OBJECT_CAST_IPX_ROUTE (plat_entry->obj),
|
|
|
|
|
NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) != 0) {
|
|
|
|
|
_LOGD ("route-sync: adding route %s failed due to existing (different!) route %s",
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)),
|
|
|
|
|
nmp_object_to_string (plat_entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, sbuf2, sizeof (sbuf2)));
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-13 16:45:22 +02:00
|
|
|
} else if ( -((int) plerr) == EINVAL
|
|
|
|
|
&& out_temporary_not_available
|
|
|
|
|
&& _err_inval_due_to_ipv6_tentative_pref_src (self, conf_o)) {
|
|
|
|
|
_LOGD ("route-sync: ignore failure to add IPv6 route with tentative IPv6 pref-src: %s: %s",
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)),
|
|
|
|
|
nm_platform_error_to_string (plerr, sbuf_err, sizeof (sbuf_err)));
|
|
|
|
|
if (!*out_temporary_not_available)
|
|
|
|
|
*out_temporary_not_available = g_ptr_array_new_full (0, (GDestroyNotify) nmp_object_unref);
|
|
|
|
|
g_ptr_array_add (*out_temporary_not_available, (gpointer) nmp_object_ref (conf_o));
|
2017-08-21 19:03:35 +02:00
|
|
|
} else if (NMP_OBJECT_CAST_IP_ROUTE (conf_o)->rt_source < NM_IP_CONFIG_SOURCE_USER) {
|
|
|
|
|
_LOGD ("route-sync: ignore failure to add IPv%c route: %s: %s",
|
|
|
|
|
vt->is_ip4 ? '4' : '6',
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)),
|
|
|
|
|
nm_platform_error_to_string (plerr, sbuf_err, sizeof (sbuf_err)));
|
|
|
|
|
} else {
|
|
|
|
|
const char *reason = "";
|
|
|
|
|
|
|
|
|
|
if ( -((int) plerr) == ENETUNREACH
|
|
|
|
|
&& ( vt->is_ip4
|
|
|
|
|
? !!NMP_OBJECT_CAST_IP4_ROUTE (conf_o)->gateway
|
|
|
|
|
: !IN6_IS_ADDR_UNSPECIFIED (&NMP_OBJECT_CAST_IP6_ROUTE (conf_o)->gateway)))
|
|
|
|
|
reason = "; is the gateway directly reachable?";
|
|
|
|
|
|
|
|
|
|
_LOGW ("route-sync: failure to add IPv%c route: %s: %s%s",
|
|
|
|
|
vt->is_ip4 ? '4' : '6',
|
|
|
|
|
nmp_object_to_string (conf_o, NMP_OBJECT_TO_STRING_PUBLIC, sbuf1, sizeof (sbuf1)),
|
|
|
|
|
nm_platform_error_to_string (plerr, sbuf_err, sizeof (sbuf_err)),
|
|
|
|
|
reason);
|
|
|
|
|
success = FALSE;
|
|
|
|
|
}
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 07:10:42 +02:00
|
|
|
plat_routes = nm_platform_lookup_addrroute_clone (self,
|
|
|
|
|
vt->obj_type,
|
|
|
|
|
ifindex,
|
|
|
|
|
kernel_delete_predicate,
|
|
|
|
|
kernel_delete_userdata);
|
|
|
|
|
|
|
|
|
|
if (plat_routes) {
|
|
|
|
|
for (i = 0; i < plat_routes->len; i++) {
|
|
|
|
|
plat_o = plat_routes->pdata[i];
|
|
|
|
|
|
|
|
|
|
if ( !routes_idx
|
|
|
|
|
|| !g_hash_table_lookup (routes_idx, plat_o)) {
|
|
|
|
|
if (!nm_platform_ip_route_delete (self, plat_o)) {
|
|
|
|
|
/* ignore error... */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 19:03:35 +02:00
|
|
|
return success;
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
nm_platform_ip_route_flush (NMPlatform *self,
|
|
|
|
|
int addr_family,
|
|
|
|
|
int ifindex)
|
|
|
|
|
{
|
|
|
|
|
gboolean success = TRUE;
|
|
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IN_SET (addr_family, AF_UNSPEC,
|
|
|
|
|
AF_INET,
|
|
|
|
|
AF_INET6));
|
|
|
|
|
|
|
|
|
|
if (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET))
|
2017-09-13 16:45:22 +02:00
|
|
|
success &= nm_platform_ip_route_sync (self, AF_INET, ifindex, NULL, NULL, NULL, NULL);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
if (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET6))
|
2017-09-13 16:45:22 +02:00
|
|
|
success &= nm_platform_ip_route_sync (self, AF_INET6, ifindex, NULL, NULL, NULL, NULL);
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-08-17 15:17:40 +02:00
|
|
|
static guint8
|
|
|
|
|
_ip_route_scope_inv_get_normalized (const NMPlatformIP4Route *route)
|
|
|
|
|
{
|
|
|
|
|
/* in kernel, you cannot set scope to RT_SCOPE_NOWHERE (255).
|
|
|
|
|
* That means, in NM, we treat RT_SCOPE_NOWHERE as unset, and detect
|
|
|
|
|
* it based on the presence of the gateway. In other words, when adding
|
|
|
|
|
* a route with scope RT_SCOPE_NOWHERE (in NetworkManager) to kernel,
|
|
|
|
|
* the resulting scope will be either "link" or "universe" (depending
|
|
|
|
|
* on the gateway).
|
|
|
|
|
*
|
|
|
|
|
* Note that internally, we track @scope_inv is the inverse of scope,
|
|
|
|
|
* so that the default equals zero (~(RT_SCOPE_NOWHERE)).
|
|
|
|
|
**/
|
|
|
|
|
if (route->scope_inv == 0) {
|
|
|
|
|
return nm_platform_route_scope_inv (!route->gateway
|
|
|
|
|
? RT_SCOPE_LINK : RT_SCOPE_UNIVERSE);
|
|
|
|
|
}
|
|
|
|
|
return route->scope_inv;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-17 13:37:21 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip_route_normalize:
|
|
|
|
|
* @addr_family: AF_INET or AF_INET6
|
|
|
|
|
* @route: an NMPlatformIP4Route or NMPlatformIP6Route instance, depending on @addr_family.
|
|
|
|
|
*
|
|
|
|
|
* Adding a route to kernel via nm_platform_ip_route_add() will normalize/coerce some
|
|
|
|
|
* properties of the route. This function modifies (normalizes) the route like it
|
|
|
|
|
* would be done by adding the route in kernel.
|
2017-09-02 16:56:27 +02:00
|
|
|
*
|
|
|
|
|
* Note that this function is related to NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY
|
|
|
|
|
* in that if two routes compare semantically equal, after normalizing they also shall
|
|
|
|
|
* compare equal with NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL.
|
2017-08-17 13:37:21 +02:00
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
nm_platform_ip_route_normalize (int addr_family,
|
|
|
|
|
NMPlatformIPRoute *route)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformIP4Route *r4;
|
|
|
|
|
NMPlatformIP6Route *r6;
|
|
|
|
|
|
|
|
|
|
switch (addr_family) {
|
|
|
|
|
case AF_INET:
|
|
|
|
|
r4 = (NMPlatformIP4Route *) route;
|
2017-09-22 15:26:56 +02:00
|
|
|
r4->table_coerced = nm_platform_route_table_coerce (nm_platform_route_table_uncoerce (r4->table_coerced, TRUE));
|
2017-08-17 13:37:21 +02:00
|
|
|
r4->network = nm_utils_ip4_address_clear_host_address (r4->network, r4->plen);
|
|
|
|
|
r4->rt_source = nmp_utils_ip_config_source_round_trip_rtprot (r4->rt_source);
|
2017-08-17 15:17:40 +02:00
|
|
|
r4->scope_inv = _ip_route_scope_inv_get_normalized (r4);
|
2017-08-17 13:37:21 +02:00
|
|
|
break;
|
|
|
|
|
case AF_INET6:
|
|
|
|
|
r6 = (NMPlatformIP6Route *) route;
|
2017-09-22 15:26:56 +02:00
|
|
|
r6->table_coerced = nm_platform_route_table_coerce (nm_platform_route_table_uncoerce (r6->table_coerced, TRUE));
|
2017-08-17 13:37:21 +02:00
|
|
|
nm_utils_ip6_address_clear_host_address (&r6->network, &r6->network, r6->plen);
|
|
|
|
|
r6->rt_source = nmp_utils_ip_config_source_round_trip_rtprot (r6->rt_source),
|
|
|
|
|
r6->metric = nm_utils_ip6_route_metric_normalize (r6->metric);
|
|
|
|
|
nm_utils_ip6_address_clear_host_address (&r6->src, &r6->src, r6->src_plen);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
nm_assert_not_reached ();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 15:33:57 +02:00
|
|
|
static NMPlatformError
|
2017-08-14 14:17:00 +02:00
|
|
|
_ip_route_add (NMPlatform *self,
|
|
|
|
|
NMPNlmFlags flags,
|
|
|
|
|
int addr_family,
|
|
|
|
|
gconstpointer route)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-08-02 10:27:32 +02:00
|
|
|
char sbuf[sizeof (_nm_utils_to_string_buffer)];
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-08-14 14:17:00 +02:00
|
|
|
nm_assert (route);
|
|
|
|
|
nm_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6));
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-08-14 14:17:00 +02:00
|
|
|
_LOGD ("route: %-10s IPv%c route: %s",
|
2017-08-21 18:02:08 +02:00
|
|
|
_nmp_nlm_flag_to_string (flags & NMP_NLM_FLAG_FMASK),
|
2017-08-14 14:17:00 +02:00
|
|
|
addr_family == AF_INET ? '4' : '6',
|
|
|
|
|
addr_family == AF_INET
|
|
|
|
|
? nm_platform_ip4_route_to_string (route, sbuf, sizeof (sbuf))
|
|
|
|
|
: nm_platform_ip6_route_to_string (route, sbuf, sizeof (sbuf)));
|
2017-02-09 23:22:25 +01:00
|
|
|
|
2017-08-14 14:17:00 +02:00
|
|
|
return klass->ip_route_add (self, flags, addr_family, route);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 15:33:57 +02:00
|
|
|
NMPlatformError
|
2017-08-14 14:17:00 +02:00
|
|
|
nm_platform_ip_route_add (NMPlatform *self,
|
|
|
|
|
NMPNlmFlags flags,
|
|
|
|
|
const NMPObject *route)
|
|
|
|
|
{
|
|
|
|
|
int addr_family;
|
|
|
|
|
|
|
|
|
|
switch (NMP_OBJECT_GET_TYPE (route)) {
|
|
|
|
|
case NMP_OBJECT_TYPE_IP4_ROUTE:
|
|
|
|
|
addr_family = AF_INET;
|
|
|
|
|
break;
|
|
|
|
|
case NMP_OBJECT_TYPE_IP6_ROUTE:
|
|
|
|
|
addr_family = AF_INET6;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
g_return_val_if_reached (FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _ip_route_add (self, flags, addr_family, NMP_OBJECT_CAST_IP_ROUTE (route));
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-21 15:33:57 +02:00
|
|
|
NMPlatformError
|
2017-08-14 14:17:00 +02:00
|
|
|
nm_platform_ip4_route_add (NMPlatform *self,
|
|
|
|
|
NMPNlmFlags flags,
|
|
|
|
|
const NMPlatformIP4Route *route)
|
|
|
|
|
{
|
|
|
|
|
return _ip_route_add (self, flags, AF_INET, route);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-08-21 15:33:57 +02:00
|
|
|
NMPlatformError
|
2017-08-02 10:27:32 +02:00
|
|
|
nm_platform_ip6_route_add (NMPlatform *self,
|
|
|
|
|
NMPNlmFlags flags,
|
|
|
|
|
const NMPlatformIP6Route *route)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2017-08-14 14:17:00 +02:00
|
|
|
return _ip_route_add (self, flags, AF_INET6, route);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
platform: pass full route object to platform delete function
Contrary to addresses, routes have no ID. When deleting a route,
you cannot just specify certain properties like network/plen,metric.
Well, actually you can specify only certain properties, but then kernel
will treat unspecified properties as wildcard and delete the first matching
route. That is not something we want, because we need to be in control which
exact route shall be deleted.
Also, rtm_tos *must* match. Even if we like the wildcard behavior,
we would need to pass TOS to nm_platform_ip4_route_delete() to be
able to delete routes with non-zero TOS. So, while certain properties
may be omitted, some must not. See how test_ip4_route_options() was
broken.
For NetworkManager it only makes ever sense to call delete on a route,
if the route is already fully known. Which means, we only delete routes
that we have already in the platform cache (otherwise, how would we know
that there is something to delete). Because of that, no longer have separate
IPv4 and IPv6 functions. Instead, have nm_platform_ip_route_delete() which
accepts a full NMPObject from the platform cache.
The code in core doesn't jet make use of this new functionality. It will
in the future.
At least, it fixes deleting routes with differing TOS.
2017-07-11 16:38:49 +02:00
|
|
|
nm_platform_ip_route_delete (NMPlatform *self,
|
|
|
|
|
const NMPObject *obj)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: pass full route object to platform delete function
Contrary to addresses, routes have no ID. When deleting a route,
you cannot just specify certain properties like network/plen,metric.
Well, actually you can specify only certain properties, but then kernel
will treat unspecified properties as wildcard and delete the first matching
route. That is not something we want, because we need to be in control which
exact route shall be deleted.
Also, rtm_tos *must* match. Even if we like the wildcard behavior,
we would need to pass TOS to nm_platform_ip4_route_delete() to be
able to delete routes with non-zero TOS. So, while certain properties
may be omitted, some must not. See how test_ip4_route_options() was
broken.
For NetworkManager it only makes ever sense to call delete on a route,
if the route is already fully known. Which means, we only delete routes
that we have already in the platform cache (otherwise, how would we know
that there is something to delete). Because of that, no longer have separate
IPv4 and IPv6 functions. Instead, have nm_platform_ip_route_delete() which
accepts a full NMPObject from the platform cache.
The code in core doesn't jet make use of this new functionality. It will
in the future.
At least, it fixes deleting routes with differing TOS.
2017-07-11 16:38:49 +02:00
|
|
|
nm_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj), NMP_OBJECT_TYPE_IP4_ROUTE,
|
|
|
|
|
NMP_OBJECT_TYPE_IP6_ROUTE));
|
2014-08-11 21:40:52 +02:00
|
|
|
|
2017-08-02 10:27:32 +02:00
|
|
|
_LOGD ("route: delete IPv%c route %s",
|
platform: pass full route object to platform delete function
Contrary to addresses, routes have no ID. When deleting a route,
you cannot just specify certain properties like network/plen,metric.
Well, actually you can specify only certain properties, but then kernel
will treat unspecified properties as wildcard and delete the first matching
route. That is not something we want, because we need to be in control which
exact route shall be deleted.
Also, rtm_tos *must* match. Even if we like the wildcard behavior,
we would need to pass TOS to nm_platform_ip4_route_delete() to be
able to delete routes with non-zero TOS. So, while certain properties
may be omitted, some must not. See how test_ip4_route_options() was
broken.
For NetworkManager it only makes ever sense to call delete on a route,
if the route is already fully known. Which means, we only delete routes
that we have already in the platform cache (otherwise, how would we know
that there is something to delete). Because of that, no longer have separate
IPv4 and IPv6 functions. Instead, have nm_platform_ip_route_delete() which
accepts a full NMPObject from the platform cache.
The code in core doesn't jet make use of this new functionality. It will
in the future.
At least, it fixes deleting routes with differing TOS.
2017-07-11 16:38:49 +02:00
|
|
|
NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_IP4_ROUTE ? '4' : '6',
|
|
|
|
|
nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
|
platform: pass full route object to platform delete function
Contrary to addresses, routes have no ID. When deleting a route,
you cannot just specify certain properties like network/plen,metric.
Well, actually you can specify only certain properties, but then kernel
will treat unspecified properties as wildcard and delete the first matching
route. That is not something we want, because we need to be in control which
exact route shall be deleted.
Also, rtm_tos *must* match. Even if we like the wildcard behavior,
we would need to pass TOS to nm_platform_ip4_route_delete() to be
able to delete routes with non-zero TOS. So, while certain properties
may be omitted, some must not. See how test_ip4_route_options() was
broken.
For NetworkManager it only makes ever sense to call delete on a route,
if the route is already fully known. Which means, we only delete routes
that we have already in the platform cache (otherwise, how would we know
that there is something to delete). Because of that, no longer have separate
IPv4 and IPv6 functions. Instead, have nm_platform_ip_route_delete() which
accepts a full NMPObject from the platform cache.
The code in core doesn't jet make use of this new functionality. It will
in the future.
At least, it fixes deleting routes with differing TOS.
2017-07-11 16:38:49 +02:00
|
|
|
return klass->ip_route_delete (self, obj);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-08-16 16:13:24 +02:00
|
|
|
NMPlatformError
|
|
|
|
|
nm_platform_ip_route_get (NMPlatform *self,
|
|
|
|
|
int addr_family,
|
|
|
|
|
gconstpointer address /* in_addr_t or struct in6_addr */,
|
2017-09-07 11:11:32 +02:00
|
|
|
int oif_ifindex,
|
2017-08-16 16:13:24 +02:00
|
|
|
NMPObject **out_route)
|
|
|
|
|
{
|
|
|
|
|
nm_auto_nmpobj NMPObject *route = NULL;
|
|
|
|
|
NMPlatformError result;
|
|
|
|
|
char buf[NM_UTILS_INET_ADDRSTRLEN];
|
2017-08-21 19:18:45 +02:00
|
|
|
char buf_err[200];
|
2017-09-07 11:11:32 +02:00
|
|
|
char buf_oif[64];
|
2017-08-16 16:13:24 +02:00
|
|
|
|
|
|
|
|
_CHECK_SELF (self, klass, FALSE);
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (address, NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
g_return_val_if_fail (NM_IN_SET (addr_family, AF_INET,
|
|
|
|
|
AF_INET6), NM_PLATFORM_ERROR_BUG);
|
|
|
|
|
|
2017-09-07 11:11:32 +02:00
|
|
|
_LOGT ("route: get IPv%c route for: %s%s",
|
2017-08-16 16:13:24 +02:00
|
|
|
addr_family == AF_INET ? '4' : '6',
|
2017-09-07 11:11:32 +02:00
|
|
|
inet_ntop (addr_family, address, buf, sizeof (buf)),
|
|
|
|
|
oif_ifindex > 0 ? nm_sprintf_buf (buf_oif, " oif %d", oif_ifindex) : "");
|
2017-08-16 16:13:24 +02:00
|
|
|
|
|
|
|
|
if (!klass->ip_route_get)
|
|
|
|
|
result = NM_PLATFORM_ERROR_OPNOTSUPP;
|
|
|
|
|
else {
|
|
|
|
|
result = klass->ip_route_get (self,
|
|
|
|
|
addr_family,
|
|
|
|
|
address,
|
2017-09-07 11:11:32 +02:00
|
|
|
oif_ifindex,
|
2017-08-16 16:13:24 +02:00
|
|
|
&route);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result != NM_PLATFORM_ERROR_SUCCESS) {
|
|
|
|
|
nm_assert (!route);
|
|
|
|
|
_LOGW ("route: get IPv%c route for: %s failed with %s",
|
|
|
|
|
addr_family == AF_INET ? '4' : '6',
|
|
|
|
|
inet_ntop (addr_family, address, buf, sizeof (buf)),
|
2017-08-21 19:18:45 +02:00
|
|
|
nm_platform_error_to_string (result, buf_err, sizeof (buf_err)));
|
2017-08-16 16:13:24 +02:00
|
|
|
} else {
|
|
|
|
|
nm_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (route), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
|
|
|
|
|
nm_assert (!NMP_OBJECT_IS_STACKINIT (route));
|
|
|
|
|
nm_assert (route->parent._ref_count == 1);
|
|
|
|
|
_LOGD ("route: get IPv%c route for: %s succeeded: %s",
|
|
|
|
|
addr_family == AF_INET ? '4' : '6',
|
|
|
|
|
inet_ntop (addr_family, address, buf, sizeof (buf)),
|
|
|
|
|
nmp_object_to_string (route, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
NM_SET_OUT (out_route, g_steal_pointer (&route));
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
#define IP4_DEV_ROUTE_BLACKLIST_TIMEOUT_MS ((int) 1500)
|
|
|
|
|
#define IP4_DEV_ROUTE_BLACKLIST_GC_TIMEOUT_S ((int) (((IP4_DEV_ROUTE_BLACKLIST_TIMEOUT_MS + 999) * 3) / 1000))
|
|
|
|
|
|
|
|
|
|
static gint64
|
|
|
|
|
_ip4_dev_route_blacklist_timeout_ms_get (gint64 timeout_ms)
|
|
|
|
|
{
|
|
|
|
|
return timeout_ms >> 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gint64
|
|
|
|
|
_ip4_dev_route_blacklist_timeout_ms_marked (gint64 timeout_ms)
|
|
|
|
|
{
|
|
|
|
|
return !!(timeout_ms & ((gint64) 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
_ip4_dev_route_blacklist_check_cb (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMPlatform *self = user_data;
|
|
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
const NMPObject *p_obj;
|
|
|
|
|
gint64 *p_timeout_ms;
|
|
|
|
|
gint64 now_ms;
|
|
|
|
|
|
|
|
|
|
priv->ip4_dev_route_blacklist_check_id = 0;
|
|
|
|
|
|
|
|
|
|
again:
|
|
|
|
|
if (!priv->ip4_dev_route_blacklist_hash)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
now_ms = nm_utils_get_monotonic_timestamp_ms ();
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init (&iter, priv->ip4_dev_route_blacklist_hash);
|
|
|
|
|
while (g_hash_table_iter_next (&iter, (gpointer *) &p_obj, (gpointer *) &p_timeout_ms)) {
|
|
|
|
|
if (!_ip4_dev_route_blacklist_timeout_ms_marked (*p_timeout_ms))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* unmark because we checked it. */
|
|
|
|
|
*p_timeout_ms = *p_timeout_ms & ~((gint64) 1);
|
|
|
|
|
|
|
|
|
|
if (now_ms > _ip4_dev_route_blacklist_timeout_ms_get (*p_timeout_ms))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (!nm_platform_lookup_entry (self,
|
|
|
|
|
NMP_CACHE_ID_TYPE_OBJECT_TYPE,
|
|
|
|
|
p_obj))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
_LOGT ("ip4-dev-route: delete %s",
|
|
|
|
|
nmp_object_to_string (p_obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
nm_platform_ip_route_delete (self, p_obj);
|
|
|
|
|
goto again;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return G_SOURCE_REMOVE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_ip4_dev_route_blacklist_check_schedule (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if (!priv->ip4_dev_route_blacklist_check_id) {
|
|
|
|
|
priv->ip4_dev_route_blacklist_check_id = g_idle_add_full (G_PRIORITY_HIGH,
|
|
|
|
|
_ip4_dev_route_blacklist_check_cb,
|
|
|
|
|
self,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_ip4_dev_route_blacklist_notify_route (NMPlatform *self,
|
|
|
|
|
const NMPObject *obj)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformPrivate *priv;
|
|
|
|
|
const NMPObject *p_obj;
|
|
|
|
|
gint64 *p_timeout_ms;
|
|
|
|
|
gint64 now_ms;
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IS_PLATFORM (self));
|
|
|
|
|
nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_IP4_ROUTE);
|
|
|
|
|
|
|
|
|
|
priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
nm_assert (priv->ip4_dev_route_blacklist_gc_timeout_id);
|
|
|
|
|
|
|
|
|
|
if (!g_hash_table_lookup_extended (priv->ip4_dev_route_blacklist_hash,
|
|
|
|
|
obj,
|
|
|
|
|
(gpointer *) &p_obj,
|
|
|
|
|
(gpointer *) &p_timeout_ms))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
now_ms = nm_utils_get_monotonic_timestamp_ms ();
|
|
|
|
|
if (now_ms > _ip4_dev_route_blacklist_timeout_ms_get (*p_timeout_ms)) {
|
|
|
|
|
/* already expired. Wait for gc. */
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_ip4_dev_route_blacklist_timeout_ms_marked (*p_timeout_ms)) {
|
|
|
|
|
nm_assert (priv->ip4_dev_route_blacklist_check_id);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We cannot delete it right away because we are in the process of receiving netlink messages.
|
|
|
|
|
* It may be possible to do so, but complicated and error prone.
|
|
|
|
|
*
|
|
|
|
|
* Instead, we mark the entry and schedule an idle action (with high priority). */
|
|
|
|
|
*p_timeout_ms = (*p_timeout_ms) | ((gint64) 1);
|
|
|
|
|
_ip4_dev_route_blacklist_check_schedule (self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
_ip4_dev_route_blacklist_gc_timeout_handle (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMPlatform *self = user_data;
|
|
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
const NMPObject *p_obj;
|
|
|
|
|
gint64 *p_timeout_ms;
|
|
|
|
|
gint64 now_ms;
|
|
|
|
|
|
|
|
|
|
nm_assert (priv->ip4_dev_route_blacklist_gc_timeout_id);
|
|
|
|
|
|
|
|
|
|
now_ms = nm_utils_get_monotonic_timestamp_ms ();
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init (&iter, priv->ip4_dev_route_blacklist_hash);
|
|
|
|
|
while (g_hash_table_iter_next (&iter, (gpointer *) &p_obj, (gpointer *) &p_timeout_ms)) {
|
|
|
|
|
if (now_ms > _ip4_dev_route_blacklist_timeout_ms_get (*p_timeout_ms)) {
|
|
|
|
|
_LOGT ("ip4-dev-route: cleanup %s",
|
|
|
|
|
nmp_object_to_string (p_obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
g_hash_table_iter_remove (&iter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_ip4_dev_route_blacklist_schedule (self);
|
|
|
|
|
return G_SOURCE_CONTINUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
_ip4_dev_route_blacklist_schedule (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
if ( !priv->ip4_dev_route_blacklist_hash
|
|
|
|
|
|| g_hash_table_size (priv->ip4_dev_route_blacklist_hash) == 0) {
|
|
|
|
|
g_clear_pointer (&priv->ip4_dev_route_blacklist_hash, g_hash_table_unref);
|
|
|
|
|
nm_clear_g_source (&priv->ip4_dev_route_blacklist_gc_timeout_id);
|
|
|
|
|
} else {
|
|
|
|
|
if (!priv->ip4_dev_route_blacklist_gc_timeout_id) {
|
|
|
|
|
/* this timeout is only to garbage collect the expired entries from priv->ip4_dev_route_blacklist_hash.
|
|
|
|
|
* It can run infrequently, and it doesn't hurt if expired entries linger around a bit
|
|
|
|
|
* longer then necessary. */
|
|
|
|
|
priv->ip4_dev_route_blacklist_gc_timeout_id = g_timeout_add_seconds (IP4_DEV_ROUTE_BLACKLIST_GC_TIMEOUT_S,
|
|
|
|
|
_ip4_dev_route_blacklist_gc_timeout_handle,
|
|
|
|
|
self);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_ip4_dev_route_blacklist_set:
|
|
|
|
|
* @self:
|
|
|
|
|
* @ifindex:
|
|
|
|
|
* @ip4_dev_route_blacklist:
|
|
|
|
|
*
|
|
|
|
|
* When adding an IP address, kernel automatically adds a device route.
|
2017-08-17 17:20:14 +02:00
|
|
|
* This can be suppressed via the IFA_F_NOPREFIXROUTE address flag. For proper
|
|
|
|
|
* IPv6 support, we require kernel support for IFA_F_NOPREFIXROUTE and always
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
* add the device route manually.
|
|
|
|
|
*
|
|
|
|
|
* For IPv4, this flag is rather new and we don't rely on it yet. We want to use
|
|
|
|
|
* it (but currently still don't). So, for IPv4, kernel possibly adds a device
|
|
|
|
|
* route, however it has a wrong metric of zero. We add our own device route (with
|
|
|
|
|
* proper metric), but need to delete the route that kernel adds.
|
|
|
|
|
*
|
|
|
|
|
* The problem is, that kernel does not immidiately add the route, when adding
|
|
|
|
|
* the address. It only shows up some time later. So, we register here a list
|
|
|
|
|
* of blacklisted routes, and when they show up within a time out, we assume it's
|
|
|
|
|
* the kernel generated one, and we delete it.
|
|
|
|
|
*
|
|
|
|
|
* Eventually, we want to get rid of this and use IFA_F_NOPREFIXROUTE for IPv4
|
|
|
|
|
* routes as well.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
nm_platform_ip4_dev_route_blacklist_set (NMPlatform *self,
|
|
|
|
|
int ifindex,
|
|
|
|
|
GPtrArray *ip4_dev_route_blacklist)
|
|
|
|
|
{
|
|
|
|
|
NMPlatformPrivate *priv;
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
const NMPObject *p_obj;
|
|
|
|
|
guint i;
|
|
|
|
|
gint64 timeout_ms;
|
|
|
|
|
gint64 timeout_ms_val;
|
|
|
|
|
gint64 *p_timeout_ms;
|
|
|
|
|
gboolean needs_check = FALSE;
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IS_PLATFORM (self));
|
|
|
|
|
nm_assert (ifindex > 0);
|
|
|
|
|
|
|
|
|
|
priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
/* first, expire all for current ifindex... */
|
|
|
|
|
if (priv->ip4_dev_route_blacklist_hash) {
|
|
|
|
|
g_hash_table_iter_init (&iter, priv->ip4_dev_route_blacklist_hash);
|
|
|
|
|
while (g_hash_table_iter_next (&iter, (gpointer *) &p_obj, (gpointer *) &p_timeout_ms)) {
|
|
|
|
|
if (NMP_OBJECT_CAST_IP4_ROUTE (p_obj)->ifindex == ifindex) {
|
|
|
|
|
/* we could g_hash_table_iter_remove(&iter) the current entry.
|
|
|
|
|
* Instead, just expire it and let _ip4_dev_route_blacklist_gc_timeout_handle()
|
|
|
|
|
* handle it.
|
|
|
|
|
*
|
|
|
|
|
* The assumption is, that ip4_dev_route_blacklist contains the very same entry
|
|
|
|
|
* again, with a new timeout. So, we can un-expire it below. */
|
|
|
|
|
*p_timeout_ms = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( ip4_dev_route_blacklist
|
|
|
|
|
&& ip4_dev_route_blacklist->len > 0) {
|
|
|
|
|
|
|
|
|
|
if (!priv->ip4_dev_route_blacklist_hash) {
|
|
|
|
|
priv->ip4_dev_route_blacklist_hash = g_hash_table_new_full ((GHashFunc) nmp_object_id_hash,
|
|
|
|
|
(GEqualFunc) nmp_object_id_equal,
|
|
|
|
|
(GDestroyNotify) nmp_object_unref,
|
|
|
|
|
nm_g_slice_free_fcn_gint64);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timeout_ms = nm_utils_get_monotonic_timestamp_ms () + IP4_DEV_ROUTE_BLACKLIST_TIMEOUT_MS;
|
|
|
|
|
timeout_ms_val = (timeout_ms << 1) | ((gint64) 1);
|
|
|
|
|
for (i = 0; i < ip4_dev_route_blacklist->len; i++) {
|
|
|
|
|
const NMPObject *o;
|
|
|
|
|
|
|
|
|
|
needs_check = TRUE;
|
|
|
|
|
o = ip4_dev_route_blacklist->pdata[i];
|
|
|
|
|
if (g_hash_table_lookup_extended (priv->ip4_dev_route_blacklist_hash,
|
|
|
|
|
o,
|
|
|
|
|
(gpointer *) &p_obj,
|
|
|
|
|
(gpointer *) &p_timeout_ms)) {
|
|
|
|
|
if (nmp_object_equal (p_obj, o)) {
|
|
|
|
|
/* un-expire and reuse the entry. */
|
|
|
|
|
_LOGT ("ip4-dev-route: register %s (update)",
|
|
|
|
|
nmp_object_to_string (p_obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
*p_timeout_ms = timeout_ms_val;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_LOGT ("ip4-dev-route: register %s",
|
|
|
|
|
nmp_object_to_string (o, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
p_timeout_ms = g_slice_new (gint64);
|
|
|
|
|
*p_timeout_ms = timeout_ms_val;
|
|
|
|
|
g_hash_table_replace (priv->ip4_dev_route_blacklist_hash,
|
|
|
|
|
(gpointer) nmp_object_ref (o),
|
|
|
|
|
p_timeout_ms);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_ip4_dev_route_blacklist_schedule (self);
|
|
|
|
|
|
|
|
|
|
if (needs_check)
|
|
|
|
|
_ip4_dev_route_blacklist_check_schedule (self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
const char *
|
|
|
|
|
nm_platform_vlan_qos_mapping_to_string (const char *name,
|
|
|
|
|
const NMVlanQosMapping *map,
|
|
|
|
|
gsize n_map,
|
|
|
|
|
char *buf,
|
|
|
|
|
gsize len)
|
|
|
|
|
{
|
|
|
|
|
gsize i;
|
|
|
|
|
char *b;
|
|
|
|
|
|
|
|
|
|
nm_utils_to_string_buffer_init (&buf, &len);
|
|
|
|
|
|
|
|
|
|
if (!n_map) {
|
|
|
|
|
nm_utils_strbuf_append_str (&buf, &len, "");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!map)
|
|
|
|
|
g_return_val_if_reached ("");
|
|
|
|
|
|
|
|
|
|
b = buf;
|
|
|
|
|
|
|
|
|
|
if (name) {
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, name);
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " {");
|
|
|
|
|
} else
|
|
|
|
|
nm_utils_strbuf_append_c (&b, &len, '{');
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < n_map; i++)
|
|
|
|
|
nm_utils_strbuf_append (&b, &len, " %u:%u", map[i].from, map[i].to);
|
|
|
|
|
nm_utils_strbuf_append_str (&b, &len, " }");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-02 14:31:12 +02:00
|
|
|
static const char *
|
|
|
|
|
_lifetime_to_string (guint32 timestamp, guint32 lifetime, gint32 now, char *buf, size_t buf_size)
|
|
|
|
|
{
|
|
|
|
|
if (lifetime == NM_PLATFORM_LIFETIME_PERMANENT)
|
|
|
|
|
return "forever";
|
|
|
|
|
|
2014-06-06 20:05:08 +02:00
|
|
|
g_snprintf (buf, buf_size, "%usec",
|
2016-03-15 17:29:58 +01:00
|
|
|
nm_utils_lifetime_rebase_relative_time_on_now (timestamp, lifetime, now));
|
2014-04-02 14:31:12 +02:00
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
|
_lifetime_summary_to_string (gint32 now, guint32 timestamp, guint32 preferred, guint32 lifetime, char *buf, size_t buf_size)
|
|
|
|
|
{
|
|
|
|
|
g_snprintf (buf, buf_size, " lifetime %d-%u[%u,%u]",
|
|
|
|
|
(signed) now, (unsigned) timestamp, (unsigned) preferred, (unsigned) lifetime);
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_link_to_string:
|
|
|
|
|
* @route: pointer to NMPlatformLink address structure
|
|
|
|
|
* @buf: (allow-none): an optional buffer. If %NULL, a static buffer is used.
|
|
|
|
|
* @len: the size of the @buf. If @buf is %NULL, this argument is ignored.
|
|
|
|
|
*
|
|
|
|
|
* A method for converting an link struct into a string representation.
|
|
|
|
|
*
|
|
|
|
|
* Returns: a string representation of the link.
|
|
|
|
|
*/
|
2014-02-17 14:08:32 +01:00
|
|
|
const char *
|
2015-10-12 10:27:33 +02:00
|
|
|
nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
|
2014-02-17 14:08:32 +01:00
|
|
|
{
|
|
|
|
|
char master[20];
|
|
|
|
|
char parent[20];
|
2015-05-05 01:25:19 +02:00
|
|
|
GString *str_flags;
|
|
|
|
|
char str_addrmode[30];
|
|
|
|
|
gs_free char *str_addr = NULL;
|
2016-04-29 21:25:43 +02:00
|
|
|
char str_inet6_token[NM_UTILS_INET_ADDRSTRLEN];
|
2015-10-14 18:45:36 +02:00
|
|
|
const char *str_link_type;
|
2014-02-17 14:08:32 +01:00
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (link, &buf, &len))
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2014-02-17 14:08:32 +01:00
|
|
|
|
2015-05-05 01:25:19 +02:00
|
|
|
str_flags = g_string_new (NULL);
|
2016-02-29 15:52:27 +01:00
|
|
|
if (NM_FLAGS_HAS (link->n_ifi_flags, IFF_NOARP))
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_append (str_flags, "NOARP,");
|
2016-02-29 15:52:27 +01:00
|
|
|
if (NM_FLAGS_HAS (link->n_ifi_flags, IFF_UP))
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_append (str_flags, "UP");
|
2014-02-17 14:08:32 +01:00
|
|
|
else
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_append (str_flags, "DOWN");
|
2014-02-17 14:08:32 +01:00
|
|
|
if (link->connected)
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_append (str_flags, ",LOWER_UP");
|
2014-02-17 14:08:32 +01:00
|
|
|
|
2016-02-29 15:52:27 +01:00
|
|
|
if (link->n_ifi_flags) {
|
2015-05-05 01:25:19 +02:00
|
|
|
char str_flags_buf[64];
|
|
|
|
|
|
2016-02-29 15:52:27 +01:00
|
|
|
nm_platform_link_flags2str (link->n_ifi_flags, str_flags_buf, sizeof (str_flags_buf));
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_append_printf (str_flags, ";%s", str_flags_buf);
|
2015-04-25 16:42:26 +02:00
|
|
|
}
|
|
|
|
|
|
2014-02-17 14:08:32 +01:00
|
|
|
if (link->master)
|
|
|
|
|
g_snprintf (master, sizeof (master), " master %d", link->master);
|
|
|
|
|
else
|
|
|
|
|
master[0] = 0;
|
|
|
|
|
|
2015-08-17 17:48:37 +02:00
|
|
|
if (link->parent > 0)
|
2015-08-17 18:31:12 +02:00
|
|
|
g_snprintf (parent, sizeof (parent), "@%d", link->parent);
|
2015-08-17 17:48:37 +02:00
|
|
|
else if (link->parent == NM_PLATFORM_LINK_OTHER_NETNS)
|
|
|
|
|
g_strlcpy (parent, "@other-netns", sizeof (parent));
|
2014-02-17 14:08:32 +01:00
|
|
|
else
|
|
|
|
|
parent[0] = 0;
|
|
|
|
|
|
2015-05-05 01:25:19 +02:00
|
|
|
if (link->addr.len)
|
|
|
|
|
str_addr = nm_utils_hwaddr_ntoa (link->addr.data, MIN (link->addr.len, sizeof (link->addr.data)));
|
2016-04-29 21:25:43 +02:00
|
|
|
|
2015-10-14 18:45:36 +02:00
|
|
|
str_link_type = nm_link_type_to_string (link->type);
|
|
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
g_snprintf (buf, len,
|
2015-05-05 01:25:19 +02:00
|
|
|
"%d: " /* ifindex */
|
|
|
|
|
"%s" /* name */
|
|
|
|
|
"%s" /* parent */
|
|
|
|
|
" <%s>" /* flags */
|
|
|
|
|
" mtu %d"
|
|
|
|
|
"%s" /* master */
|
|
|
|
|
" arp %u" /* arptype */
|
2016-02-15 16:23:38 +01:00
|
|
|
" %s" /* link->type */
|
2015-05-05 01:25:19 +02:00
|
|
|
"%s%s" /* kind */
|
|
|
|
|
"%s" /* is-in-udev */
|
2016-02-17 14:00:52 +01:00
|
|
|
"%s%s" /* addr-gen-mode */
|
2015-05-05 01:25:19 +02:00
|
|
|
"%s%s" /* addr */
|
|
|
|
|
"%s%s" /* inet6_token */
|
|
|
|
|
"%s%s" /* driver */
|
2016-08-16 13:47:05 +02:00
|
|
|
" rx:%"G_GUINT64_FORMAT",%"G_GUINT64_FORMAT
|
|
|
|
|
" tx:%"G_GUINT64_FORMAT",%"G_GUINT64_FORMAT
|
2015-06-15 14:41:35 +02:00
|
|
|
,
|
2015-05-05 01:25:19 +02:00
|
|
|
link->ifindex,
|
|
|
|
|
link->name,
|
|
|
|
|
parent,
|
|
|
|
|
str_flags->str,
|
2015-04-28 10:11:04 +02:00
|
|
|
link->mtu, master,
|
2015-05-05 01:25:19 +02:00
|
|
|
link->arptype,
|
2016-03-08 17:41:31 +01:00
|
|
|
str_link_type ?: "???",
|
2016-02-15 16:23:38 +01:00
|
|
|
link->kind ? (g_strcmp0 (str_link_type, link->kind) ? "/" : "*") : "?",
|
2015-10-14 18:45:36 +02:00
|
|
|
link->kind && g_strcmp0 (str_link_type, link->kind) ? link->kind : "",
|
2015-05-05 01:25:19 +02:00
|
|
|
link->initialized ? " init" : " not-init",
|
2016-02-17 14:00:52 +01:00
|
|
|
link->inet6_addr_gen_mode_inv ? " addrgenmode " : "",
|
|
|
|
|
link->inet6_addr_gen_mode_inv ? nm_platform_link_inet6_addrgenmode2str (_nm_platform_uint8_inv (link->inet6_addr_gen_mode_inv), str_addrmode, sizeof (str_addrmode)) : "",
|
2015-05-05 01:25:19 +02:00
|
|
|
str_addr ? " addr " : "",
|
|
|
|
|
str_addr ? str_addr : "",
|
2016-05-27 18:24:04 +02:00
|
|
|
link->inet6_token.id ? " inet6token " : "",
|
|
|
|
|
link->inet6_token.id ? nm_utils_inet6_interface_identifier_to_token (link->inet6_token, str_inet6_token) : "",
|
2015-05-05 01:25:19 +02:00
|
|
|
link->driver ? " driver " : "",
|
2016-08-16 13:47:05 +02:00
|
|
|
link->driver ? link->driver : "",
|
|
|
|
|
link->rx_packets, link->rx_bytes,
|
|
|
|
|
link->tx_packets, link->tx_bytes);
|
2015-05-05 01:25:19 +02:00
|
|
|
g_string_free (str_flags, TRUE);
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2014-02-17 14:08:32 +01:00
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_gre_to_string (const NMPlatformLnkGre *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_local[30];
|
|
|
|
|
char str_local1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_remote[30];
|
|
|
|
|
char str_remote1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_ttl[30];
|
|
|
|
|
char str_tos[30];
|
|
|
|
|
char str_parent_ifindex[30];
|
|
|
|
|
char str_input_flags[30];
|
|
|
|
|
char str_output_flags[30];
|
|
|
|
|
char str_input_key[30];
|
|
|
|
|
char str_input_key1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_output_key[30];
|
|
|
|
|
char str_output_key1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
2015-10-12 15:15:21 +02:00
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"gre"
|
|
|
|
|
"%s" /* remote */
|
|
|
|
|
"%s" /* local */
|
|
|
|
|
"%s" /* parent_ifindex */
|
|
|
|
|
"%s" /* ttl */
|
|
|
|
|
"%s" /* tos */
|
|
|
|
|
"%s" /* path_mtu_discovery */
|
|
|
|
|
"%s" /* iflags */
|
|
|
|
|
"%s" /* oflags */
|
|
|
|
|
"%s" /* ikey */
|
|
|
|
|
"%s" /* okey */
|
|
|
|
|
"",
|
|
|
|
|
lnk->remote ? nm_sprintf_buf (str_remote, " remote %s", nm_utils_inet4_ntop (lnk->remote, str_remote1)) : "",
|
|
|
|
|
lnk->local ? nm_sprintf_buf (str_local, " local %s", nm_utils_inet4_ntop (lnk->local, str_local1)) : "",
|
|
|
|
|
lnk->parent_ifindex ? nm_sprintf_buf (str_parent_ifindex, " dev %d", lnk->parent_ifindex) : "",
|
|
|
|
|
lnk->ttl ? nm_sprintf_buf (str_ttl, " ttl %u", lnk->ttl) : " ttl inherit",
|
|
|
|
|
lnk->tos ? (lnk->tos == 1 ? " tos inherit" : nm_sprintf_buf (str_tos, " tos 0x%x", lnk->tos)) : "",
|
|
|
|
|
lnk->path_mtu_discovery ? "" : " nopmtudisc",
|
|
|
|
|
lnk->input_flags ? nm_sprintf_buf (str_input_flags, " iflags 0x%x", lnk->input_flags) : "",
|
|
|
|
|
lnk->output_flags ? nm_sprintf_buf (str_output_flags, " oflags 0x%x", lnk->output_flags) : "",
|
|
|
|
|
NM_FLAGS_HAS (lnk->input_flags, GRE_KEY) || lnk->input_key ? nm_sprintf_buf (str_input_key, " ikey %s", nm_utils_inet4_ntop (lnk->input_key, str_input_key1)) : "",
|
|
|
|
|
NM_FLAGS_HAS (lnk->output_flags, GRE_KEY) || lnk->output_key ? nm_sprintf_buf (str_output_key, " okey %s", nm_utils_inet4_ntop (lnk->output_key, str_output_key1)) : "");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-15 15:47:14 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_infiniband_to_string (const NMPlatformLnkInfiniband *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_p_key[64];
|
|
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
2015-10-15 15:47:14 +02:00
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"infiniband"
|
|
|
|
|
"%s" /* p_key */
|
|
|
|
|
"%s%s" /* mode */
|
|
|
|
|
"",
|
|
|
|
|
lnk->p_key ? nm_sprintf_buf (str_p_key, " pkey %d", lnk->p_key) : "",
|
|
|
|
|
lnk->mode ? " mode " : "",
|
|
|
|
|
lnk->mode ?: "");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 22:22:25 +01:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_ip6tnl_to_string (const NMPlatformLnkIp6Tnl *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_local[30];
|
|
|
|
|
char str_local1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_remote[30];
|
|
|
|
|
char str_remote1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_ttl[30];
|
|
|
|
|
char str_tclass[30];
|
|
|
|
|
char str_flow[30];
|
|
|
|
|
char str_encap[30];
|
|
|
|
|
char str_proto[30];
|
|
|
|
|
char str_parent_ifindex[30];
|
|
|
|
|
|
|
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
|
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"ip6tnl"
|
|
|
|
|
"%s" /* remote */
|
|
|
|
|
"%s" /* local */
|
|
|
|
|
"%s" /* parent_ifindex */
|
|
|
|
|
"%s" /* ttl */
|
|
|
|
|
"%s" /* tclass */
|
|
|
|
|
"%s" /* encap limit */
|
|
|
|
|
"%s" /* flow label */
|
|
|
|
|
"%s" /* proto */
|
|
|
|
|
"",
|
|
|
|
|
nm_sprintf_buf (str_remote, " remote %s", nm_utils_inet6_ntop (&lnk->remote, str_remote1)),
|
|
|
|
|
nm_sprintf_buf (str_local, " local %s", nm_utils_inet6_ntop (&lnk->local, str_local1)),
|
|
|
|
|
lnk->parent_ifindex ? nm_sprintf_buf (str_parent_ifindex, " dev %d", lnk->parent_ifindex) : "",
|
|
|
|
|
lnk->ttl ? nm_sprintf_buf (str_ttl, " ttl %u", lnk->ttl) : " ttl inherit",
|
|
|
|
|
lnk->tclass == 1 ? " tclass inherit" : nm_sprintf_buf (str_tclass, " tclass 0x%x", lnk->tclass),
|
|
|
|
|
nm_sprintf_buf (str_encap, " encap-limit %u", lnk->encap_limit),
|
|
|
|
|
nm_sprintf_buf (str_flow, " flow-label 0x05%x", lnk->flow_label),
|
|
|
|
|
nm_sprintf_buf (str_proto, " proto %u", lnk->proto));
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 14:01:56 +01:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_ipip_to_string (const NMPlatformLnkIpIp *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_local[30];
|
|
|
|
|
char str_local1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_remote[30];
|
|
|
|
|
char str_remote1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_ttl[30];
|
|
|
|
|
char str_tos[30];
|
|
|
|
|
char str_parent_ifindex[30];
|
|
|
|
|
|
|
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
|
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"ipip"
|
|
|
|
|
"%s" /* remote */
|
|
|
|
|
"%s" /* local */
|
|
|
|
|
"%s" /* parent_ifindex */
|
|
|
|
|
"%s" /* ttl */
|
|
|
|
|
"%s" /* tos */
|
|
|
|
|
"%s" /* path_mtu_discovery */
|
|
|
|
|
"",
|
|
|
|
|
lnk->remote ? nm_sprintf_buf (str_remote, " remote %s", nm_utils_inet4_ntop (lnk->remote, str_remote1)) : "",
|
|
|
|
|
lnk->local ? nm_sprintf_buf (str_local, " local %s", nm_utils_inet4_ntop (lnk->local, str_local1)) : "",
|
|
|
|
|
lnk->parent_ifindex ? nm_sprintf_buf (str_parent_ifindex, " dev %d", lnk->parent_ifindex) : "",
|
|
|
|
|
lnk->ttl ? nm_sprintf_buf (str_ttl, " ttl %u", lnk->ttl) : " ttl inherit",
|
|
|
|
|
lnk->tos ? (lnk->tos == 1 ? " tos inherit" : nm_sprintf_buf (str_tos, " tos 0x%x", lnk->tos)) : "",
|
|
|
|
|
lnk->path_mtu_discovery ? "" : " nopmtudisc");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-30 18:20:09 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_macsec_to_string (const NMPlatformLnkMacsec *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
|
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"macsec "
|
|
|
|
|
"sci %016llx "
|
|
|
|
|
"protect %s "
|
|
|
|
|
"cipher %016llx "
|
|
|
|
|
"icvlen %u "
|
|
|
|
|
"encodingsa %u "
|
|
|
|
|
"validate %u "
|
|
|
|
|
"encrypt %s "
|
|
|
|
|
"send_sci %s "
|
|
|
|
|
"end_station %s "
|
|
|
|
|
"scb %s "
|
|
|
|
|
"replay %s",
|
|
|
|
|
(unsigned long long) lnk->sci,
|
|
|
|
|
lnk->protect ? "on" : "off",
|
|
|
|
|
(unsigned long long) lnk->cipher_suite,
|
|
|
|
|
lnk->icv_length,
|
|
|
|
|
lnk->encoding_sa,
|
|
|
|
|
lnk->validation,
|
|
|
|
|
lnk->encrypt ? "on" : "off",
|
|
|
|
|
lnk->include_sci ? "on" : "off",
|
|
|
|
|
lnk->es ? "on" : "off",
|
|
|
|
|
lnk->scb ? "on" : "off",
|
|
|
|
|
lnk->replay_protect ? "on" : "off");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
2015-10-12 15:15:21 +02:00
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
2015-12-03 15:44:33 +01:00
|
|
|
"macvlan mode %u %s",
|
|
|
|
|
lnk->mode,
|
|
|
|
|
lnk->no_promisc ? "not-promisc" : "promisc");
|
2015-10-12 15:15:21 +02:00
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-11 18:41:48 +01:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_sit_to_string (const NMPlatformLnkSit *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_local[30];
|
|
|
|
|
char str_local1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_remote[30];
|
|
|
|
|
char str_remote1[NM_UTILS_INET_ADDRSTRLEN];
|
|
|
|
|
char str_ttl[30];
|
|
|
|
|
char str_tos[30];
|
|
|
|
|
char str_flags[30];
|
|
|
|
|
char str_proto[30];
|
|
|
|
|
char str_parent_ifindex[30];
|
|
|
|
|
|
|
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
|
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"sit"
|
|
|
|
|
"%s" /* remote */
|
|
|
|
|
"%s" /* local */
|
|
|
|
|
"%s" /* parent_ifindex */
|
|
|
|
|
"%s" /* ttl */
|
|
|
|
|
"%s" /* tos */
|
|
|
|
|
"%s" /* path_mtu_discovery */
|
|
|
|
|
"%s" /* flags */
|
|
|
|
|
"%s" /* proto */
|
|
|
|
|
"",
|
|
|
|
|
lnk->remote ? nm_sprintf_buf (str_remote, " remote %s", nm_utils_inet4_ntop (lnk->remote, str_remote1)) : "",
|
|
|
|
|
lnk->local ? nm_sprintf_buf (str_local, " local %s", nm_utils_inet4_ntop (lnk->local, str_local1)) : "",
|
|
|
|
|
lnk->parent_ifindex ? nm_sprintf_buf (str_parent_ifindex, " dev %d", lnk->parent_ifindex) : "",
|
|
|
|
|
lnk->ttl ? nm_sprintf_buf (str_ttl, " ttl %u", lnk->ttl) : " ttl inherit",
|
|
|
|
|
lnk->tos ? (lnk->tos == 1 ? " tos inherit" : nm_sprintf_buf (str_tos, " tos 0x%x", lnk->tos)) : "",
|
|
|
|
|
lnk->path_mtu_discovery ? "" : " nopmtudisc",
|
|
|
|
|
lnk->flags ? nm_sprintf_buf (str_flags, " flags 0x%x", lnk->flags) : "",
|
|
|
|
|
lnk->proto ? nm_sprintf_buf (str_proto, " proto 0x%x", lnk->proto) : "");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_vlan_to_string (const NMPlatformLnkVlan *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
2015-10-27 16:14:54 +01:00
|
|
|
char *b;
|
|
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
2015-10-12 13:44:44 +02:00
|
|
|
return buf;
|
|
|
|
|
|
2015-10-27 16:14:54 +01:00
|
|
|
b = buf;
|
|
|
|
|
|
|
|
|
|
nm_utils_strbuf_append (&b, &len, "vlan %u", lnk->id);
|
|
|
|
|
if (lnk->flags)
|
|
|
|
|
nm_utils_strbuf_append (&b, &len, " flags 0x%x", lnk->flags);
|
2015-10-12 13:44:44 +02:00
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_lnk_vxlan_to_string (const NMPlatformLnkVxlan *lnk, char *buf, gsize len)
|
|
|
|
|
{
|
|
|
|
|
char str_group[100];
|
|
|
|
|
char str_group6[100];
|
|
|
|
|
char str_local[100];
|
|
|
|
|
char str_local6[100];
|
|
|
|
|
char str_dev[25];
|
|
|
|
|
char str_limit[25];
|
|
|
|
|
char str_src_port[35];
|
|
|
|
|
char str_dst_port[25];
|
|
|
|
|
char str_tos[25];
|
|
|
|
|
char str_ttl[25];
|
|
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
2015-10-12 15:15:21 +02:00
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
if (lnk->group == 0)
|
|
|
|
|
str_group[0] = '\0';
|
|
|
|
|
else {
|
|
|
|
|
g_snprintf (str_group, sizeof (str_group),
|
|
|
|
|
" %s %s",
|
|
|
|
|
IN_MULTICAST (ntohl (lnk->group)) ? "group" : "remote",
|
|
|
|
|
nm_utils_inet4_ntop (lnk->group, NULL));
|
|
|
|
|
}
|
|
|
|
|
if (IN6_IS_ADDR_UNSPECIFIED (&lnk->group6))
|
|
|
|
|
str_group6[0] = '\0';
|
|
|
|
|
else {
|
|
|
|
|
g_snprintf (str_group6, sizeof (str_group6),
|
|
|
|
|
" %s%s %s",
|
|
|
|
|
IN6_IS_ADDR_MULTICAST (&lnk->group6) ? "group" : "remote",
|
|
|
|
|
str_group[0] ? "6" : "", /* usually, a vxlan has either v4 or v6 only. */
|
|
|
|
|
nm_utils_inet6_ntop (&lnk->group6, NULL));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (lnk->local == 0)
|
|
|
|
|
str_local[0] = '\0';
|
|
|
|
|
else {
|
|
|
|
|
g_snprintf (str_local, sizeof (str_local),
|
|
|
|
|
" local %s",
|
|
|
|
|
nm_utils_inet4_ntop (lnk->local, NULL));
|
|
|
|
|
}
|
|
|
|
|
if (IN6_IS_ADDR_UNSPECIFIED (&lnk->local6))
|
|
|
|
|
str_local6[0] = '\0';
|
|
|
|
|
else {
|
|
|
|
|
g_snprintf (str_local6, sizeof (str_local6),
|
|
|
|
|
" local%s %s",
|
|
|
|
|
str_local[0] ? "6" : "", /* usually, a vxlan has either v4 or v6 only. */
|
|
|
|
|
nm_utils_inet6_ntop (&lnk->local6, NULL));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"vxlan"
|
|
|
|
|
" id %u" /* id */
|
|
|
|
|
"%s%s" /* group/group6 */
|
|
|
|
|
"%s%s" /* local/local6 */
|
|
|
|
|
"%s" /* dev */
|
|
|
|
|
"%s" /* src_port_min/src_port_max */
|
|
|
|
|
"%s" /* dst_port */
|
|
|
|
|
"%s" /* learning */
|
|
|
|
|
"%s" /* proxy */
|
|
|
|
|
"%s" /* rsc */
|
|
|
|
|
"%s" /* l2miss */
|
|
|
|
|
"%s" /* l3miss */
|
|
|
|
|
"%s" /* tos */
|
|
|
|
|
"%s" /* ttl */
|
|
|
|
|
" ageing %u" /* ageing */
|
|
|
|
|
"%s" /* limit */
|
|
|
|
|
"",
|
|
|
|
|
(guint) lnk->id,
|
|
|
|
|
str_group, str_group6,
|
|
|
|
|
str_local, str_local6,
|
|
|
|
|
lnk->parent_ifindex ? nm_sprintf_buf (str_dev, " dev %d", lnk->parent_ifindex) : "",
|
|
|
|
|
lnk->src_port_min || lnk->src_port_max ? nm_sprintf_buf (str_src_port, " srcport %u %u", lnk->src_port_min, lnk->src_port_max) : "",
|
|
|
|
|
lnk->dst_port ? nm_sprintf_buf (str_dst_port, " dstport %u", lnk->dst_port) : "",
|
|
|
|
|
!lnk->learning ? " nolearning" : "",
|
|
|
|
|
lnk->proxy ? " proxy" : "",
|
|
|
|
|
lnk->rsc ? " rsc" : "",
|
|
|
|
|
lnk->l2miss ? " l2miss" : "",
|
|
|
|
|
lnk->l3miss ? " l3miss" : "",
|
|
|
|
|
lnk->tos == 1 ? " tos inherit" : nm_sprintf_buf (str_tos, " tos %#x", lnk->tos),
|
|
|
|
|
lnk->ttl ? nm_sprintf_buf (str_ttl, " ttl %u", lnk->ttl) : "",
|
|
|
|
|
lnk->ageing,
|
|
|
|
|
lnk->limit ? nm_sprintf_buf (str_limit, " maxaddr %u", lnk->limit) : "");
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-29 20:07:34 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip4_address_to_string:
|
|
|
|
|
* @route: pointer to NMPlatformIP4Address address structure
|
2015-10-12 10:27:33 +02:00
|
|
|
* @buf: (allow-none): an optional buffer. If %NULL, a static buffer is used.
|
|
|
|
|
* @len: the size of the @buf. If @buf is %NULL, this argument is ignored.
|
2013-08-29 20:07:34 +02:00
|
|
|
*
|
|
|
|
|
* A method for converting an address struct into a string representation.
|
|
|
|
|
*
|
|
|
|
|
* Example output: ""
|
|
|
|
|
*
|
2015-10-12 10:27:33 +02:00
|
|
|
* Returns: a string representation of the address.
|
2013-08-29 20:07:34 +02:00
|
|
|
*/
|
|
|
|
|
const char *
|
2015-10-12 10:27:33 +02:00
|
|
|
nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address, char *buf, gsize len)
|
2013-08-29 20:07:34 +02:00
|
|
|
{
|
2016-02-29 16:50:55 +01:00
|
|
|
char s_flags[TO_STRING_IFA_FLAGS_BUF_SIZE];
|
2013-08-29 20:07:34 +02:00
|
|
|
char s_address[INET_ADDRSTRLEN];
|
2013-12-02 21:12:05 +01:00
|
|
|
char s_peer[INET_ADDRSTRLEN];
|
2014-02-18 12:52:16 +01:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE];
|
2014-02-19 16:10:59 -05:00
|
|
|
char str_label[32];
|
2016-04-11 14:29:17 +02:00
|
|
|
char str_lft[30], str_pref[30], str_time[50], s_source[50];
|
2013-12-02 21:12:05 +01:00
|
|
|
char *str_peer = NULL;
|
2014-04-02 14:31:12 +02:00
|
|
|
const char *str_lft_p, *str_pref_p, *str_time_p;
|
|
|
|
|
gint32 now = nm_utils_get_monotonic_timestamp_s ();
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (address, &buf, &len))
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
|
|
|
|
|
inet_ntop (AF_INET, &address->address, s_address, sizeof (s_address));
|
2013-10-21 14:36:59 +02:00
|
|
|
|
2015-10-21 23:17:11 +02:00
|
|
|
if (address->peer_address != address->address) {
|
2013-12-02 21:12:05 +01:00
|
|
|
inet_ntop (AF_INET, &address->peer_address, s_peer, sizeof (s_peer));
|
|
|
|
|
str_peer = g_strconcat (" ptp ", s_peer, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (NULL, address->ifindex, str_dev, sizeof (str_dev));
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2014-02-19 16:10:59 -05:00
|
|
|
if (*address->label)
|
|
|
|
|
g_snprintf (str_label, sizeof (str_label), " label %s", address->label);
|
|
|
|
|
else
|
|
|
|
|
str_label[0] = 0;
|
|
|
|
|
|
2014-04-02 14:31:12 +02:00
|
|
|
str_lft_p = _lifetime_to_string (address->timestamp,
|
|
|
|
|
address->lifetime ? address->lifetime : NM_PLATFORM_LIFETIME_PERMANENT,
|
|
|
|
|
now, str_lft, sizeof (str_lft)),
|
|
|
|
|
str_pref_p = (address->lifetime == address->preferred)
|
|
|
|
|
? str_lft_p
|
|
|
|
|
: ( _lifetime_to_string (address->timestamp,
|
|
|
|
|
address->lifetime ? MIN (address->preferred, address->lifetime) : NM_PLATFORM_LIFETIME_PERMANENT,
|
|
|
|
|
now, str_pref, sizeof (str_pref)) );
|
|
|
|
|
str_time_p = _lifetime_summary_to_string (now, address->timestamp, address->preferred, address->lifetime, str_time, sizeof (str_time));
|
|
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
g_snprintf (buf, len,
|
2016-02-29 16:50:55 +01:00
|
|
|
"%s/%d lft %s pref %s%s%s%s%s%s src %s",
|
2014-04-02 14:31:12 +02:00
|
|
|
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
|
2013-12-02 21:12:05 +01:00
|
|
|
str_peer ? str_peer : "",
|
2014-02-18 12:52:16 +01:00
|
|
|
str_dev,
|
2016-02-29 16:50:55 +01:00
|
|
|
_to_string_ifa_flags (address->n_ifa_flags, s_flags, sizeof (s_flags)),
|
2014-02-19 16:10:59 -05:00
|
|
|
str_label,
|
2016-04-11 14:29:17 +02:00
|
|
|
nmp_utils_ip_config_source_to_string (address->addr_source, s_source, sizeof (s_source)));
|
2013-12-02 21:12:05 +01:00
|
|
|
g_free (str_peer);
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
}
|
|
|
|
|
|
2015-12-04 16:31:15 +01:00
|
|
|
NM_UTILS_FLAGS2STR_DEFINE (nm_platform_link_flags2str, unsigned,
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_LOOPBACK, "loopback"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_BROADCAST, "broadcast"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_POINTOPOINT, "pointopoint"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_MULTICAST, "multicast"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_NOARP, "noarp"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_ALLMULTI, "allmulti"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_PROMISC, "promisc"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_MASTER, "master"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_SLAVE, "slave"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_DEBUG, "debug"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_DYNAMIC, "dynamic"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_AUTOMEDIA, "automedia"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_PORTSEL, "portsel"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_NOTRAILERS, "notrailers"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_UP, "up"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_RUNNING, "running"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_LOWER_UP, "lowerup"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_DORMANT, "dormant"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFF_ECHO, "echo"),
|
|
|
|
|
);
|
2015-10-26 21:35:18 +01:00
|
|
|
|
2016-01-18 12:54:04 +01:00
|
|
|
NM_UTILS_ENUM2STR_DEFINE (nm_platform_link_inet6_addrgenmode2str, guint8,
|
|
|
|
|
NM_UTILS_ENUM2STR (NM_IN6_ADDR_GEN_MODE_NONE, "none"),
|
|
|
|
|
NM_UTILS_ENUM2STR (NM_IN6_ADDR_GEN_MODE_EUI64, "eui64"),
|
|
|
|
|
NM_UTILS_ENUM2STR (NM_IN6_ADDR_GEN_MODE_STABLE_PRIVACY, "stable-privacy"),
|
2016-02-17 14:19:17 +01:00
|
|
|
NM_UTILS_ENUM2STR (NM_IN6_ADDR_GEN_MODE_RANDOM, "random"),
|
2016-01-18 12:54:04 +01:00
|
|
|
);
|
2015-10-26 21:35:18 +01:00
|
|
|
|
2015-12-04 16:31:15 +01:00
|
|
|
NM_UTILS_FLAGS2STR_DEFINE (nm_platform_addr_flags2str, unsigned,
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_SECONDARY, "secondary"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_NODAD, "nodad"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_OPTIMISTIC, "optimistic"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_HOMEADDRESS, "homeaddress"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_DEPRECATED, "deprecated"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_TENTATIVE, "tentative"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_PERMANENT, "permanent"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_MANAGETEMPADDR, "mngtmpaddr"),
|
|
|
|
|
NM_UTILS_FLAGS2STR (IFA_F_NOPREFIXROUTE, "noprefixroute"),
|
|
|
|
|
);
|
2015-10-26 21:35:18 +01:00
|
|
|
|
2016-01-18 12:54:04 +01:00
|
|
|
NM_UTILS_ENUM2STR_DEFINE (nm_platform_route_scope2str, int,
|
|
|
|
|
NM_UTILS_ENUM2STR (RT_SCOPE_NOWHERE, "nowhere"),
|
|
|
|
|
NM_UTILS_ENUM2STR (RT_SCOPE_HOST, "host"),
|
|
|
|
|
NM_UTILS_ENUM2STR (RT_SCOPE_LINK, "link"),
|
|
|
|
|
NM_UTILS_ENUM2STR (RT_SCOPE_SITE, "site"),
|
|
|
|
|
NM_UTILS_ENUM2STR (RT_SCOPE_UNIVERSE, "global"),
|
|
|
|
|
);
|
2014-03-04 22:00:24 +01:00
|
|
|
|
2013-08-29 20:07:34 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip6_address_to_string:
|
|
|
|
|
* @route: pointer to NMPlatformIP6Address address structure
|
2015-10-12 10:27:33 +02:00
|
|
|
* @buf: (allow-none): an optional buffer. If %NULL, a static buffer is used.
|
|
|
|
|
* @len: the size of the @buf. If @buf is %NULL, this argument is ignored.
|
2013-08-29 20:07:34 +02:00
|
|
|
*
|
|
|
|
|
* A method for converting an address struct into a string representation.
|
|
|
|
|
*
|
|
|
|
|
* Example output: "2001:db8:0:f101::1/64 lft 4294967295 pref 4294967295 time 16922666 on dev em1"
|
|
|
|
|
*
|
2015-10-12 10:27:33 +02:00
|
|
|
* Returns: a string representation of the address.
|
2013-08-29 20:07:34 +02:00
|
|
|
*/
|
|
|
|
|
const char *
|
2015-10-12 10:27:33 +02:00
|
|
|
nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address, char *buf, gsize len)
|
2013-08-29 20:07:34 +02:00
|
|
|
{
|
2016-02-29 16:50:55 +01:00
|
|
|
char s_flags[TO_STRING_IFA_FLAGS_BUF_SIZE];
|
2013-08-29 20:07:34 +02:00
|
|
|
char s_address[INET6_ADDRSTRLEN];
|
2013-12-02 21:12:05 +01:00
|
|
|
char s_peer[INET6_ADDRSTRLEN];
|
2016-04-11 14:29:17 +02:00
|
|
|
char str_lft[30], str_pref[30], str_time[50], s_source[50];
|
2014-02-18 12:52:16 +01:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE];
|
2013-12-02 21:12:05 +01:00
|
|
|
char *str_peer = NULL;
|
2014-04-02 14:31:12 +02:00
|
|
|
const char *str_lft_p, *str_pref_p, *str_time_p;
|
|
|
|
|
gint32 now = nm_utils_get_monotonic_timestamp_s ();
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (address, &buf, &len))
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
|
|
|
|
|
inet_ntop (AF_INET6, &address->address, s_address, sizeof (s_address));
|
2013-10-21 14:36:59 +02:00
|
|
|
|
2013-12-02 21:12:05 +01:00
|
|
|
if (!IN6_IS_ADDR_UNSPECIFIED (&address->peer_address)) {
|
|
|
|
|
inet_ntop (AF_INET6, &address->peer_address, s_peer, sizeof (s_peer));
|
|
|
|
|
str_peer = g_strconcat (" ptp ", s_peer, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (NULL, address->ifindex, str_dev, sizeof (str_dev));
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2014-04-02 14:31:12 +02:00
|
|
|
str_lft_p = _lifetime_to_string (address->timestamp,
|
|
|
|
|
address->lifetime ? address->lifetime : NM_PLATFORM_LIFETIME_PERMANENT,
|
|
|
|
|
now, str_lft, sizeof (str_lft)),
|
|
|
|
|
str_pref_p = (address->lifetime == address->preferred)
|
|
|
|
|
? str_lft_p
|
|
|
|
|
: ( _lifetime_to_string (address->timestamp,
|
|
|
|
|
address->lifetime ? MIN (address->preferred, address->lifetime) : NM_PLATFORM_LIFETIME_PERMANENT,
|
|
|
|
|
now, str_pref, sizeof (str_pref)) );
|
|
|
|
|
str_time_p = _lifetime_summary_to_string (now, address->timestamp, address->preferred, address->lifetime, str_time, sizeof (str_time));
|
|
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
g_snprintf (buf, len,
|
|
|
|
|
"%s/%d lft %s pref %s%s%s%s%s src %s",
|
2014-04-02 14:31:12 +02:00
|
|
|
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
|
2013-12-02 21:12:05 +01:00
|
|
|
str_peer ? str_peer : "",
|
2014-02-18 12:52:16 +01:00
|
|
|
str_dev,
|
2016-02-29 16:50:55 +01:00
|
|
|
_to_string_ifa_flags (address->n_ifa_flags, s_flags, sizeof (s_flags)),
|
2016-04-11 14:29:17 +02:00
|
|
|
nmp_utils_ip_config_source_to_string (address->addr_source, s_source, sizeof (s_source)));
|
2013-12-02 21:12:05 +01:00
|
|
|
g_free (str_peer);
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
}
|
|
|
|
|
|
2013-08-26 22:10:11 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip4_route_to_string:
|
|
|
|
|
* @route: pointer to NMPlatformIP4Route route structure
|
2015-10-12 10:27:33 +02:00
|
|
|
* @buf: (allow-none): an optional buffer. If %NULL, a static buffer is used.
|
|
|
|
|
* @len: the size of the @buf. If @buf is %NULL, this argument is ignored.
|
2013-08-26 22:10:11 +02:00
|
|
|
*
|
|
|
|
|
* A method for converting a route struct into a string representation.
|
|
|
|
|
*
|
2013-08-29 20:07:34 +02:00
|
|
|
* Example output: "192.168.1.0/24 via 0.0.0.0 dev em1 metric 0 mss 0"
|
|
|
|
|
*
|
2015-10-12 10:27:33 +02:00
|
|
|
* Returns: a string representation of the route.
|
2013-08-26 22:10:11 +02:00
|
|
|
*/
|
2013-08-29 20:07:34 +02:00
|
|
|
const char *
|
2015-10-12 10:27:33 +02:00
|
|
|
nm_platform_ip4_route_to_string (const NMPlatformIP4Route *route, char *buf, gsize len)
|
2013-08-26 22:10:11 +02:00
|
|
|
{
|
2013-08-29 20:07:34 +02:00
|
|
|
char s_network[INET_ADDRSTRLEN], s_gateway[INET_ADDRSTRLEN];
|
2015-06-22 13:22:48 +02:00
|
|
|
char s_pref_src[INET_ADDRSTRLEN];
|
2014-02-18 12:52:16 +01:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE];
|
2017-08-21 23:17:12 +02:00
|
|
|
char str_table[30];
|
2016-04-11 14:29:17 +02:00
|
|
|
char str_scope[30], s_source[50];
|
2017-02-15 14:00:44 +01:00
|
|
|
char str_tos[32], str_window[32], str_cwnd[32], str_initcwnd[32], str_initrwnd[32], str_mtu[32];
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (route, &buf, &len))
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2013-08-26 22:10:11 +02:00
|
|
|
inet_ntop (AF_INET, &route->network, s_network, sizeof(s_network));
|
|
|
|
|
inet_ntop (AF_INET, &route->gateway, s_gateway, sizeof(s_gateway));
|
2013-10-21 14:36:59 +02:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (NULL, route->ifindex, str_dev, sizeof (str_dev));
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2017-02-15 14:00:44 +01:00
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
g_snprintf (buf, len,
|
2017-08-21 23:17:12 +02:00
|
|
|
"%s" /* table */
|
2015-06-22 13:02:23 +02:00
|
|
|
"%s/%d"
|
|
|
|
|
" via %s"
|
|
|
|
|
"%s"
|
|
|
|
|
" metric %"G_GUINT32_FORMAT
|
|
|
|
|
" mss %"G_GUINT32_FORMAT
|
2017-02-15 14:00:44 +01:00
|
|
|
" rt-src %s" /* protocol */
|
2016-04-11 15:32:45 +02:00
|
|
|
"%s" /* cloned */
|
2015-06-22 13:02:23 +02:00
|
|
|
"%s%s" /* scope */
|
2015-06-22 13:22:48 +02:00
|
|
|
"%s%s" /* pref-src */
|
2017-02-15 14:00:44 +01:00
|
|
|
"%s" /* tos */
|
|
|
|
|
"%s" /* window */
|
|
|
|
|
"%s" /* cwnd */
|
|
|
|
|
"%s" /* initcwnd */
|
|
|
|
|
"%s" /* initrwnd */
|
|
|
|
|
"%s" /* mtu */
|
2015-06-22 13:02:23 +02:00
|
|
|
"",
|
2017-09-22 15:26:56 +02:00
|
|
|
route->table_coerced ? nm_sprintf_buf (str_table, "table %u ", nm_platform_route_table_uncoerce (route->table_coerced, FALSE)) : "",
|
2016-04-06 14:19:05 +02:00
|
|
|
s_network,
|
|
|
|
|
route->plen,
|
2015-06-22 13:02:23 +02:00
|
|
|
s_gateway,
|
2014-02-18 12:52:16 +01:00
|
|
|
str_dev,
|
2015-06-22 13:02:23 +02:00
|
|
|
route->metric,
|
|
|
|
|
route->mss,
|
2016-04-11 14:29:17 +02:00
|
|
|
nmp_utils_ip_config_source_to_string (route->rt_source, s_source, sizeof (s_source)),
|
2016-04-11 15:32:45 +02:00
|
|
|
route->rt_cloned ? " cloned" : "",
|
2015-05-03 10:47:41 +02:00
|
|
|
route->scope_inv ? " scope " : "",
|
2015-10-26 21:35:18 +01:00
|
|
|
route->scope_inv ? (nm_platform_route_scope2str (nm_platform_route_scope_inv (route->scope_inv), str_scope, sizeof (str_scope))) : "",
|
2015-06-22 13:22:48 +02:00
|
|
|
route->pref_src ? " pref-src " : "",
|
2017-02-15 14:00:44 +01:00
|
|
|
route->pref_src ? inet_ntop (AF_INET, &route->pref_src, s_pref_src, sizeof(s_pref_src)) : "",
|
2017-08-02 07:16:35 +02:00
|
|
|
route->tos ? nm_sprintf_buf (str_tos, " tos 0x%x", (unsigned) route->tos) : "",
|
2017-07-27 06:58:44 +02:00
|
|
|
route->window || route->lock_window ? nm_sprintf_buf (str_window, " window %s%"G_GUINT32_FORMAT, route->lock_window ? "lock " : "", route->window) : "",
|
|
|
|
|
route->cwnd || route->lock_cwnd ? nm_sprintf_buf (str_cwnd, " cwnd %s%"G_GUINT32_FORMAT, route->lock_cwnd ? "lock " : "", route->cwnd) : "",
|
|
|
|
|
route->initcwnd || route->lock_initcwnd ? nm_sprintf_buf (str_initcwnd, " initcwnd %s%"G_GUINT32_FORMAT, route->lock_initcwnd ? "lock " : "", route->initcwnd) : "",
|
|
|
|
|
route->initrwnd || route->lock_initrwnd ? nm_sprintf_buf (str_initrwnd, " initrwnd %s%"G_GUINT32_FORMAT, route->lock_initrwnd ? "lock " : "", route->initrwnd) : "",
|
|
|
|
|
route->mtu || route->lock_mtu ? nm_sprintf_buf (str_mtu, " mtu %s%"G_GUINT32_FORMAT, route->lock_mtu ? "lock " : "", route->mtu) : "");
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_platform_ip6_route_to_string:
|
|
|
|
|
* @route: pointer to NMPlatformIP6Route route structure
|
2015-10-12 10:27:33 +02:00
|
|
|
* @buf: (allow-none): an optional buffer. If %NULL, a static buffer is used.
|
|
|
|
|
* @len: the size of the @buf. If @buf is %NULL, this argument is ignored.
|
2013-08-29 20:07:34 +02:00
|
|
|
*
|
|
|
|
|
* A method for converting a route struct into a string representation.
|
|
|
|
|
*
|
|
|
|
|
* Example output: "ff02::fb/128 via :: dev em1 metric 0"
|
|
|
|
|
*
|
2015-10-12 10:27:33 +02:00
|
|
|
* Returns: a string representation of the route.
|
2013-08-29 20:07:34 +02:00
|
|
|
*/
|
|
|
|
|
const char *
|
2015-10-12 10:27:33 +02:00
|
|
|
nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route, char *buf, gsize len)
|
2013-08-29 20:07:34 +02:00
|
|
|
{
|
2017-02-09 17:26:04 +01:00
|
|
|
char s_network[INET6_ADDRSTRLEN], s_gateway[INET6_ADDRSTRLEN], s_pref_src[INET6_ADDRSTRLEN];
|
2017-08-10 17:37:58 +02:00
|
|
|
char s_src_all[INET6_ADDRSTRLEN + 40], s_src[INET6_ADDRSTRLEN];
|
2017-08-21 23:17:12 +02:00
|
|
|
char str_table[30];
|
2016-04-11 14:29:17 +02:00
|
|
|
char str_dev[TO_STRING_DEV_BUF_SIZE], s_source[50];
|
2017-08-02 07:16:35 +02:00
|
|
|
char str_window[32], str_cwnd[32], str_initcwnd[32], str_initrwnd[32], str_mtu[32];
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2015-10-27 10:25:22 +01:00
|
|
|
if (!nm_utils_to_string_buffer_init_null (route, &buf, &len))
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2017-02-09 17:26:04 +01:00
|
|
|
inet_ntop (AF_INET6, &route->network, s_network, sizeof (s_network));
|
|
|
|
|
inet_ntop (AF_INET6, &route->gateway, s_gateway, sizeof (s_gateway));
|
|
|
|
|
|
|
|
|
|
if (IN6_IS_ADDR_UNSPECIFIED (&route->pref_src))
|
|
|
|
|
s_pref_src[0] = 0;
|
|
|
|
|
else
|
|
|
|
|
inet_ntop (AF_INET6, &route->pref_src, s_pref_src, sizeof (s_pref_src));
|
2013-10-21 14:36:59 +02:00
|
|
|
|
platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.
While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.
With this change, NMPlatform instances can be used individually, not
only as a singleton instance.
Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.
Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.
Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.
This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-18 12:36:09 +02:00
|
|
|
_to_string_dev (NULL, route->ifindex, str_dev, sizeof (str_dev));
|
2013-08-29 20:07:34 +02:00
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
g_snprintf (buf, len,
|
2017-08-21 23:17:12 +02:00
|
|
|
"%s" /* table */
|
2015-06-22 13:02:23 +02:00
|
|
|
"%s/%d"
|
|
|
|
|
" via %s"
|
|
|
|
|
"%s"
|
|
|
|
|
" metric %"G_GUINT32_FORMAT
|
|
|
|
|
" mss %"G_GUINT32_FORMAT
|
2017-02-15 14:00:44 +01:00
|
|
|
" rt-src %s" /* protocol */
|
2017-08-10 17:37:58 +02:00
|
|
|
"%s" /* source */
|
2016-04-11 15:32:45 +02:00
|
|
|
"%s" /* cloned */
|
2017-02-09 17:26:04 +01:00
|
|
|
"%s%s" /* pref-src */
|
2017-02-15 14:00:44 +01:00
|
|
|
"%s" /* window */
|
|
|
|
|
"%s" /* cwnd */
|
|
|
|
|
"%s" /* initcwnd */
|
|
|
|
|
"%s" /* initrwnd */
|
|
|
|
|
"%s" /* mtu */
|
2015-06-22 13:02:23 +02:00
|
|
|
"",
|
2017-09-22 15:26:56 +02:00
|
|
|
route->table_coerced ? nm_sprintf_buf (str_table, "table %u ", nm_platform_route_table_uncoerce (route->table_coerced, FALSE)) : "",
|
2016-04-06 14:19:05 +02:00
|
|
|
s_network,
|
|
|
|
|
route->plen,
|
2015-06-22 13:02:23 +02:00
|
|
|
s_gateway,
|
2014-02-18 12:52:16 +01:00
|
|
|
str_dev,
|
2015-06-22 13:02:23 +02:00
|
|
|
route->metric,
|
|
|
|
|
route->mss,
|
2016-04-11 15:32:45 +02:00
|
|
|
nmp_utils_ip_config_source_to_string (route->rt_source, s_source, sizeof (s_source)),
|
2017-08-10 17:37:58 +02:00
|
|
|
route->src_plen || !IN6_IS_ADDR_UNSPECIFIED (&route->src)
|
|
|
|
|
? nm_sprintf_buf (s_src_all, " src %s/%u", nm_utils_inet6_ntop (&route->src, s_src), (unsigned) route->src_plen)
|
|
|
|
|
: "",
|
2017-02-09 17:26:04 +01:00
|
|
|
route->rt_cloned ? " cloned" : "",
|
|
|
|
|
s_pref_src[0] ? " pref-src " : "",
|
2017-02-15 14:00:44 +01:00
|
|
|
s_pref_src[0] ? s_pref_src : "",
|
2017-07-27 06:58:44 +02:00
|
|
|
route->window || route->lock_window ? nm_sprintf_buf (str_window, " window %s%"G_GUINT32_FORMAT, route->lock_window ? "lock " : "", route->window) : "",
|
|
|
|
|
route->cwnd || route->lock_cwnd ? nm_sprintf_buf (str_cwnd, " cwnd %s%"G_GUINT32_FORMAT, route->lock_cwnd ? "lock " : "", route->cwnd) : "",
|
|
|
|
|
route->initcwnd || route->lock_initcwnd ? nm_sprintf_buf (str_initcwnd, " initcwnd %s%"G_GUINT32_FORMAT, route->lock_initcwnd ? "lock " : "", route->initcwnd) : "",
|
|
|
|
|
route->initrwnd || route->lock_initrwnd ? nm_sprintf_buf (str_initrwnd, " initrwnd %s%"G_GUINT32_FORMAT, route->lock_initrwnd ? "lock " : "", route->initrwnd) : "",
|
|
|
|
|
route->mtu || route->lock_mtu ? nm_sprintf_buf (str_mtu, " mtu %s%"G_GUINT32_FORMAT, route->lock_mtu ? "lock " : "", route->mtu) : "");
|
2017-02-15 14:00:44 +01:00
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
return buf;
|
2013-08-26 22:10:11 +02:00
|
|
|
}
|
|
|
|
|
|
platform: use NMDedupMultiIndex for routes in NMPCache
Rework platform object cache to use NMDedupMultiIndex.
Already previously, NMPCache used NMMultiIndex and had thus
O(1) for most operations. What is new is:
- Contrary to NMMultiIndex, NMDedupMultiIndex preserves the order of
the cached items. That is crucial to handle routes properly as kernel
will replace the first matching route based on network/plen/metric
properties. See related bug rh#1337855.
Without tracking the order of routes as they are exposed
by kernel, we cannot properly maintain the route cache.
- All NMPObject instances are now treated immutable, refcounted
and get de-duplicated via NMDedupMultiIndex. This allows
to have a global NMDedupMultiIndex that can be shared with
NMIP4Config and NMRouteManager. It also allows to share the
objects themselves.
Immutable objects are so much nicer. We can get rid of the
update pre-hook callback, which was required previously because
we would mutate the object inplace. Now, we can just update
the cache, and compare obj_old and obj_new after the fact.
- NMMultiIndex was treated as an internal of NMPCache. On the other
hand, NMDedupMultiIndex exposes NMDedupMultiHeadEntry, which is
basically an object that allows to iterate over all related
objects. That means, we can now lookup objects in the cache
and give the NMDedupMultiHeadEntry instance to the caller,
which then can iterate the list on it's own -- without need
for copying anything.
Currently, at various places we still create copies of lookup
results. That can be improved later.
The ability to share NMPObject instances should enable us to
significantly improve performance and scale with large number
of routes.
Of course there is a memory overhead of having an index for each list
entry. Each NMPObject may also require an NMDedupMultiEntry,
NMDedupMultiHeadEntry, and NMDedupMultiBox item, which are tracked
in a GHashTable. Optimally, one NMDedupMultiHeadEntry is the head
for multiple objects, and NMDedupMultiBox is able to deduplicate several
NMPObjects, so that there is a net saving.
Also, each object type has several indexes of type NMPCacheIdType.
So, worst case an NMPlatformIP4Route in the platform cache is tracked
by 8 NMPCacheIdType indexes, for each we require a NMDedupMultiEntry,
plus the shared NMDedupMultiHeadEntry. The NMDedupMultiBox instance
is shared between the 8 indexes (and possibly other).
2017-06-21 10:53:34 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_link_hash (const NMPlatformLink *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 99413953;
|
|
|
|
|
guint8 i8;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->type);
|
|
|
|
|
h = NM_HASH_COMBINE (h, g_str_hash (obj->name));
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->master);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->n_ifi_flags);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->connected);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->mtu);
|
|
|
|
|
h = NM_HASH_COMBINE (h, !!obj->initialized);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->arptype);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->addr.len);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->inet6_addr_gen_mode_inv);
|
|
|
|
|
if (obj->kind)
|
|
|
|
|
h = NM_HASH_COMBINE (h, g_str_hash (obj->kind));
|
|
|
|
|
if (obj->driver)
|
|
|
|
|
h = NM_HASH_COMBINE (h, g_str_hash (obj->driver));
|
|
|
|
|
for (i8 = 0; i8 < obj->addr.len; i8++)
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->addr.data[i8]);
|
|
|
|
|
for (i8 = 0; i8 < sizeof (obj->inet6_token); i8++)
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->inet6_token.id_u8[i8]);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->rx_packets);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->rx_bytes);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tx_packets);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tx_bytes);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-05 18:35:20 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, type);
|
|
|
|
|
NM_CMP_FIELD_STR (a, b, name);
|
|
|
|
|
NM_CMP_FIELD (a, b, master);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent);
|
|
|
|
|
NM_CMP_FIELD (a, b, n_ifi_flags);
|
2017-07-26 11:23:35 +02:00
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, connected);
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_FIELD (a, b, mtu);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, initialized);
|
|
|
|
|
NM_CMP_FIELD (a, b, arptype);
|
|
|
|
|
NM_CMP_FIELD (a, b, addr.len);
|
|
|
|
|
NM_CMP_FIELD (a, b, inet6_addr_gen_mode_inv);
|
|
|
|
|
NM_CMP_FIELD_STR_INTERNED (a, b, kind);
|
|
|
|
|
NM_CMP_FIELD_STR_INTERNED (a, b, driver);
|
2015-04-27 18:06:59 +02:00
|
|
|
if (a->addr.len)
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_FIELD_MEMCMP_LEN (a, b, addr.data, a->addr.len);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, inet6_token);
|
|
|
|
|
NM_CMP_FIELD (a, b, rx_packets);
|
|
|
|
|
NM_CMP_FIELD (a, b, rx_bytes);
|
|
|
|
|
NM_CMP_FIELD (a, b, tx_packets);
|
|
|
|
|
NM_CMP_FIELD (a, b, tx_bytes);
|
2014-04-05 18:35:20 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_gre_hash (const NMPlatformLnkGre *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 1887023311;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent_ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->input_flags);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->output_flags);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->input_key);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->output_key);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->local);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->remote);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ttl);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
|
|
|
|
h = NM_HASH_COMBINE (h, !obj->path_mtu_discovery);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_gre_cmp (const NMPlatformLnkGre *a, const NMPlatformLnkGre *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent_ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, input_flags);
|
|
|
|
|
NM_CMP_FIELD (a, b, output_flags);
|
|
|
|
|
NM_CMP_FIELD (a, b, input_key);
|
|
|
|
|
NM_CMP_FIELD (a, b, output_key);
|
|
|
|
|
NM_CMP_FIELD (a, b, local);
|
|
|
|
|
NM_CMP_FIELD (a, b, remote);
|
|
|
|
|
NM_CMP_FIELD (a, b, ttl);
|
|
|
|
|
NM_CMP_FIELD (a, b, tos);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, path_mtu_discovery);
|
2015-10-12 15:15:21 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_infiniband_hash (const NMPlatformLnkInfiniband *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 1748638583;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->p_key);
|
|
|
|
|
if (obj->mode)
|
|
|
|
|
h = NM_HASH_COMBINE (h, g_str_hash (obj->mode));
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-15 15:47:14 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_infiniband_cmp (const NMPlatformLnkInfiniband *a, const NMPlatformLnkInfiniband *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, p_key);
|
|
|
|
|
NM_CMP_FIELD_STR_INTERNED (a, b, mode);
|
2015-10-15 15:47:14 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_ip6tnl_hash (const NMPlatformLnkIp6Tnl *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 1651660009;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent_ifindex);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->local);
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->remote);
|
2017-06-27 19:08:05 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->ttl);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tclass);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->encap_limit);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->flow_label);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->proto);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 22:22:25 +01:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6Tnl *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent_ifindex);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, local);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, remote);
|
|
|
|
|
NM_CMP_FIELD (a, b, ttl);
|
|
|
|
|
NM_CMP_FIELD (a, b, tclass);
|
|
|
|
|
NM_CMP_FIELD (a, b, encap_limit);
|
|
|
|
|
NM_CMP_FIELD (a, b, flow_label);
|
|
|
|
|
NM_CMP_FIELD (a, b, proto);
|
2015-11-27 22:22:25 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_ipip_hash (const NMPlatformLnkIpIp *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 861934429;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent_ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->local);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->remote);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ttl);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->path_mtu_discovery);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-27 14:01:56 +01:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_ipip_cmp (const NMPlatformLnkIpIp *a, const NMPlatformLnkIpIp *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent_ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, local);
|
|
|
|
|
NM_CMP_FIELD (a, b, remote);
|
|
|
|
|
NM_CMP_FIELD (a, b, ttl);
|
|
|
|
|
NM_CMP_FIELD (a, b, tos);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, path_mtu_discovery);
|
2015-11-27 14:01:56 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_macsec_hash (const NMPlatformLnkMacsec *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 226984267;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->sci);
|
|
|
|
|
h = NM_HASH_COMBINE_UINT64 (h, obj->icv_length);
|
|
|
|
|
h = NM_HASH_COMBINE_UINT64 (h, obj->cipher_suite);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->encoding_sa);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->validation);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->encrypt);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->protect);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->include_sci);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->es);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->scb);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->replay_protect);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-30 18:20:09 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_macsec_cmp (const NMPlatformLnkMacsec *a, const NMPlatformLnkMacsec *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, sci);
|
|
|
|
|
NM_CMP_FIELD (a, b, icv_length);
|
|
|
|
|
NM_CMP_FIELD (a, b, cipher_suite);
|
|
|
|
|
NM_CMP_FIELD (a, b, window);
|
|
|
|
|
NM_CMP_FIELD (a, b, encoding_sa);
|
|
|
|
|
NM_CMP_FIELD (a, b, validation);
|
2017-07-26 11:23:35 +02:00
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, encrypt);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, protect);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, include_sci);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, es);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, scb);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, replay_protect);
|
2016-06-30 18:20:09 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_macvlan_hash (const NMPlatformLnkMacvlan *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 771014989;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->mode);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->no_promisc);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tap);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_macvlan_cmp (const NMPlatformLnkMacvlan *a, const NMPlatformLnkMacvlan *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, mode);
|
2017-07-26 11:23:35 +02:00
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, no_promisc);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, tap);
|
2015-10-12 15:15:21 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_sit_hash (const NMPlatformLnkSit *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 1690154969;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent_ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->local);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->remote);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ttl);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->path_mtu_discovery);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->flags);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->proto);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-11 18:41:48 +01:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_sit_cmp (const NMPlatformLnkSit *a, const NMPlatformLnkSit *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent_ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, local);
|
|
|
|
|
NM_CMP_FIELD (a, b, remote);
|
|
|
|
|
NM_CMP_FIELD (a, b, ttl);
|
|
|
|
|
NM_CMP_FIELD (a, b, tos);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, path_mtu_discovery);
|
|
|
|
|
NM_CMP_FIELD (a, b, flags);
|
|
|
|
|
NM_CMP_FIELD (a, b, proto);
|
2015-11-11 18:41:48 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_vlan_hash (const NMPlatformLnkVlan *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 58751383;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->id);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->flags);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 13:44:44 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_vlan_cmp (const NMPlatformLnkVlan *a, const NMPlatformLnkVlan *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, id);
|
|
|
|
|
NM_CMP_FIELD (a, b, flags);
|
2015-10-12 13:44:44 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-27 19:08:05 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_lnk_vxlan_hash (const NMPlatformLnkVxlan *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 461041297;
|
|
|
|
|
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->parent_ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->id);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->group);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->local);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->group6);
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->local6);
|
2017-06-27 19:08:05 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ttl);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->learning);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ageing);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->limit);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->dst_port);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->src_port_min);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->src_port_max);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->proxy);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->rsc);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->l2miss);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->l3miss);
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-12 15:15:21 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_lnk_vxlan_cmp (const NMPlatformLnkVxlan *a, const NMPlatformLnkVxlan *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, parent_ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, id);
|
|
|
|
|
NM_CMP_FIELD (a, b, group);
|
|
|
|
|
NM_CMP_FIELD (a, b, local);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, group6);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, local6);
|
|
|
|
|
NM_CMP_FIELD (a, b, tos);
|
|
|
|
|
NM_CMP_FIELD (a, b, ttl);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, learning);
|
|
|
|
|
NM_CMP_FIELD (a, b, ageing);
|
|
|
|
|
NM_CMP_FIELD (a, b, limit);
|
|
|
|
|
NM_CMP_FIELD (a, b, dst_port);
|
|
|
|
|
NM_CMP_FIELD (a, b, src_port_min);
|
|
|
|
|
NM_CMP_FIELD (a, b, src_port_max);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, proxy);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, rsc);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, l2miss);
|
|
|
|
|
NM_CMP_FIELD_BOOL (a, b, l3miss);
|
2015-10-12 15:15:21 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-12 18:39:53 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_ip4_address_hash (const NMPlatformIP4Address *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 469681301;
|
|
|
|
|
|
|
|
|
|
if (obj) {
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->address);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->peer_address);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->addr_source);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->timestamp);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lifetime);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->preferred);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->n_ifa_flags);
|
|
|
|
|
h = NM_HASH_COMBINE (h, g_str_hash (obj->label));
|
|
|
|
|
}
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 09:58:55 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4Address *b)
|
|
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
|
|
|
|
NM_CMP_FIELD (a, b, address);
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
|
|
|
|
NM_CMP_FIELD (a, b, peer_address);
|
|
|
|
|
NM_CMP_FIELD (a, b, addr_source);
|
|
|
|
|
NM_CMP_FIELD (a, b, timestamp);
|
|
|
|
|
NM_CMP_FIELD (a, b, lifetime);
|
|
|
|
|
NM_CMP_FIELD (a, b, preferred);
|
|
|
|
|
NM_CMP_FIELD (a, b, n_ifa_flags);
|
|
|
|
|
NM_CMP_FIELD_STR (a, b, label);
|
2013-09-06 09:58:55 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-12 18:39:53 +02:00
|
|
|
guint
|
|
|
|
|
nm_platform_ip6_address_hash (const NMPlatformIP6Address *obj)
|
|
|
|
|
{
|
|
|
|
|
guint h = 605908909;
|
|
|
|
|
|
|
|
|
|
if (obj) {
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->address);
|
2017-06-12 18:39:53 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->peer_address);
|
2017-06-12 18:39:53 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->addr_source);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->timestamp);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lifetime);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->preferred);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->n_ifa_flags);
|
|
|
|
|
}
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 09:58:55 +02:00
|
|
|
int
|
|
|
|
|
nm_platform_ip6_address_cmp (const NMPlatformIP6Address *a, const NMPlatformIP6Address *b)
|
|
|
|
|
{
|
2015-10-11 21:46:42 +02:00
|
|
|
const struct in6_addr *p_a, *p_b;
|
|
|
|
|
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
|
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
|
|
|
|
NM_CMP_FIELD_MEMCMP (a, b, address);
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
2015-10-11 21:46:42 +02:00
|
|
|
p_a = nm_platform_ip6_address_get_peer (a);
|
|
|
|
|
p_b = nm_platform_ip6_address_get_peer (b);
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_DIRECT_MEMCMP (p_a, p_b, sizeof (*p_a));
|
|
|
|
|
NM_CMP_FIELD (a, b, addr_source);
|
|
|
|
|
NM_CMP_FIELD (a, b, timestamp);
|
|
|
|
|
NM_CMP_FIELD (a, b, lifetime);
|
|
|
|
|
NM_CMP_FIELD (a, b, preferred);
|
|
|
|
|
NM_CMP_FIELD (a, b, n_ifa_flags);
|
2013-09-06 09:58:55 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-12 18:39:53 +02:00
|
|
|
guint
|
2017-07-26 10:50:23 +02:00
|
|
|
nm_platform_ip4_route_hash (const NMPlatformIP4Route *obj, NMPlatformIPRouteCmpType cmp_type)
|
2017-06-12 18:39:53 +02:00
|
|
|
{
|
2017-07-26 10:50:23 +02:00
|
|
|
guint h = NM_HASH_COMBINE (1228913327, cmp_type);
|
2017-06-12 18:39:53 +02:00
|
|
|
|
|
|
|
|
if (obj) {
|
2017-07-26 10:50:23 +02:00
|
|
|
switch (cmp_type) {
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
|
2017-09-22 15:26:56 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE));
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen));
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->metric);
|
2017-08-02 07:16:35 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
2017-07-19 12:51:22 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
2017-08-15 11:37:58 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source));
|
2017-08-17 15:17:40 +02:00
|
|
|
h = NM_HASH_COMBINE (h, _ip_route_scope_inv_get_normalized (obj));
|
2017-07-19 13:03:28 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->gateway);
|
2017-07-26 07:26:18 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->mss);
|
2017-07-26 09:25:21 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->pref_src);
|
2017-07-27 06:47:11 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->window);
|
2017-07-31 15:42:52 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->mtu);
|
2017-07-27 07:21:01 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_mtu);
|
2017-07-19 12:51:22 +02:00
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
break;
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
|
2017-09-22 15:26:56 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE));
|
|
|
|
|
else
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->table_coerced);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
|
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
h = NM_HASH_COMBINE (h, nm_utils_ip4_address_clear_host_address (obj->network, obj->plen));
|
|
|
|
|
else
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->network);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->metric);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->gateway);
|
2017-08-17 15:17:40 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
2017-08-15 11:37:58 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source));
|
2017-08-17 15:17:40 +02:00
|
|
|
h = NM_HASH_COMBINE (h, _ip_route_scope_inv_get_normalized (obj));
|
|
|
|
|
} else {
|
2017-08-15 11:37:58 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->rt_source);
|
2017-08-17 15:17:40 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->scope_inv);
|
|
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->mss);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->pref_src);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->rt_cloned);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->tos);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_mtu);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->mtu);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2017-06-12 18:39:53 +02:00
|
|
|
}
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 09:58:55 +02:00
|
|
|
int
|
2017-07-26 10:50:23 +02:00
|
|
|
nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4Route *b, NMPlatformIPRouteCmpType cmp_type)
|
2013-09-06 09:58:55 +02:00
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
2017-07-26 10:50:23 +02:00
|
|
|
switch (cmp_type) {
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
|
2017-09-22 15:26:56 +02:00
|
|
|
NM_CMP_DIRECT (nm_platform_route_table_uncoerce (a->table_coerced, TRUE),
|
|
|
|
|
nm_platform_route_table_uncoerce (b->table_coerced, TRUE));
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_DIRECT_IN4ADDR_SAME_PREFIX (a->network, b->network, MIN (a->plen, b->plen));
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
|
|
|
|
NM_CMP_FIELD (a, b, metric);
|
2017-08-02 07:16:35 +02:00
|
|
|
NM_CMP_FIELD (a, b, tos);
|
2017-07-19 12:51:22 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
2017-08-15 11:37:58 +02:00
|
|
|
NM_CMP_DIRECT (nmp_utils_ip_config_source_round_trip_rtprot (a->rt_source),
|
|
|
|
|
nmp_utils_ip_config_source_round_trip_rtprot (b->rt_source));
|
2017-08-17 15:17:40 +02:00
|
|
|
NM_CMP_DIRECT (_ip_route_scope_inv_get_normalized (a),
|
|
|
|
|
_ip_route_scope_inv_get_normalized (b));
|
2017-07-19 13:03:28 +02:00
|
|
|
NM_CMP_FIELD (a, b, gateway);
|
2017-07-26 07:26:18 +02:00
|
|
|
NM_CMP_FIELD (a, b, mss);
|
2017-07-26 09:25:21 +02:00
|
|
|
NM_CMP_FIELD (a, b, pref_src);
|
2017-07-27 06:47:11 +02:00
|
|
|
NM_CMP_FIELD (a, b, window);
|
2017-07-31 15:42:52 +02:00
|
|
|
NM_CMP_FIELD (a, b, cwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initcwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initrwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, mtu);
|
2017-07-27 07:21:01 +02:00
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_window);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_cwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initcwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initrwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_mtu);
|
2017-07-19 12:51:22 +02:00
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
break;
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
|
2017-09-22 15:26:56 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
|
|
|
|
NM_CMP_DIRECT (nm_platform_route_table_uncoerce (a->table_coerced, TRUE),
|
|
|
|
|
nm_platform_route_table_uncoerce (b->table_coerced, TRUE));
|
|
|
|
|
} else
|
|
|
|
|
NM_CMP_FIELD (a, b, table_coerced);
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
|
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
NM_CMP_DIRECT_IN4ADDR_SAME_PREFIX (a->network, b->network, MIN (a->plen, b->plen));
|
|
|
|
|
else
|
|
|
|
|
NM_CMP_FIELD (a, b, network);
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
|
|
|
|
NM_CMP_FIELD (a, b, metric);
|
|
|
|
|
NM_CMP_FIELD (a, b, gateway);
|
2017-08-15 11:37:58 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
|
|
|
|
NM_CMP_DIRECT (nmp_utils_ip_config_source_round_trip_rtprot (a->rt_source),
|
|
|
|
|
nmp_utils_ip_config_source_round_trip_rtprot (b->rt_source));
|
2017-08-17 15:17:40 +02:00
|
|
|
NM_CMP_DIRECT (_ip_route_scope_inv_get_normalized (a),
|
|
|
|
|
_ip_route_scope_inv_get_normalized (b));
|
|
|
|
|
} else {
|
2017-08-15 11:37:58 +02:00
|
|
|
NM_CMP_FIELD (a, b, rt_source);
|
2017-08-17 15:17:40 +02:00
|
|
|
NM_CMP_FIELD (a, b, scope_inv);
|
|
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, mss);
|
|
|
|
|
NM_CMP_FIELD (a, b, pref_src);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, rt_cloned);
|
|
|
|
|
NM_CMP_FIELD (a, b, tos);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_window);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_cwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initcwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initrwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_mtu);
|
|
|
|
|
NM_CMP_FIELD (a, b, window);
|
|
|
|
|
NM_CMP_FIELD (a, b, cwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initcwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initrwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, mtu);
|
|
|
|
|
break;
|
2017-04-13 22:34:32 +02:00
|
|
|
}
|
2013-09-06 09:58:55 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-12 18:39:53 +02:00
|
|
|
guint
|
2017-07-26 10:50:23 +02:00
|
|
|
nm_platform_ip6_route_hash (const NMPlatformIP6Route *obj, NMPlatformIPRouteCmpType cmp_type)
|
2017-06-12 18:39:53 +02:00
|
|
|
{
|
2017-07-26 10:50:23 +02:00
|
|
|
guint h = NM_HASH_COMBINE (1053326051, cmp_type);
|
2017-06-12 18:39:53 +02:00
|
|
|
|
|
|
|
|
if (obj) {
|
2017-07-26 10:50:23 +02:00
|
|
|
switch (cmp_type) {
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
|
2017-09-22 15:26:56 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE));
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->network, obj->plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
2017-08-14 12:27:30 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nm_utils_ip6_route_metric_normalize (obj->metric));
|
2017-07-26 09:25:21 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->src, obj->src_plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->src_plen);
|
2017-07-19 13:03:28 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
2017-07-19 13:03:28 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->gateway);
|
|
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
break;
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
|
2017-09-22 15:26:56 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
h = NM_HASH_COMBINE (h, nm_platform_route_table_uncoerce (obj->table_coerced, TRUE));
|
|
|
|
|
else
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->table_coerced);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->ifindex);
|
|
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->network, obj->plen);
|
|
|
|
|
else
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->network);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->plen);
|
2017-08-14 12:27:30 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
h = NM_HASH_COMBINE (h, nm_utils_ip6_route_metric_normalize (obj->metric));
|
|
|
|
|
else
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->metric);
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->gateway);
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->pref_src);
|
2017-07-26 09:25:21 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR_PREFIX (h, &obj->src, obj->src_plen);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->src_plen);
|
2017-08-15 11:37:58 +02:00
|
|
|
h = NM_HASH_COMBINE (h, nmp_utils_ip_config_source_round_trip_rtprot (obj->rt_source));
|
2017-07-26 09:25:21 +02:00
|
|
|
} else {
|
|
|
|
|
h = NM_HASH_COMBINE_IN6ADDR (h, &obj->src);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->src_plen);
|
2017-08-15 11:37:58 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->rt_source);
|
2017-07-26 09:25:21 +02:00
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
h = NM_HASH_COMBINE (h, obj->mss);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->rt_cloned);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->lock_mtu);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->window);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->cwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initcwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->initrwnd);
|
|
|
|
|
h = NM_HASH_COMBINE (h, obj->mtu);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2017-06-12 18:39:53 +02:00
|
|
|
}
|
|
|
|
|
return h;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-06 09:58:55 +02:00
|
|
|
int
|
2017-07-26 10:50:23 +02:00
|
|
|
nm_platform_ip6_route_cmp (const NMPlatformIP6Route *a, const NMPlatformIP6Route *b, NMPlatformIPRouteCmpType cmp_type)
|
2013-09-06 09:58:55 +02:00
|
|
|
{
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
2017-07-26 10:50:23 +02:00
|
|
|
switch (cmp_type) {
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_WEAK_ID:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID:
|
2017-09-22 15:26:56 +02:00
|
|
|
NM_CMP_DIRECT (nm_platform_route_table_uncoerce (a->table_coerced, TRUE),
|
|
|
|
|
nm_platform_route_table_uncoerce (b->table_coerced, TRUE));
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_DIRECT_IN6ADDR_SAME_PREFIX (&a->network, &b->network, MIN (a->plen, b->plen));
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
2017-08-14 12:27:30 +02:00
|
|
|
NM_CMP_DIRECT (nm_utils_ip6_route_metric_normalize (a->metric), nm_utils_ip6_route_metric_normalize (b->metric));
|
2017-07-26 09:25:21 +02:00
|
|
|
NM_CMP_DIRECT_IN6ADDR_SAME_PREFIX (&a->src, &b->src, MIN (a->src_plen, b->src_plen));
|
|
|
|
|
NM_CMP_FIELD (a, b, src_plen);
|
2017-07-19 13:03:28 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) {
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
2017-07-19 13:03:28 +02:00
|
|
|
NM_CMP_FIELD_IN6ADDR (a, b, gateway);
|
|
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
break;
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY:
|
|
|
|
|
case NM_PLATFORM_IP_ROUTE_CMP_TYPE_FULL:
|
2017-09-22 15:26:56 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
|
|
|
|
NM_CMP_DIRECT (nm_platform_route_table_uncoerce (a->table_coerced, TRUE),
|
|
|
|
|
nm_platform_route_table_uncoerce (b->table_coerced, TRUE));
|
|
|
|
|
} else
|
|
|
|
|
NM_CMP_FIELD (a, b, table_coerced);
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, ifindex);
|
|
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
NM_CMP_DIRECT_IN6ADDR_SAME_PREFIX (&a->network, &b->network, MIN (a->plen, b->plen));
|
|
|
|
|
else
|
|
|
|
|
NM_CMP_FIELD_IN6ADDR (a, b, network);
|
|
|
|
|
NM_CMP_FIELD (a, b, plen);
|
2017-08-14 12:27:30 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY)
|
|
|
|
|
NM_CMP_DIRECT (nm_utils_ip6_route_metric_normalize (a->metric), nm_utils_ip6_route_metric_normalize (b->metric));
|
|
|
|
|
else
|
|
|
|
|
NM_CMP_FIELD (a, b, metric);
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD_IN6ADDR (a, b, gateway);
|
|
|
|
|
NM_CMP_FIELD_IN6ADDR (a, b, pref_src);
|
2017-07-26 09:25:21 +02:00
|
|
|
if (cmp_type == NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY) {
|
|
|
|
|
NM_CMP_DIRECT_IN6ADDR_SAME_PREFIX (&a->src, &b->src, MIN (a->src_plen, b->src_plen));
|
|
|
|
|
NM_CMP_FIELD (a, b, src_plen);
|
2017-08-15 11:37:58 +02:00
|
|
|
NM_CMP_DIRECT (nmp_utils_ip_config_source_round_trip_rtprot (a->rt_source),
|
|
|
|
|
nmp_utils_ip_config_source_round_trip_rtprot (b->rt_source));
|
2017-07-26 09:25:21 +02:00
|
|
|
} else {
|
|
|
|
|
NM_CMP_FIELD_IN6ADDR (a, b, src);
|
|
|
|
|
NM_CMP_FIELD (a, b, src_plen);
|
2017-08-15 11:37:58 +02:00
|
|
|
NM_CMP_FIELD (a, b, rt_source);
|
2017-07-26 09:25:21 +02:00
|
|
|
}
|
2017-07-26 10:50:23 +02:00
|
|
|
NM_CMP_FIELD (a, b, mss);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, rt_cloned);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_window);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_cwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initcwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_initrwnd);
|
|
|
|
|
NM_CMP_FIELD_UNSAFE (a, b, lock_mtu);
|
|
|
|
|
NM_CMP_FIELD (a, b, window);
|
|
|
|
|
NM_CMP_FIELD (a, b, cwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initcwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, initrwnd);
|
|
|
|
|
NM_CMP_FIELD (a, b, mtu);
|
|
|
|
|
break;
|
2017-04-13 22:34:32 +02:00
|
|
|
}
|
2013-09-06 09:58:55 +02:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-03 11:42:00 +02:00
|
|
|
/**
|
|
|
|
|
* nm_platform_ip_address_cmp_expiry:
|
|
|
|
|
* @a: a NMPlatformIPAddress to compare
|
|
|
|
|
* @b: the other NMPlatformIPAddress to compare
|
|
|
|
|
*
|
|
|
|
|
* Compares two addresses and returns which one has a longer remaining lifetime.
|
|
|
|
|
* If both addresses have the same lifetime, look at the remaining preferred time.
|
|
|
|
|
*
|
|
|
|
|
* For comparison, only the timestamp, lifetime and preferred fields are considered.
|
|
|
|
|
* If they compare equal (== 0), their other fields were not considered.
|
|
|
|
|
*
|
|
|
|
|
* Returns: -1, 0, or 1 according to the comparison
|
|
|
|
|
**/
|
|
|
|
|
int
|
|
|
|
|
nm_platform_ip_address_cmp_expiry (const NMPlatformIPAddress *a, const NMPlatformIPAddress *b)
|
|
|
|
|
{
|
2014-06-09 10:28:55 +02:00
|
|
|
gint64 ta = 0, tb = 0;
|
2014-04-03 11:42:00 +02:00
|
|
|
|
2017-07-26 10:52:27 +02:00
|
|
|
NM_CMP_SELF (a, b);
|
2014-04-03 11:42:00 +02:00
|
|
|
|
|
|
|
|
if (a->lifetime == NM_PLATFORM_LIFETIME_PERMANENT || a->lifetime == 0)
|
|
|
|
|
ta = G_MAXINT64;
|
2014-06-09 10:28:55 +02:00
|
|
|
else if (a->timestamp)
|
2014-04-03 11:42:00 +02:00
|
|
|
ta = ((gint64) a->timestamp) + a->lifetime;
|
|
|
|
|
|
|
|
|
|
if (b->lifetime == NM_PLATFORM_LIFETIME_PERMANENT || b->lifetime == 0)
|
|
|
|
|
tb = G_MAXINT64;
|
2014-06-09 10:28:55 +02:00
|
|
|
else if (b->timestamp)
|
2014-04-03 11:42:00 +02:00
|
|
|
tb = ((gint64) b->timestamp) + b->lifetime;
|
|
|
|
|
|
|
|
|
|
if (ta == tb) {
|
|
|
|
|
/* if the lifetime is equal, compare the preferred time. */
|
2014-06-09 10:28:55 +02:00
|
|
|
ta = tb = 0;
|
2014-04-03 11:42:00 +02:00
|
|
|
|
|
|
|
|
if (a->preferred == NM_PLATFORM_LIFETIME_PERMANENT || a->lifetime == 0 /* liftime==0 means permanent! */)
|
|
|
|
|
ta = G_MAXINT64;
|
2014-06-09 10:28:55 +02:00
|
|
|
else if (a->timestamp)
|
2014-04-03 11:42:00 +02:00
|
|
|
ta = ((gint64) a->timestamp) + a->preferred;
|
|
|
|
|
|
|
|
|
|
if (b->preferred == NM_PLATFORM_LIFETIME_PERMANENT|| b->lifetime == 0)
|
|
|
|
|
tb = G_MAXINT64;
|
2014-06-09 10:28:55 +02:00
|
|
|
else if (b->timestamp)
|
2014-04-03 11:42:00 +02:00
|
|
|
tb = ((gint64) b->timestamp) + b->preferred;
|
|
|
|
|
|
|
|
|
|
if (ta == tb)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ta < tb ? -1 : 1;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-24 12:28:07 +02:00
|
|
|
const char *
|
|
|
|
|
nm_platform_signal_change_type_to_string (NMPlatformSignalChangeType change_type)
|
2014-03-07 19:04:38 +01:00
|
|
|
{
|
|
|
|
|
switch (change_type) {
|
|
|
|
|
case NM_PLATFORM_SIGNAL_ADDED:
|
|
|
|
|
return "added";
|
|
|
|
|
case NM_PLATFORM_SIGNAL_CHANGED:
|
|
|
|
|
return "changed";
|
|
|
|
|
case NM_PLATFORM_SIGNAL_REMOVED:
|
|
|
|
|
return "removed";
|
|
|
|
|
default:
|
|
|
|
|
g_return_val_if_reached ("UNKNOWN");
|
|
|
|
|
}
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2015-07-02 14:35:38 +02:00
|
|
|
log_link (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformLink *device, NMPlatformSignalChangeType change_type, gpointer user_data)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
|
|
|
|
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("signal: link %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_link_to_string (device, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2015-07-02 14:35:38 +02:00
|
|
|
log_ip4_address (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP4Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("signal: address 4 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip4_address_to_string (address, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2015-07-02 14:35:38 +02:00
|
|
|
log_ip6_address (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP6Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("signal: address 6 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip6_address_to_string (address, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2015-07-02 14:35:38 +02:00
|
|
|
log_ip4_route (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP4Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("signal: route 4 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip4_route_to_string (route, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2015-07-02 14:35:38 +02:00
|
|
|
log_ip6_route (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP6Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2015-10-12 10:27:33 +02:00
|
|
|
_LOGD ("signal: route 6 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip6_route_to_string (route, NULL, 0));
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2013-03-27 22:23:24 +01:00
|
|
|
|
2017-06-29 13:13:54 +02:00
|
|
|
void
|
|
|
|
|
nm_platform_cache_update_emit_signal (NMPlatform *self,
|
|
|
|
|
NMPCacheOpsType cache_op,
|
|
|
|
|
const NMPObject *obj_old,
|
|
|
|
|
const NMPObject *obj_new)
|
|
|
|
|
{
|
|
|
|
|
gboolean visible_new;
|
|
|
|
|
gboolean visible_old;
|
|
|
|
|
const NMPObject *o;
|
|
|
|
|
const NMPClass *klass;
|
|
|
|
|
|
|
|
|
|
nm_assert (NM_IN_SET ((NMPlatformSignalChangeType) cache_op, (NMPlatformSignalChangeType) NMP_CACHE_OPS_UNCHANGED, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_SIGNAL_REMOVED));
|
|
|
|
|
|
|
|
|
|
ASSERT_nmp_cache_ops (nm_platform_get_cache (self), cache_op, obj_old, obj_new);
|
|
|
|
|
|
2017-08-21 16:55:02 +02:00
|
|
|
nm_assert (NM_IN_SET (nm_platform_netns_get (self),
|
|
|
|
|
NULL,
|
|
|
|
|
nmp_netns_get_current ()));
|
|
|
|
|
|
2017-06-29 13:13:54 +02:00
|
|
|
NMTST_ASSERT_PLATFORM_NETNS_CURRENT (self);
|
|
|
|
|
|
|
|
|
|
switch (cache_op) {
|
|
|
|
|
case NMP_CACHE_OPS_ADDED:
|
|
|
|
|
if (!nmp_object_is_visible (obj_new))
|
|
|
|
|
return;
|
|
|
|
|
o = obj_new;
|
|
|
|
|
break;
|
|
|
|
|
case NMP_CACHE_OPS_UPDATED:
|
|
|
|
|
visible_old = nmp_object_is_visible (obj_old);
|
|
|
|
|
visible_new = nmp_object_is_visible (obj_new);
|
|
|
|
|
if (!visible_old && visible_new) {
|
|
|
|
|
o = obj_new;
|
|
|
|
|
cache_op = NMP_CACHE_OPS_ADDED;
|
|
|
|
|
} else if (visible_old && !visible_new) {
|
|
|
|
|
o = obj_old;
|
|
|
|
|
cache_op = NMP_CACHE_OPS_REMOVED;
|
|
|
|
|
} else if (!visible_new) {
|
|
|
|
|
/* it was invisible and stayed invisible. Nothing to do. */
|
|
|
|
|
return;
|
|
|
|
|
} else
|
|
|
|
|
o = obj_new;
|
|
|
|
|
break;
|
|
|
|
|
case NMP_CACHE_OPS_REMOVED:
|
|
|
|
|
if (!nmp_object_is_visible (obj_old))
|
|
|
|
|
return;
|
|
|
|
|
o = obj_old;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
nm_assert (cache_op == NMP_CACHE_OPS_UNCHANGED);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
klass = NMP_OBJECT_GET_CLASS (o);
|
|
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
if ( klass->obj_type == NMP_OBJECT_TYPE_IP4_ROUTE
|
|
|
|
|
&& NM_PLATFORM_GET_PRIVATE (self)->ip4_dev_route_blacklist_gc_timeout_id
|
|
|
|
|
&& NM_IN_SET (cache_op, NMP_CACHE_OPS_ADDED, NMP_CACHE_OPS_UPDATED))
|
|
|
|
|
_ip4_dev_route_blacklist_notify_route (self, o);
|
|
|
|
|
|
2017-06-29 13:13:54 +02:00
|
|
|
_LOGt ("emit signal %s %s: %s",
|
|
|
|
|
klass->signal_type,
|
|
|
|
|
nm_platform_signal_change_type_to_string ((NMPlatformSignalChangeType) cache_op),
|
|
|
|
|
nmp_object_to_string (o, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
|
|
|
|
|
|
|
|
|
|
nmp_object_ref (o);
|
|
|
|
|
g_signal_emit (self,
|
|
|
|
|
_nm_platform_signal_id_get (klass->signal_type_id),
|
|
|
|
|
0,
|
|
|
|
|
(int) klass->obj_type,
|
|
|
|
|
o->object.ifindex,
|
|
|
|
|
&o->object,
|
|
|
|
|
(int) cache_op);
|
|
|
|
|
nmp_object_unref (o);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2017-06-29 11:18:10 +02:00
|
|
|
NMPCache *
|
|
|
|
|
nm_platform_get_cache (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
return NM_PLATFORM_GET_PRIVATE (self)->cache;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-19 01:06:28 +01:00
|
|
|
NMPNetns *
|
|
|
|
|
nm_platform_netns_get (NMPlatform *self)
|
|
|
|
|
{
|
|
|
|
|
_CHECK_SELF (self, klass, NULL);
|
|
|
|
|
|
|
|
|
|
return self->_netns;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2017-07-04 12:49:47 +02:00
|
|
|
nm_platform_netns_push (NMPlatform *self, NMPNetns **netns)
|
2016-02-19 01:06:28 +01:00
|
|
|
{
|
2017-07-04 12:49:47 +02:00
|
|
|
g_return_val_if_fail (NM_IS_PLATFORM (self), FALSE);
|
2016-02-19 01:06:28 +01:00
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
if ( self->_netns
|
|
|
|
|
&& !nmp_netns_push (self->_netns)) {
|
2016-02-19 01:06:28 +01:00
|
|
|
NM_SET_OUT (netns, NULL);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-04 12:49:47 +02:00
|
|
|
NM_SET_OUT (netns, self->_netns);
|
2016-02-19 01:06:28 +01:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2016-02-19 01:06:28 +01:00
|
|
|
|
2015-03-25 11:28:19 +01:00
|
|
|
static guint32
|
|
|
|
|
_vtr_v4_metric_normalize (guint32 metric)
|
|
|
|
|
{
|
|
|
|
|
return metric;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-03-25 11:28:19 +01:00
|
|
|
|
|
|
|
|
const NMPlatformVTableRoute nm_platform_vtable_route_v4 = {
|
|
|
|
|
.is_ip4 = TRUE,
|
2017-06-29 15:19:35 +02:00
|
|
|
.obj_type = NMP_OBJECT_TYPE_IP4_ROUTE,
|
2015-03-25 11:28:19 +01:00
|
|
|
.addr_family = AF_INET,
|
|
|
|
|
.sizeof_route = sizeof (NMPlatformIP4Route),
|
2017-07-26 10:50:23 +02:00
|
|
|
.route_cmp = (int (*) (const NMPlatformIPXRoute *a, const NMPlatformIPXRoute *b, NMPlatformIPRouteCmpType cmp_type)) nm_platform_ip4_route_cmp,
|
2015-10-12 10:27:33 +02:00
|
|
|
.route_to_string = (const char *(*) (const NMPlatformIPXRoute *route, char *buf, gsize len)) nm_platform_ip4_route_to_string,
|
2015-03-25 11:28:19 +01:00
|
|
|
.metric_normalize = _vtr_v4_metric_normalize,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const NMPlatformVTableRoute nm_platform_vtable_route_v6 = {
|
|
|
|
|
.is_ip4 = FALSE,
|
2017-06-29 15:19:35 +02:00
|
|
|
.obj_type = NMP_OBJECT_TYPE_IP6_ROUTE,
|
2015-03-25 11:28:19 +01:00
|
|
|
.addr_family = AF_INET6,
|
|
|
|
|
.sizeof_route = sizeof (NMPlatformIP6Route),
|
2017-07-26 10:50:23 +02:00
|
|
|
.route_cmp = (int (*) (const NMPlatformIPXRoute *a, const NMPlatformIPXRoute *b, NMPlatformIPRouteCmpType cmp_type)) nm_platform_ip6_route_cmp,
|
2015-10-12 10:27:33 +02:00
|
|
|
.route_to_string = (const char *(*) (const NMPlatformIPXRoute *route, char *buf, gsize len)) nm_platform_ip6_route_to_string,
|
2015-03-25 11:28:19 +01:00
|
|
|
.metric_normalize = nm_utils_ip6_route_metric_normalize,
|
|
|
|
|
};
|
|
|
|
|
|
2016-10-02 18:22:50 +02:00
|
|
|
/*****************************************************************************/
|
2015-03-25 11:28:19 +01:00
|
|
|
|
2015-05-12 07:34:56 +02:00
|
|
|
static void
|
|
|
|
|
set_property (GObject *object, guint prop_id,
|
|
|
|
|
const GValue *value, GParamSpec *pspec)
|
|
|
|
|
{
|
2016-02-19 01:06:28 +01:00
|
|
|
NMPlatform *self = NM_PLATFORM (object);
|
|
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
2015-05-12 07:34:56 +02:00
|
|
|
|
|
|
|
|
switch (prop_id) {
|
2016-02-19 01:06:28 +01:00
|
|
|
case PROP_NETNS_SUPPORT:
|
|
|
|
|
/* construct-only */
|
|
|
|
|
if (g_value_get_boolean (value)) {
|
|
|
|
|
NMPNetns *netns;
|
|
|
|
|
|
|
|
|
|
netns = nmp_netns_get_current ();
|
|
|
|
|
if (netns)
|
|
|
|
|
self->_netns = g_object_ref (netns);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-06-29 10:51:38 +02:00
|
|
|
case PROP_USE_UDEV:
|
|
|
|
|
/* construct-only */
|
|
|
|
|
priv->use_udev = g_value_get_boolean (value);
|
|
|
|
|
break;
|
2017-04-17 18:40:52 +02:00
|
|
|
case PROP_LOG_WITH_PTR:
|
2015-05-12 07:34:56 +02:00
|
|
|
/* construct-only */
|
2017-04-17 18:40:52 +02:00
|
|
|
priv->log_with_ptr = g_value_get_boolean (value);
|
2015-05-12 07:34:56 +02:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
static void
|
2016-09-28 15:58:24 +02:00
|
|
|
nm_platform_init (NMPlatform *self)
|
2013-03-27 22:23:24 +01:00
|
|
|
{
|
2016-09-28 15:58:24 +02:00
|
|
|
self->_priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_PLATFORM, NMPlatformPrivate);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|
|
|
|
|
|
2017-06-29 11:18:10 +02:00
|
|
|
static GObject *
|
|
|
|
|
constructor (GType type,
|
|
|
|
|
guint n_construct_params,
|
|
|
|
|
GObjectConstructParam *construct_params)
|
|
|
|
|
{
|
|
|
|
|
GObject *object;
|
|
|
|
|
NMPlatform *self;
|
|
|
|
|
NMPlatformPrivate *priv;
|
|
|
|
|
|
|
|
|
|
object = G_OBJECT_CLASS (nm_platform_parent_class)->constructor (type,
|
|
|
|
|
n_construct_params,
|
|
|
|
|
construct_params);
|
|
|
|
|
self = NM_PLATFORM (object);
|
|
|
|
|
priv = NM_PLATFORM_GET_PRIVATE (self);
|
|
|
|
|
|
|
|
|
|
priv->multi_idx = nm_dedup_multi_index_new ();
|
|
|
|
|
|
|
|
|
|
priv->cache = nmp_cache_new (nm_platform_get_multi_idx (self),
|
|
|
|
|
priv->use_udev);
|
|
|
|
|
return object;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-19 01:06:28 +01:00
|
|
|
static void
|
|
|
|
|
finalize (GObject *object)
|
|
|
|
|
{
|
|
|
|
|
NMPlatform *self = NM_PLATFORM (object);
|
core: pass NMDedupMultiIndex instance to NMIP4Config and other
NMIP4Config, NMIP6Config, and NMPlatform shall share one
NMDedupMultiIndex instance.
For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns.
NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config.
So currently NMNetns is the access point to the shared NMDedupMultiIndex
instance, and it gets it from it's NMPlatform instance.
The NMDedupMultiIndex instance is really a singleton, we don't want
multiple instances of it. However, for testing, instead of adding a
singleton instance, pass the instance explicitly around.
2017-06-12 08:16:47 +02:00
|
|
|
NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
|
2016-02-19 01:06:28 +01:00
|
|
|
|
platform: add non-exclusive routes and drop route-manager
Previously, we would add exclusive routes via netlink message flags
NLM_F_CREATE | NLM_F_REPLACE for RTM_NEWROUTE. Similar to `ip route replace`.
Using that form of RTM_NEWROUTE message, we could only add a certain
route with a certain network/plen,metric triple once. That was already
hugely inconvenient, because
- when configuring routes, multiple (managed) interfaces may get
conflicting routes (multihoming). Only one of the routes can be actually
configured using `ip route replace`, so we need to track routes that are
currently shadowed.
- when configuring routes, we might replace externally configured
routes on unmanaged interfaces. We should not interfere with such
routes.
That was worked around by having NMRouteManager (and NMDefaultRouteManager).
NMRouteManager would keep a list of the routes which NetworkManager would like
to configure, even if momentarily being unable to do so due to conflicting routes.
This worked mostly well but was complicated. It involved bumping metrics to
avoid conflicts for device routes, as we might require them for gateway routes.
Drop that now. Instead, use the corresponding of `ip route append` to configure
routes. This allows NetworkManager to confiure (almost) all routes that we care.
Especially, it can configure all routes on a managed interface, without
replacing/interfering with routes on other interfaces. Hence, NMRouteManager
becomes obsolete.
It practice it is a bit more complicated because:
- when adding an IPv4 address, kernel will automatically create a device route
for the subnet. We should avoid that by using the IFA_F_NOPREFIXROUTE flag for
IPv4 addresses (still to-do). But as kernel may not support that flag for IPv4
addresses yet (and we don't require such a kernel yet), we still need functionality
similar to nm_route_manager_ip4_route_register_device_route_purge_list().
This functionality is now handled via nm_platform_ip4_dev_route_blacklist_set().
- trying to configure an IPv6 route with a source address will be rejected
by kernel as long as the address is tentative (see related bug rh#1457196).
Preferably, NMDevice would keep the list of routes which should be configured,
while kernel would have the list of what actually is configured. There is a
feed-back loop where both affect each other (for example, when externally deleting
a route, NMDevice must forget about it too). Previously, NMRouteManager would have
the task of remembering all routes which we currently want to configure, but cannot
due to conflicting routes.
We get rid of that, because now we configure non-exclusive routes. We however still
will need to remember IPv6 routes with a source address, that currently cannot be
configured yet. Hence, we will need to keep track of routes that
currently cannot be configured, but later may be.
That is still not done yet, as NMRouteManager didn't handle this
correctly either.
2017-08-14 14:18:53 +02:00
|
|
|
nm_clear_g_source (&priv->ip4_dev_route_blacklist_check_id);
|
|
|
|
|
nm_clear_g_source (&priv->ip4_dev_route_blacklist_gc_timeout_id);
|
|
|
|
|
g_clear_pointer (&priv->ip4_dev_route_blacklist_hash, g_hash_table_unref);
|
2016-02-19 01:06:28 +01:00
|
|
|
g_clear_object (&self->_netns);
|
2017-06-29 11:18:10 +02:00
|
|
|
nm_dedup_multi_index_unref (priv->multi_idx);
|
|
|
|
|
nmp_cache_free (priv->cache);
|
2016-02-19 01:06:28 +01:00
|
|
|
}
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
static void
|
|
|
|
|
nm_platform_class_init (NMPlatformClass *platform_class)
|
|
|
|
|
{
|
|
|
|
|
GObjectClass *object_class = G_OBJECT_CLASS (platform_class);
|
|
|
|
|
|
2015-05-12 07:34:56 +02:00
|
|
|
g_type_class_add_private (object_class, sizeof (NMPlatformPrivate));
|
|
|
|
|
|
2017-06-29 11:18:10 +02:00
|
|
|
object_class->constructor = constructor;
|
2015-05-12 07:34:56 +02:00
|
|
|
object_class->set_property = set_property;
|
2016-02-19 01:06:28 +01:00
|
|
|
object_class->finalize = finalize;
|
2015-05-12 07:34:56 +02:00
|
|
|
|
2014-10-23 14:19:59 -04:00
|
|
|
platform_class->wifi_set_powersave = wifi_set_powersave;
|
|
|
|
|
|
2016-02-19 01:06:28 +01:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_NETNS_SUPPORT,
|
|
|
|
|
g_param_spec_boolean (NM_PLATFORM_NETNS_SUPPORT, "", "",
|
2016-04-07 12:22:44 +02:00
|
|
|
NM_PLATFORM_NETNS_SUPPORT_DEFAULT,
|
2016-02-19 01:06:28 +01:00
|
|
|
G_PARAM_WRITABLE |
|
|
|
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
|
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
|
|
2017-06-29 10:51:38 +02:00
|
|
|
g_object_class_install_property
|
|
|
|
|
(object_class, PROP_USE_UDEV,
|
|
|
|
|
g_param_spec_boolean (NM_PLATFORM_USE_UDEV, "", "",
|
|
|
|
|
FALSE,
|
|
|
|
|
G_PARAM_WRITABLE |
|
|
|
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
|
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
|
|
2015-05-12 07:34:56 +02:00
|
|
|
g_object_class_install_property
|
2017-04-17 18:40:52 +02:00
|
|
|
(object_class, PROP_LOG_WITH_PTR,
|
|
|
|
|
g_param_spec_boolean (NM_PLATFORM_LOG_WITH_PTR, "", "",
|
2017-04-18 13:16:54 +02:00
|
|
|
TRUE,
|
2015-05-12 07:34:56 +02:00
|
|
|
G_PARAM_WRITABLE |
|
|
|
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
|
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
|
|
2015-11-27 12:54:31 +01:00
|
|
|
#define SIGNAL(signal, signal_id, method) \
|
|
|
|
|
G_STMT_START { \
|
|
|
|
|
signals[signal] = \
|
|
|
|
|
g_signal_new_class_handler (""signal_id"", \
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class), \
|
|
|
|
|
G_SIGNAL_RUN_FIRST, \
|
|
|
|
|
G_CALLBACK (method), \
|
|
|
|
|
NULL, NULL, NULL, \
|
2016-10-22 13:08:36 +02:00
|
|
|
G_TYPE_NONE, 4, \
|
|
|
|
|
G_TYPE_INT, /* (int) NMPObjectType */ \
|
|
|
|
|
G_TYPE_INT, /* ifindex */ \
|
|
|
|
|
G_TYPE_POINTER /* const NMPObject * */, \
|
|
|
|
|
G_TYPE_INT /* (int) NMPlatformSignalChangeType */ \
|
|
|
|
|
); \
|
2015-11-27 12:54:31 +01:00
|
|
|
} G_STMT_END
|
|
|
|
|
|
2013-03-27 22:23:24 +01:00
|
|
|
/* Signals */
|
2015-11-27 12:54:31 +01:00
|
|
|
SIGNAL (NM_PLATFORM_SIGNAL_ID_LINK, NM_PLATFORM_SIGNAL_LINK_CHANGED, log_link);
|
|
|
|
|
SIGNAL (NM_PLATFORM_SIGNAL_ID_IP4_ADDRESS, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, log_ip4_address);
|
|
|
|
|
SIGNAL (NM_PLATFORM_SIGNAL_ID_IP6_ADDRESS, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, log_ip6_address);
|
|
|
|
|
SIGNAL (NM_PLATFORM_SIGNAL_ID_IP4_ROUTE, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, log_ip4_route);
|
|
|
|
|
SIGNAL (NM_PLATFORM_SIGNAL_ID_IP6_ROUTE, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, log_ip6_route);
|
2013-03-27 22:23:24 +01:00
|
|
|
}
|