summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-10-05 13:42:24 +0200
committerThomas Haller <thaller@redhat.com>2015-10-05 15:25:54 +0200
commit6d78afd73fe2349ecc864dd2daedacf12269e3b0 (patch)
treeef5db5c89c747b92e00a4f68c958750a6b8eadfe
parent6395c829bb143301275b9bb449780d46a381553c (diff)
downloadNetworkManager-th/more-asserts.tar.gz
device: add assertion to consistancy of nm_device_check_connection_available()th/more-asserts
-rw-r--r--src/devices/nm-device.c67
1 files changed, 51 insertions, 16 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 5d9644e8e6..961d725a8d 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -8018,6 +8018,33 @@ nm_device_update_metered (NMDevice *self)
}
}
+static gboolean
+_nm_device_check_connection_available (NMDevice *self,
+ NMConnection *connection,
+ NMDeviceCheckConAvailableFlags flags,
+ const char *specific_object)
+{
+ NMDeviceState state;
+
+ state = nm_device_get_state (self);
+ if (state < NM_DEVICE_STATE_UNMANAGED)
+ return FALSE;
+ if ( state < NM_DEVICE_STATE_UNAVAILABLE
+ && nm_device_get_unmanaged (self, NM_UNMANAGED_ALL & ~NM_UNMANAGED_DEFAULT))
+ return FALSE;
+ if ( state < NM_DEVICE_STATE_DISCONNECTED
+ && ( ( !NM_FLAGS_HAS (flags, _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER)
+ && !nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE))
+ || ( NM_FLAGS_HAS (flags, _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER)
+ && !nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER))))
+ return FALSE;
+
+ if (!nm_device_check_connection_compatible (self, connection))
+ return FALSE;
+
+ return NM_DEVICE_GET_CLASS (self)->check_connection_available (self, connection, flags, specific_object);
+}
+
/**
* nm_device_check_connection_available():
* @self: the #NMDevice
@@ -8039,25 +8066,33 @@ nm_device_check_connection_available (NMDevice *self,
NMDeviceCheckConAvailableFlags flags,
const char *specific_object)
{
- NMDeviceState state;
+ gboolean available;
- state = nm_device_get_state (self);
- if (state < NM_DEVICE_STATE_UNMANAGED)
- return FALSE;
- if ( state < NM_DEVICE_STATE_UNAVAILABLE
- && nm_device_get_unmanaged (self, NM_UNMANAGED_ALL & ~NM_UNMANAGED_DEFAULT))
- return FALSE;
- if ( state < NM_DEVICE_STATE_DISCONNECTED
- && ( ( !NM_FLAGS_HAS (flags, _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER)
- && !nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE))
- || ( NM_FLAGS_HAS (flags, _NM_DEVICE_CHECK_CON_AVAILABLE_FOR_USER_REQUEST_WAITING_CARRIER)
- && !nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_IGNORE_CARRIER))))
- return FALSE;
+ available = _nm_device_check_connection_available (self, connection, flags, specific_object);
- if (!nm_device_check_connection_compatible (self, connection))
- return FALSE;
+#if NM_MORE_ASSERTS >= 2
+ {
+ /* The meaning of the flags is so that *adding* a flag relaxes a condition, thus making
+ * the device *more* available. Assert against that requirement by testing all the flags. */
+ NMDeviceCheckConAvailableFlags i, j, k;
+ gboolean available_all[NM_DEVICE_CHECK_CON_AVAILABLE_ALL + 1] = { FALSE };
+
+ for (i = 0; i <= NM_DEVICE_CHECK_CON_AVAILABLE_ALL; i++)
+ available_all[i] = _nm_device_check_connection_available (self, connection, i, specific_object);
+
+ for (i = 0; i <= NM_DEVICE_CHECK_CON_AVAILABLE_ALL; i++) {
+ for (j = 1; j <= NM_DEVICE_CHECK_CON_AVAILABLE_ALL; j <<= 1) {
+ if (NM_FLAGS_HAS (i, j)) {
+ k = i & ~j;
+ nm_assert ( available_all[i] == available_all[k]
+ || available_all[i]);
+ }
+ }
+ }
+ }
+#endif
- return NM_DEVICE_GET_CLASS (self)->check_connection_available (self, connection, flags, specific_object);
+ return available;
}
static void