summary refs log tree commit diff
path: root/src/core/supplicant
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/supplicant')
-rw-r--r--src/core/supplicant/nm-supplicant-config.c173
-rw-r--r--src/core/supplicant/nm-supplicant-interface.c172
-rw-r--r--src/core/supplicant/nm-supplicant-manager.c8
-rw-r--r--src/core/supplicant/nm-supplicant-settings-verify.c1
-rw-r--r--src/core/supplicant/nm-supplicant-types.h11
-rw-r--r--src/core/supplicant/tests/test-supplicant-config.c39
6 files changed, 257 insertions, 147 deletions
diff --git a/src/core/supplicant/nm-supplicant-config.c b/src/core/supplicant/nm-supplicant-config.c
index bc2a692e..1959a161 100644
--- a/src/core/supplicant/nm-supplicant-config.c
+++ b/src/core/supplicant/nm-supplicant-config.c
@@ -10,11 +10,11 @@
 
 #include <stdlib.h>
 
-#include "nm-glib-aux/nm-str-buf.h"
-#include "nm-core-internal.h"
+#include "libnm-glib-aux/nm-str-buf.h"
+#include "libnm-core-intern/nm-core-internal.h"
 #include "nm-supplicant-settings-verify.h"
 #include "nm-setting.h"
-#include "nm-libnm-core-intern/nm-auth-subject.h"
+#include "libnm-core-aux-intern/nm-auth-subject.h"
 #include "NetworkManagerUtils.h"
 #include "nm-utils.h"
 #include "nm-setting-ip4-config.h"
@@ -334,11 +334,10 @@ nm_supplicant_config_to_variant(NMSupplicantConfig *self)
             break;
         case NM_SUPPL_OPT_TYPE_BYTES:
         case NM_SUPPL_OPT_TYPE_UTF8:
-            g_variant_builder_add(
-                &builder,
-                "{sv}",
-                key,
-                g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, option->value, option->len, 1));
+            g_variant_builder_add(&builder,
+                                  "{sv}",
+                                  key,
+                                  nm_g_variant_new_ay((const guint8 *) option->value, option->len));
             break;
         case NM_SUPPL_OPT_TYPE_KEYWORD:
         case NM_SUPPL_OPT_TYPE_STRING:
@@ -667,8 +666,8 @@ add_string_val(NMSupplicantConfig *self,
                             display_value,                                                \
                             error)                                                        \
     ({                                                                                    \
-        typeof(*(setting)) *_setting = (setting);                                         \
-        gboolean            _success = TRUE;                                              \
+        typeof(setting) _setting = (setting);                                             \
+        gboolean        _success = TRUE;                                                  \
                                                                                           \
         if (nm_setting_##setting_name##_get_num_##field_plural(_setting)) {               \
             const char _separator = (separator);                                          \
@@ -815,7 +814,7 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
     nm_auto_free_gstring GString *key_mgmt_conf = NULL;
     const char *                  key_mgmt, *auth_alg;
     const char *                  psk;
-    gboolean                      set_pmf;
+    gboolean                      set_pmf, wps_disabled;
 
     g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
     g_return_val_if_fail(setting != NULL, FALSE);
@@ -835,58 +834,82 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
     }
 
     key_mgmt      = nm_setting_wireless_security_get_key_mgmt(setting);
-    key_mgmt_conf = g_string_new(key_mgmt);
-    if (nm_streq(key_mgmt, "wpa-psk")) {
+    key_mgmt_conf = g_string_new("");
+
+    if (nm_streq(key_mgmt, "none")) {
+        g_string_append(key_mgmt_conf, "NONE");
+
+    } else if (nm_streq(key_mgmt, "ieee8021x")) {
+        g_string_append(key_mgmt_conf, "IEEE8021X");
+
+    } else if (nm_streq(key_mgmt, "owe")) {
+        pmf = NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED;
+
+        g_string_append(key_mgmt_conf, "OWE");
+
+    } else if (nm_streq(key_mgmt, "wpa-psk")) {
+        if (pmf != NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED)
+            g_string_append(key_mgmt_conf, "WPA-PSK");
         if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
-            g_string_append(key_mgmt_conf, " wpa-psk-sha256");
+            g_string_append(key_mgmt_conf, " WPA-PSK-SHA256");
         if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
-            g_string_append(key_mgmt_conf, " ft-psk");
+            g_string_append(key_mgmt_conf, " FT-PSK");
         if (_get_capability(priv, NM_SUPPL_CAP_TYPE_SAE)) {
-            g_string_append(key_mgmt_conf, " sae");
+            g_string_append(key_mgmt_conf, " SAE");
             if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
-                g_string_append(key_mgmt_conf, " ft-sae");
+                g_string_append(key_mgmt_conf, " FT-SAE");
         }
+
+    } else if (nm_streq(key_mgmt, "sae")) {
+        pmf = NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED;
+
+        g_string_append(key_mgmt_conf, "SAE");
+        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
+            g_string_append(key_mgmt_conf, " FT-SAE");
+
     } else if (nm_streq(key_mgmt, "wpa-eap")) {
+        if (pmf != NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED)
+            g_string_append(key_mgmt_conf, "WPA-EAP");
+        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT)) {
+            g_string_append(key_mgmt_conf, " FT-EAP");
+            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
+                g_string_append(key_mgmt_conf, " FT-EAP-SHA384");
+        }
         if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)) {
-            g_string_append(key_mgmt_conf, " wpa-eap-sha256");
-
+            g_string_append(key_mgmt_conf, " WPA-EAP-SHA256");
             if (_get_capability(priv, NM_SUPPL_CAP_TYPE_SUITEB192)
                 && pmf == NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED)
-                g_string_append(key_mgmt_conf, " wpa-eap-suite-b-192");
+                g_string_append(key_mgmt_conf, " WPA-EAP-SUITE-B-192");
         }
