Commit graph

276 commits

Author SHA1 Message Date
Thomas Haller
26a65f4fe4 platform: fix compiler warning about uninitialized usage
CC       nm-linux-platform.lo
    platform/nm-linux-platform.c: In function '_nm_platform_link_get':
    platform/nm-linux-platform.c:161:17: error: 'rtnllink' may be used uninitialized in this function [-Werror=maybe-uninitialized]
       nl_object_put (*object);
                     ^
    platform/nm-linux-platform.c:1923:35: note: 'rtnllink' was declared here
      auto_nl_object struct rtnl_link *rtnllink;
                                       ^
    cc1: all warnings being treated as errors

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:11:36 +02:00
Thomas Haller
a04df905fd platform: fix format specifyer in _lifetime_to_string() for unsigned
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:05:08 +02:00
Thomas Haller
58b318b53a platform: raise address changed signals for lifetime update
When only the lifetime of an address changes, we did not get a platform signal
as libnl does not consider the time fields in nl_object_diff().
Workaround by comparing the timestamps manually.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:38 +02:00
Thomas Haller
441f337412 platform: refactor setting the source of platform addresses to NM_PLATFORM_SOURCE_KERNEL
Moving setting the source of the address to the init_* functions.

This also has the advantage, that the platform internal to_string functions have the proper
source set.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:38 +02:00
Thomas Haller
2ff046e5aa platform: change address_to_string functions to show remaining lifetime/preferred times
Change the to_string functions to convert the lifetime/preferred values
to the time remaining when the function is evaluated. These functions
are used for printing/debugging, so it's more sensible to show the
remaining time.

On the other hand, for debugging, it's better to see the raw values (also).
In addition to the remaining time we keep to print the timestamps+now if the
address is not permanent. So when inspecting the logs it is possible to figure
out the real values.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:38 +02:00
Thomas Haller
e1410b5a88 platform: refactor calculating valid/preferred times when adding address
Replace the calls to subtract_guint32() by _rebase_relative_time_on_now()
and _address_get_lifetime().

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:37 +02:00
Thomas Haller
d90b9ff2c8 platform: fix setting preferred time for address
Before nm_platform_ip4_address_sync() set the preferred time to the same value
as the address lifetime. The result was that the preferred time was
always identical to valid lifetime.

This will lead to the kernel using the address longer then the desired
preferred time (until validity of the address expires).

https://bugzilla.redhat.com/show_bug.cgi?id=1082041
https://bugzilla.redhat.com/show_bug.cgi?id=1083283

Reported-by: Kai Engert <kengert@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:37 +02:00
Thomas Haller
84cfd06d6a core/platform: limit the preferred time to address lifetime
Related: https://bugzilla.redhat.com/show_bug.cgi?id=1082041

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:37 +02:00
Thomas Haller
8310a039d8 platform: fix preferred and valid lifetimes for addresses from netlink/kernel
The kernel tells the address lifetimes in the 'struct ifa_cacheinfo'
attribute. This contains two timestamps (cstamp and tstamp) and two
relative lifetimes (ifa_prefered and ifa_valid).

The timestamps are equal to clock_gettime(CLOCK_MONOTONIC) scale in
1/100th of a second (wrapping every 497 days).

The preferred/valid times are re-adjusted everytime when sending the
message and count down as the time goes by. In other words, they are
anchored relatively to the moment of when kernel creates the netlink
message.

As platform is caching the rtnl_addr object, the information of *when* the
lifetimes started counting is not available.

This patch fixes reading these values by hacking the libnl object
when it gets received, so that valid and preferred are instead absolute
expiration timestamps in scale nm_utils_get_monotonic_timestamp_s() --
which NM internally is used for address timestamps.

There are two minor downsides to this hack:
- the valid and preferred properties of a cached rtnl_addr object have
  an unexpected meaning, i.e. they are absolute and in a different time
  scale.
- later when converting rtnl_addr to NMPlatformIPAddress, the base
  timestamp is set to "1", i.e. an NMPlatformIPAddress has no knowledge
  of when the address was created or last modified. The timestamp
  property of NMPlatformIPAddress is solely there to anchor the relative
  timestamps lifetime and preferred. Do not use it for anything
  else.
  Another reason the timestamp property is meaningless is that
  its scale nm_utils_get_monotonic_timestamp_s() starts counting at
  process start. So addresses that existed before would have a negative
  or zero timestamp, which we avoid. This in turn could be solved by either
  allowing negative timestamps or by shifting
  nm_utils_get_monotonic_timestamp_*(). Both is viable, but not
  necessary (ATM), because the age of an address has no other apparent
  use then to anchor the relative timestamps.
  Another implication is, that we potentially could get rid of the
  timestamp completely, and insteat make preferred and lifetime be
  absolute expiries.

