Commit graph

254 commits

Author SHA1 Message Date
Beniamino Galvani
92b382e2f8 dhcp: nettools: handle 'retracted' event as 'expired'
The 'retracted' event is emitted when the client receives a NAK in the
rebooting, requesting, renewing or rebinding state, while 'expired'
means that the client wasn't able to renew the lease before expiry.

In both cases the old lease is no longer valid and n-dhcp4 keep trying
to get a lease, so the two events should be handlded in the same way.

Note that the systemd client doesn't have a 'retracted' event and
considers all NAKs as 'expired' events.

(cherry picked from commit 2523000b36)
2020-01-09 09:47:57 +01:00
Beniamino Galvani
46ad3aa4f3 dhcp: nettools: start from init-reboot phase when reusing address
If we know the address used previously, also tell the client to start
from the init-reboot phase, so that it will start with a DHCP request
instead of a discover.

(cherry picked from commit 6af6f70d81)
2019-12-23 16:45:44 +01:00
Beniamino Galvani
bee319bf94 dhcp: nettools: fix parsing of classless routes option
Fixes: 6adade6f21 ('dhcp: add nettools dhcp4 client')
(cherry picked from commit dd3114deb0)
2019-12-23 16:45:43 +01:00
Beniamino Galvani
09597c105e dhcp: test parsing of domain-search option
Add a test for the parsing of the the domain-search option.

(cherry picked from commit c9fbdf3cb0)
2019-12-23 16:45:41 +01:00
Beniamino Galvani
fc41827874 dhcp: nettools: check return value of g_file_set_contents()
Found by covscan:

 NetworkManager-1.22.0/src/dhcp/nm-dhcp-nettools.c:945: check_return:
 Calling "g_file_set_contents" without checking return value (as is
 done elsewhere 16 out of 20 times).

Fixes: 9f89516928 ('dhcp: nettools: read/write lease files')
(cherry picked from commit cfc418f887)
2019-12-18 10:04:36 +01:00
Beniamino Galvani
ea22135384 dhcp: nettools: fix parsing of search domains option
'first' was never modified and so the dot was never added.

Fixes: 6adade6f21 ('dhcp: add nettools dhcp4 client')

https://bugzilla.redhat.com/show_bug.cgi?id=1783981
(cherry picked from commit 9aa00a8a14)
2019-12-17 14:35:05 +01:00
Beniamino Galvani
aa8d5a3e9e dhcp: support FQDN flags in the nettools backend
Make the nettools backed honor the ipv4.dhcp-hostname-flags property.
2019-11-28 17:56:35 +01:00
Beniamino Galvani
316ff68bfa dhcp: support FQDN flags in the dhclient backend
Make the dhclient backend honor the ipv4.dhcp-fqdn-flags setting.
2019-11-28 17:56:35 +01:00
Thomas Haller
d3c7083f97 dhcp: switch IPv4 "internal" DHCP client to use "nettools" backend instead of "systemd"
Previously, our "internal" DHCPv4 client is based on a fork of
systemd code. This manner of maintaining the fork is problematic.
The solution is to use a proper library: n-dhcp4 from the nettools
project.

We already have these two as undocumented plugins available, by
setting either "dhcp=systemd" or "dhcp=nettools". This is only for
testing. Users are only supposed to use the "internal" plugin.

Up until now, the "internal" DHCPv4 plugin was based on "systemd" code.
Change that to use "nettools" instead.

Possibly this breaks something, and we need to fix it. But do this
early so we have time to test the nettools plugin and identify issues.

For the user, this change should be entirely transparant.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/302
2019-11-23 09:21:55 +01:00
Thomas Haller
09e5a0e805 dhcp/nettools: fix format-nonliteral warning for printf in nettools_log()
../src/dhcp/nm-dhcp-nettools.c:1048:27: error: format string is not a string literal [-Werror,-Wformat-nonliteral]
                    msg = g_strdup_vprintf (fmt, ap);
                                            ^~~

Fixes: 97a8785148 ('nettools: enable logging')
2019-11-22 14:34:01 +01:00
Beniamino Galvani
97a8785148 nettools: enable logging 2019-11-22 10:24:49 +01:00
Thomas Haller
037aa02aba dhcp/nettools: fix assertion failure to calculate lease lifetimes
Fixes: 0108d74866 ('dhcp/nettools: exactly calculate lease lifetimes')
2019-11-21 13:48:31 +01:00
Thomas Haller
0108d74866 dhcp/nettools: exactly calculate lease lifetimes
Now that we can not only get the expiry timestamp of the lease
(n_dhcp4_client_lease_get_lifetime()), but also the base timestamp,
we can calculate the lifetime exactly.

