Commit graph

189 commits

Author SHA1 Message Date
Thomas Haller
3c0ceda905 platform: don't assert for valid ifindex in nm_platform_link_get()
It's not uncommon to lookup a platform parameter with invalid
ifindex or ifname. Be more resilient and just return "no link found".

Fixes: e8e455817b
(cherry picked from commit 0a38352470)
2015-06-22 09:56:06 +02:00
Thomas Haller
1fb84b1688 platform: refactor virtual methods for link objects in NMPlatform
Change nm_platform_link_get() to return the cached NMPlatformLink
instance. Now what all our implementations (fake and linux) have such a
cache internal object, let's just expose it directly.
Note that the lifetime of the exposed link object is possibly quite
short. A caller must copy the returned value if he intends to preserve
it for later.
Also add nm_platform_link_get_by_ifname() and modify nm_platform_link_get_by_address()
to return the instance.

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

Also remove some stub implementations in NMFakePlatform that just
bail out. Instead allow for a missing virtual functions and perform
the "default" action in the accessor.
An example for that is nm_platform_link_get_permanent_address().

(cherry picked from commit e8e455817b)
2015-06-22 09:56:06 +02:00
Thomas Haller
6835e80aea platform: add nm_platform_process_events() function
(cherry picked from commit 55a67ec787)
2015-06-22 09:56:05 +02:00
Thomas Haller
dd49380d42 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 (...);

(cherry picked from commit 68a4ffb4e2)
2015-06-22 09:54:52 +02:00
Thomas Haller
6a9cd7c113 platform: signal missing firmware in nm_platform_set_up()
Don't use nm_platform_get_error() anymore.

(cherry picked from commit c1a945b95d)
2015-06-22 09:54:52 +02:00
Thomas Haller
87c1b92cc5 platform: return NMPlatformError from link-add functions
Later remove nm_platform_get_error() and signal errors via return
error codes.

Also, fix nm_platform_infiniband_partition_add() and
nm_platform_vlan_add() to check the type of the existing link
and fail with WRONG_TYPE otherwise.

(cherry picked from commit d7fe907c32)
2015-06-22 09:54:52 +02:00
Thomas Haller
8fbd2d84e8 platform: rework NMPlatformError codes
- rename "NONE" to "SUCCESS", what it really is.
- change the to-string result not to contain spaces
  and being closer the name of the enum value.
- add new error reasons "UNSPECIFIED" and "BUG".
- remove the code comments around the enum definition.
  They add no further description about why this error
  happens and only paraphrase the name of the enum.
- reserve negative integers for 'errno'. This is neat
  because if we get a system error we can pass on the
  underlying errno as cause.

(cherry picked from commit f7fb68755c)
2015-06-22 09:54:52 +02:00
Thomas Haller
0def11cf47 platform: expose GUdevDevice instance for platform links
(cherry picked from commit b74e620f2d)
2015-06-22 09:54:52 +02:00
Thomas Haller
42a93b79ed platform: no longer expose udi field in NMPlatformLink
The @udi field is not a static string, so any user of a NMPlatformLink
instance must make sure not to use the field beyond the lifetime of the
NMPlatformLink instance.
As we pass on the platform link instance during platform changed events,
this is hard to ensure for the subscriber of the signal -- because a
call back into platform could invalidate/modify the object.

Just not expose this field as part of the link instance. The few callers
who actually needed it should instead call nm_platform_get_uid(). With
that, the lifetime of the returned 'const char *' pointer is clearly
defined.

(cherry picked from commit 1b2b988ea9)
2015-06-21 15:32:13 +02:00
Thomas Haller
d24732b874 platform: remove redundant NMPlatformLink fields "arp" and "up"
(cherry picked from commit 076fe578e3)
2015-06-21 15:30:49 +02:00
Thomas Haller
662194cde3 platform: register singleton instance early with NM_PLATFORM_REGISTER_SINGLETON
Add a construct-only property NM_PLATFORM_REGISTER_SINGLETON to NMPlatform.
When set to TRUE, the constructor will self-register to nm_platform_setup().

The reason for this is that the _LOG() macro in NMLinuxPlatform logs the
self pointer if the instance is not the singleton instance.