-        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
-            g_string_append(key_mgmt_conf, " ft-eap");
-        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT)
-            && _get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
-            g_string_append(key_mgmt_conf, " ft-eap-sha384");
+
         switch (fils) {
         case NM_SETTING_WIRELESS_SECURITY_FILS_REQUIRED:
             g_string_truncate(key_mgmt_conf, 0);
             if (!_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
-                g_string_assign(key_mgmt_conf, "fils-sha256 fils-sha384");
+                g_string_assign(key_mgmt_conf, "FILS-SHA256 FILS-SHA384");
             /* fall-through */
         case NM_SETTING_WIRELESS_SECURITY_FILS_OPTIONAL:
-            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
-                g_string_append(key_mgmt_conf, " fils-sha256 fils-sha384");
-            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)
-                && _get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
-                g_string_append(key_mgmt_conf, " ft-fils-sha256");
-            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)
-                && _get_capability(priv, NM_SUPPL_CAP_TYPE_FT)
-                && _get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
-                g_string_append(key_mgmt_conf, " ft-fils-sha384");
+            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)) {
+                g_string_append(key_mgmt_conf, " FILS-SHA256 FILS-SHA384");
+                if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT)) {
+                    g_string_append(key_mgmt_conf, " FT-FILS-SHA256");
+                    if (_get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
+                        g_string_append(key_mgmt_conf, " FT-FILS-SHA384");
+                }
+            }
             break;
+
         default:
             break;
         }
-    } else if (nm_streq(key_mgmt, "sae")) {
-        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
-            g_string_append(key_mgmt_conf, " ft-sae");
+
     } else if (nm_streq(key_mgmt, "wpa-eap-suite-b-192")) {
         pmf = NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED;
-        if (!nm_supplicant_config_add_option(self, "pairwise", "GCMP-256", -1, NULL, error)
-            || !nm_supplicant_config_add_option(self, "group", "GCMP-256", -1, NULL, error))
-            return FALSE;
+
+        g_string_append(key_mgmt_conf, "WPA-EAP-SUITE-B-192");
+        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT)
+            && _get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
+            g_string_append(key_mgmt_conf, " FT-EAP-SHA384");
     }
 
     if (!add_string_val(self, key_mgmt_conf->str, "key_mgmt", TRUE, NULL, error))
@@ -955,10 +978,6 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
         }
     }
 