Previously, we had to guess the base time by assuming that we just
received the lease *now*. This wasn't exact.
2019-11-20 14:54:39 +01:00
Thomas Haller
a8d46492b3 dhcp/nettools: don't trim the "expiry" timestamp to 32 bit
The "expiry" is the Unix timestamp when the lease expires.
This is not at all a useful parameter, in particular because
the system's clock can be reset. Instead, we should expose
the lease receive time stamp (in CLOCK_BOOTTIME), and the lease
lifetime.

Anyway. So, we somehow need to express infinite lifetimes. Previously,
we would use the special value 4294967295 (2^32-1). However, that value
does not seem so great, because it's also the Unix timestamp of
2106-02-07T06:28:15+0000. While that is quite far in the future, it's
a valid timestamp still. Of course, the code worked around that by never
setting a timestamp larger than 4294967295-1, but it still limits the
range of what we can expose.

Note that for the lifetime "dhcp_lease_time", we do express infinity
with 4294967295. That's fine, it also does not contradict what we
receive in the DHCP lease on the wire because the lifetime there is
expressed by a 32 bit integer.

Instead, for the "expiry" timestamp, don't perform such triming.
The expiry timestamp is just the start timestamp plus the lease
lifetime. If that is larger than 2106-02-07, so be it.
On the other hand, express infinity by omitting the "expiry" field.
2019-11-20 14:54:39 +01:00
Lubomir Rintel
c1104a5cc2 dhcp/nettools: add siaddr to lease options
This is so that we end up with a next-server option analogous to what
dhclient helper sends us. Dracut uses this for networked boots.
2019-11-18 13:34:09 +01:00
Lubomir Rintel
e475ac7567 systemd: add siaddr to lease options
This is so that we end up with a next-server option analogous to what
dhclient helper sends us. Dracut uses this for networked boots.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/329
2019-11-18 13:33:03 +01:00
Beniamino Galvani
6f16e524be core: support ipvX.dhcp-iaid properties 2019-11-11 10:31:36 +01:00
Thomas Haller
7efc3c479f dhcp: truncate client-id for n-dhcp4 client at arbitrary limit
RFC does not define how long the client ID can be. However,
n-dhcp4 enforces that the server replies with a client ID that
matches the request. Also, the client ID gets encoded as a DHCP
option, hence it cannot be longer than 255 bytes.

While n-dhcp4 doesn't enforce a certain length, a too long client
ID is not going to work. Hence, truncate it at 133 bytes.

This is the same limit that also systemd's DHCP client has. It's chosen
to fit an RFC4361-complient client ID with a DUID of length
MAX_DUID_LEN (which is 128 bytes according to RFC 3315 section 9.1).

Fixes-test: @ipv4_set_very_long_dhcp_client_id

See-also: https://github.com/nettools/n-dhcp4/pull/6

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/307
2019-10-23 14:58:13 +02:00
Beniamino Galvani
2da4d54ac3 dhcp: ignore hostname when invalid
The hostname used for DHCP can be the one obtained from the hostnamed
service and is not guaranteed to be valid, at least with systemd
239. Instead of sending an invalid DHCP option to the server or
failing due to later checks in clients, ignore the hostname and log a
warning when it is invalid.