This will be fixed properly later, by not caching libnl objects but  instead
native NMPlatform objects. For those we have full control over their properties.

https://bugzilla.gnome.org/show_bug.cgi?id=727382

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 20:01:37 +02:00
Thomas Haller
ab1a015579 platform/test: fix route tests after reworking source property
Breakage introduced by commit 662ade1e47.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-06 17:21:33 +02:00
Dan Winship
662ade1e47 platform: improve tracking of route sources
NMIP[46]Route had a "source" field, but it was always set to KERNEL
for routes read from the kernel (even if they were originally added by
NM).

Fix things a bit by translating between our "source" field and the
kernel's "protocol" field.

https://bugzilla.gnome.org/show_bug.cgi?id=729203
2014-06-06 10:24:43 -04:00
Dan Winship
e644745d85 trivial: route-related whitespace/indentation fixes 2014-06-06 10:23:28 -04:00
Thomas Haller
8ce1eb3837 nmtst: add new mode where tests assert against logged messages (assert_messages)
In this mode, nmtst itself will not log anything and not set the logging
level. Also, it will set g_log_set_always_fatal().

This is for tests that want to assert against all logged messages via
g_test_expect_message().

In this mode also setting the logging level via NMTST_DEBUG variable has
no effect. The test is expected to manage the logging level itself and
changing the logging level might interfere with the test.

As a showcase, move keyfile/tests/test-keyfile.c to nmtst.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:58 +02:00
Thomas Haller
ae863a6954 platform/test: allow running root tests as sudo
Call to nmtst_reexec_sudo(), which allows you to specify a program
via environment variable to exec the test.

This is useful to exec the test program with sudo.

  NMTST_DEBUG="no-debug,sudo-cmd=$PWD/tools/test-sudo-wrapper.sh" make -C src/platform/tests/ check

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:58 +02:00
Thomas Haller
e3784fa618 platform/test: always run linux platform tests (will be skipped as non-root)
Always run the linux platform tests, even if called as non-root user.
In such a case, print a message and return 77 (signalizing that the test
was skipped).

Only if we configured with --enable-test=root, we enforce that the
user executes the tests as root.

Co-Authored-By: Pavel Šimerda <psimerda@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:58 +02:00
Thomas Haller
0fde65a14e platform/test: workaround team bug in older kernel version
In older versions of team (e.g. Fedora 17), the master team device
stays up, even if no slaves are IFF_LOWER_UP. Workaround this bug.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:58 +02:00
Thomas Haller
1ff6e1b65e platform/test: fix expecting NM_PLATFORM_SOURCE_KERNEL in platform tests
In this case, the fake platform implementation was wrong in that it did
not set the source property of the route/address objects like linux
platform does. Fix the test and the fake platform.

https://bugzilla.gnome.org/show_bug.cgi?id=706293

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:58 +02:00
Pavel Šimerda
fd41c989d5 platform: fix software device handling when announcing links
The handling for announcing links was broken resulting in
duplicate link-added signals from platform.

Co-Authored-By: Thomas Haller <thaller@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:57 +02:00
Pavel Šimerda
f008c9fbea platform/test: fix fake platform to emit signals synchronously (analog to Linux platform)
When adding a link, the Linux platform implementation raises the
link-changed signal synchronously. Fix the fake platform to behave identically
and also fix all the tests.

This also fixes the Linux platform tests for the most part because now the
test functions (and fake platform) behave like the Linux system
implementation.

https://bugzilla.gnome.org/show_bug.cgi?id=706293

