diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2022-02-16 15:54:44 +0200 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2022-02-24 23:12:39 +0200 |
commit | 72102011e91621cf3080d5fb32f929aa1d34949d (patch) | |
tree | 36068552eb99604fc33228db6ae35ae873023e5f | |
parent | 9c4fbbe1b8ab6e2e6206f9fb9fe8bcf4c89aa5ff (diff) | |
download | NetworkManager-72102011e91621cf3080d5fb32f929aa1d34949d.tar.gz |
core: teach nm-manager about os_owner
Reflect what the rfkill-manager saw in the nm-manager.
This will allow to take decision based on the os_owner state.
-rw-r--r-- | src/core/nm-manager.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c index 8a18440ce7..b459e74e8d 100644 --- a/src/core/nm-manager.c +++ b/src/core/nm-manager.c @@ -63,6 +63,7 @@ typedef struct { bool user_enabled : 1; bool sw_enabled : 1; bool hw_enabled : 1; + bool os_owner : 1; } RfkillRadioState; typedef enum { @@ -2299,6 +2300,9 @@ _rfkill_radio_state_get_enabled(const RfkillRadioState *rstate, gboolean check_c { gboolean enabled; + /* If the device is not owned by the os, hw_enabled will be FALSE, hence + * we don't need to consider os_owner here. + */ enabled = rstate->user_enabled && rstate->hw_enabled; if (check_changeable) enabled &= rstate->sw_enabled; @@ -2314,19 +2318,23 @@ _rfkill_radio_state_set_from_manager(NMRfkillManager *rfkill_mgr, case NM_RFKILL_STATE_UNBLOCKED: rstate->sw_enabled = TRUE; rstate->hw_enabled = TRUE; + rstate->os_owner = TRUE; return; case NM_RFKILL_STATE_SOFT_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = TRUE; + rstate->os_owner = TRUE; return; case NM_RFKILL_STATE_HARD_BLOCKED: rstate->sw_enabled = FALSE; rstate->hw_enabled = FALSE; + /* In case the OS doesn't own the NIC, we would be in NM_RFKILL_STATE_HARD_BLOCKED */ + rstate->os_owner = TRUE; return; case NM_RFKILL_STATE_HARD_BLOCKED_OS_NOT_OWNER: - /* TODO: do something special here */ rstate->sw_enabled = FALSE; rstate->hw_enabled = FALSE; + rstate->os_owner = FALSE; return; } nm_assert_not_reached(); @@ -2388,10 +2396,11 @@ _rfkill_update_one_type(NMManager *self, NMRfkillType rtype) /* Print out all states affecting device enablement */ _LOGD(LOGD_RFKILL, - "rfkill: %s hw-enabled %d sw-enabled %d", + "rfkill: %s hw-enabled %d sw-enabled %d os-owner %d", nm_rfkill_type_to_string(rtype), rstate->hw_enabled, - rstate->sw_enabled); + rstate->sw_enabled, + rstate->os_owner); /* Log new killswitch state */ new_rfkilled = rstate->hw_enabled && rstate->sw_enabled; @@ -6474,12 +6483,14 @@ do_sleep_wake(NMManager *self, gboolean sleeping_changed) gboolean enabled = _rfkill_radio_state_get_enabled(rstate, TRUE); _LOGD(LOGD_RFKILL, - "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d)", + "rfkill: %s %s devices (hw_enabled %d, sw_enabled %d, user_enabled %d, " + "os_owner %d)", enabled ? "enabling" : "disabling", nm_rfkill_type_to_string(rtype), rstate->hw_enabled, rstate->sw_enabled, - rstate->user_enabled); + rstate->user_enabled, + rstate->os_owner); if (nm_device_get_rfkill_type(device) == rtype) nm_device_set_enabled(device, enabled); } @@ -7941,11 +7952,13 @@ nm_manager_init(NMManager *self) .user_enabled = TRUE, .sw_enabled = FALSE, .hw_enabled = TRUE, + .os_owner = TRUE, }; priv->radio_states[NM_RFKILL_TYPE_WWAN] = (RfkillRadioState){ .user_enabled = TRUE, .sw_enabled = FALSE, .hw_enabled = TRUE, + .os_owner = TRUE, }; priv->sleeping = FALSE; |