During construction, we already have many log lines due to initialization
of the instance. These lines all end up qualified with the self pointer.
By earlier self-registering, printing the pointer value is omitted.

Yes, this patch is really just to prettify logging.

(cherry picked from commit 56b07b1a3f)
2015-06-21 15:26:18 +02:00
Thomas Haller
d45bb6d461 platform: implement NMPObject and NMPCache
NMPObject is a simple "object" implemenation around NMPlatformObject.
They are ref-counted and have a class-pointer. Several basic functions
like equality, hash, to-string are implemented.

NMPCache is can be used to store the NMPObject. Objects are indexed
via their primary id, but there is also multi-lookup via NMCacheId
and NMMultiIndex.

Part of the implementation is inside "nm-linux-platform.c",
because it depends on utility functions from there.

(cherry picked from commit 53f98e7f9e)
2015-06-21 15:21:56 +02:00
Thomas Haller
fa7acaef83 platform: add _NM_IP_CONFIG_SOURCE_RTPROT_KERNEL source
Later we will need this flag to distinguish routes from kernel
that have source RTPROT_KERNEL.

This flag is still unused.

(cherry picked from commit 64d918293b)
2015-06-21 15:19:01 +02:00
Thomas Haller
4ac1889a86 platform: print more fields in nm_platform_link_to_string()
(cherry picked from commit c34598fa23)
2015-06-21 15:19:01 +02:00
Thomas Haller
27c87c75b8 platform: expose internal buffer for to_string() functions
I'd like to reuse this buffer for other to-string functions that
are platform related.

(cherry picked from commit 655a0e71d4)
2015-06-21 15:19:01 +02:00
Thomas Haller
988e8139d0 platform/trivial: rename to_string_buffer variable
(cherry picked from commit 806109c245)
2015-06-21 15:19:01 +02:00
Thomas Haller
79f2c30099 platform: add inet6_token parameter to NMPlatformLink
(cherry picked from commit 32ab8c18f5)
2015-06-21 15:19:01 +02:00
Thomas Haller
0acc868baa platform: add arptype parameter to NMPlatformLink
(cherry picked from commit 3ce4431695)
2015-06-21 15:19:01 +02:00
Thomas Haller
0ee58d136a platform: add inet6_addr_get_mode_inv parameter to NMPlatformLink
(cherry picked from commit 5b2b62ff51)
2015-06-21 15:19:00 +02:00
Thomas Haller
a0cb0b6b08 platform: add addr parameter to NMPlatformLink
(cherry picked from commit 36e77218a0)
2015-06-21 15:19:00 +02:00
Thomas Haller
607b69bbc0 platform: add vlan_id parameter to NMPlatformLink
(cherry picked from commit 3cdde18f52)
2015-06-21 15:19:00 +02:00
Thomas Haller
4e2ef48a21 platform: add flags parameter to NMPlatformLink
(cherry picked from commit b307abc010)
2015-06-21 15:19:00 +02:00
Thomas Haller
980d6f4b78 platform: add scope parameter to NMPlatformIP4Route
Cache the scope as part of the NMPlatformIP4Route and
no longer read it from libnl object when needed. Later
there will be no more libnl objects around, and we need
to scope when deleting an IPv4 route.

(cherry picked from commit 619f660a3e)
2015-06-21 15:18:56 +02:00
Thomas Haller
072296750c platform: expose nm_platform_signal_change_type_to_string()
(cherry picked from commit d4f828c887)
2015-06-19 12:26:03 +02:00
Thomas Haller
4e0af0aa52 platform: move nm_platform_query_devices() to nm-manager
nm_platform_query_devices() would raise an 'added' signal
for all its links. That is bad style because it could
confuse other listeners for platform signals which don't
expect such artificial change signals.

The public API of NMPlatform already gives NMManager the ability
to 'pull' all the links and iterate them itself.

Before, nm_platform_query_devices() would also initialize udev
devices, so there was a more compelling reason for this function.

(cherry picked from commit d7a312d17a)
2015-06-19 12:26:02 +02:00
Thomas Haller
acb39d4b31 platform: merge setup_devices() function into constructed()
We already populate the netlink cache in constructed(). No need
to wait with udev devices until nm_platform_query_devices(). Just
do it right away.

Add a hack to keep 'lo' default-unmanaged. Now that we load
udev devices earlier, we end up clearing the default-unmanged
flag on 'lo', which has bad consequences.

