Commit graph

10778 commits

Author SHA1 Message Date
Beniamino Galvani
bb20f2eb61 macsec: enable send-sci by default and make the option configurable
It is safer to enable send-sci by default because, at the cost of
8-byte overhead, it makes MACsec work over bridges (note that kernel
also enables it by default). While at it, also make the option
configurable.

https://bugzilla.redhat.com/show_bug.cgi?id=1588041
2018-06-14 15:13:11 +02:00
Lubomir Rintel
650b5fd99e wwan: ensure the route parameters are set on IPv6 only configuration 2018-06-13 16:56:51 +02:00
Lubomir Rintel
267948f2b7 wwan: set the route parameters at the beginning of ip4 config
We set the metric to the routes as we receive them from the PPP plugin. We
ought to let the modem know before it starts IPv4 configuration, not right
before the commit.

https://bugzilla.redhat.com/show_bug.cgi?id=1585611
2018-06-13 16:45:24 +02:00
Lubomir Rintel
74c2a0aca4 device: drop an unused variable
src/devices/nm-device.c:7764:25: error: unused variable 'stable_hwaddr' [-Werror,-Wunused-variable]
        gs_unref_bytes GBytes *stable_hwaddr = NULL;
                               ^
2018-06-13 15:56:27 +02:00
Lubomir Rintel
c00e17578f wifi: expose the LastScan property
This is the time when the last Wi-Fi scan finished. It will help clients
decide whether the AP list is fresh enough.
2018-06-13 14:44:06 +02:00
Thomas Haller
988cecb6d3 device: log generated ipv4.dhcp-client-id in <debug> mode 2018-06-12 14:45:40 +02:00
Thomas Haller
67ffd17b6c device: unify logging of ipv6.dhcp-duid by giving common prefix
For better or worse, the logging done for ipv4.dhcp-client-id
is prefixed with ipv4.dhcp-client-id. Let ipv6.dhcp-duid follow
that pattern.

Also, generate_duid_from_machine_id() would log at two places,
it should use the same logging prefix.

Also, it logs the value of "duid" variable. Ensure, that "duid"
is not %NULL at that point.

