Commit graph

376 commits

Author SHA1 Message Date
Thomas Haller
387377d8fc core: fix uninialized boolean variable in reset_autoconnect_all()
It's not critical, because at worst we get a false-positive that
something changed.

Found by coverity.

Fixes: 4e7b05de79
(cherry picked from commit fbc6008260)
2017-12-12 11:21:05 +01:00
Thomas Haller
446c86f4be settings: let invisible connection not autoconnect according to is_blocked() function
Previously, NMPolicy would explicitly check whether the connection is not visible,
to skip autoconnect.

We have nm_settings_connection_autoconnect_is_blocked() function, that can do that.
The advantage is, that at various places we call nm_settings_connection_autoconnect_is_blocked()
to determine whether autoconnect is blocked. By declaring invisible connections
as blocked from autoconnect as well, we short-cut various autoconnection attempts,
that previoulsy only failed later during auto_activate_device().

(cherry picked from commit ccc93639a0)
2017-12-06 09:35:43 +01:00
Thomas Haller
ab24d5356c settings: remove accessor functions to connection flags
The accessor functions just look whether a certain flag is set. As these
functions have a different name then the flags, this is more confusing
then helpful. For example, if you want to know where the NM_GENERATED
flag matters, you had to know to grep for nm_settings_connection_get_nm_generated()
in addition to NM_SETTINGS_CONNECTION_FLAGS_NM_GENERATED.

The accessor function hid that the property was implemented as
a connection flag. For example, it was not immediately obvious
that nm_settings_connection_get_nm_generated() is the same
as having the NM_SETTINGS_CONNECTION_FLAGS_NM_GENERATED flag
set.

Drop them.

(cherry picked from commit 545e3111c8)
2017-12-06 09:35:43 +01:00
Thomas Haller
1c071d388c settings: track visible state as regular connection flags
We already need to re-emit the notify::flags signal.
It's cumbersome to do this for boolean properties, so
re-use the flags to also track the visibility state.

(cherry picked from commit 0e1abe5ef3)
2017-12-06 09:35:43 +01:00
Thomas Haller
6c22f99219 policy: don't schedule_activate_all() when going to sleep
This was added by cfb2af1df2, but it's
wrong. Here we reset the autoconnect-blocked-reasons when going to sleep,
not when waking up.

(cherry picked from commit 88549b031a)
2017-11-29 10:22:58 +01:00
Lubomir Rintel
5468e72d25 policy: fix possible crash on deactivating connection on removal
_deactivate_if_active() takes a NMPolicy instance while the
connection_removed signal handler takes a NMPolicyPrivate pointer.

(cherry picked from commit c9db2c17aa)
2017-11-28 13:52:40 +01:00
Thomas Haller
bf7661189e c-list: re-import latest version of c-list.h from upstream
Most notably, it renames
  c_list_unlink_init() -> c_list_unlink()
  c_list_unlink() -> c_list_unlink_stale()

  $ sed -e 's/\<c_list_unlink\>/c_list_unlink_old/g' \
        -e 's/\<c_list_unlink_init\>/c_list_unlink/g' \
        -e 's/\<c_list_unlink_old\>/c_list_unlink_stale/g' \
        $(git grep -l c_list_unlink -- ':(exclude)shared/nm-utils/c-list.h') \
        -i

(cherry picked from commit b6efac9ec2)
2017-11-28 12:04:15 +01:00
Thomas Haller
118b9f2978 core: fix race of blocking autoconnect for no-secrets when a new secret-agent registers
When activation of the connection fails with no-secrets, we block
autoconnect due to that. However, NMPolicy also unblocks such
autoconnect, whenever a new secret-agent registers. The reason
is obviously, that the new secret-agent might be able to provide
the previously missing secrets.

However, there is a race between
  - making the secret request, failing activation and blocking autoconnect
  - new secret-agent registers

If the secret-agent registers after making the request, but before we
block autoconnect, then autoconnect stays blocked.

  [1511468634.5759] device (wlp4s0): state change: config -> need-auth (reason 'none', sys-iface-state: 'managed')
  [1511468634.5772] device (wlp4s0): No agents were available for this request.
  [1511468638.4082] agent-manager: req[0x55ea7e58a5d0, :1.32/org.kde.plasma.networkmanagement/1000]: agent registered
  [1511468638.4082] policy: re-enabling autoconnect for all connections with failed secrets
  [1511468664.6280] device (wlp4s0): state change: need-auth -> failed (reason 'no-secrets', sys-iface-state: 'managed')
  [1511468664.6287] policy: connection 'tuxmobil' now blocked from autoconnect due to no secrets