Co-Authored-By: Thomas Haller <thaller@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:57 +02:00
Pavel Šimerda
accd10b501 platform/test: disable bonding tests if no bonding module is available
Co-Authored-By: Thomas Haller <thaller@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:57 +02:00
Thomas Haller
79a99613c2 platform/test: use nm-test-utils.h in test-common
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:57 +02:00
Thomas Haller
66e2e932b5 platform: add nm_platform_link_get()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:57 +02:00
Thomas Haller
cb023c57a7 platform: improve logging on error in delete_object()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:55 +02:00
Thomas Haller
a895b58484 platform: don't log error for delete_object() if IPv6 address doesn't exist
This causes root platform tests to fail on rhel-7

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-05 18:12:55 +02:00
Thomas Haller
253bfa5c47 platform: fix crash after 'fix check_cache_items() to check items in two steps'
Fixes regression introduced by commit 90ab7e83ff.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 20:20:16 +02:00
Thomas Haller
a312dc6d1d platform: fix lookup of routes and deletion of IPv4 routes
When doing a lookup for an libnl route, the cache comparison function
for routes takes into account 'family', 'tos', 'table', 'dst', and 'prio'.

In NetworkManager we don't use all of these properties for a route, so
at several places when doing a cache lookup we don't have all identifying
properties. Usually we only have 'family' and 'dst' ('table' is
implicit 0, because NM does currently not care about any other tables).

The problem is that NM sees routes with different 'tos', 'prio', but it
cannot look them up in the cache. Add a hack to search the cache
fuzzy.

This is similar to the hack for link, where the identifying properties
are 'family' and 'ifindex', but we only have 'ifindex' at hand. However,
contrary to this hack, we coerce the 'family' to AF_UNSPEC for every link cache
operation. This is not viable in this case, because we internally need
the 'tos' field.

We need the 'tos' field because when deleting an IPv4 route, the 'tos' field must
match. See fib_table_delete(). This was already partially fixed by commit
f0daf90298, but before the lookup to the
cached object would fail for any non-zero 'tos'.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 18:39:09 +02:00
Thomas Haller
cffca6a1c2 platform/trivial: add fixme code comment
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 18:39:08 +02:00
Thomas Haller
90ab7e83ff platform: fix check_cache_items() to check items in two steps
check_cache_items() iterated over all items and called refresh_object().
But refresh_object() might remove the current object from the cache, so
this would break the iteration.

Instead check the items in two steps. First find all the objects we care
about and build a list of them. Then check them.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 18:39:08 +02:00
Thomas Haller
68bd8711d2 platform/trivial: fix typo in ip6_route_exists()
By passing INADDR_ANY as a gconstpointer, we actually always passed NULL
as gateway. Maybe this was not intended, but it seems correct now
and is proven to work. So this fixe has no behavioral change.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 18:38:49 +02:00
Thomas Haller
968b468b2f platform: allow setting address when adding software link (bridge)
Add an additional address parameter to link_add/bridge_add, to set the
MAC address of software devices.

https://bugzilla.gnome.org/show_bug.cgi?id=729844

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-30 17:02:31 +02:00
Thomas Haller
f0daf90298 platform: fix regression failing with ESRCH when deleting IPv4 routes
When deleting an IPv4 route, several fields must match (or be left
unspecified/zero). See fib_table_delete().

Previously, NM would look into the cache and use that object for
deletion. This was changed recently, thereby breaking the deletion
of routes by not specifying all properties as needed.

Fixes regression introduced by commit 019bf7512d.

Related: https://bugzilla.gnome.org/show_bug.cgi?id=726273

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-27 21:40:31 +02:00
Jiří Klimeš
98ae6e06d2 all: g_type_init() has been deprecated in GLib 2.35.0
g_type_init() deprecation:
https://bugzilla.gnome.org/show_bug.cgi?id=686161
2014-05-27 16:58:21 +02:00
Thomas Haller
019bf7512d platform: improve workaround for deleting IPv4 route with libnl guessing route scope
Previously, we always lookup the cache for libnl objects and used those for
delete_object(). This was necessary, because libnl guesses and overwrites
the IPv4 route scope.

Newer libnl no longer overwrites the scope if set explicitly to RT_SCOPE_NOWHERE.
So, this workaround is no longer needed. Indeed there might be cases, where it is
harmful, because we might guess the wrong scope.

This was fixed in libnl3 in commits
  85ec9c7ad8
  015c4ee59b