-    /* Don't try to enable PMF on non-WPA/SAE/OWE networks */
-    if (!NM_IN_STRSET(key_mgmt, "wpa-eap", "wpa-eap-suite-b-192", "wpa-psk", "sae", "owe"))
-        pmf = NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE;
-
     /* Check if we actually support PMF */
     set_pmf = TRUE;
     if (!_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)) {
@@ -973,7 +992,7 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
     }
 
     /* Only WPA-specific things when using WPA */
-    if (NM_IN_STRSET(key_mgmt, "wpa-psk", "wpa-eap", "sae", "owe")) {
+    if (NM_IN_STRSET(key_mgmt, "owe", "wpa-psk", "sae", "wpa-eap", "wpa-eap-suite-b-192")) {
         if (!ADD_STRING_LIST_VAL(self,
                                  setting,
                                  wireless_security,
@@ -985,29 +1004,40 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
                                  NULL,
                                  error))
             return FALSE;
-        if (!ADD_STRING_LIST_VAL(self,
-                                 setting,
-                                 wireless_security,
-                                 pairwise,
-                                 pairwise,
-                                 "pairwise",
-                                 ' ',
-                                 TRUE,
-                                 NULL,
-                                 error))
-            return FALSE;
-        if (!ADD_STRING_LIST_VAL(self,
-                                 setting,
-                                 wireless_security,
-                                 group,
-                                 groups,
-                                 "group",
-                                 ' ',
-                                 TRUE,
-                                 NULL,
-                                 error))
-            return FALSE;
 
+        if (nm_streq(key_mgmt, "wpa-eap-suite-b-192")) {
+            if (!nm_supplicant_config_add_option(self, "pairwise", "GCMP-256", -1, NULL, error))
+                return FALSE;
+            if (!nm_supplicant_config_add_option(self, "group", "GCMP-256", -1, NULL, error))
+                return FALSE;
+        } else {
+            if (!ADD_STRING_LIST_VAL(self,
+                                     setting,
+                                     wireless_security,
+                                     pairwise,
+                                     pairwise,
+                                     "pairwise",
+                                     ' ',
+                                     TRUE,
+                                     NULL,
+                                     error))
+                return FALSE;
+            if (!ADD_STRING_LIST_VAL(self,
+                                     setting,
+                                     wireless_security,
+                                     group,
+                                     groups,
+                                     "group",
+                                     ' ',
+                                     TRUE,
+                                     NULL,
+                                     error))
+                return FALSE;
+        }
+
+        /* We set the supplicants global "pmf" config value to "1" (optional),
+         * so no need to set it network-specific again if PMF_OPTIONAL is set.
+         */
         if (set_pmf
             && NM_IN_SET(pmf,
                          NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE,
@@ -1107,6 +1137,13 @@ nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *
         }
     }
 
+    wps_disabled = (nm_setting_wireless_security_get_wps_method(setting)
+                    == NM_SETTING_WIRELESS_SECURITY_WPS_METHOD_DISABLED);
+    if (wps_disabled) {
+        if (!nm_supplicant_config_add_option(self, "wps_disabled", "1", 1, NULL, error))
+            return FALSE;
+    }
+
     return TRUE;
 }
 
diff --git a/src/core/supplicant/nm-supplicant-interface.c b/src/core/supplicant/nm-supplicant-interface.c
index a38ebf18..1556e290 100644
--- a/src/core/supplicant/nm-supplicant-interface.c
+++ b/src/core/supplicant/nm-supplicant-interface.c
@@ -12,13 +12,13 @@
 #include <linux/if_ether.h>
 
 #include "NetworkManagerUtils.h"
-#include "nm-core-internal.h"
-#include "nm-glib-aux/nm-c-list.h"
-#include "nm-glib-aux/nm-ref-string.h"
-#include "nm-std-aux/nm-dbus-compat.h"
+#include "libnm-core-intern/nm-core-internal.h"
+#include "libnm-glib-aux/nm-c-list.h"
+#include "libnm-glib-aux/nm-ref-string.h"
+#include "libnm-glib-aux/nm-dbus-aux.h"
+#include "libnm-std-aux/nm-dbus-compat.h"
 #include "nm-supplicant-config.h"
 #include "nm-supplicant-manager.h"
-#include "shared/nm-glib-aux/nm-dbus-aux.h"
 
 #define DBUS_TIMEOUT_MSEC 20000
 
@@ -267,30 +267,41 @@ security_from_vardict(GVariant *security)
     NM80211ApSecurityFlags flags = NM_802_11_AP_SEC_NONE;
     const char **          array;
     const char *           tmp;
+    gsize                  i;
+    const char *           v;
 
     nm_assert(g_variant_is_of_type(security, G_VARIANT_TYPE_VARDICT));
 
     if (g_variant_lookup(security, "KeyMgmt", "^a&s", &array)) {
-        if (g_strv_contains(array, "wpa-psk") || g_strv_contains(array, "wpa-ft-psk"))
-            flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
-        if (g_strv_contains(array, "wpa-eap") || g_strv_contains(array, "wpa-ft-eap")
-            || g_strv_contains(array, "wpa-fils-sha256")
-            || g_strv_contains(array, "wpa-fils-sha384"))
-            flags |= NM_802_11_AP_SEC_KEY_MGMT_802_1X;
-        if (g_strv_contains(array, "sae"))
-            flags |= NM_802_11_AP_SEC_KEY_MGMT_SAE;
-        if (g_strv_contains(array, "owe"))
-            flags |= NM_802_11_AP_SEC_KEY_MGMT_OWE;
-        if (g_strv_contains(array, "wpa-eap-suite-b-192"))
-            flags |= NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192;
+        for (i = 0; (v = array[i]); i++) {
+            if (NM_IN_STRSET(v, "wpa-psk", "wpa-psk-sha256", "wpa-ft-psk"))
+                flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
+            else if (NM_IN_STRSET(v,
+                                  "wpa-eap",
+                                  "wpa-eap-sha256",
+                                  "wpa-ft-eap",
+                                  "wpa-fils-sha256",
+                                  "wpa-fils-sha384",
+                                  "wpa-fils-ft-sha256",
+                                  "wpa-fils-ft-sha384"))
+                flags |= NM_802_11_AP_SEC_KEY_MGMT_802_1X;
+            else if (NM_IN_STRSET(v, "sae", "ft-sae"))
+                flags |= NM_802_11_AP_SEC_KEY_MGMT_SAE;
+            else if (NM_IN_STRSET(v, "owe"))
+                flags |= NM_802_11_AP_SEC_KEY_MGMT_OWE;
+            else if (NM_IN_STRSET(v, "wpa-eap-suite-b-192", "wpa-ft-eap-sha384"))
+                flags |= NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192;
+        }
         g_free(array);
     }
 
     if (g_variant_lookup(security, "Pairwise", "^a&s", &array)) {
-        if (g_strv_contains(array, "tkip"))
-            flags |= NM_802_11_AP_SEC_PAIR_TKIP;
-        if (g_strv_contains(array, "ccmp"))
-            flags |= NM_802_11_AP_SEC_PAIR_CCMP;
+        for (i = 0; (v = array[i]); i++) {
+            if (NM_IN_STRSET(v, "tkip"))
+                flags |= NM_802_11_AP_SEC_PAIR_TKIP;
+            else if (NM_IN_STRSET(v, "ccmp"))
+                flags |= NM_802_11_AP_SEC_PAIR_CCMP;
+        }
         g_free(array);
     }
 
@@ -359,8 +370,12 @@ _dbus_connection_call_simple_cb(GObject *source, GAsyncResult *result, gpointer
     gs_free_error GError *error    = NULL;
     const char *          log_reason;
     gs_free char *        remote_error = NULL;
+    gpointer              p_suppress_warning;
+    gboolean              suppress_warning;
+
+    nm_utils_user_data_unpack(user_data, &self, &log_reason, &p_suppress_warning);
 
-    nm_utils_user_data_unpack(user_data, &self, &log_reason);
+    suppress_warning = GPOINTER_TO_INT(p_suppress_warning);
 
     res = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), result, &error);
     if (nm_utils_error_is_cancelled(error))