https://bugzilla.redhat.com/show_bug.cgi?id=1744427
2019-10-17 18:05:20 +02:00
Beniamino Galvani
b58e4d311d dhcp: include conditionals from existing dhclient configuration
Since commit 159ff23268 ('dhcp/dhclient-utils: skip over
dhclient.conf blocks') we skip blocks enclosed in lines containing '{'
and '}' because NM should ignore 'lease', 'alias' and other
declarations. However, conditional statements seem useful and should
not be skipped.

https://bugzilla.redhat.com/show_bug.cgi?id=1758550
2019-10-10 14:47:21 +02:00
Thomas Haller
3b69f02164 all: unify format of our Copyright source code comments
```bash

readarray -d '' FILES < <(
  git ls-files -z \
    ':(exclude)po' \
    ':(exclude)shared/c-rbtree' \
    ':(exclude)shared/c-list' \
    ':(exclude)shared/c-siphash' \
    ':(exclude)shared/c-stdaux' \
    ':(exclude)shared/n-acd' \
    ':(exclude)shared/n-dhcp4' \
    ':(exclude)src/systemd/src' \
    ':(exclude)shared/systemd/src' \
    ':(exclude)m4' \
    ':(exclude)COPYING*'
  )

sed \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[-–] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C1pyright#\5 - \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[,] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C2pyright#\5, \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C3pyright#\5#\7/' \
  -e 's/^Copyright \(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/C4pyright#\1#\3/' \
  -i \
  "${FILES[@]}"

echo ">>> untouched Copyright lines"
git grep Copyright "${FILES[@]}"

echo ">>> Copyright lines with unusual extra"
git grep '\<C[0-9]pyright#' "${FILES[@]}" | grep -i reserved

sed \
  -e 's/\<C[0-9]pyright#\([^#]*\)#\(.*\)$/Copyright (C) \1 \2/' \
  -i \
  "${FILES[@]}"

```

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/298
2019-10-02 17:03:52 +02:00
Iñigo Martínez
23bd02110c meson: Rename the compiler flags variable
Renamed the variable holding the compiler flags to be consistent
with different meson ports.

This naming pattern improves the use of different compiler flags
in environments with multiple languages.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
31f1516760 meson: Improve the src build file
The targets that involve the use of the `NetworkManager` library,
built in the `src` build file have been improved by applying a set
of changes:

- Indentation has been fixed.
- Set of objects used in targets have been grouped together.
- Aritificial dependencies used to group dependencies and custom
  compiler flags have been removed and their use replaced with
  proper dependencies and compiler flags to avoid any confussion.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
70a34c54fe meson: Use dependency for nm-default header
The `nm-default.h` header is used widely in the code by many
targets. This header includes different headers and needs different
libraries depending the compilation flags.

A new set of `*nm_default_dep` dependencies have been created to
ease the inclusion of different directorires and libraries.

This allows cleaner build files and avoiding linking unnecessary
libraries so this has been applied allowing the removal of some
dependencies involving the linking of unnecessary libraries.
2019-10-01 09:49:33 +02:00
Thomas Haller
abff46cacf all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
Beniamino Galvani
3c4f70c5c2 dhcp: systemd: support DHCPv6 prefix delegation
Add support to the internal DHCP client for requesting a prefix and
distributing it to interfaces with 'shared' IPv6 mode.

The systemd-networkd API currently allows to request only a single
prefix and so there will be issues when the number of downstream
interfaces is greater than the number of /64 subnets available in the
returned prefix; but this is still an improvement over the previous
situation when no prefix was requested at all.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/247
2019-09-30 16:15:13 +02:00
Thomas Haller
5bf2112056 core: use G_DEFINE_ABSTRACT_TYPE() macro instead of G_DEFINE_TYPE_EXTENDED() 2019-09-26 08:18:58 +02:00
Thomas Haller
87680c4148 dhcp/nettools: round time difference when calculating the lease lifetime
nettools does not expose the original lease lifetime. It's a missing
API. Instead, it only exposes the timestamp when the lease will expire.

As a workaround, we calulate the timestamp by subtracting the current
timestamp from the expiration timestamp, assuming that the lease was
received just now. However, it was not received *exactly* now, but a
few milliseconds before. Hence, the calculated timestamp is not exact
here and likely a few milliseconds less then the actual (full integer)
value.

Account for that by rounding the value to the second.
2019-09-23 16:10:51 +02:00
Francesco Giudici
07b3ecbb7a dhcp: nettools: drop useless "options" GHashTable checks 2019-09-13 18:44:32 +02:00
Francesco Giudici
86973eae1f dhcp: nettools: add utf8 checking on the wpad option
and assert values exported as dhcp options are utf8 compliant
2019-09-13 18:44:32 +02:00
Francesco Giudici
3a10c47786 dhcp: nettools: drop the 'iface' parameter when no more used
Drop it from the functions for extracting the dhcp options from the
lease: it was just used for the logging, but now we log all the options
once, at the end of the process.
2019-09-13 18:44:32 +02:00
Francesco Giudici
6945ecb804 dhcp: nettools: drop plugin logging of the lease options
as these are already logged in common dhcp-client code. Moreover, now
the log level of the lease options will move from INFO to DEBUG.
2019-09-13 18:44:32 +02:00
Francesco Giudici
fff39e4a88 dhcp: internal: drop plugin logging of the lease options
as these are already logged in common dhcp-client code.
2019-09-13 18:44:32 +02:00
Francesco Giudici
862177f6b6 dhcp: log the dhcp options got in the lease once for all plugin
Each plugin logged the options: just do that on dhcp state change and do
in common code.
Log the options at INFO level for all the plugins. This partially reverts
the effects on the internal plugin of the commit:
97ce488f5f ('dhcp/internal: decrease logging level when
retrieving dhcp options')
2019-09-13 18:44:32 +02:00
Francesco Giudici
dbd9ed1c62 dhcp: nettools: retrieve and expose the private dhcp options 2019-09-13 18:44:32 +02:00
Francesco Giudici
cded6d5184 dhcp: nettools: retrieve and expose the expiry time
also fix the lease time: it should be the time in seconds that the lease
lasts
2019-09-13 18:44:32 +02:00
Lubomir Rintel
24028a2246 all: SPDX header conversion
$ find * -type f |xargs perl contrib/scripts/spdx.pl
  $ git rm contrib/scripts/spdx.pl
2019-09-10 11:19:56 +02:00
Francesco Giudici
9f89516928 dhcp: nettools: read/write lease files
Use the same format of systemd-netword, so that we will be compatible
with the leases created/read by the current "internal" plugin.
Note that actually only the leased address is processed when reading a
lease file, so no need to save more than the ip address when saving the
lease.
2019-09-05 12:13:36 +02:00
Francesco Giudici
f60a60a0d0 dhcp: dhclient: use the shared function to retrieve the lease file path
... but leave in place the custom checks dependant on the dhclient plugin
2019-09-05 12:13:36 +02:00
Francesco Giudici
ee20761ea8 dhcp: prefer nm_assert() to g_assert*() 2019-09-05 12:13:36 +02:00
Francesco Giudici
89814d90aa dhcp: internal: use the shared function to retrieve the lease file path 2019-09-05 12:13:36 +02:00
Francesco Giudici
afb9bb0dac dhcp: add a shared function to retrieve the dhcp lease file
For each plugin we try to come up with a lease file constructed in the
same way, i.e., plugin name + iface + connection duid. If the file isn't
already there, for some plugins (dhclient) we do extra checks in order
to allow to use lease files generated outside of NetworkManager. Let's
allow to generate the common NetworkManager dhcp lease file name in a
shared function, reporting to the caller if the file isn't already there,
so that further plugin specific checks can be performed if needed.
2019-09-05 12:13:36 +02:00
Beniamino Galvani
c0a825bc8e dhcp: fall back to 'internal' client for IPv6 when using 'nettools'
The 'nettools' client doesn't support IPv6, fall back to 'internal'.
2019-08-29 09:39:42 +02:00
Thomas Haller
75503c8554 dhcp: minor refactoring to switch default IPv4 DHCP plugin to "nettools" with one-line change
Minor refactoring so that there is only a one-line change necessary to
flip the implementation of the "internal" DHCP plugin for IPv4 from
"systemd" to "nettools".

We don't do that yet, because there are still some issues (e.g. the
lease is not persisted for nettools plugin). Eventually we want to
switch, so prepare the code to be almost there.
2019-08-13 09:42:15 +02:00
Thomas Haller
b53e261427 dhcp: make "systemd" DHCP plugin configurable
We have the "internal" DHCP plugin. That's our preferred plugin,
and eventually we may drop all other plugins.

Currently, the "internal" plugin is based on code from systemd-networkd
and implemented in "src/dhcp/nm-dhcp-systemd.c". As this code is forked
we eventually want to switch to nettools' n-dhcp4 library (for IPv4).
For that reason we already have "src/dhcp/nm-dhcp-nettools.c".

Note that "nettools" can be configured as a DHCP plugin, but this configuration
is only experimental and for testing. There is never supposed to be a
"nettools" plugin, but eventually the "internal" plugin will switch
implementation.

We don't want to replace systemd-based implementation right away. Not until
we are sure that nettools works well. For that reason we keep them
both in parallel for a while.

This commit makes "systemd" DHCP plugin explicitly configurable
in NetworkManager.conf. Like "nettools" this is an undocumented option,
only for testing.

If you choose "internal" (the default), you get one of the
implementations (currently the "systemd" one). But by selecting
"systemd" or "nettools" explicitly, you can select the exact plugin.
2019-08-13 09:42:15 +02:00
Thomas Haller
8d8cc0da3d dhcp: log effectively used DHCP plugin type 2019-08-13 09:42:15 +02:00
Thomas Haller
b32cf71814 dhcp: cleanup selecting GType from DHCP client factory
Instead of returning a client-factory, return the GType right
away.
2019-08-13 09:42:15 +02:00
Francesco Giudici
84dbc217a3 dhcp: nettools: check if addr is in the lease when bound
otherwise quit early and share log info about it, like we do in the
systemd internal client.
2019-07-25 11:42:12 +02:00
Francesco Giudici
2509b840a3 dhcp: nettools: use shared dhcp option resources 2019-07-25 11:42:12 +02:00
Francesco Giudici
2672bacaaa dhcp: add "fqdn" and "client id" to the shared dhcp options 2019-07-25 11:42:12 +02:00