Note the long timing between making the secret request and the
activation failure. This race already existed before, but now with
WPS push-button method enabled by default, the duraction of the
activation is much longer and the race is easy to hit.

https://bugzilla.gnome.org/show_bug.cgi?id=790571
(cherry picked from commit e2c8ef45ac)
2017-11-27 16:00:53 +01:00
Thomas Haller
37ac96cb55 policy: use "agent-registered" signal directly from NMAgentManager instead of NMSettings
(cherry picked from commit 46af70b508)
2017-11-27 16:00:53 +01:00
Thomas Haller
d0039b5521 policy: avoid false positives for checking for autoactivation
We want to only check for autoconnect all, if something happend that
makes it possible that we can autoconnect now (while we couldn't
previously).

It's not a real problem to check more often then strictly necessary.
But add a check to rule out a few false-positives to avoid the
overhead of checking all devices for autoconnect.

(cherry picked from commit f0147a9c47)
2017-11-27 16:00:53 +01:00
Thomas Haller
01dbbf1404 policy: add nm_settings_connection_autoconnect_is_blocked() helper function
(cherry picked from commit 36ac08c092)
2017-11-27 16:00:53 +01:00
Thomas Haller
d4530effb8 policy: don't clear autoconnect-blocked-reason user-request on internal reasons
reset_autoconnect_all() as two callers with only_no_secrets=FALSE:

  - sleeping_changed() when NM returns from sleep.

  - when device changes to state DISCONNECTED with reason
    CARRIER.

In both cases, this should not overwrite a previous decision by
the user that the connection should not autoconnect.

(cherry picked from commit d8b4403f6b)
2017-11-27 16:00:53 +01:00
Thomas Haller
76560639ba policy: only selectively schedule autoconnect check in activate_slave_connections()
schedule_activate_all() is expensive. It iterates over all devices, and asks
them to autoactivated (which might involve iterating over all connections for
each device). Avoid it if nothing changed.

(cherry picked from commit 5e5121a483)
2017-11-27 16:00:52 +01:00
Thomas Haller
632bb9524e policy: only reset autoconnect-blocked-reason FAILED in activate_slave_connections()
The reasons no-secret and user-request still hold.

(cherry picked from commit 3a826a83df)
2017-11-27 16:00:52 +01:00
Thomas Haller
4d8fcebd2e policy: only reset no-secrets autoconnect block flag when secret agent registers
The other blocked reasons still hold. If autoconnect was blocked for
other reasons then no-secrets, a secret agent should not unblock them
all.

(cherry picked from commit b154f29b2b)
2017-11-27 16:00:52 +01:00
Thomas Haller
78d619fc9d policy: track autoconnect-blocked-reasons as flags
Extend the enum and API to use flags for the blocked reasons.
A connection is blocked from autoconnect if it has any reason
set.

There is no behavioral change in this patch beyond that, because
where we previously would set blocked-reason NONE, we would still
clear all flags, and not only a particular one.

Later of course, we want to set and clear individual flags
independently.

(cherry picked from commit 8d2d9b0748)
2017-11-27 16:00:52 +01:00
Thomas Haller
c8de52e281 policy: minor refactoring of device_state_changed()
(cherry picked from commit ddb8713d44)
2017-11-27 16:00:52 +01:00
Thomas Haller
c956bc5154 policy: minor cleanup of loop in activate_slave_connections()
(cherry picked from commit 40b534c5d8)
2017-11-27 16:00:52 +01:00
Thomas Haller
655d9f7961 policy: fix logging about autoconnect retries number
NMPolicy printed

  policy: connection 'a' failed to autoconnect; 1 tries left
  settings-connection[0x55a485553b60,ab9f3891-3420-335e-89da-f14c1b94c540]: autoconnect: retries set 0

That is, it claimed there was one more try, when in fact there wasn't.

