Commit graph

491 commits

Author SHA1 Message Date
Thomas Haller
44dc97d184 platform: fetch objects via the event socket
Use the event socket to request object via NLM_F_DUMP.

No longer use 'priv->nlh' socket to fetch objects.
Instead fetch them via the priv->nlh_event socket that also
provides asynchronous events when objects change.

That way, the events are in sync with our explicit requests
and we can directly use the events. Previously, the events were
only used to indicate that a refetch must happen, so that every
event triggered a complete dump of all addresses/routes.

We still use 'priv->nlh' to make synchronous requests such as
adding/changing/deleting objects. That means, after we send a
request, we must make sure that the result manifested itself
at 'nlh_event' socket and the platform cache.
That's why we sometimes still must force a dump to sync changes.
That could be improved by using only one netlink socket so that
we would wait for the ACK of our request.

While not yet perfect, this already significantly reduces the number of
fetches. Additionally, before, whenever requesting a dump of addresses
or routes (which we did much more often, search for "get_kernel_object for type"
log lines), we always dumped IPv4 and IPv6 together. Now only request
the addr-family in question.

https://bugzilla.gnome.org/show_bug.cgi?id=747985
https://bugzilla.redhat.com/show_bug.cgi?id=1211133
(cherry picked from commit 051cf8bbde)
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
25519f798d platform: reorder initialization
First fully construct the GOjbect instance before starting to
populate the cache.

(cherry picked from commit f1f1c3cb73)
2015-06-21 15:23:34 +02:00
Thomas Haller
8d13e08cd3 platform: add _support_user_ipv6ll_still_undecided() macro
(cherry picked from commit a2d793f0e1)
2015-06-21 15:23:34 +02:00
Thomas Haller
521d80dd9d platform: add priv pointer to NMLinuxPlatform
(cherry picked from commit bd9dab2a09)
2015-06-21 15:23:34 +02:00
Thomas Haller
6745030913 platform: refactor flushing of event socket to _nl_sock_flush_data()
(cherry picked from commit 9a16ce0876)
2015-06-21 15:23:34 +02:00
Thomas Haller
eb7b773536 platform/test: add simple test for NMLinuxPlatform
Just create a NMLinuxPlatform instance and unref it again.
This already connects to netlink and fetches all objects.

(cherry picked from commit 977626d942)
2015-06-21 15:23:34 +02:00
Thomas Haller
e655d053a1 platform: remove unused argument preserve_rtprot from rtprot_to_source()
(cherry picked from commit 4fee05c35b)
2015-06-21 15:23:34 +02:00
Thomas Haller
f4f78e002d platform: remove obsolete functions after refactoring platform cache
(cherry picked from commit 2f0d0b96db)
2015-06-21 15:23:34 +02:00
Thomas Haller
aa9a596724 platform: use new platform caching
Switch platform caching implementation. Instead of caching libnl
objects, cache our own types.

Don't remove yet the now obsolete functions.

Advantage:

* Performance
  - as we now cache our native NMPlatformObject instances, we no longer
    have to convert libnl objects every time we access the platform
    cache.
  - for most cases, access is now O(1) because we can lookup the object
    in a hash table. Note that ip4_address_get_all() still has to
    create a copy of the result (O(n)), but as the caller is about to
    use those elements, he cannot do better then O(n) anyway.

* We cache our own native types and have full control over them. We
  cannot extend the libnl objects, which has many short-commings:
  - _rtnl_addr_hack_lifetimes_rel_to_abs() to convert the timestamps
    to absolute values (and back).
  - hack_empty_master_iff_lower_up() would modify the internal flag,
    but it looses the original value. That means, we can only hack
    the state before putting a link into the cache, but we cannot revert
    that change, when a slave in the cache changes state.
    That was previously solved by always refetching the master when
    a slave changed. Now we can re-evaluate the connected state
    (DELAYED_ACTION_TYPE_MASTER_CONNECTED).
  - we implement functions like equality, to-string as most suitable
    for us. Before we needed hacks like nm_nl_object_diff(),
    nm_nl_cache_search(), route_search_cache().
  - we can extend our objects with exactly those properties we care,
    and possibly additional properties that are not representable in
    the libnl objects.
  - we no longer cache RTM_F_CLONED routes and they get rejected early
    on as we receive them.
  - In the future, maybe it'd be interesting the make platform objects
    immutable (and ref-counted) and expose them directly.