@@ -371,37 +386,70 @@ _dbus_connection_call_simple_cb(GObject *source, GAsyncResult *result, gpointer
         return;
     }
 
-    remote_error = g_dbus_error_get_remote_error(error);
-    if (!nm_streq0(remote_error, "fi.w1.wpa_supplicant1.NotConnected")) {
-        g_dbus_error_strip_remote_error(error);
-        _LOGW("call-%s: failed with %s", log_reason, error->message);
-        return;
+    if (!suppress_warning) {
+        remote_error = g_dbus_error_get_remote_error(error);
+        if (!nm_streq0(remote_error, "fi.w1.wpa_supplicant1.NotConnected")) {
+            g_dbus_error_strip_remote_error(error);
+            _LOGW("call-%s: failed with %s", log_reason, error->message);
+            return;
+        }
     }
 
     _LOGT("call-%s: failed with %s", log_reason, error->message);
 }
 
 static void
-_dbus_connection_call_simple(NMSupplicantInterface *self,
-                             const char *           interface_name,
-                             const char *           method_name,
-                             GVariant *             parameters,
-                             const GVariantType *   reply_type,
-                             const char *           log_reason)
+_dbus_connection_call_simple_full_impl(NMSupplicantInterface *self,
+                                       const char *           interface_name,
+                                       const char *           method_name,
+                                       GVariant *             parameters,
+                                       const GVariantType *   reply_type,
+                                       const char *           log_reason,
+                                       gboolean               suppress_warning)
 {
     NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE(self);
 
-    _dbus_connection_call(self,
-                          interface_name,
-                          method_name,
-                          parameters,
-                          reply_type,
-                          G_DBUS_CALL_FLAGS_NONE,
-                          DBUS_TIMEOUT_MSEC,
-                          priv->main_cancellable,
-                          _dbus_connection_call_simple_cb,
-                          nm_utils_user_data_pack(self, log_reason));
-}
+    _dbus_connection_call(
+        self,
+        interface_name,
+        method_name,
+        parameters,
+        reply_type,
+        G_DBUS_CALL_FLAGS_NONE,
+        DBUS_TIMEOUT_MSEC,
+        priv->main_cancellable,
+        _dbus_connection_call_simple_cb,
+        nm_utils_user_data_pack(self, log_reason, GINT_TO_POINTER(suppress_warning)));
+}
+
+#define _dbus_connection_call_simple_full(self,              \
+                                          interface_name,    \
+                                          method_name,       \
+                                          parameters,        \
+                                          reply_type,        \
+                                          log_reason,        \
+                                          suppress_warning)  \
+    _dbus_connection_call_simple_full_impl((self),           \
+                                           (interface_name), \
+                                           (method_name),    \
+                                           (parameters),     \
+                                           (reply_type),     \
+                                           "" log_reason "", \
+                                           (suppress_warning))
+
+#define _dbus_connection_call_simple(self,                   \
+                                     interface_name,         \
+                                     method_name,            \
+                                     parameters,             \
+                                     reply_type,             \
+                                     log_reason)             \
+    _dbus_connection_call_simple_full_impl((self),           \
+                                           (interface_name), \
+                                           (method_name),    \
+                                           (parameters),     \
+                                           (reply_type),     \
+                                           "" log_reason "", \
+                                           FALSE)
 
 /*****************************************************************************/
 