(cherry picked from commit 5fc4b32629)
2017-11-27 16:00:52 +01:00
Thomas Haller
fff56e2316 policy: don't log GError code
Our GError codes are mostly meaningless, only the message is interesting.
And our messages should anyway be unique, so that one could understand
which was the corresponding error code (by inspecting the source code).

While at it, use gs_free_error.

(cherry picked from commit 3d118f5b49)
2017-11-27 16:00:52 +01:00
Thomas Haller
e6d1931fe7 policy: move setting autoconnect retries to a separate function
Note that for the

  if (nm_device_state_reason_check (reason) == NM_DEVICE_STATE_REASON_NO_SECRETS)

case we no longer do the

  if (nm_settings_connection_autoconnect_retries_get (connection) == 0)

check. But that is fine, because we only skip schedling a reset_connections_retries()
action. But note, that that previously we also would never actually
scheudle a new timeout, because

  - either nm_settings_connection_autoconnect_retries_get (connection) != 0
  - or the retries count was zero, in which case we already have a
    reset_connections_retries action pending (from the time when we
    set it to zero.

So, there is no change in behavior at all except dropping of a redundant
logging line.

(cherry picked from commit 124b905f97)
2017-11-27 16:00:52 +01:00
Thomas Haller
a508d0ad5c policy: minor code cleanup in activate_slave_connections()
(cherry picked from commit 071495c754)
2017-11-27 16:00:52 +01:00
Thomas Haller
99fc77c7b0 settings/trivial: rename nm_settings_connection_autoconnect_retries_blocked_until()
NMSettingsConnection has 3 properties that are related to autoconnect:
  - autoconnect_retries
  - autoconnect_blocked_until
  - autoconnect_blocked_reason

autoconnect_blocked_reason is entirely independent from the other two.
A connection have have autoconnect blocked via a blocked-reason, but the
retry count is not affected by that. The retry count is an independent
mechanism, that may additionally prevent autoconnect.

However autoconnect_retries and autoconnect_retries_blocked_until are
strongly related. The latter is set if and only if autoconnect_retries is
at zero.

Rename to reflect that better.

(cherry picked from commit 955432ca87)
2017-11-27 16:00:52 +01:00
Thomas Haller
e683801bd2 policy: merge reset_autoconnect_*() functions
(cherry picked from commit 4e7b05de79)
2017-11-27 16:00:52 +01:00
Thomas Haller
f988bbe613 core: merge IPv4 and IPv6 versions of nm_active_connection_get_default()
(cherry picked from commit 10a46c5ae2)
2017-11-27 16:00:52 +01:00
Thomas Haller
274a609a4b core: track NMActiveConnection in manager with CList
Using CList, we embed the list element in NMActiveConnection struct
itself. That means for example, that you couldn't track a
NMActiveConnection more then once. But we anyway never want that.

The advantage is, that removing an active connection from the list
is O(1), and we safe additional GSlice allocations for each node
element.

(cherry picked from commit 3a907377ac)
2017-11-27 16:00:48 +01:00
Thomas Haller
bfd4a70cc3 policy: use CList to track pending_activation_checks
This makes link and unlink operations O(1) and safes an additional
GSlice allocation for each GSList node.

(cherry picked from commit 3b874554ac)
2017-11-27 15:59:58 +01:00
Thomas Haller
59886a85e3 policy: schedule autoactivation check after reset_autoconnect_all()
When changing the autoconnect blocked settings, we must trigger a recheck-all.

(cherry picked from commit cfb2af1df2)
2017-11-27 15:59:58 +01:00
Thomas Haller
1a28926b22 policy: avoid cloning connection list
We don't care about having a cloned list, nor do we care about
a sort order.

(cherry picked from commit 31f70557f5)
2017-11-27 15:59:58 +01:00
Beniamino Galvani
8db2120979 core: allow slaves to autoactivate when master is available
When a master connection is deactivated by user, we set the
autoconnect-blocked reason 'user-request' for the connection and we
propagate the same reason to slaves. Doing so prevents the
autoactivation of slaves when the master is manually activated again,
because the only way to override the 'user-request' blocked reason is
through manual activation of slaves.

Instead what should happen is that the manual deactivation of a master
marks slaves as blocked for failed dependencies. When the master
becomes available again, slaves can autoactivate if the profile allows
it.

https://bugzilla.redhat.com/show_bug.cgi?id=1437598
(cherry picked from commit b31118cfd2)
2017-11-13 20:34:23 +01:00
Thomas Haller
dd4e8ef9dc policy: merge IPv4 and IPv6 implementation of update_ip_dns()
(cherry picked from commit 157932f7dd)
2017-11-13 14:37:03 +01:00
Thomas Haller
8f131e4e18 policy: don't block autoconnect for connections when disconnecting software devices
This was added by commit 979b8920b4
(core: move virtual device autoconnect tracking bits out of NMManager)
to avoid autoconnecting software devices repeatedly. That was done,
because disconnecting a software device would delete the NMDevice
instance, and there is no property on a device to prevent autoconnect.

In the meantime, we only unrealize software devices and don't delete
them entirely. Also, the autoconnect-blocked flags of the device are
preserved when the device unrealized.

It was anyway odd, that deactivating one software-device would block
autoconnection for all matching connections.

(cherry picked from commit 146fbfab33)
2017-11-08 12:35:10 +01:00
Thomas Haller
f0731dc716 device: refactor autoconnect blocking by introducing NMDeviceAutoconnectBlockedFlags enum
The flags allow for more then two reasons. Currently the only reasons
for allowing or disallowing autoconnect are "user" and "intern".

It's a bit odd, that NMDeviceAutoconnectBlockedFlags has a negative
meaning. So
  nm_device_set_autoconnect_intern (device, FALSE);
gets replaced by
  nm_device_set_autoconnect_blocked_set (device, NM_DEVICE_AUTOCONNECT_BLOCKED_INTERN);
and so on.

However, it's chosen this way, because autoconnect shall be allowed,
unless any blocked-reason is set. That is, to check whether autoconnect
is allowed, we do
  if (!nm_device_get_autoconnect_blocked (device, NM_DEVICE_AUTOCONNECT_BLOCKED_ALL))
The alternative check would be
  if (nm_device_get_autoconnect_allowed (device, NM_DEVICE_AUTOCONNECT_ALLOWED_ALL) == NM_DEVICE_AUTOCONNECT_ALLOWED_ALL)
which seems odd too.

So, add the inverse flags to block autoconnect.

Beside refactoring and inverting the meaning of the autoconnect
settings, there is no change in behavior.

(cherry picked from commit 5279ab5be6)
2017-11-08 12:35:10 +01:00
Thomas Haller
bb0536fc00 policy: refactor auto_activate_device() to return early
(cherry picked from commit a7ef46eaaa)
2017-11-08 12:35:10 +01:00
Thomas Haller
baa0d95c95 policy: optimize nm_device_can_auto_connect() to not check nm_device_autoconnect_allowed()
(cherry picked from commit bfe66fb8f4)
2017-11-08 12:35:10 +01:00
Thomas Haller
d8bb62c909 policy: remove redundant check in device_autoconnect_changed()
schedule_activate_check() also checks for nm_device_autoconnect_allowed()
and aborts if there is nothing to do.

(cherry picked from commit 990af413ac)
2017-11-08 12:35:10 +01:00
Thomas Haller
d0f82352ea device: move nm_device_get_enabled() from schedule_activate_check() to nm_device_autoconnect_allowed()
(cherry picked from commit fc18ff30cf)
2017-11-08 12:35:09 +01:00
Thomas Haller
cb2aa6bd4c policy: move blocking autoconnect from NMDeviceModem to NMPolicy
Only NMPolicy should be concerned with handling autoconnect, and
blocking it.

Move the code. Note that there is a slight possible change in
behavior, as the order of when the connection is blocked changes,
based on the different times when the device changed signal gets
executed. But that shouldn't be a problem.
2017-10-31 19:35:33 +01:00
Thomas Haller
3828ba3b0e policy: inline can_autoconnect check in auto_activate_device() 2017-10-31 19:35:33 +01:00
Thomas Haller
1a9d4869ed policy: move nm_settings_connection_can_autoconnect() to policy
Step by step, we move all tracking of autoconnect to NMPolicy.
2017-10-31 19:35:33 +01:00
Thomas Haller
ec9bff293b settings/trivial: rename settings-connection's autoconnect functions
Names like
  - nm_settings_connection_get_autoconnect_retries
  - nm_settings_connection_set_autoconnect_retries
  - nm_settings_connection_reset_autoconnect_retries
are about the same thing, but they are cumbersome to grep
because they share not a common prefix.

Rename them from SUBJECT_VERB_OBJECT to SUBJECT_OBJECT_VERB,
which sounds odd in English, but seems preferred to me.
Now you can grep for "nm_settings_connection_autoconnect_retries_" to
get all accessors of the retry count, or "nm_settings_connection_autoconnect_"
to get all accessors related to autoconnect in general.
2017-10-31 19:14:07 +01:00
Thomas Haller
3dd60d0ef0 device/trivial: rename nm_device_get_ip_route_metric() to nm_device_get_route_metric()
Brevity!
2017-10-06 11:13:43 +02:00
Thomas Haller
cfb14ce17e core: cleanup autoconnect retry handling
- clearify in the manual page that setting retry to 1 means to try
  once, without retry.
- log the initially set retry value in nm_settings_connection_get_autoconnect_retries().
- use nm_settings_connection_get_autoconnect_retries() in
  nm_settings_connection_can_autoconnect().
2017-10-04 13:57:16 +02:00
Beniamino Galvani
937ee1de82 core: rename NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_UNBLOCKED enum
NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_NONE sounds better.
2017-09-29 15:34:55 +02:00
Beniamino Galvani
32efb87d4d core: unblock failed connections when the master is available
In case the connection is blocked because it failed, the availability
of a master is a good reason to unblock it so that it can be tried
again.

Fixes: a1ea422aad
2017-09-29 15:32:19 +02:00
Beniamino Galvani
b80ee4a72c core: make auto-connect-blocked-reason more specific
Distinguish between connections blocked from autoconnecting by user
request and connections blocked because they failed (and would fail
again).

Later, the reason will be used to unblock failed connection when some
conditions change.
2017-09-29 15:32:16 +02:00
Beniamino Galvani
e25de114b2 nm-policy: use nm_g_hash_table_add() instead of g_hash_table_add()
The return value of g_hash_table_add() was added in GLib 2.40, use the
wrapper to avoid compile error on older versions:

 src/nm-policy.c: In function ‘auto_activate_device’:
 src/nm-policy.c:1279:7: error: void value not ignored as it ought to be

Fixes: a1ea422aad
2017-09-27 14:17:11 +02:00
Beniamino Galvani
a1ea422aad policy: watch active-connection state to detect autoconnect early failures
When a connection is autoactivated NMPolicy only detects a failure by
watching the device state, or when the activation fails immediately.

If the activation fails after the asynchronus authorization check
before the device enters the PREPARE state, no other connection is
tried.

Let NMPolicy watch the active-connection state to detect early
failures and disconnect the signal handler when we detect that the
device state is progressing.

https://bugzilla.redhat.com/show_bug.cgi?id=1310676
2017-09-27 13:45:07 +02:00
Thomas Haller
77ec302714 core: rework handling of default-routes and drop NMDefaultRouteManager
Remove NMDefaultRouteManager. Instead, add the default-route to the
NMIP4Config/NMIP6Config instance.

This basically reverts commit e8824f6a52.
We added NMDefaultRouteManager because we used the corresponding to `ip
route replace` when configuring routes. That would replace default-routes
on other interfaces so we needed a central manager to coordinate routes.
Now, we use the corresponding of `ip route append` to configure routes,
and each interface can configure routes indepdentently.

In NMDevice, when creating the default-route, ignore @auto_method for
external devices. We shall not touch these devices.

Especially the code in NMPolicy regarding selection of the best-device
seems wrong. It probably needs further adjustments in the future.
Especially get_best_ip_config() should be replaced, because this
distinction VPN vs. devices seems wrong to me.
Thereby, remove the @ignore_never_default argument. It was added by
commit bb75026004, I don't think it's
needed anymore.

This brings another change. Now that we track default-routes in
NMIP4Config/NMIP6Config, they are also exposed on D-Bus like regular
routes. I think that makes sense, but it is a change in behavior, as
previously such routes were not exposed there.
2017-09-08 11:11:21 +02:00
Thomas Haller
5c7e0654eb policy: take reference to best_device/activating_device
Don't rely on manager keeping them alive long enough. E.g.
get-best-device() is used when resetting the best device,
however, it accesses the current device (hence, it relies
on manager removing the device from the list, but keeping
it alive long enough).
2017-09-08 11:05:04 +02:00