Commit graph

12205 commits

Author SHA1 Message Date
Lubomir Rintel
4b097e314e initrd: fix error reporting on bad netmask
It says the address is bad, but what is wrong is the mask.
2019-07-02 10:29:23 +02:00
Thomas Haller
0d58cab4a0 settings: use nm_connection_to_dbus_full() to avoid cloning the connection during GetSettings() 2019-06-28 16:48:17 +02:00
Thomas Haller
31c4c111d3 settings: cleanup handling of seen-bssids list in NMSettingsConnection
- most connections are not Wi-Fi connections and thus don't have a seen-bssids
  list. Only create the seen_bssids hash when required. This avoids allocating the
  hash in common cases and avoids checking the hash for the content (which is often
  empty).

- nm_settings_connection_get_seen_bssids() should return a sorted list.
  Leaving the sort order undefined is ugly.

- in try_fill_ssid_for_hidden_ap(), we need to check all
  NMSettingsConnection instances whether they know this bssid.
  Reorder the checks, to first call nm_settings_connection_has_seen_bssid(), which
  is faster and in most cases returns a negative result (shortcutting
  the rest).
2019-06-28 16:48:17 +02:00
Beniamino Galvani
2c97ae435e dhcp: systemd: relicense as LGPL
Soon a new DHCP backend will be added that will take code from the
internal one. Change its license to LGPL so that the whole new backend
code can also be LGPL, which is the preferred license for new
NetworkManager code.

Acked-by: Dan Williams <dcbw@redhat.com>
Acked-by: Dan Winship <danw@redhat.com>
Acked-by: Lubomir Rintel <lkundrak@v3.sk>
Acked-by: Thomas Haller <thaller@redhat.com>
2019-06-27 17:08:37 +02:00
Thomas Haller
8a8e894f80 core: add and use nm_keep_alive_destroy()
When we are done with a NMKeepAlive instance, we always should do
three things:

  - unset the owner
  - disarm (freeze) the keep-alive
  - give up our reference.

Add and use nm_keep_alive_destroy() that does this.
2019-06-27 13:25:40 +02:00
Thomas Haller
e36cf1e890 ifcfg-rh: add allow_filename_cb() argument to write-ifcfg-rh function
The function determines the filename automatically, but we
need to blacklist certain names.

That is, because NetworkManager keeps a list of loaded files
in memory. When writing a new file, we really want to choose
a filename that is not yet taken. For that we must not only
consider files on disk, but also files that existed on the last
time of loading.
2019-06-26 12:26:11 +02:00
Thomas Haller
e5b21344c5 ifcfg-rh: cleanup utils_detect_ifcfg_path()
- avoid cloing the basename. Determining the basename can be done conveniently
  with strrchr().
- use cleanup macro for temporary variable.
- while in practice it should not happen, check that the colon in the name
  of alias file names is not followed by another '/'.
2019-06-26 12:26:11 +02:00
Thomas Haller
a4642c78f7 settings: cache agent and system secrets in a GVariant only
We don't need the full NMConnection.
2019-06-26 12:26:11 +02:00
Thomas Haller
f8a20d0a09 manager: don't consider by-user change flag for creating unrealized device
This effectively reverts commit [1].

The by-user argument is not very clear what it means. Is a "nmcli
connection load $FILENAME" a user-action? How about reload?

I don't know whether the problem that this was supposed to fix is still
present. But in any case, the condition here seems not right. It's
already hard to understand when and how we generate unrealized devices.

If the condition from commit [1] should be prevented, then it must happen
somehow differently. In the example, the offending connection is a generated
volatile profile with the device being sys-face-state "external". Of course,
we should not generate devices for such profiles nor autoactivating them.
So adding a device for a volatile connection is always wrong. Don't do that,
which should avoid the original problem.