@@ -557,7 +605,7 @@ _bss_info_properties_changed(NMSupplicantInterface *self,
     guint16        v_u16;
     guint32        v_u32;
     NM80211ApFlags p_ap_flags;
-    NM80211Mode    p_mode;
+    _NM80211Mode   p_mode;
     guint8         p_signal_percent;
     const guint8 * arr_data;
     gsize          arr_len;
@@ -605,15 +653,15 @@ _bss_info_properties_changed(NMSupplicantInterface *self,
 
     if (nm_g_variant_lookup(properties, "Mode", "&s", &v_s)) {
         if (nm_streq(v_s, "infrastructure"))
-            p_mode = NM_802_11_MODE_INFRA;
+            p_mode = _NM_802_11_MODE_INFRA;
         else if (nm_streq(v_s, "ad-hoc"))
-            p_mode = NM_802_11_MODE_ADHOC;
+            p_mode = _NM_802_11_MODE_ADHOC;
         else if (nm_streq(v_s, "mesh"))
-            p_mode = NM_802_11_MODE_MESH;
+            p_mode = _NM_802_11_MODE_MESH;
         else
-            p_mode = NM_802_11_MODE_UNKNOWN;
+            p_mode = _NM_802_11_MODE_UNKNOWN;
     } else if (initial)
-        p_mode = NM_802_11_MODE_UNKNOWN;
+        p_mode = _NM_802_11_MODE_UNKNOWN;
     else
         p_mode = bss_info->mode;
     if (bss_info->mode != p_mode) {
@@ -1619,11 +1667,10 @@ _wps_handle_set_pc_cb(GVariant *res, GError *error, gpointer user_data)
          * enroll with any BSS in range. */
         if (!nm_utils_hwaddr_aton(wps_data->bssid, bssid_buf, sizeof(bssid_buf)))
             nm_assert_not_reached();
-        g_variant_builder_add(
-            &start_args,
-            "{sv}",
-            "Bssid",
-            g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, bssid_buf, ETH_ALEN, sizeof(guint8)));
+        g_variant_builder_add(&start_args,
+                              "{sv}",
+                              "Bssid",
+                              nm_g_variant_new_ay(bssid_buf, ETH_ALEN));
     }
 
     wps_data->needs_cancelling = TRUE;
@@ -1901,7 +1948,7 @@ _properties_changed_main(NMSupplicantInterface *self, GVariant *properties)
 
     if (nm_g_variant_lookup(properties, "CurrentBSS", "&o", &v_s)) {
         v_s = nm_dbus_path_not_empty(v_s);
-        if (!nm_ref_string_equals_str(priv->current_bss, v_s)) {
+        if (!nm_ref_string_equal_str(priv->current_bss, v_s)) {
             nm_ref_string_unref(priv->current_bss);
             priv->current_bss     = nm_ref_string_new(v_s);
             do_notify_current_bss = TRUE;
@@ -2721,12 +2768,13 @@ nm_supplicant_interface_p2p_cancel_connect(NMSupplicantInterface *self)
 {
     g_return_if_fail(NM_IS_SUPPLICANT_INTERFACE(self));
 
-    _dbus_connection_call_simple(self,
-                                 NM_WPAS_DBUS_IFACE_INTERFACE_P2P_DEVICE,
-                                 "Cancel",
-                                 NULL,
-                                 G_VARIANT_TYPE("()"),
-                                 "p2p-cancel");
+    _dbus_connection_call_simple_full(self,
+                                      NM_WPAS_DBUS_IFACE_INTERFACE_P2P_DEVICE,
+                                      "Cancel",
+                                      NULL,
+                                      G_VARIANT_TYPE("()"),
+                                      "p2p-cancel",
+                                      TRUE);
 }
 
 void
diff --git a/src/core/supplicant/nm-supplicant-manager.c b/src/core/supplicant/nm-supplicant-manager.c
index 7cf1a2bb..e432889b 100644
--- a/src/core/supplicant/nm-supplicant-manager.c
+++ b/src/core/supplicant/nm-supplicant-manager.c
@@ -8,13 +8,13 @@
 
 #include "nm-supplicant-manager.h"
 
-#include "nm-core-internal.h"
+#include "libnm-core-intern/nm-core-internal.h"
 #include "nm-dbus-manager.h"
-#include "nm-glib-aux/nm-dbus-aux.h"
-#include "nm-glib-aux/nm-ref-string.h"
+#include "libnm-glib-aux/nm-dbus-aux.h"
+#include "libnm-glib-aux/nm-ref-string.h"
 #include "nm-supplicant-interface.h"
 #include "nm-supplicant-types.h"
-#include "platform/nm-platform.h"
+#include "libnm-platform/nm-platform.h"
 
 /*****************************************************************************/
 
diff --git a/src/core/supplicant/nm-supplicant-settings-verify.c b/src/core/supplicant/nm-supplicant-settings-verify.c
index 3f0a33e0..5e77b207 100644
--- a/src/core/supplicant/nm-supplicant-settings-verify.c
+++ b/src/core/supplicant/nm-supplicant-settings-verify.c
@@ -144,6 +144,7 @@ static const struct Opt opt_table[] = {
     OPT_BYTES("wep_key2", 0),
     OPT_BYTES("wep_key3", 0),
     OPT_INT("wep_tx_keyidx", 0, 3),
+    OPT_INT("wps_disabled", 0, 1),
 };
 
 static gboolean
diff --git a/src/core/supplicant/nm-supplicant-types.h b/src/core/supplicant/nm-supplicant-types.h
index ae2db3f6..c9b72de1 100644
--- a/src/core/supplicant/nm-supplicant-types.h
+++ b/src/core/supplicant/nm-supplicant-types.h
@@ -7,6 +7,7 @@
 #define __NETWORKMANAGER_SUPPLICANT_TYPES_H__
 
 #include "c-list/src/c-list.h"
+#include "libnm-base/nm-base.h"
 
 #define NM_WPAS_DBUS_SERVICE   "fi.w1.wpa_supplicant1"
 #define NM_WPAS_DBUS_PATH      "/fi/w1/wpa_supplicant1"
@@ -50,9 +51,9 @@ typedef enum {
     _NM_SUPPL_CAP_TYPE_NUM,
 } NMSupplCapType;
 
-#define NM_SUPPL_CAP_MASK_NO(type)   ((NMSupplCapMask)(1llu << ((type) *2u)))
-#define NM_SUPPL_CAP_MASK_YES(type)  ((NMSupplCapMask)(2llu << ((type) *2u)))
-#define NM_SUPPL_CAP_MASK_MASK(type) ((NMSupplCapMask)(3llu << ((type) *2u)))
+#define NM_SUPPL_CAP_MASK_NO(type)   ((NMSupplCapMask) (1llu << ((type) *2u)))
+#define NM_SUPPL_CAP_MASK_YES(type)  ((NMSupplCapMask) (2llu << ((type) *2u)))
+#define NM_SUPPL_CAP_MASK_MASK(type) ((NMSupplCapMask) (3llu << ((type) *2u)))
 
 typedef enum {
     NM_SUPPL_CAP_MASK_NONE = 0,
@@ -113,7 +114,7 @@ NM_SUPPL_CAP_MASK_GET(NMSupplCapMask features, NMSupplCapType type)
 
     nm_assert(NM_IN_SET(f, 0, 1, 2));
 
-    return (NMTernary)(f - 1);
+    return (NMTernary) (f - 1);
 }
 
 static inline char
@@ -178,7 +179,7 @@ typedef struct _NMSupplicantBssInfo {
 
     NM80211ApFlags ap_flags : 5;
 
-    NM80211Mode mode : 4;
+    _NM80211Mode mode : 4;
 
     bool bssid_valid : 1;
 
diff --git a/src/core/supplicant/tests/test-supplicant-config.c b/src/core/supplicant/tests/test-supplicant-config.c
index 99729c18..0cf35d0e 100644
--- a/src/core/supplicant/tests/test-supplicant-config.c
+++ b/src/core/supplicant/tests/test-supplicant-config.c
@@ -14,7 +14,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
-#include "nm-core-internal.h"
+#include "libnm-core-intern/nm-core-internal.h"
 
 #include "supplicant/nm-supplicant-config.h"
 #include "supplicant/nm-supplicant-settings-verify.h"
@@ -394,7 +394,17 @@ test_wifi_wpa_psk(const char *                 detail,
     NMTST_EXPECT_NM_INFO("Config: added 'scan_ssid' value '1'*");
     NMTST_EXPECT_NM_INFO("Config: added 'bssid' value '11:22:33:44:55:66'*");
     NMTST_EXPECT_NM_INFO("Config: added 'freq_list' value *");
-    NMTST_EXPECT_NM_INFO("Config: added 'key_mgmt' value 'WPA-PSK WPA-PSK-SHA256'");
+    switch (pmf) {
+    case NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE:
+    case NM_SETTING_WIRELESS_SECURITY_PMF_OPTIONAL:
+        NMTST_EXPECT_NM_INFO("Config: added 'key_mgmt' value 'WPA-PSK WPA-PSK-SHA256'");
+        break;
+    case NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED:
+        NMTST_EXPECT_NM_INFO("Config: added 'key_mgmt' value ' WPA-PSK-SHA256'");
+        break;
+    default:
+        break;
+    }
     NMTST_EXPECT_NM_INFO("Config: added 'psk' value *");
     NMTST_EXPECT_NM_INFO("Config: added 'proto' value 'WPA RSN'");
     NMTST_EXPECT_NM_INFO("Config: added 'pairwise' value 'TKIP CCMP'");
@@ -421,11 +431,22 @@ test_wifi_wpa_psk(const char *                 detail,
     validate_opt(detail, config_dict, "scan_ssid", NM_SUPPL_OPT_TYPE_INT, GINT_TO_POINTER(1));
     validate_opt(detail, config_dict, "ssid", NM_SUPPL_OPT_TYPE_BYTES, ssid);
     validate_opt(detail, config_dict, "bssid", NM_SUPPL_OPT_TYPE_KEYWORD, bssid_str);
-    validate_opt(detail,
-                 config_dict,
-                 "key_mgmt",
-                 NM_SUPPL_OPT_TYPE_KEYWORD,
-                 "WPA-PSK WPA-PSK-SHA256");
+    switch (pmf) {
+    case NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE:
+    case NM_SETTING_WIRELESS_SECURITY_PMF_OPTIONAL:
+        validate_opt(detail,
+                     config_dict,
+                     "key_mgmt",
+                     NM_SUPPL_OPT_TYPE_KEYWORD,
+                     "WPA-PSK WPA-PSK-SHA256");
+        break;
+    case NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED:
+        validate_opt(detail, config_dict, "key_mgmt", NM_SUPPL_OPT_TYPE_KEYWORD, " WPA-PSK-SHA256");
+        break;
+    default:
+        break;
+    }
+
     validate_opt(detail, config_dict, "proto", NM_SUPPL_OPT_TYPE_KEYWORD, "WPA RSN");
     validate_opt(detail, config_dict, "pairwise", NM_SUPPL_OPT_TYPE_KEYWORD, "TKIP CCMP");
     validate_opt(detail, config_dict, "group", NM_SUPPL_OPT_TYPE_KEYWORD, "TKIP CCMP");
@@ -483,6 +504,7 @@ test_wifi_sae_psk(const char *psk)
     NMTST_EXPECT_NM_INFO("Config: added 'proto' value 'RSN'");
     NMTST_EXPECT_NM_INFO("Config: added 'pairwise' value 'TKIP CCMP'");
     NMTST_EXPECT_NM_INFO("Config: added 'group' value 'TKIP CCMP'");
+    NMTST_EXPECT_NM_INFO("Config: added 'ieee80211w' value '2'");
     config_dict =
         build_supplicant_config(connection,
                                 1500,
@@ -815,9 +837,10 @@ test_wifi_eap_suite_b_generation(void)
     NMTST_EXPECT_NM_INFO("Config: added 'scan_ssid' value '1'*");
     NMTST_EXPECT_NM_INFO("Config: added 'bssid' value '11:22:33:44:55:66'*");
     NMTST_EXPECT_NM_INFO("Config: added 'freq_list' value *");
+    NMTST_EXPECT_NM_INFO("Config: added 'key_mgmt' value 'WPA-EAP-SUITE-B-192'");
     NMTST_EXPECT_NM_INFO("Config: added 'pairwise' value 'GCMP-256'");
     NMTST_EXPECT_NM_INFO("Config: added 'group' value 'GCMP-256'");
-    NMTST_EXPECT_NM_INFO("Config: added 'key_mgmt' value 'WPA-EAP-SUITE-B-192'");
+    NMTST_EXPECT_NM_INFO("Config: added 'ieee80211w' value '2'");
     NMTST_EXPECT_NM_INFO("Config: added 'eap' value 'TLS'");
     NMTST_EXPECT_NM_INFO("Config: added 'fragment_size' value '1086'");
     NMTST_EXPECT_NM_INFO("Config: added 'ca_cert' value '*/test-ca-cert.pem'");