(cherry picked from commit d6ce01f115)
2015-06-19 12:26:02 +02:00
Dan Williams
b5f5aa0960 platform: move InfiniBand property reading into the platform and prefer netlink
Add a netlink implementation for reading InfiniBand properties, but fall back to
sysfs when that isn't supported by the kernel.

(cherry picked from commit 5cf226463a)
2015-06-17 18:52:43 +02:00
Dan Williams
d5e0a6ff86 core: move permanent and initial MAC address reading to NMDevice and NMPlatform
Ethernet, WiFi, and VLAN used the same implementation for initial address.

Ethernet and WiFi used the same implementation (and duplicated code) for
permanent MAC address, plus they both used ethtool in what should be
generic code, which is better done in the platform.

(cherry picked from commit aba250a7d4)
2015-06-17 16:19:19 +02:00
Dan Williams
c7ce5612ca platform: move driver & firmware version reading into the platform
(cherry picked from commit ddaea22332)
2015-06-17 16:19:19 +02:00
Dan Williams
081aeaf3e6 platform: add nm_platform_link_get_by_address()
(cherry picked from commit fa74ed7ca1)
2015-06-17 16:19:19 +02:00
Dan Williams
4b9f506bfd platform: return link objects from add functions
(cherry picked from commit 2abda4bfa5)
2015-06-17 16:19:19 +02:00
Thomas Haller
7b6ffb1e5f platform: intern driver string for NMPlatformLink
Always intern string from udev_get_driver().

We use the result of udev_get_driver() for setting NMPlatformLink.driver.
In all other cases, we already set that value to an interned string,
which simplifies memory handling.

As it was, the lifetime of that string was tied to the lifetime of the
GUdevDevice.

This is not a stelar solution, but we assume that the overall numbers
of different drivers is limited so we don't leak large amounts of
memory.

(cherry picked from commit 3171b543dc)
2015-06-17 15:28:01 +02:00
Thomas Haller
efec4b42e2 platform: refactor extraction of type-name for link
link_extract_type() would return the NMLinkType and a
@type_name string. If the type was unknown, this string
was rtnl_link_get_type() (IFLA_INFO_KIND).

Split up this behavior and treat those values independently.
link_extract_type() now only detects the NMLinkType. Most users
don't care about unknown types and can just use nm_link_type_to_string()
to get a string represenation.

Only nm_platform_link_get_type_name() (and NMDeviceGeneric:type_description)
cared about a more descriptive type. For that, modify link_get_type_name()
to return nm_link_type_to_string() if NMLinkType could be detected.
As fallback, return rtnl_link_get_type().

Also, rename the field NMPlatformLink:link_type to "kind". For now this
field is mostly unused. It will be used later when refactoring platform
caching.

(cherry picked from commit e2c742c77b)
2015-06-17 15:28:01 +02:00
Dan Williams
285ee1fda2 platform: don't wait for udev before announcing links
(cherry picked from commit 388b7830f3)
2015-06-17 14:54:02 +02:00
Thomas Haller
2f4db91fcc platform: add nm_platform_try_get() function
(cherry picked from commit 90caa93582)
2015-06-17 14:39:35 +02:00
Thomas Haller
e43baa1481 platform: drop nm_platform_free() and register weak-ref
Instead of having a nm_platform_free() function, use NM_DEFINE_SINGLETON_WEAK_REF()
and register a weak reference. That way, users who want to free the platform
instance can just unref it.

(cherry picked from commit 04ed48e5a0)
2015-06-17 14:39:34 +02:00
Thomas Haller
3a437a8e55 platform: drop virtual setup() initalization function
We already have nm_*_platform_setup() that gets specified
via -DSETUP. This SETUP() hook gives us all the flexiblity
we need to customize our singleton, so just do any required
setup there.

Also, it would be easier to add an alternative (hypotetical)
nm_fake_platform_setup_custom() to customize the singleton then to
parametrize the NMPlatform:setup() implementation. So this virtual
function is less flexible and redundant.

(cherry picked from commit fe2608c903)
2015-06-17 14:39:34 +02:00
Thomas Haller
c61901d24c platform: pass singleton instance to nm_platform_setup()
We have two hooks to modify setup of the platform singleton:
nm_linux_platform_setup() and the virtual setup() function.