[1] commit a8a4eb1418 ('manager: don't create the virtual devices on all connection changes')
2019-06-26 12:26:11 +02:00
Thomas Haller
d1f269ab36 core: ensure normalized connection during add-and-activate
nm_connection_verify() returns success for fully valid (normalized)
connections and also connections that are NM_SETTING_VERIFY_NORMALIZABLE.

We really want to fully normalize the profiles during add-and-activate.
2019-06-26 12:26:11 +02:00
Thomas Haller
6d4592354f settings: reorder checks in _delete_volatile_connection_do() to perform cheaper check first
Checking whether a settings connection is still tracked is a simple
c_list_is_empty(). It's faster, so do it first.
2019-06-26 12:26:11 +02:00
Thomas Haller
50e193d12c settings: use NMCListElem instead of DeleteVolatileConnectionData for tracking connections to delete
For tracking a CList of one pointer we have NMCListElem API. We don't need
to implement our own struct to hold the list pointers and the data pointer.
2019-06-26 12:26:11 +02:00
Thomas Haller
eed4b5253f settings: don't implement settings plugins as singletons
The settings plugins are created by NMSettings when the plugin
gets loaded. There is no need for these instances to be singletons
or to have a singleton getter.

Also, while in practice we create a settings plugin instance of
each type only once, there is nothing that would prevent creating
multiple instances. Hence, having a singleton getter is not right.

What is however useful, is to track them and block shutdown
via nm_shutdown_wait_obj_register*(). While the actual waiting
is not yet implemented, we should mark the plugin instances to
block shutdown (in the future).
2019-06-26 12:26:11 +02:00
Thomas Haller
a410873461 core: add flag to nm_shutdown_wait_obj_register_full() for freeing allcated message string
In fact, nm_shutdown_wait_obj_register*() API is still not implemented
and registering an object has no effect currently. That is, blocking
shutdown and waiting for instances to be destroyed during shutdown
is not yet implemented. Still, we already implement the API so that
components can register themself to block the shutdown. The point is
of course, that the callers already use this API, although it's not yet
implemented.

Anyway, sometimes the message string is not static. Add an option to
pass an allocated string and let the string be destroyed when no longer
needed.
2019-06-26 12:26:11 +02:00
Beniamino Galvani
e4ce9bd7af device: set IPv6 token only when necessary
Setting the IPv6 token triggers a new router solicitation from kernel
and so we should avoid when not strictly necessary.

https://mail.gnome.org/archives/networkmanager-list/2019-May/msg00004.html
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/179
2019-06-26 09:04:00 +02:00
Thomas Haller
16dbe0a573 core: avoid plain pointer values in logging output
Logging pointer values is useful to identify the object in the logging message.
But plain pointer values also can be used to defeat ASLR and should not be logged.

Instead, print NM_HASH_OBFUSCATE_PTR() value, which is a 64 bit number based on
the pointer value and some random seed. A minor problem is that there is still the
chance of duplicates, albeit small.
2019-06-25 13:26:37 +02:00
Thomas Haller
74641be816 settings: drop ibft settings plugin
The functionality of the ibft settings plugin is now handled by
nm-initrd-generator. There is no need for it anymore, drop it.

Note that ibft called iscsiadm, which requires CAP_SYS_ADMIN to work
([1]). We really want to drop this capability, so the current solution
of a settings plugin (as it is implemented) is wrong. The solution
instead is nm-initrd-generator.

Also, on Fedora the ibft was disabled and probably on most other
distributions as well. This was only used on RHEL.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1371201#c7
2019-06-20 16:06:44 +02:00
Thomas Haller
5a416a9da1 Revert "Coerce connectivity "LIMITED" to "NONE" when device is disconnected"
NMConnectivity can now distinguish between LIMITED and NONE connectivity
and it does so based on whether IP addresses and routes are configured.

Previously, NMConnectivity would not differenciate between limited and
no connectivity, which is why NMDevice added some additional logic on top
to coerce LIMITED to NONE (if the device is not logically connected).

But note that the connectivity state (whether a network is reachable on
an interface) depends on what is configured in kernel and whether the
internet is reachable on that interface. It does not depend on the
logical device state.

On the other hand, whether the device is configured in a manner to have
connectivity depends on the logical state of the device (as NetworkManager
is configuring the device).

So, in many cases, the logical state and the connectivity state agree now,
but for the right reasons.

This reverts commit 4c4dbcb78d.
2019-06-18 15:49:09 +02:00
Thomas Haller
b626baa313 connectivity: make platform argument to nm_connectivity_check_start() optional
The platform is used to detect whether to skip the connectivity check right away.
It should be an optional argument, so one could avoid this pre-check.
2019-06-18 15:49:09 +02:00
Thomas Haller
19c957f091 connectivity: simplify passing result to idle handler 2019-06-18 15:49:09 +02:00
Thomas Haller
4001aee370 connectivity: remove unused error varialbe in _idle_cb() 2019-06-18 15:49:09 +02:00
Beniamino Galvani
91d447df19 device: don't start connectivity check on unconfigured devices
If the interface has no carrier, no addresses or no routes there is no
point in starting a connectivity check on it because it will fail.
Moreover, doing the check on a device without routes causes the
addition of a negative entry in the ARP table for each of the
addresses associated with the connectivity check host; this can lead
to poor network performances.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/181
2019-06-18 15:49:09 +02:00
Thomas Haller
5b7f6421c7 keyfile: rework selecting path name in nms_keyfile_writer_connection() and add callback to reject filenames
The previous logic seems complicated to me. I even think it is wrong.
Rework it, I think this makes sense.

Also, previously the existing path was used if the file didn't exist.
I think that is wrong. If for force a rename, then the filename must
not be used even if the file currently does not exist.

Also add an "allow_filename_cb" argument, to reject filenames that
are blacklisted.
2019-06-17 12:12:02 +02:00
Thomas Haller
71928a3e5c settings: avoid cloning the connection to maintain agent-owned secrets 2019-06-17 12:12:02 +02:00
Thomas Haller
a17453913c settings: add _nm_connection_clear_secrets_by_secret_flags() function to simplify clearing secrets 2019-06-17 12:12:02 +02:00
Thomas Haller
396b188697 settings: pass const strv plugins array to load_plugins() 2019-06-17 12:12:02 +02:00
Thomas Haller
a56fb02af6 settings: avoid emiting notify::unmanaged-specs for NMSettings if there are no changes 2019-06-17 12:12:02 +02:00
Thomas Haller
408a453bee settings: track keyfile plugin explicitly in NMSettings
The keyfile plugin is special. For one, NetworkManager will always load
it.

In the future, only this plugin should handle in-memory connections.
In-memory connections are kinda special, and we don't need general
plugins to be concerned about them. They should be handled by keyfile
plugin.

But then NMSettings needs to have a reference to the keyfile plugin
instance at hand.
2019-06-17 12:12:02 +02:00
Thomas Haller
2630ebd7b9 device: support reapplying route-table
Changing "ipv4.route-table" and "ipv6.route-table" was not allowed
during reapply.

The main difficulty for supporting that is changing the sync-mode.

With route-table 0, we don't sync all tables but only the main table.
So, when reapply changes from full-sync to no-full-sync, it's slightly
more complicated.

But it's probably not too complicated either. The change from
no-full-sync to full-sync is simple: we just start doing a full-sync.
The reverse change is slightly more complicated, because we need to
do one last full-sync, to get rid of routes that we configured on those
other tables.
2019-06-17 11:36:33 +02:00
Thomas Haller
bb3726acc2 device: use nm_platform_sysctl_ip_conf_get_rp_filter_ipv4() for warning about rp-filter 2019-06-17 11:36:33 +02:00
Thomas Haller
23c1e32456 platform: add nm_platform_sysctl_ip_conf_get_rp_filter_ipv4() 2019-06-17 11:36:33 +02:00
Thomas Haller
1fc36dc58f platform/tests: relax assertion for accepting signals in /link/software/bridge test
/link/software/bridge: NMPlatformSignalAssert: ../src/platform/tests/test-link.c:289, test_slave(): failure to accept signal [0,2] times: 'link-changed-changed' ifindex 10 (3 times received)
2019-06-16 09:35:51 +02:00
Thomas Haller
97c672665d platform/tests: relax assertion for accepting signals in /link/software/bond test
/link/software/bond: NMPlatformSignalAssert: ../src/platform/tests/test-link.c:243, test_slave(): failure to accept signal [1,2] times: link-changed-changed ifindex 13 (3 times received)
2019-06-14 14:20:08 +02:00
Alfonso Sánchez-Beato
a251712a72 core/pppd-plugin: wait to recover port settings before notifying death
pppd restores the previous settings for the serial port it uses right
before exiting. It is especially important to do so because otherwise
ModemManager is not able to recover the port as it can receive a hangup
event from the port due to CLOCAL not being restored.  However, there is
currently a race condition that produces this issue. This is because
when PHASE_DEAD is notified, pppd still has not restored the port
settings - it does that a bit later, in the die() function.

This patch delays notifying PHASE_DEAD until when the exitnotify() hook
is called by pppd: when this happens the port settings have already been
restored.

There were previously efforts to fix this in commit fe090c34b7, so
PHASE_DEAD was used instead of PHASE_DISCONNECT to notify MM that the
port was disconnected, but that still early to ensure that the port
settings are restored.

The MM traces seen when the bug is triggered are:

ModemManager[2158]: <warn>  (ttyACM1): could not re-acquire serial port lock: (5) Input/output error
ModemManager[2158]: <warn>  Couldn't load Operator Code: 'Cannot run sequence: 'Could not open serial device ttyACM1: it has been forced close'

https://mail.gnome.org/archives/networkmanager-list/2019-June/msg00014.html
2019-06-14 13:29:45 +02:00
Lubomir Rintel
ae4152120a ovs/ovsdb: add support for setting dpdk devargs option 2019-06-14 12:10:20 +02:00
Lubomir Rintel
f69dffe1e8 ovs/ovsdb: remove unused headers
Just include what is actually needed.
2019-06-14 12:02:23 +02:00
Lubomir Rintel
02950ec600 ovs/factory: fail the NMDevice if there's an error in OVSDB 2019-06-14 10:33:26 +02:00
Lubomir Rintel
e948ce7deb ovs/ovsdb: track the devices before we signal addition
This doesn't make any difference in practice, but it seems more correct.
It would cause issues if we decided to remove an interface from the
signal handler.
2019-06-14 10:33:26 +02:00
Lubomir Rintel
f2c066e104 ovs/ovsdb: signal a failure when an error column is set
When an interface (other OVS device types can not fail)  encounters an error
it indicates it by changing the error column. Watch for those changes so
that we can eventually communicate them to the OVS factory to deal with
them.
2019-06-14 10:33:26 +02:00
Lubomir Rintel
dedc0cba23 ovs/ovsdb: fix signal handler argument types 2019-06-14 10:33:08 +02:00
Lubomir Rintel
b1feebc43a ovs/ovsdb: remove the device-changes signal
It doesn't communicate anything about the nature of the change and
indeed nothing uses it.
2019-06-14 10:32:53 +02:00
Lubomir Rintel
99c7adc1e1 ovs/ovsdb: guard against OVSDB integrity issues
Don't crash in situations, where the bridge or a port has a child with
UUID we don't know. This could happen if we mess up the parsing of
messages from OVSDB, but could also theoretically happen in OVSDB sends
us bad data.
2019-06-14 10:32:53 +02:00
Thomas Haller
31382c9727 settings: remove unused NMSettingsConnection.supports_secrets() function 2019-06-13 16:10:53 +02:00
Thomas Haller
d92356c868 settings: use _nm_utils_slist_to_strv() for NMSettings:unmanaged-specs property getter
Note that now the empty list will be represented as %NULL instead of an
empty strv array.

That makes no difference in pratice. The main use of this property is as
glue for NMDBusManager to expose the property on D-Bus. Thereby it uses
g_dbus_gvalue_to_gvariant() which handles %NULL just fine.
2019-06-13 16:10:53 +02:00
Thomas Haller
ceaf64eee7 settings,libnm: move is-adhoc-wpa check to libnm
"nm-settings.c" is complex enough. Move this trivial helper function to libnm-core.
2019-06-13 16:10:53 +02:00
Thomas Haller
25de86abb6 manager: cleanup freeing CList in NMManager's dispose()
To unlink all elements, I find a while() loop easier to read
than c_list_for_each_*safe().
2019-06-13 16:10:53 +02:00
Thomas Haller
142c1215ee auth-chain: track auth-chains in embedded CList
NMManager and NMSettings both may have multiple authorization requests
ongoing. They need to keep track of them, at the very least to be able
to cancel them on shutdown.

Since NMAuthChain is not ref-countable, it always has only one clear
user/owner. It makes little sense otherwise. Since most callers already
want to track their NMAuthChain instances, let NMAuthChain help with that.

Embed a "parent" CList field inside NMAuthChain. This avoids requiring
an additional GSList allocation to track the element. Also, it allows to
link and append an element without iterating the list.

This ties the caller and the NMAuthChain a bit tighter together (making them
less indepdendent). Generally that is not desirable. But here it seems the
logic (of tracking the NMAuthChain) is still trivial and well separated.
It's just that NMAuthChain instances now can be linked in a CList.
2019-06-13 16:10:53 +02:00
Thomas Haller
a63714ec1d settings,keyfile: move openconnect hack from settings to keyfile reader
VPN settings (for openconnect) can only be handled by the keyfile settings
plugin.

In any case, such special casing belongs to the settings plugin and not
"nm-settings.c". The reason is that the settings plugin already has an
intimate understanding of the content of connections, it knows which fields
exist, their meaning, etc. It makes sense special handling of
openconnect is done there.

See also commit 304d0b869b ('core: openconnect migration hack').
Unfortunately it's not clear to me why/whether this is still the
right thing to do.
2019-06-13 16:10:53 +02:00
Thomas Haller
be0018382d settings: in have_connection_for_device() first skip over irrelevant connection types
nm_device_check_connection_compatible() is potentially expensive.
Check first whether the connection candidate is of a relevant type,
hoping that this check is cheaper and thus shortcuts other checks
early.
2019-06-13 16:10:53 +02:00
Thomas Haller
179134bbdc settings/trivial: move code around
"nm-settings.c" has more than 2000 LOC. Code that is related should be
grouped better so that it's easier to understand how it belongs
together.
2019-06-13 16:10:53 +02:00