about summary refs log tree commit diff
path: root/debian
diff options
context:
space:
mode:
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/core-add-reason-argument-to-NMActiveConnection-device_sta.patch74
-rw-r--r--debian/patches/core-propagate-the-user-requested-reason-for-act-request-.patch65
-rw-r--r--debian/patches/series2
3 files changed, 141 insertions, 0 deletions
diff --git a/debian/patches/core-add-reason-argument-to-NMActiveConnection-device_sta.patch b/debian/patches/core-add-reason-argument-to-NMActiveConnection-device_sta.patch
new file mode 100644
index 00000000..e70025ed
--- /dev/null
+++ b/debian/patches/core-add-reason-argument-to-NMActiveConnection-device_sta.patch
@@ -0,0 +1,74 @@
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Sat, 21 Oct 2023 22:22:15 +0200
+Subject: core: add "reason" argument to NMActiveConnection
+ device_state_changed()
+
+NMActiveConnection implements method device_state_changed() that
+re-emits device state changes as convenience for subclasses. Add the
+reason for the state change to the handler, as it will be used in the
+next commit.
+
+(cherry picked from commit 634dd2f5e865c9ec167e0ca4fb04802e06ebd5d0)
+---
+ src/core/nm-act-request.c        | 3 ++-
+ src/core/nm-active-connection.c  | 3 ++-
+ src/core/nm-active-connection.h  | 3 ++-
+ src/core/vpn/nm-vpn-connection.c | 3 ++-
+ 4 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/src/core/nm-act-request.c b/src/core/nm-act-request.c
+index dce18ba..8fcff63 100644
+--- a/src/core/nm-act-request.c
++++ b/src/core/nm-act-request.c
+@@ -259,7 +259,8 @@ static void
+ device_state_changed(NMActiveConnection *active,
+                      NMDevice           *device,
+                      NMDeviceState       new_state,
+-                     NMDeviceState       old_state)
++                     NMDeviceState       old_state,
++                     NMDeviceStateReason reason)
+ {
+     NMActiveConnectionState       cur_ac_state    = nm_active_connection_get_state(active);
+     NMActiveConnectionState       ac_state        = NM_ACTIVE_CONNECTION_STATE_UNKNOWN;
+diff --git a/src/core/nm-active-connection.c b/src/core/nm-active-connection.c
+index 36a11f7..5feab96 100644
+--- a/src/core/nm-active-connection.c
++++ b/src/core/nm-active-connection.c
+@@ -636,7 +636,8 @@ device_state_changed(NMDevice           *device,
+         NM_ACTIVE_CONNECTION_GET_CLASS(self)->device_state_changed(self,
+                                                                    device,
+                                                                    new_state,
+-                                                                   old_state);
++                                                                   old_state,
++                                                                   reason);
+ }
+ 
+ static void
+diff --git a/src/core/nm-active-connection.h b/src/core/nm-active-connection.h
+index 15db68c..8032294 100644
+--- a/src/core/nm-active-connection.h
++++ b/src/core/nm-active-connection.h
+@@ -78,7 +78,8 @@ typedef struct {
+     void (*device_state_changed)(NMActiveConnection *connection,
+                                  NMDevice           *device,
+                                  NMDeviceState       new_state,
+-                                 NMDeviceState       old_state);
++                                 NMDeviceState       old_state,
++                                 NMDeviceStateReason reason);
+     void (*master_failed)(NMActiveConnection *connection);
+ 
+     void (*device_changed)(NMActiveConnection *connection,
+diff --git a/src/core/vpn/nm-vpn-connection.c b/src/core/vpn/nm-vpn-connection.c
+index d7102a1..3dba9ff 100644
+--- a/src/core/vpn/nm-vpn-connection.c
++++ b/src/core/vpn/nm-vpn-connection.c
+@@ -1143,7 +1143,8 @@ static void
+ device_state_changed(NMActiveConnection *active,
+                      NMDevice           *device,
+                      NMDeviceState       new_state,
+-                     NMDeviceState       old_state)
++                     NMDeviceState       old_state,
++                     NMDeviceStateReason reason)
+ {
+     if (_service_and_connection_can_persist(NM_VPN_CONNECTION(active))) {
+         if (new_state <= NM_DEVICE_STATE_DISCONNECTED || new_state == NM_DEVICE_STATE_FAILED) {
diff --git a/debian/patches/core-propagate-the-user-requested-reason-for-act-request-.patch b/debian/patches/core-propagate-the-user-requested-reason-for-act-request-.patch
new file mode 100644
index 00000000..e75e3192
--- /dev/null
+++ b/debian/patches/core-propagate-the-user-requested-reason-for-act-request-.patch
@@ -0,0 +1,65 @@
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Sun, 22 Oct 2023 08:38:55 +0200
+Subject: core: propagate the user-requested reason for act-request
+ disconnection
+
+If the device is being disconnected for a user request, at the moment
+the active connection goes to state DEACTIVATED through the following
+transitions, independently of the reason for the disconnection:
+
+ - state: DEACTIVATING, reason: UNKNOWN
+ - state: DEACTIVATED,  reason: DEVICE_DISCONNECTED
+
+For VPNs, a disconnection is always user-initiated, and the active
+connection states emitted are:
+
+ - state: DEACTIVATING, reason: USER_DISCONNECTED
+ - state: DEACTIVATED,  reason: USER_DISCONNECTED
+
+This difference poses problems for clients that want to handle device
+and VPNs in the same way, especially because WireGuard is implemented
+as a device, but is logically a VPN.
+
+Let NMActRequest translate the USER_REQUESTED device state reason to
+USER_DISCONNECTED active connection state reason, in case of
+disconnection.
+
+This is an API change, but the previous behavior of reporting generic
+uninformative reasons seems a bug. See for example
+nmc_activation_get_effective_state(), which inspects the AC state
+reason and in case it's generic (DEVICE_DISCONNECTED), it considers
+the device state instead.
+
+https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/1405
+(cherry picked from commit d3db0883c7723a9e150ea9856bd8678480c99874)
+---
+ src/core/nm-act-request.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/src/core/nm-act-request.c b/src/core/nm-act-request.c
+index 8fcff63..bed7ffd 100644
+--- a/src/core/nm-act-request.c
++++ b/src/core/nm-act-request.c
+@@ -320,14 +320,20 @@ device_state_changed(NMActiveConnection *active,
+                          active);
+         break;
+     case NM_DEVICE_STATE_DEACTIVATING:
++        if (reason == NM_DEVICE_STATE_REASON_USER_REQUESTED)
++            ac_state_reason = NM_ACTIVE_CONNECTION_STATE_REASON_USER_DISCONNECTED;
++
+         ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATING;
+         break;
+     case NM_DEVICE_STATE_FAILED:
+     case NM_DEVICE_STATE_DISCONNECTED:
+     case NM_DEVICE_STATE_UNMANAGED:
+     case NM_DEVICE_STATE_UNAVAILABLE:
+-        ac_state        = NM_ACTIVE_CONNECTION_STATE_DEACTIVATED;
+-        ac_state_reason = NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED;
++        ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATED;
++        if (reason == NM_DEVICE_STATE_REASON_USER_REQUESTED)
++            ac_state_reason = NM_ACTIVE_CONNECTION_STATE_REASON_USER_DISCONNECTED;
++        else
++            ac_state_reason = NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED;
+ 
+         g_signal_handlers_disconnect_by_func(device, G_CALLBACK(device_notify), active);
+         break;
diff --git a/debian/patches/series b/debian/patches/series
index a2d7e06d..83f7b7ab 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,3 @@
 Force-online-state-with-unmanaged-devices.patch
+core-add-reason-argument-to-NMActiveConnection-device_sta.patch
+core-propagate-the-user-requested-reason-for-act-request-.patch