On the other hand, nm_platform_setup() limits us by accepting
only a GType, instead of a prepeared platform instance.
Make the nm_platform_setup() method more flexible, so that we can
later drop the setup() hook.

(cherry picked from commit a50d77d952)
2015-06-17 14:37:32 +02:00
Thomas Haller
2cbcb6df51 platform: initialize NMLinuxPlatform in constructed() method
setup() can be used to initialize a NMPlatform instance that is
registered as singleton via nm_platform_setup(). It should not
be used to initialize the object.

Prior to c6529a9d74, this change was
not possible because constructed() will call back into nm_platform_*()
functions, without having the singleton instance setup.

(cherry picked from commit dc9b25f161)
2015-06-17 14:37:32 +02:00
Thomas Haller
3a30ccacc7 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".

(cherry picked from commit c6529a9d74)
2015-06-17 14:32:30 +02:00
Lubomir Rintel
117e62040d platform: give the platform an opportunity to override default-unmanaged
Some out of tree drivers add Ethernet devices that are supposed to be managed
by other their tooling, e.g. VirtualBox or VMWare.

Rather than hardcoding their drivers (at least VirtualBox doesn't even set a
"driver" property in sysfs) or hardcoding a logic that identifies such devices
let's just add a possibility to blacklist them in udev. This makes it possible
for whoever who ships such a driver to ship rules that prevent NetworkManager
from managing the device itself.

Furthermore it makes it possible for the user with special needs leverage the
flexibility of udev rules to override the defaults. In the end the user can
decide to let NetworkManager manage default-unmanaged interfaces such as VEth
or turn on default-unmanaged for devices on a particular bus.

An udev rule for VirtualBox would look like this:

  SUBSYSTEM=="net", ENV{INTERFACE}=="vboxnet[0-9]*", ENV{NM_UNMANAGED}="1"

(cherry picked from commit 85ee1f4a9c)
2015-06-17 13:39:42 +02:00
Thomas Haller
ba285e319e libnm: move _nm_utils_ascii_str_to_int64() from src/ to libnm-core/
(cherry picked from commit c5d23737fd)
2015-06-17 13:30:39 +02:00
Thomas Haller
a4d11bae29 trivial: rename nm_utils_ascii_str_to_int64() to _nm_utils_ascii_str_to_int64()
(cherry picked from commit 093f6d477b)
2015-06-17 13:30:38 +02:00
Lubomir Rintel
3cbd7cdc03 platform: Add support for IPv6 tokenized identifiers
(cherry picked from commit db5603e615)
2015-06-17 13:19:16 +02:00
Thomas Haller
495209c145 platform: fix nm_platform_link_cmp() to consider ifindex
(cherry picked from commit f167346534)
2015-05-13 16:07:36 +02:00
Thomas Haller
6e8c5b51b1 platform: don't accept lowering IPv6 hop-limit from RA (CVE-2015-2924)
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6fd99094de2b83d1d4c8457f2c83483b2828e75a
http://seclists.org/oss-sec/2015/q2/46
https://bugzilla.redhat.com/show_bug.cgi?id=1209902
https://bugzilla.redhat.com/show_bug.cgi?id=1209903
(cherry picked from commit bdaaf9849b)

Conflicts:
	src/nm-iface-helper.c
	src/platform/nm-platform.h
2015-04-29 14:28:57 +02:00
Thomas Haller
1ff6f6c304 platform: add VTable to handle IPv4 and IPv6 routes generically
(cherry picked from commit 290faa003d)
2015-04-09 11:21:08 +02:00
Dan Williams
51fd5a9bd7 platform: add nm_platform_link_get_dev_id()
Some devices (s390 OSA and ipvlan) use the same link layer address
for different interfaces, and dev_id is what differentiates them.
2015-03-27 15:24:48 -05:00
Dan Williams
f3902ca423 platform: update code documentation for nm_platform_link_get_physical_port_id() 2015-03-27 15:18:03 -05:00
Lubomir Rintel
fe9dada57a route-manager: refactor: a readability improvement
(cherry picked from commit 6c5d93b847)

Conflicts:
	src/nm-route-manager.c
2015-03-09 14:27:44 +01:00