* Previous implementation did not order the refresh of objects but
  called check_cache_items(). Now, those actions are delayed and
  combined in an attempt to reduce the overall number of reloads.
  Realize how expensive a check_cache_items() for addresses and routes
  was: it would iterate all addresses/routes and call refresh_object().
  The latter obtains a full dump of *all* objects again, and ignores
  all but the needle.
  Note that we probably still schedule some delayed actions that
  are not needed.
  Later we can optimize that further (related bug bgo #747985).

While some of these points could also have been implemented with
caching of libnl objects, that would have become hard to maintain.

https://bugzilla.gnome.org/show_bug.cgi?id=747981
(cherry picked from commit 470bcefa5f)
2015-06-21 15:23:31 +02:00
Thomas Haller
e784f7d23d platform: add new platform caching to nm-linux-platform.c
It is not yet used, only add new code beside the existing
implementation. It will be used later.

(cherry picked from commit f268dca0f1)
2015-06-21 15:21:56 +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
9842f292c1 platform: move ObjectType to nmp-object.h
(cherry picked from commit d1e7554a90)
2015-06-21 15:21:56 +02:00
Thomas Haller
d4899efd49 platform: add nmp-object.h file
(cherry picked from commit 359fe9f8c1)
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
01d20783ed platform: implement dispose() in NMLinuxPlatform
(cherry picked from commit 304abc909a)
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
4e5a11f229 platform: return @now from _rtnl_addr_last_update_time_to_nm()
Will be used later.

(cherry picked from commit 4c49d78f49)
2015-06-21 15:18:15 +02:00
Jiří Klimeš
60080377a2 all: fix a compiler warning about function declarations
warning: function declaration isn’t a prototype [-Wstrict-prototypes]

In C function() and function(void) are two different prototypes (as opposed to
C++).
function()     accepts an arbitrary number of arguments
function(void) accepts zero arguments

(cherry picked from commit 94a393e9ed)
2015-06-19 12:40:54 +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
8f6a883c73 platform: refactor support_kernel_extended_ifa_flags to static variable
Whether we have support depends on the kernel, and is not
per NMLinuxPlatform instance.

(cherry picked from commit 2f3fd86dc5)
2015-06-19 12:26:03 +02:00
Thomas Haller
adcd51065b platform: move ethtool_get_link_speed() to nm-platform-utils
(cherry picked from commit 95333d84bc)
2015-06-19 12:26:03 +02:00
Thomas Haller
f9760da1a1 platform: move supports_mii_carrier_detect() to nmp_utils_mii_supports_carrier_detect()
(cherry picked from commit 299af02e40)
2015-06-19 12:26:03 +02:00
Thomas Haller
8ad91fa6d0 platform: move ethtool_*() to nmp_utils_ethtool_*()
(cherry picked from commit ac84b22fc7)
2015-06-19 12:26:03 +02:00
Thomas Haller
ddd9884bcf platform: factor out ethtool_get_wake_on_lan() function
(cherry picked from commit 398819c3ac)
2015-06-19 12:26:03 +02:00
Thomas Haller
345b73fa1b platform: factor out ethtool_get_peer_ifindex() function
(cherry picked from commit ba084b5b90)
2015-06-19 12:26:03 +02:00
Thomas Haller
6c76801190 platform: factor out ethtool_supports_vlans() function
(cherry picked from commit 4be9394864)
2015-06-19 12:26:03 +02:00
Thomas Haller
a72350c4da platform/trivial: move ethtool_supports_carrier_detect() code
(cherry picked from commit 2b8f3331d7)
2015-06-19 12:26:03 +02:00
Thomas Haller
716dd795de platform: move code udev_get_driver() to nmp_utils_udev_get_driver()
(cherry picked from commit 77a3767d1e)
2015-06-19 12:26:02 +02:00
Thomas Haller
cd2d241fb7 platform: add nm-platform-utils.[ch] files
There is no general purpose file for platform utilities.
We only have nm-platform.h, which contains (mostly) functions
that operate on a NMPlatform instance (and that can be mocked
using NMFakePlatform).

Add a new file for independent utility functions. nm-platform-utils.c
should not call into functions having a NMPlatform instance, to
have them independent from platform caching and the platform
singleton.

(cherry picked from commit ce700d94f5)
2015-06-19 12:26:02 +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
Lubomir Rintel
cf0a0ed576 tests: use a user ns to fake root
(cherry picked from commit ed01c975d8)
2015-06-19 12:26:02 +02:00
Lubomir Rintel
a030ac36d3 tests: allow running the link test without a writeable sysfs
This fixes the test run in a container/our NETNS/NEWUSER test jail.

(cherry picked from commit f9dd7f0d84)
2015-06-19 12:26:02 +02:00
Thomas Haller
90eb13a111 core: add option to suppress error logging if nm_utils_modprobe() fails
We don't want error logging for nm_platform_link_add() which
tries to load the bonding module. Later we will run tests as non-root,
where modprobe will fail. Logging an error would break the tests.

(cherry picked from commit 39f2b51abb)
2015-06-19 12:26:02 +02:00
Lubomir Rintel
0f95b5c345 builds: only enable TAP driver for glib >= 2.37.6
No TAP support for previous versions and --tap argument is silently ignored,
confusing the TAP driver.

(cherry picked from commit c47c06470a)
2015-06-19 11:52:50 +02:00
Lubomir Rintel
fe3e32c034 tests: use the TAP formatter
The test results in standard format are easily integrated into CI systems.

(cherry picked from commit 6463ce5dd9)
2015-06-19 11:52:50 +02:00
Lubomir Rintel
30d37abbc0 tests: call g_test_run() even when skipping the test
It will return the 77 exit code itself. For TAP output it will also generate
the proper test skip marker.

(cherry picked from commit 14f4674f64)
2015-06-19 11:52:50 +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
Thomas Haller
a81830c766 platform/test: fix valgrind warning about NULL arguments to mount()
==21573== Syscall param mount(type) points to unaddressable byte(s)
    ==21573==    at 0x854B9BA: mount (syscall-template.S:81)
    ==21573==    by 0x158922: main (test-common.c:295)
    ==21573==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==21573==
    {
       <insert_a_suppression_name_here>
       Memcheck:Param
       mount(type)
       fun:mount
       fun:main
    }

Fixes: d6aef9c188
(cherry picked from commit 0d7012faab)
2015-06-17 18:47:45 +02:00
Lubomir Rintel
faf46ad316 linux-platforms: don't enumerate devices via udev if udevd is not running
We'd be able to do so for already existing devices, but not for devices that
are added afterwards, since gudev is hardwired not to listen for events from
kernel.

(cherry picked from commit 26aeb12749)
2015-06-17 18:47:45 +02:00