Also, fix leak of nm_dhcp_utils_duid_to_string() value during logging.
2018-06-12 14:45:40 +02:00
Thomas Haller
374d147421 device: refactor generate_duid_from_machine_id() to have a straight forward code path
Previously, there were two blocks

  if (NM_IN_SET (duid, "ll", "llt")
     preprocess_hwaddr()
  else if (NM_IN_SET (duid, "stable-ll", "stable-llt", "stable-uuid"))
     preprecess_stable_id()

  if (nm_streq (duid, "ll")
     generate_ll()
  else if (nm_streq (duid, "llt"))
     generate_llt()
  else if (nm_streq (duid, "stable-ll")
     generate_stable_ll()
  ...

That is, the latter block depends on the execution of the previous
block, while the previous block is guarded by a particular condition,
slighlty different than the condition in the later block.

It is confusing to follow. Instead, check for our cases one by one, and
when we determined a particular DUID type, process it within the same block
of code. Now the code consists of individual blocks, that all end with a "goto
out*". That means, it's easier to understand the flow of the code.

Also, don't initialize duid_error variable and separate between
"out_error" and "out_good". This allows that the compiler gives
a warning if we missed ot initialize duid_error.
2018-06-12 14:45:40 +02:00
Thomas Haller
6d06a0e1b0 device: handle failure in generate_duid_from_machine_id() in dhcp6_get_duid()
dhcp6_get_duid() already handles failure to generate the DUID in a
sensible manner. No reason to duplicate the error handling in
generate_duid_from_machine_id().

Especially, because generate_duid_from_machine_id() used to cache the
random DUID in memory and reuse it from then on. There is no reason to do
that, /etc/machine-id must be available to NetworkManager. We still
handle such a grave error gracefully by generating a random DUID.
2018-06-12 14:45:40 +02:00
Thomas Haller
8bb1aed2ad device: fix enforcing ipv6.dhcp-duid for binary DUID 2018-06-12 13:30:36 +02:00
Thomas Haller
5df4c17ba1 device: handle failure to generate ipv4.dhcp-client-id by fallback to random client-id
First of all, generating the client-id is not expected to fail. If it fails,
something is already very wrong. Maybe, a failure to generate a client-id
should result in failing the activation. However, let's not go full
measure in this question.

Instead:
- ensure that we log a warning and a reason why the client-id could not
  be generated.
- fallback to a random client id. Clearly, we were unable to generate
  the requested client-id, hence, we should fallback to a default value
  which does not make the host easily identifyable. Of course, that means
  that the generated DHCP client-id is not at all stable. But note that
  something is already very wrong, so when handling the error we should do
  something conservative (that is, protecting the users privacy).

This is also what happens for a failure to generate the ipv6.dhcp-duid.
2018-06-12 13:30:36 +02:00
Thomas Haller
d9488417e7 device: obtain current MAC address from platform for generating ipv4.dhcp-client-id=mac
In practice, there should be no difference between peeking into
the platform cache, or using the cached value from nm_device_get_hw_address().

Prefer the hardware address from the platform, because:
- we also pass the current MAC address to nm_dhcp_manager_start_ip4().
  For not particularly strong reason, it uses the MAC address obtained
  from platform. At the least, it makes sense that we use the same
  addresses for the client-id as well.
- ipv6.dhcp-duid also gets the address from platform. Again,
  no strong reason either way, but they should behave similar
  in this regard.
2018-06-12 10:23:40 +02:00
Lubomir Rintel
d815130468 ifcfg-rh: add nm-ifup and nm-ifdown scripts
They're intended to be used via update-alternatives(8) as compatibility
shims for Red Hat systems without the legacy network control scripts.

While they're not strictly parts of the settings plugin, they're best
just installed along with it, since they're supposed to be available on
systems that use the ifcfg files.
2018-06-11 15:09:42 +02:00
Lubomir Rintel
87f5ff6927 settings-connection: expose Filename property on D-Bus
This allows implementing some convenience features in nmcli -- listing
the backing store for the connection in "nmcli c show", and using the
filename for specifying connection in "nmcli c up/down".

Eventually, paired with ReloadConnections(), this could be used to
implement something similar to what "systemctl edit" does for units
(though we'd need to pick another command name as we aready use
"nmcli c edit" for something different).
2018-06-11 15:06:49 +02:00
Thomas Haller
152560e294 policy: log connection UUID for auto-activation
The connection.id (NAME) is not necessarily unique.
To avoid confusion, log the UUID as well.
2018-06-11 09:44:05 +02:00
Francesco Giudici
f913ed4d0c ifcfg: introduce DHCPV6_DUID to map ipv6.dhcp-duid property 2018-06-09 22:20:39 +02:00
Francesco Giudici
e9321713a9 ifcfg: make_ip6_setting cleanup & optimization 2/2
get rid of svGetValueStr_cp() in favor of svGetValueStr() in the
make_ip6_setting() function
2018-06-09 22:20:39 +02:00
Francesco Giudici
fa478d8f22 ifcfg: make_ip6_setting cleanup & optimization 1/2
get rid of the useless "str_value" variable.
2018-06-09 22:20:39 +02:00
Francesco Giudici
f054c3fcaa dhcp: allow to skip DUID search from DHCP client global configuration
When the used client is dhclient we were used to search for DUID not
only in the specific lease files generated by NetworkManager, but also
in the global lease file generated outside NetworkManager.
Keep this capability but allow to just search in the NM lease files if
a value different from the default one is specified in dhcp-duid.
2018-06-09 22:20:39 +02:00
Francesco Giudici
0d841e7471 dhcp: remove fallback DUID-UUID generation from dhcp code
This commit centralizes the DUID generation in nm-device.c.
As a consequence, a DUID is always provided when starting a
DHCPv6 client. The DHCP client can override the passed DUID
with the value contained in the client-specific lease file.
2018-06-09 22:20:39 +02:00
Francesco Giudici
7a0b6b17bb libnm-core: add ipv6.dhcp-duid property
allow to specify the DUID to be used int the DHCPv6 client identifier
option: the dhcp-duid property accepts either a hex string or the
special values "lease", "llt", "ll", "stable-llt", "stable-ll" and
"stable-uuid".

"lease": give priority to the DUID available in the lease file if any,
         otherwise fallback to a global default dependant on the dhcp
         client used. This is the default and reflects how the DUID
         was managed previously.
"ll": enforce generation and use of LL type DUID based on the current
      hardware address.
"llt": enforce generation and use of LLT type DUID based on the current
       hardware address and a stable time field.
"stable-ll": enforce generation and use of LL type DUID based on a
             link layer address derived from the stable id.
"stable-llt": enforce generation and use of LLT type DUID based on
              a link layer address and a timestamp both derived from the
              stable id.
"stable-uuid": enforce generation and use of a UUID type DUID based on a
               uuid generated from the stable id.
2018-06-08 18:23:31 +02:00
Francesco Giudici
fcc6bf7198 core: add function to retrieve secret_key generation time
This will be soon used to derive the timestamp to generate DHCPv6
DUIDs of type DUID-LLT.
2018-06-07 14:38:02 +02:00
Francesco Giudici
84c9ce0d79 dhclient: always update the DUID in the lease file
We will soon introduce a property to set a custom DUID and we want
to enforce that the provided value is used.
Note that this commit does not cause any change in behavior in current
code.
2018-06-07 14:38:02 +02:00
Francesco Giudici
5686536647 dhclient: fix updating the DUID in multiline lease files
The nm_dhcp_dhclient_save_duid() function will save a newly generated
DUID to a previously existing lease file. The function will only save
the DUID if not present in the lease file: in this case, should preserve
the other contents of the lease file.
A dhclient lease file for IPv6 generated by NetworkManager will always
add the DUID as a first item: so in practice finding a lease file
without DUID will never happen.
This has hidden a bug in the function: the loop that is meant to append
the non-duid lines in the lease file would strip all the newlines,
mangling the lease file.
Fix the function allowing to keep the original lines and add a test to
check this functionality is kept well functioning.

FIXME: the new test and the other duid ones already there  store the file
in the current working-directory. Tests should not do that.
2018-06-07 14:38:02 +02:00
Thomas Haller
644aa42f68 dns: change main.rc-manager=file behavior to always follow symlink
With "main.rc-manager=file", if /etc/resolv.conf is a symlink, NetworkManager
would follow the symlink and update the file instead.

However, note that realpath() only returns a target, if the file actually
exists. That means, if /etc/resolv.conf is a dangling symlink, NetworkManager
would replace the symlink with a file.

This was the only case in which NetworkManager would every change a symlink
resolv.conf to a file. I think this is undesired behavior.

This is a change in long established behavior. Although note that there were several
changes regarding rc-manager settings in the past. See for example commit [1] and [2].

Now, first still try using realpath() as before. Only if that fails, try
to resolve /etc/resolv.conf as a symlink with readlink().

Following the dangling symlink is likely not a problem for the user, it
probably is even desired. The part that most likely can cause problems
is if the destination file is not writable. That happens for example, if
the destination's parent directories are missing. In this case, NetworkManager
will now fail to write resolv.conf and log a warning. This has the potential of
breaking existing setups, but it really is a mis-configuration from the user's
side.

This fixes for example the problem, if the user configures
/etc/resolv.conf as symlink to /tmp/my-resolv.conf. At boot, the file
would not exist, and NetworkManager would previously always replace the
link with a plain file. Instead, it should follow the symlink and create
the file.

[1] 718fd22436
[2] 15177a34be

https://github.com/NetworkManager/NetworkManager/pull/127
2018-06-05 16:21:10 +02:00
Beniamino Galvani
7696e6c1fa manager: fix failed assertion on user activations
We can't use g_steal_pointer(&active) in the argument list if another
argument uses @active because the order of evaluation is not defined.

This fixes the following bug:

 src/nm-manager.c:511:_async_op_complete_ac_auth_cb: assertion failed: (active == async_op_data->ac_auth.active)

Fixes: f4fc62bad8

https://bugzilla.redhat.com/show_bug.cgi?id=1585494
2018-06-04 18:06:47 +02:00
Beniamino Galvani
3fb4eed3ef settings: let connections keep NMSettings alive
The NMSettings instance can't be disposed while there is any exported
connection. Ideally we should unexport all connections on NMSettings'
disposal, but for now leak @self on termination when there are
connections alive.

This fixes the following bug on shutdown:

 assertion failed: (c_list_is_empty (&priv->connections_lst_head))
 #0  raise () from target:/lib64/libc.so.6
 #1  abort () from target:/lib64/libc.so.6
 #2  g_assertion_message (domain=0x66cab2 "NetworkManager", file=0x6a5e48 "src/settings/nm-settings.c", line=1929)
 #3  g_assertion_message_expr () at gtestutils.c:2555
 #4  finalize (object=0x1dab170) at src/settings/nm-settings.c:1929
 #5  g_object_unref (_object=0x1dab170) at gobject.c:3340
 #6  dispose (object=0x1de50b0) at src/nm-manager.c:7139
 #7  g_object_unref (_object=0x1de50b0) at gobject.c:3303
 #8  _nm_singleton_instance_destroy () at src/nm-core-utils.c:138
 #9  _dl_fini () from target:/lib64/ld-linux-x86-64.so.2
 #10 __run_exit_handlers () from target:/lib64/libc.so.6
 #11 exit () from target:/lib64/libc.so.6
 #12 main (argc=<optimized out>, argv=<optimized out>) at src/main.c:460

https://bugzilla.redhat.com/show_bug.cgi?id=1579858
2018-06-03 16:46:48 +02:00
Beniamino Galvani
bd63d39252 dhcp: fix handling of failure events
DHCPv4 can fail for two reasons:

 (a) the client failed to contact server and to get an initial lease

 (b) the client failed to renew the lease after it was successfully
     acquired

For (a) the client generates a TIMEOUT event, for (b) an EXPIRED
event.  Currently we fail the IP method immediately after (a), but
this doesn't work well when the carrier flickers and we restart the
client because if the server goes temporarily down, the IP method
fails and DHCP is never restarted.

Let's change this, and determine whether to fail IP configuration only
by looking at the current IP state: when it's IP_CONF then we are
getting the initial lease and a failure means that IP configuration
must fail; otherwise any other state means that the lease expired or
could not be renewed and thus we keep the client running for the grace
period.

https://bugzilla.redhat.com/show_bug.cgi?id=1573780
2018-06-02 10:50:18 +02:00
Beniamino Galvani
e86ea0240f device: don't try to change MTU on a disconnected device
ip_config_merge_and_apply() can be called without an applied
connection, but then it calls nm_device_set_ip_config() and tries to
retrieve the configured MTU, throwing an assertion if the applied
connection is NULL.

src/devices/nm-device.c: line 8080 (nm_device_get_configured_mtu_for_wired): should not be reached

Since it doesn't make sense apply a MTU from the connection when there
is no connection, add a check against this.
2018-06-01 17:02:23 +02:00
Beniamino Galvani
a1f1b13f4f settings: fix plugins loading
Since load_plugin() modifies the list, we must pass its address.

Fixes: fd86a1aebb
2018-06-01 10:26:01 +02:00
Thomas Haller
bc28a2b164 man: clarify main.rc-manager=file behavior for resolv.conf as dangling symlink
It's not clear whether this was desired behavior. However, it was
behavior for a long time, so we probably should not change it.

Just document what happens with dangling symlinks.
2018-06-01 09:05:38 +02:00
Thomas Haller
5485dbea21 dns: move local variables to inner scope in update_resolv_conf() 2018-06-01 08:26:29 +02:00
Lubomir Rintel
ad7b700d6a test: don't assert on the tun link being up to date prior to upping it
Fixes the test run with:

  NMTST_SEED_RAND=502735495 src/platform/tests/test-link-linux \
      -p /link/software/detect/tun/external
2018-05-31 16:54:35 +02:00
Thomas Haller
b8b6100c78 all: replace systemd's siphash24 with c-siphash
Originally, we used "nm-utils/siphash24.c", which was copied
from systemd's source tree. It was both used by our own NetworkManager
code, and by our internal systemd fork.

Then, we added "shared/c-siphash" as a dependency for n-acd.

Now, drop systemd's implementation and use c-siphash also
for our internal purpose. Also, let systemd code use c-siphash,
by patching "src/systemd/src/basic/siphash24.h".
2018-05-31 15:59:38 +02:00
Thomas Haller
b7426e91db build: use default NM_BUILD_* defines for tests
Use two common defines NM_BUILD_SRCDIR and NM_BUILD_BUILDDIR
for specifying the location of srcdir and builddir.

Note that this is only relevant for tests, as they expect
a certain layout of the directories, to find files that concern
them.
2018-05-31 15:59:38 +02:00
Thomas Haller
82b088ab5f build: don't add shared/nm-utils directory to include search path
All users are supposed to include files from nm-utils by fully specifying
the path. -I.*shared/nm-utils is wrong.

Only, systemd code likes to include "siphash24.h" directly. Instead of
adding "-Ishared/nm-utils" to the search path, add an intermediary
header to sd-adapt. Note, that in the meantime we anyway should rework
siphash24 to use shared/c-siphash instead.

This also fixes build for meson, which was broken recently.
2018-05-31 15:59:38 +02:00
Alfonso Sánchez-Beato
cdbd99c5d5 platform/wifi: do not double-free nl_msg
In some places, there was an unneeded call to nlmsg_free () for
messages declared with the nm_auto_nlmsg macro.
2018-05-31 11:53:26 +02:00
Lubomir Rintel
0a3f1ab1a4 settings-plugin: drop all properties
They're not useful and just add extra noise.
2018-05-31 11:50:02 +02:00
Lubomir Rintel
0112253064 settings: do away with plugin capabilities
There's exactly one and not too useful -- only used only in one spot
where we can do hapilly without it.
2018-05-31 11:50:02 +02:00
Lubomir Rintel
8b6c998a94 settings: don't use the name property to disambiguate plugins
Use the path instead. This drop an useless use of the "name" property,
which is, coincidentally also wrong. (We use "ibft" in the plugin path
whereas the property is set to "iBFT".)
2018-05-31 11:50:02 +02:00
Lubomir Rintel
159cb0302c settings: simplify the settings plugin loading log line
It's actually annoying, useless and wraps over even on wide displays.
Let's make it consistent with the log line we use for device plugins.

Also, this drops the last use of the "info" property and one useless use
of the "name" property.
2018-05-31 11:50:02 +02:00
Lubomir Rintel
fd86a1aebb settings: refactor load_plugins() to remote a harmful use of goto
Turn the plugin loading logic between load_plugin: and next: into a
subroutine.
2018-05-31 11:50:02 +02:00
Beniamino Galvani
851d89dc6a platform: sort known IPv6 addresses by scope before a sync
The order we want to enforce is only among addresses with the same
scope, as the kernel always keeps addresses sorted by
scope. Therefore, apply the same sorting to known addresses, so that
we don't try to unnecessary change the order of addresses with
different scopes.

https://bugzilla.redhat.com/show_bug.cgi?id=1578668
2018-05-30 17:59:57 +02:00
Beniamino Galvani
39b5691847 device: vlan: restart ARP announcement after we change MAC
After the parent MAC address changes and we update the VLAN MAC, also
restart ARP announcement to notify neighbors of the new address mapping.
2018-05-29 11:18:30 +02:00
Beniamino Galvani
b6b158e310 core: vlan: avoid unneeded casts 2018-05-29 11:18:30 +02:00
Beniamino Galvani
7f6a19b1ad n-acd: slightly improve logging
If timeout is 0 we don't really do a probe. Also, log the timeout.
2018-05-29 11:18:30 +02:00
Aleksander Morgado
d97eab6c5a policy: don't block connection if device is gone
If the active connection is deactivated because the device is gone,
don't block autoconnection. Otherwise, whenever the device comes
back (e.g. maybe it was reset in the middle of a connection attempt),
the autoconnection logic won't be triggered, as the settings are still
blocked.

I'm able to reproduce this by performing a WWAN modem reset in the
middle of a connection attempt.

https://github.com/NetworkManager/NetworkManager/pull/121
2018-05-28 17:04:01 +02:00
Thomas Haller
eb821ead15 all: add stable-id specifier "${DEVICE}"
Add new stable-id specifier "${DEVICE}" to explicitly declare that the
connection's identity differs per-device.

Note that for settings like "ipv6.addr-gen-mode=stable" we already hash
the interface's name. So, in combination with addr-gen-mode, using this
specifier has no real use. But for example, we don't do that for
"ipv4.dhcp-client-id=stable".
Point being, in various context we possibly already include a per-device
token into the generation algorithm. But that is not the case for all
contexts and uses.

Especially the DHCPv4 client identifier is supposed to differ between interfaces
(according to RFC). We don't do that by default with "ipv4.dhcp-client-id=stable",
but with "${DEVICE}" can can now be configured by the user.
Note that the fact that the client-id is the same accross interfaces, is not a
common problem, because profiles are usually restricted to one device via
connection.interface-name.
2018-05-28 14:59:08 +02:00
Thomas Haller
d1a94a85b1 device: hash a per-host key for ipv4.dhcp-client-id=stable
Otherwise, the generated client-id depends purely on the profile's
stable-id. It means, the same profile (that is, either the same UUID
or same stable-id) on different hosts will result in identical client-ids.

That is clearly not desired. Hash a per-host secret-key as well.

Note, that we don't hash the interface name. So, activating the
profile on different interfaces, will still yield the same client-id.
But also note, that commonly a profile is restricted to one device,
via "connection.interface-name".

Note that this is a change in behavior. However, "ipv4.dhcp-client-id=stable"
was only added recently and not yet released.

Fixes: 62a7863979
2018-05-28 14:58:24 +02:00
Thomas Haller
dbcb1d6d97 core: let nm_utils_secret_key_read() handle failures internally
and add nm_utils_secret_key_get() to cache the secret-key, to only
obtain it once.

nm_utils_secret_key_read() is not expected to fail. However, in case
of an unexpected error, don't propagate the error to the caller,
but instead handle it internally.

That means, in case of error:
  - log a warning within nm_utils_secret_key_read() itself.
  - always return a generated secret-key. In case of error, the
    key won't be persisted (obviously). But the caller can ignore
    the error and just proceed with an in-memory key.

Hence, also add nm_utils_secret_key_get() to cache the key. This way,
we only try to actually generate/read the secret-key once.  Since that
might fail and return an in-memory key, we must for future invocations
return the same key, without generating a new one.
2018-05-28 14:58:24 +02:00