https://bugzilla.gnome.org/show_bug.cgi?id=726273

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-19 15:22:50 +02:00
Thomas Haller
ff801bcafc platform: add function _nl_has_capability() to access nl_has_capability() dynamically
The libnl function nl_has_capability() was only added recently, so don't depend on it
at compile time. Instead use dlopen to load the function if the libnl library contains it.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-19 15:22:46 +02:00
Thomas Haller
bb7517181f platform: assert libnl alloc functions against out of memory
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-13 13:50:25 -05:00
Dan Williams
085bc0876c platform: better detection of OLPC Mesh interfaces
Instead of just looking at the udev tags, also look for sysfs entries
that the libertas driver uses when mesh is enabled.
2014-05-13 12:38:44 -05:00
Dan Williams
a9fa1bd9e2 platform: don't crash on link_change() error when ifname is NULL
to_string_link() logs link details and creates a new link to do this,
filling in the various filed in init_link().  init_link() attempts to
fill in the driver name, and might call ethtool to do that.  Well,
ethtool API only accepts an interface name (which we don't have) and
not an ifindex (which we do have), and dies.  Ensure that the ethtool
functions bail out instead of crashing if they don't get an interface
name.

Unfortunately, most callers of link_change() don't bother setting
ifindex or ifname on the link that ends up getting passed to
to_string_link(), because libnl doesn't require that when calling
rtnl_link_change().  Modify all callers to at least set the
ifindex so that to_string_link() has something useful to log.

NetworkManager[10651]: <info> (msh0): device state change: unmanaged -> unavailable (reason 'managed') [10 20 2]
NetworkManager[10651]: (platform/nm-linux-platform.c:684):link_extract_type: runtime check failed: (ifname != NULL)
NetworkManager[10651]: <error> [1398107504.807205] [platform/nm-linux-platform.c:1856] link_change(): Netlink error changing link 12:  <UP> mtu 0 (1) driver 'usb8xxx' udi '/sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/net/msh0': Message sequence number mismatch

    at platform/nm-linux-platform.c:691
    at platform/nm-linux-platform.c:1850
    at devices/nm-device.c:5523
    NM_DEVICE_STATE_REASON_NOW_MANAGED) at devices/nm-device.c:6662
    at nm-manager.c:2115
2014-05-13 12:38:43 -05:00
Thomas Haller
8e88b4e2fa core/logging: trivial renaming internal LOGD_OLPC_MESH name to LOGD_OLPC
The domain LOGD_OLPC_MESH is known as "OLPC". This is the only case where
the internal name LOGD_X does not correspond to the external name X.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-12 18:52:27 +02:00
Thomas Haller
d16761d939 platform/trivial: rename object type enums to give them a common name prefix
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:23 +02:00
Thomas Haller
59a56a0aff platform: add function nm_platform_link_cmp()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:23 +02:00
Thomas Haller
9cd7b40a04 platform: add nm_platform_ip_address_cmp_expiry()
This compares two addresses and returns which one has a longer
remaining life (i.e. a later expiry timestamp).

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:23 +02:00
Thomas Haller
a8c17a2517 platform: extract common fields of IPv4/IPv6 addresses and routes to base struct
Especially the calculation of timestamps is identicall for addresses.
By creating a "base struct", we can use the same code for that, because
NMPlatformIP4Address and NMPlatformIP6Address can now both be treated as
NMPlatformIPAddress (and the same for routes).

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:22 +02:00
Thomas Haller
09d3c833fd platform: refactor signals by combining added/changed/removed
Before platform raised 3 signals for each object type. Combine
them into one and add a new parameter @change_type to distinguish
between the change type.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:22 +02:00
Thomas Haller
38ffd3eb9b platform: refactor build_rtnl_addr() by replacing addr4_to_broadcast()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:22 +02:00
Thomas Haller
857e5e0b21 platform: don't zero terminate the result GArray of get_all() functions
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 03:44:22 +02:00
Thomas Haller
53b6a99798 platform: refactor ip4_route_get_all() and ip6_route_get_all()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 01:03:06 +02:00
Thomas Haller
a4d2d71409 platform: refactor ip4_address_get_all() and ip6_address_get_all()
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-05-03 01:03:06 +02:00
Peter Wu
a2eb4789ac platform: set link scope for IP4LL addresses
https://bugzilla.gnome.org/show_bug.cgi?id=728595

[thaller@redhat.com: minor change in coding style]
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-04-27 15:32:07 +02:00
Dan Winship
bea82ca98b all: set G_LOG_DOMAIN appropriately, for better g_log() messages 2014-04-23 10:19:17 -04:00
Dan Winship
ddb17bef81 platform: add link_get_wake_on_lan() 2014-04-17 12:48:20 -04:00