about summary refs log tree commit diff
path: root/src/nmcli
diff options
context:
space:
mode:
Diffstat (limited to 'src/nmcli')
-rw-r--r--src/nmcli/common.c18
-rw-r--r--src/nmcli/connections.c17
-rw-r--r--src/nmcli/devices.c167
-rw-r--r--src/nmcli/gen-metadata-nm-settings-nmcli.xml.in28
-rw-r--r--src/nmcli/general.c18
-rw-r--r--src/nmcli/utils.c14
-rw-r--r--src/nmcli/utils.h5
7 files changed, 161 insertions, 106 deletions
diff --git a/src/nmcli/common.c b/src/nmcli/common.c
index 15a7927b..5940f2f0 100644
--- a/src/nmcli/common.c
+++ b/src/nmcli/common.c
@@ -156,6 +156,11 @@ _metagen_ip4_config_get_fcn(NMC_META_GENERIC_INFO_GET_FCN_ARGS)
             return NULL;
         arrc = nm_ip_config_get_wins_servers(cfg4);
         goto arrc_out;
+    case NMC_GENERIC_INFO_TYPE_IP4_CONFIG_CLAT_ADDRESS:
+        *out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE;
+        str = nm_ip_config_get_clat_address(cfg4);
+        NM_SET_OUT(out_is_default, !str);
+        return str;
     default:
         break;
     }
@@ -184,6 +189,7 @@ const NmcMetaGenericInfo *const metagen_ip4_config[_NMC_GENERIC_INFO_TYPE_IP4_CO
     _METAGEN_IP4_CONFIG(NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN, "DOMAIN"),
     _METAGEN_IP4_CONFIG(NMC_GENERIC_INFO_TYPE_IP4_CONFIG_SEARCHES, "SEARCHES"),
     _METAGEN_IP4_CONFIG(NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS, "WINS"),
+    _METAGEN_IP4_CONFIG(NMC_GENERIC_INFO_TYPE_IP4_CONFIG_CLAT_ADDRESS, "CLAT-ADDRESS"),
 };
 
 /*****************************************************************************/
@@ -245,6 +251,16 @@ _metagen_ip6_config_get_fcn(NMC_META_GENERIC_INFO_GET_FCN_ARGS)
             return NULL;
         arrc = nm_ip_config_get_searches(cfg6);
         goto arrc_out;
+    case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_ADDRESS:
+        *out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE;
+        str = nm_ip_config_get_clat_address(cfg6);
+        NM_SET_OUT(out_is_default, !str);
+        return str;
+    case NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_PREF64:
+        *out_flags |= NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE;
+        str = nm_ip_config_get_clat_pref64(cfg6);
+        NM_SET_OUT(out_is_default, !str);
+        return str;
     default:
         break;
     }
@@ -272,6 +288,8 @@ const NmcMetaGenericInfo *const metagen_ip6_config[_NMC_GENERIC_INFO_TYPE_IP6_CO
     _METAGEN_IP6_CONFIG(NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DNS, "DNS"),
     _METAGEN_IP6_CONFIG(NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DOMAIN, "DOMAIN"),
     _METAGEN_IP6_CONFIG(NMC_GENERIC_INFO_TYPE_IP6_CONFIG_SEARCHES, "SEARCHES"),
+    _METAGEN_IP6_CONFIG(NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_ADDRESS, "CLAT-ADDRESS"),
+    _METAGEN_IP6_CONFIG(NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_PREF64, "CLAT-PREF64"),
 };
 
 /*****************************************************************************/
diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c
index a3b03efe..6f0356c5 100644
--- a/src/nmcli/connections.c
+++ b/src/nmcli/connections.c
@@ -818,8 +818,11 @@ _metagen_con_show_get_fcn(NMC_META_GENERIC_INFO_GET_FCN_ARGS)
 }
 
 const NmcMetaGenericInfo *const metagen_con_show[_NMC_GENERIC_INFO_TYPE_CON_SHOW_NUM + 1] = {
-#define _METAGEN_CON_SHOW(type, name) \
-    [type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_con_show_get_fcn)
+#define _METAGEN_CON_SHOW(type, name, ...)                            \
+    [type] = NMC_META_GENERIC(name,                                   \
+                              .info_type = type,                      \
+                              .get_fcn   = _metagen_con_show_get_fcn, \
+                              __VA_ARGS__)
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_NAME, "NAME"),
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_UUID, "UUID"),
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_TYPE, "TYPE"),
@@ -833,7 +836,7 @@ const NmcMetaGenericInfo *const metagen_con_show[_NMC_GENERIC_INFO_TYPE_CON_SHOW
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_DEVICE, "DEVICE"),
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_STATE, "STATE"),
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_ACTIVE_PATH, "ACTIVE-PATH"),
-    _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_PORT, "SLAVE"),
+    _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_PORT, "PORT", .alias = "SLAVE"),
     _METAGEN_CON_SHOW(NMC_GENERIC_INFO_TYPE_CON_SHOW_FILENAME, "FILENAME"),
 };
 #define NMC_FIELDS_CON_SHOW_COMMON "NAME,UUID,TYPE,DEVICE"
@@ -920,6 +923,7 @@ _metagen_con_active_general_get_fcn(NMC_META_GENERIC_INFO_GET_FCN_ARGS)
          * but the settings-connection profile. There is no guarantee, that they agree. */
         return s_con ? nm_setting_connection_get_zone(s_con) : NULL;
     case NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_CONTROLLER_PATH:
+    case NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_MASTER_PATH:
         dev = nm_active_connection_get_controller(ac);
         return dev ? nm_object_get_path(NM_OBJECT(dev)) : NULL;
     default:
@@ -949,6 +953,8 @@ const NmcMetaGenericInfo
         _METAGEN_CON_ACTIVE_GENERAL(NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_CON_PATH, "CON-PATH"),
         _METAGEN_CON_ACTIVE_GENERAL(NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_ZONE, "ZONE"),
         _METAGEN_CON_ACTIVE_GENERAL(NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_CONTROLLER_PATH,
+                                    "CONTROLLER-PATH"),
+        _METAGEN_CON_ACTIVE_GENERAL(NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_MASTER_PATH,
                                     "MASTER-PATH"),
 };
 
@@ -5645,6 +5651,7 @@ connection_warnings(NmCli *nmc, NMConnection *connection)
     guint            i, found;
     const char      *id;
     const char      *deprecated;
+    gs_free char    *gw_warning = NULL;
 
     deprecated = nmc_connection_check_deprecated(NM_CONNECTION(connection));
     if (deprecated)
@@ -5673,6 +5680,10 @@ connection_warnings(NmCli *nmc, NMConnection *connection)
                      nm_connection_get_uuid(NM_CONNECTION(connection)),
                      found);
     }
+
+    gw_warning = nm_connection_get_unreachable_gateways_warning(connection, TRUE);
+    if (gw_warning)
+        nmc_printerr("Warning: %s.\n", gw_warning);
 }
 
 static void
diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c
index 2787439e..bc24bcde 100644
--- a/src/nmcli/devices.c
+++ b/src/nmcli/devices.c
@@ -732,21 +732,22 @@ const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[] = {
     NMC_META_GENERIC("BSSID"),     /* 3 */
     NMC_META_GENERIC("MODE"),      /* 4 */
     NMC_META_GENERIC("CHAN"),      /* 5 */
-    NMC_META_GENERIC("FREQ"),      /* 6 */
-    NMC_META_GENERIC("RATE"),      /* 7 */
-    NMC_META_GENERIC("BANDWIDTH"), /* 8 */
-    NMC_META_GENERIC("SIGNAL"),    /* 9 */
-    NMC_META_GENERIC("BARS"),      /* 10 */
-    NMC_META_GENERIC("SECURITY"),  /* 11 */
-    NMC_META_GENERIC("WPA-FLAGS"), /* 12 */
-    NMC_META_GENERIC("RSN-FLAGS"), /* 13 */
-    NMC_META_GENERIC("DEVICE"),    /* 14 */
-    NMC_META_GENERIC("ACTIVE"),    /* 15 */
-    NMC_META_GENERIC("IN-USE"),    /* 16 */
-    NMC_META_GENERIC("DBUS-PATH"), /* 17 */
+    NMC_META_GENERIC("BAND"),      /* 6 */
+    NMC_META_GENERIC("FREQ"),      /* 7 */
+    NMC_META_GENERIC("RATE"),      /* 8 */
+    NMC_META_GENERIC("BANDWIDTH"), /* 9 */
+    NMC_META_GENERIC("SIGNAL"),    /* 10 */
+    NMC_META_GENERIC("BARS"),      /* 11 */
+    NMC_META_GENERIC("SECURITY"),  /* 12 */
+    NMC_META_GENERIC("WPA-FLAGS"), /* 13 */
+    NMC_META_GENERIC("RSN-FLAGS"), /* 14 */
+    NMC_META_GENERIC("DEVICE"),    /* 15 */
+    NMC_META_GENERIC("ACTIVE"),    /* 16 */
+    NMC_META_GENERIC("IN-USE"),    /* 17 */
+    NMC_META_GENERIC("DBUS-PATH"), /* 18 */
     NULL,
 };
-#define NMC_FIELDS_DEV_WIFI_LIST_COMMON       "IN-USE,BSSID,SSID,MODE,CHAN,RATE,SIGNAL,BARS,SECURITY"
+#define NMC_FIELDS_DEV_WIFI_LIST_COMMON       "IN-USE,BSSID,SSID,MODE,BAND,CHAN,RATE,SIGNAL,BARS,SECURITY"
 #define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME," NMC_FIELDS_DEV_WIFI_LIST_COMMON
 
 const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = {
@@ -765,17 +766,19 @@ const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = {
 const NmcMetaGenericInfo *const nmc_fields_dev_show_controller_prop[] = {
     NMC_META_GENERIC("NAME"),   /* 0 */
     NMC_META_GENERIC("SLAVES"), /* 1 */
+    NMC_META_GENERIC("PORTS"),  /* 2 */
     NULL,
 };
-#define NMC_FIELDS_DEV_SHOW_CONTROLLER_PROP_COMMON "NAME,SLAVES"
+#define NMC_FIELDS_DEV_SHOW_CONTROLLER_PROP_COMMON "NAME,SLAVES,PORTS"
 
 const NmcMetaGenericInfo *const nmc_fields_dev_show_team_prop[] = {
     NMC_META_GENERIC("NAME"),   /* 0 */
     NMC_META_GENERIC("SLAVES"), /* 1 */
-    NMC_META_GENERIC("CONFIG"), /* 2 */
+    NMC_META_GENERIC("PORTS"),  /* 2 */
+    NMC_META_GENERIC("CONFIG"), /* 3 */
     NULL,
 };
-#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,CONFIG"
+#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,PORTS,CONFIG"
 
 const NmcMetaGenericInfo *const nmc_fields_dev_show_vlan_prop[] = {
     NMC_META_GENERIC("NAME"),   /* 0 */
@@ -867,7 +870,7 @@ usage(void)
           "<ifname>]\n"
           "                         [bssid <BSSID>] [name <name>] [private yes|no] [hidden "
           "yes|no]\n\n"
-          "  wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg] "
+          "  wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg|6GHz] "
           "[channel <channel>] [password <password>]\n\n"
           "  wifi rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n\n"
           "  wifi show-password [ifname <ifname>]\n\n"
@@ -1023,7 +1026,7 @@ usage_device_wifi(void)
           "It is also assumed that IP configuration is obtained via DHCP.\n"
           "\n"
           "ARGUMENTS := hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>]\n"
-          "                     [band a|bg] [channel <channel>] [password <password>]\n"
+          "                     [band a|bg|6GHz] [channel <channel>] [password <password>]\n"
           "\n"
           "Create a Wi-Fi hotspot. Use 'connection down' or 'device disconnect'\n"
           "to stop the hotspot.\n"
@@ -1325,6 +1328,7 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info)
     const char            *bssid;
     NM80211Mode            mode;
     char                  *channel_str;
+    const char            *band_str;
     char                  *freq_str;
     char                  *ssid_str     = NULL;
     char                  *ssid_hex_str = NULL;
@@ -1369,6 +1373,22 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info)
     rsn_flags_str = ap_wpa_rsn_flags_to_string(rsn_flags, NM_META_ACCESSOR_GET_TYPE_PRETTY);
     sig_bars      = nmc_wifi_strength_bars(strength);
 
+    switch (nm_utils_wifi_freq_to_band(freq)) {
+    case NM_WIFI_BAND_2_4_GHZ:
+        band_str = _("2.4 GHz");
+        break;
+    case NM_WIFI_BAND_5_GHZ:
+        band_str = _("5 GHz");
+        break;
+    case NM_WIFI_BAND_6_GHZ:
+        band_str = _("6 GHz");
+        break;
+    default:
+    case NM_WIFI_BAND_UNKNOWN:
+        band_str = "";
+        break;
+    }
+
     security_str = g_string_new(NULL);
 
     if (_ap_is_wep(ap)) {
@@ -1417,18 +1437,19 @@ fill_output_access_point(NMAccessPoint *ap, const APInfo *info)
                  : mode == NM_802_11_MODE_MESH  ? _("Mesh")
                                                 : _("N/A"));
     set_val_str(arr, 5, channel_str);
-    set_val_str(arr, 6, freq_str);
-    set_val_str(arr, 7, bitrate_str);
-    set_val_str(arr, 8, bandwidth_str);
-    set_val_str(arr, 9, strength_str);
-    set_val_strc(arr, 10, sig_bars);
-    set_val_str(arr, 11, g_string_free(security_str, FALSE));
-    set_val_str(arr, 12, wpa_flags_str);
-    set_val_str(arr, 13, rsn_flags_str);
-    set_val_strc(arr, 14, info->device);
-    set_val_strc(arr, 15, active ? _("yes") : _("no"));
-    set_val_strc(arr, 16, active ? "*" : " ");
-    set_val_strc(arr, 17, nm_object_get_path(NM_OBJECT(ap)));
+    set_val_strc(arr, 6, band_str);
+    set_val_str(arr, 7, freq_str);
+    set_val_str(arr, 8, bitrate_str);
+    set_val_str(arr, 9, bandwidth_str);
+    set_val_str(arr, 10, strength_str);
+    set_val_strc(arr, 11, sig_bars);
+    set_val_str(arr, 12, g_string_free(security_str, FALSE));
+    set_val_str(arr, 13, wpa_flags_str);
+    set_val_str(arr, 14, rsn_flags_str);
+    set_val_strc(arr, 15, info->device);
+    set_val_strc(arr, 16, active ? _("yes") : _("no"));
+    set_val_strc(arr, 17, active ? "*" : " ");
+    set_val_strc(arr, 18, nm_object_get_path(NM_OBJECT(ap)));
 
     /* Set colors */
     color = wifi_signal_to_color(strength);
@@ -1520,7 +1541,8 @@ print_bond_bridge_info(NMDevice   *device,
 
     arr = nmc_dup_fields_array(tmpl, NMC_OF_FLAG_SECTION_PREFIX);
     set_val_strc(arr, 0, group_prefix); /* i.e. BOND, TEAM, BRIDGE */
-    set_val_str(arr, 1, g_string_free(ports_str, FALSE));
+    set_val_str(arr, 1, g_strdup(ports_str->str));
+    set_val_str(arr, 2, g_string_free(ports_str, FALSE));
     g_ptr_array_add(out.output_data, arr);
 
     print_data_prepare_width(out.output_data);
@@ -1583,8 +1605,9 @@ print_team_info(NMDevice *device, NmCli *nmc, const char *group_prefix, const ch
 
     arr = nmc_dup_fields_array(tmpl, NMC_OF_FLAG_SECTION_PREFIX);
     set_val_strc(arr, 0, group_prefix); /* TEAM */
-    set_val_str(arr, 1, g_string_free(ports_str, FALSE));
-    set_val_str(arr, 2, sanitize_team_config(nm_device_team_get_config(NM_DEVICE_TEAM(device))));
+    set_val_str(arr, 1, g_strdup(ports_str->str));
+    set_val_str(arr, 2, g_string_free(ports_str, FALSE));
+    set_val_str(arr, 3, sanitize_team_config(nm_device_team_get_config(NM_DEVICE_TEAM(device))));
     g_ptr_array_add(out.output_data, arr);
 
     print_data_prepare_width(out.output_data);
@@ -4571,10 +4594,11 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char *
             }
             band = *argv;
             if (argc == 1 && nmc->complete)
-                nmc_complete_strings(band, "a", "bg");
-            if (strcmp(band, "a") && strcmp(band, "bg")) {
+                nmc_complete_strings(band, "a", "bg", "6GHz");
+            if (!NM_IN_STRSET(band, "a", "bg", "6GHz")) {
                 g_string_printf(nmc->return_text,
-                                _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."),
+                                _("Error: band argument value '%s' is invalid; use 'a', 'bg' "
+                                  "or '6GHz'."),
                                 band);
                 nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
                 return;
@@ -4622,7 +4646,7 @@ do_device_wifi_hotspot(const NMCCommand *cmd, NmCli *nmc, int argc, const char *
             nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
             return;
         }
-        if (!nmc_string_to_uint(channel, TRUE, 1, 5825, &value)
+        if (!nmc_string_to_uint(channel, TRUE, 1, G_MAXUINT32, &value)
             || !nm_utils_wifi_is_channel_valid(value, band)) {
             g_string_printf(nmc->return_text,
                             _("Error: channel '%s' not valid for band '%s'."),
@@ -4810,44 +4834,15 @@ do_device_wifi_rescan(const NMCCommand *cmd, NmCli *nmc, int argc, const char *c
 }
 
 static void
-string_append_mecard(GString *string, const char *tag, const char *text)
-{
-    const char *p;
-    bool        is_hex = TRUE;
-    int         start;
-
-    if (!text)
-        return;
-
-    g_string_append(string, tag);
-    start = string->len;
-
-    for (p = text; *p; p++) {
-        if (!g_ascii_isxdigit(*p))
-            is_hex = FALSE;
-        if (strchr("\\\":;,", *p))
-            g_string_append_c(string, '\\');
-        g_string_append_c(string, *p);
-    }
-
-    if (is_hex) {
-        g_string_insert_c(string, start, '\"');
-        g_string_append_c(string, '\"');
-    }
-    g_string_append_c(string, ';');
-}
-
-static void
 print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection)
 {
-    NMSettingWireless            *s_wireless;
-    NMSettingWirelessSecurity    *s_wsec;
-    const char                   *key_mgmt = NULL;
-    const char                   *psk      = NULL;
-    const char                   *type     = NULL;
-    GBytes                       *ssid_bytes;
-    gs_free char                 *ssid   = NULL;
-    nm_auto_free_gstring GString *string = NULL;
+    NMSettingWireless         *s_wireless;
+    NMSettingWirelessSecurity *s_wsec;
+    const char                *key_mgmt = NULL;
+    const char                *psk      = NULL;
+    GBytes                    *ssid_bytes;
+    gs_free char              *ssid = NULL;
+    nm_auto_free_secret char  *uri  = NULL;
 
     s_wireless = nm_connection_get_setting_wireless(connection);
     g_return_if_fail(s_wireless);
@@ -4858,9 +4853,6 @@ print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection)
     g_return_if_fail(ssid);
     nmc_print("SSID: %s\n", ssid);
 
-    string = g_string_sized_new(64);
-    g_string_append(string, "WIFI:");
-
     s_wsec = nm_connection_get_setting_wireless_security(connection);
     if (s_wsec) {
         key_mgmt = nm_setting_wireless_security_get_key_mgmt(s_wsec);
@@ -4868,33 +4860,30 @@ print_wifi_connection(const NmcConfig *nmc_config, NMConnection *connection)
     }
 
     if (key_mgmt == NULL) {
-        type = "nopass";
         nmc_print("%s: %s\n", _("Security"), _("None"));
     } else if (strcmp(key_mgmt, "none") == 0 || strcmp(key_mgmt, "ieee8021x") == 0) {
-        type = "WEP";
         nmc_print("%s: WEP\n", _("Security"));
     } else if (strcmp(key_mgmt, "wpa-none") == 0 || strcmp(key_mgmt, "wpa-psk") == 0
                || strcmp(key_mgmt, "sae") == 0) {
-        type = "WPA";
         nmc_print("%s: WPA\n", _("Security"));
     } else if (strcmp(key_mgmt, "owe") == 0) {
-        type = "nopass";
         nmc_print("%s: OWE\n", _("Security"));
     }
 
-    if (psk)
+    if (psk && psk[0]) {
         nmc_print("%s: %s\n", _("Password"), psk);
+    } else if (nmc_wifi_key_mgmt_uses_psk(key_mgmt)) {
+        /* A QR code for a secured network without its password connects to
+         * nothing, so don't print one. */
+        nmc_printerr(
+            _("Warning: cannot read the Wi-Fi password due to insufficient privileges.\n"));
+        return;
+    }
 
-    string_append_mecard(string, "T:", type);
-    string_append_mecard(string, "S:", ssid);
-    string_append_mecard(string, "P:", psk);
-
-    if (nm_setting_wireless_get_hidden(s_wireless))
-        g_string_append(string, "H:true;");
+    uri = nmc_wifi_qr_uri_new(ssid, key_mgmt, psk, nm_setting_wireless_get_hidden(s_wireless));
 
-    g_string_append_c(string, ';');
     if (nmc_config->use_colors)
-        nmc_print_qrcode(string->str);
+        nmc_print_qrcode(uri);
 
     nmc_print("\n");
 }
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
index 7a9f4e9c..801c760d 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -33,9 +33,9 @@
                   format="string"
                   values="infrastructure, adhoc, ap, mesh" />
         <property name="band"
-                  nmcli-description="802.11 frequency band of the network.  One of &quot;a&quot; for 5GHz 802.11a or &quot;bg&quot; for 2.4GHz 802.11.  This will lock associations to the Wi-Fi network to the specific band, i.e. if &quot;a&quot; is specified, the device will not associate with the same network in the 2.4GHz band even if the network&apos;s settings are compatible.  This setting depends on specific driver capability and may not work with all drivers."
+                  nmcli-description="802.11 frequency band of the network.  One of &quot;a&quot; for 5GHz, &quot;bg&quot; for 2.4GHz or &quot;6GHz&quot;.  This will lock associations to the Wi-Fi network to the specific band, i.e. if &quot;a&quot; is specified, the device will not associate with the same network in the 2.4GHz (bg) or 6GHz bands even if the network&apos;s settings are compatible.  This setting depends on specific driver capability and may not work with all drivers."
                   format="string"
-                  values="a, bg" />
+                  values="a, bg, 6GHz" />
         <property name="channel"
                   nmcli-description="Wireless channel to use for the Wi-Fi connection.  The device will only join (or create for Ad-Hoc networks) a Wi-Fi network on the specified channel.  Because channel numbers overlap between bands, this property also requires the &quot;band&quot; property to be set."
                   format="integer"
@@ -653,7 +653,7 @@
                   format="choice (NMConnectionMultiConnect)"
                   values="default (0), single (1), manual-multiple (2), multiple (3)" />
         <property name="auth-retries"
-                  nmcli-description="The number of retries for the authentication. Zero means to try indefinitely; -1 means to use a global default. If the global default is not set, the authentication retries for 3 times before failing the connection. Currently, this only applies to 802-1x authentication."
+                  nmcli-description="The number of retries for the authentication. Zero means to try indefinitely; -1 means to use a global default. If the global default is not set, the authentication retries for 3 times before failing the connection. Connections using a pre-shared key to authenticate will only prompt for a new key during the last authentication attempt."
                   format="integer"
                   values="-1 - 2147483647" />
         <property name="timestamp"
@@ -1424,10 +1424,10 @@
                   format="boolean"
                   values="true/yes/on, false/no/off" />
         <property name="dhcp-client-id"
-                  nmcli-description="A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string (&apos;aa:bb:cc&apos;) it is interpreted as a binary client ID, in which case the first byte is assumed to be the &apos;type&apos; field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. &apos;01:xx:xx:xx:xx:xx:xx&apos; where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the &apos;type&apos; field is set to 0. The special values &quot;mac&quot; and &quot;perm-mac&quot; are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value &quot;ipv6-duid&quot; uses the DUID from &quot;ipv6.dhcp-duid&quot; property as an RFC4361-compliant client identifier. As IAID it uses &quot;ipv4.dhcp-iaid&quot; and falls back to &quot;ipv6.dhcp-iaid&quot; if unset. The special value &quot;duid&quot; generates a RFC4361-compliant client identifier based on &quot;ipv4.dhcp-iaid&quot; and uses a DUID generated by hashing /etc/machine-id. The special value &quot;stable&quot; is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the &quot;${DEVICE}&quot; or &quot;${MAC}&quot; specifier to get a per-device key. The special value &quot;none&quot; prevents any client identifier from being sent. Note that this is normally not recommended. If unset, a globally configured default from NetworkManager.conf is used. If still unset, the default depends on the DHCP plugin. The internal dhcp client will default to &quot;mac&quot; and the dhclient plugin will try to use one from its config file if present, or won&apos;t sent any client-id otherwise."
+                  nmcli-description="A string sent to the DHCP server to identify the local machine which the DHCP server may use to customize the DHCP lease and options. When the property is a hex string (&apos;aa:bb:cc&apos;) it is interpreted as a binary client ID, in which case the first byte is assumed to be the &apos;type&apos; field as per RFC 2132 section 9.14 and the remaining bytes may be an hardware address (e.g. &apos;01:xx:xx:xx:xx:xx:xx&apos; where 1 is the Ethernet ARP type and the rest is a MAC address). If the property is not a hex string it is considered as a non-hardware-address client ID and the &apos;type&apos; field is set to 0. The special values &quot;mac&quot; and &quot;perm-mac&quot; are supported, which use the current or permanent MAC address of the device to generate a client identifier with type ethernet (01). Currently, these options only work for ethernet type of links. The special value &quot;ipv6-duid&quot; uses the DUID from &quot;ipv6.dhcp-duid&quot; property as an RFC4361-compliant client identifier. As IAID it uses &quot;ipv4.dhcp-iaid&quot; and falls back to &quot;ipv6.dhcp-iaid&quot; if unset. The special value &quot;duid&quot; generates a RFC4361-compliant client identifier based on &quot;ipv4.dhcp-iaid&quot; and uses a DUID generated by hashing /etc/machine-id. The special value &quot;stable&quot; is supported to generate a type 0 client identifier based on the stable-id (see connection.stable-id) and a per-host key. If you set the stable-id, you may want to include the &quot;${DEVICE}&quot; or &quot;${MAC}&quot; specifier to get a per-device key. The special value &quot;none&quot; prevents any client identifier from being sent. Note that this is normally not recommended. If unset, a globally configured default from NetworkManager.conf is used. If still unset, internal dhcp client will default to &quot;mac&quot;."
                   format="string" />
         <property name="dhcp-iaid"
-                  nmcli-description="A string containing the &quot;Identity Association Identifier&quot; (IAID) used by the DHCP client. The string can be a 32-bit number (either decimal, hexadecimal or as colon separated hexadecimal numbers). Alternatively it can be set to the special values &quot;mac&quot;, &quot;perm-mac&quot;, &quot;ifname&quot; or &quot;stable&quot;. When set to &quot;mac&quot; (or &quot;perm-mac&quot;), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to &quot;ifname&quot;, the IAID is computed by hashing the interface name. The special value &quot;stable&quot; can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be &quot;ifname&quot;. For DHCPv4, the IAID is only used with &quot;ipv4.dhcp-client-id&quot; values &quot;duid&quot; and &quot;ipv6-duid&quot; to generate the client-id. For DHCPv6, note that at the moment this property is only supported by the &quot;internal&quot; DHCPv6 plugin. The &quot;dhclient&quot; DHCPv6 plugin always derives the IAID from the MAC address. The actually used DHCPv6 IAID for a currently activated interface is exposed in the lease information of the device."
+                  nmcli-description="A string containing the &quot;Identity Association Identifier&quot; (IAID) used by the DHCP client. The string can be a 32-bit number (either decimal, hexadecimal or as colon separated hexadecimal numbers). Alternatively it can be set to the special values &quot;mac&quot;, &quot;perm-mac&quot;, &quot;ifname&quot; or &quot;stable&quot;. When set to &quot;mac&quot; (or &quot;perm-mac&quot;), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to &quot;ifname&quot;, the IAID is computed by hashing the interface name. The special value &quot;stable&quot; can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be &quot;ifname&quot;. For DHCPv4, the IAID is only used with &quot;ipv4.dhcp-client-id&quot; values &quot;duid&quot; and &quot;ipv6-duid&quot; to generate the client-id. For DHCPv6, note that at the moment this property is only supported by the &quot;internal&quot; DHCPv6 plugin. The actually used DHCPv6 IAID for a currently activated interface is exposed in the lease information of the device."
                   format="string" />
         <property name="dhcp-dscp"
                   nmcli-description="Specifies the value for the DSCP field (traffic class) of the IP header. When empty, the global default value is used; if no global default is specified, it is assumed to be &quot;CS0&quot;. Allowed values are: &quot;CS0&quot;, &quot;CS4&quot; and &quot;CS6&quot;. The property is currently valid only for IPv4, and it is supported only by the &quot;internal&quot; DHCP plugin."
@@ -1469,12 +1469,12 @@
                   format="boolean"
                   values="true/yes/on, false/no/off" />
         <property name="required-timeout"
-                  nmcli-description="The minimum time interval in milliseconds for which dynamic IP configuration should be tried before the connection succeeds. This property is useful for example if both IPv4 and IPv6 are enabled and are allowed to fail. Normally the connection succeeds as soon as one of the two address families completes; by setting a required timeout for e.g. IPv4, one can ensure that even if IP6 succeeds earlier than IPv4, NetworkManager waits some time for IPv4 before the connection becomes active. Note that if &quot;may-fail&quot; is FALSE for the same address family, this property has no effect as NetworkManager needs to wait for the full DHCP timeout. A zero value means that no required timeout is present, -1 means the default value (either configuration ipvx.required-timeout override or zero)."
+                  nmcli-description="The minimum time interval in milliseconds for which dynamic IP configuration should be tried before the connection succeeds. This property is useful for example if both IPv4 and IPv6 are enabled and are allowed to fail. Normally the connection succeeds as soon as one of the two address families completes; by setting a required timeout for e.g. IPv4, one can ensure that even if IPv6 succeeds earlier than IPv4, NetworkManager waits some time for IPv4 before the connection becomes active. Note that if &quot;may-fail&quot; is FALSE for the same address family, this property has no effect as NetworkManager needs to wait for the full DHCP timeout. A zero value means that no required timeout is present, -1 means the default value (either configuration ipvx.required-timeout override or zero)."
                   format="integer"
                   values="-1 - 2147483647"
                   special-values="default (-1), infinity (2147483647)" />
         <property name="dad-timeout"
-                  nmcli-description="Maximum timeout in milliseconds used to check for the presence of duplicate IP addresses on the network.  If an address conflict is detected, the activation will fail. The property is currently implemented only for IPv4. A zero value means that no duplicate address detection is performed, -1 means the default value (either the value configured globally in NetworkManger.conf or 200ms).  A value greater than zero is a timeout in milliseconds.  Note that the time intervals are subject to randomization as per RFC 5227 and so the actual duration can be between half and the full time specified in this property."
+                  nmcli-description="Maximum timeout in milliseconds used to check for the presence of duplicate IP addresses on the network.  If an address conflict is detected, the activation will fail. The property is currently implemented only for IPv4. A zero value means that no duplicate address detection is performed, -1 means the default value (either the value configured globally in NetworkManager.conf or 200ms).  A value greater than zero is a timeout in milliseconds.  Note that the time intervals are subject to randomization as per RFC 5227 and so the actual duration can be between half and the full time specified in this property."
                   format="integer"
                   values="-1 - 30000"
                   special-values="default (-1), off (0)" />
@@ -1482,9 +1482,13 @@
                   nmcli-description="The Vendor Class Identifier DHCP option (60). Special characters in the data string may be escaped using C-style escapes, nevertheless this property cannot contain nul bytes. If the per-profile value is unspecified (the default), a global connection default gets consulted. If still unspecified, the DHCP option is not sent to the server."
                   format="string" />
         <property name="dhcp-ipv6-only-preferred"
-                  nmcli-description="Controls the &quot;IPv6-Only Preferred&quot; DHCPv4 option (RFC 8925). When set to &quot;yes&quot; (1), the host adds the option to the parameter request list; if the DHCP server sends the option back, the host stops the DHCP client for the time interval specified in the option. Enable this feature if the host supports an IPv6-only mode, i.e. either all applications are IPv6-only capable or there is a form of 464XLAT deployed. When set to &quot;default&quot; (-1), the actual value is looked up in the global configuration; if not specified, it defaults to &quot;no&quot; (0). If the connection has IPv6 method set to &quot;disabled&quot;, this property does not have effect and the &quot;IPv6-Only Preferred&quot; option is always disabled."
+                  nmcli-description="Controls the &quot;IPv6-Only Preferred&quot; DHCPv4 option (option 108 - RFC 8925). When set to &quot;yes&quot; (1), the host adds the option to the parameter request list; if the DHCP server sends the option back, the host stops the DHCP client for the time interval specified in the option. Enable this feature if the host supports an IPv6-only mode, i.e. either all applications are IPv6-only capable or there is a form of CLAT (464XLAT) deployed. If set to &quot;auto&quot; (2), the option is automatically turned on when the IPv6 method is &quot;auto&quot; and the connection profile has ipv4.clat set to &quot;yes&quot; or &quot;auto&quot;. If these two conditions are met, the host can operate in IPv6-only mode and therefore it is safe to disable DHCPv4 when the network also supports it. When set to &quot;default&quot; (-1), the actual value is looked up in the global configuration; if not specified, it defaults to &quot;auto&quot; (2). If the connection has IPv6 method set to &quot;disabled&quot;, this property does not have effect and the &quot;IPv6-Only Preferred&quot; option is always disabled."
                   format="choice (NMSettingIP4DhcpIpv6OnlyPreferred)"
-                  values="default (-1), no (0), yes (1)" />
+                  values="default (-1), no (0), yes (1), auto (2)" />
+        <property name="clat"
+                  nmcli-description="Controls the CLAT (Customer-side translator) functionality. CLAT is used to implement the client part of 464XLAT (RFC 6877), an architecture that provides IPv4 connectivity to hosts on IPv6-only networks. When CLAT is enabled, NetworkManager discovers the NAT64 prefix from IPv6 Router Advertisements; if a NAT64 prefix is announced, NetworkManager installs a BPF program to perform the stateless translation of packets between IPv4 and IPv6. Setting &quot;no&quot; (0) completely disables CLAT. &quot;auto&quot; (1) enables CLAT only when the IPv4 method is &apos;auto&apos; and the device doesn&apos;t have a native IPv4 gateway. &quot;force&quot; (2) enables CLAT even if the IPv4 method is not &apos;auto&apos; and even if the device has a native IPv4 gateway. When set to &quot;default&quot; (-1), the actual value is looked up in the global configuration; if not specified it defaults to &quot;no&quot; (0). In the future the default fall back value will change to &quot;auto&quot; (1)."
+                  format="choice (NMSettingIp4ConfigClat)"
+                  values="default (-1), no (0), auto (1), force (2)" />
         <property name="link-local"
                   nmcli-description="Enable and disable the IPv4 link-local configuration independently of the ipv4.method configuration. This allows a link-local address (169.254.x.y/16) to be obtained in addition to other addresses, such as those manually configured or obtained from a DHCP server. When set to &quot;auto&quot;, the value is dependent on &quot;ipv4.method&quot;. When set to &quot;default&quot;, it honors the global connection default, before falling back to &quot;auto&quot;. Note that if &quot;ipv4.method&quot; is &quot;disabled&quot;, then link local addressing is always disabled too. The default is &quot;default&quot;. Since 1.52, when set to &quot;fallback&quot;, a link-local address is obtained if no other IPv4 address is set."
                   format="choice (NMSettingIP4LinkLocal)"
@@ -1574,7 +1578,7 @@
                   format="boolean"
                   values="true/yes/on, false/no/off" />
         <property name="required-timeout"
-                  nmcli-description="The minimum time interval in milliseconds for which dynamic IP configuration should be tried before the connection succeeds. This property is useful for example if both IPv4 and IPv6 are enabled and are allowed to fail. Normally the connection succeeds as soon as one of the two address families completes; by setting a required timeout for e.g. IPv4, one can ensure that even if IP6 succeeds earlier than IPv4, NetworkManager waits some time for IPv4 before the connection becomes active. Note that if &quot;may-fail&quot; is FALSE for the same address family, this property has no effect as NetworkManager needs to wait for the full DHCP timeout. A zero value means that no required timeout is present, -1 means the default value (either configuration ipvx.required-timeout override or zero)."
+                  nmcli-description="The minimum time interval in milliseconds for which dynamic IP configuration should be tried before the connection succeeds. This property is useful for example if both IPv4 and IPv6 are enabled and are allowed to fail. Normally the connection succeeds as soon as one of the two address families completes; by setting a required timeout for e.g. IPv4, one can ensure that even if IPv6 succeeds earlier than IPv4, NetworkManager waits some time for IPv4 before the connection becomes active. Note that if &quot;may-fail&quot; is FALSE for the same address family, this property has no effect as NetworkManager needs to wait for the full DHCP timeout. A zero value means that no required timeout is present, -1 means the default value (either configuration ipvx.required-timeout override or zero)."
                   format="integer"
                   values="-1 - 2147483647"
                   special-values="default (-1), infinity (2147483647)" />
@@ -1609,10 +1613,10 @@
                   nmcli-description="A IPv6 address followed by a slash and a prefix length. If set, the value is sent to the DHCPv6 server as hint indicating the prefix delegation (IA_PD) we want to receive. To only hint a prefix length without prefix, set the address part to the zero address (for example &quot;::/60&quot;)."
                   format="string" />
         <property name="dhcp-duid"
-                  nmcli-description="A string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried in the Client Identifier option. If the property is a hex string (&apos;aa:bb:cc&apos;) it is interpreted as a binary DUID and filled as an opaque value in the Client Identifier option. The special value &quot;lease&quot; will retrieve the DUID previously used from the lease file belonging to the connection. If no DUID is found and &quot;dhclient&quot; is the configured dhcp client, the DUID is searched in the system-wide dhclient lease file. If still no DUID is found, or another dhcp client is used, a global and permanent DUID-UUID (RFC 6355) will be generated based on the machine-id. The special values &quot;llt&quot; and &quot;ll&quot; will generate a DUID of type LLT or LL (see RFC 3315) based on the current MAC address of the device. In order to try providing a stable DUID-LLT, the time field will contain a constant timestamp that is used globally (for all profiles) and persisted to disk. The special values &quot;stable-llt&quot;, &quot;stable-ll&quot; and &quot;stable-uuid&quot; will generate a DUID of the corresponding type, derived from the connection&apos;s stable-id and a per-host unique key. You may want to include the &quot;${DEVICE}&quot; or &quot;${MAC}&quot; specifier in the stable-id, in case this profile gets activated on multiple devices. So, the link-layer address of &quot;stable-ll&quot; and &quot;stable-llt&quot; will be a generated address derived from the stable id. The DUID-LLT time value in the &quot;stable-llt&quot; option will be picked among a static timespan of three years (the upper bound of the interval is the same constant timestamp used in &quot;llt&quot;). When the property is unset, the global value provided for &quot;ipv6.dhcp-duid&quot; is used. If no global value is provided, the default &quot;lease&quot; value is assumed."
+                  nmcli-description="A string containing the DHCPv6 Unique Identifier (DUID) used by the dhcp client to identify itself to DHCPv6 servers (RFC 3315). The DUID is carried in the Client Identifier option. If the property is a hex string (&apos;aa:bb:cc&apos;) it is interpreted as a binary DUID and filled as an opaque value in the Client Identifier option. The special value &quot;lease&quot; will retrieve the DUID previously used from the lease file belonging to the connection. If no DUID is found, a global and permanent DUID-UUID (RFC 6355) will be generated based on the machine-id. The special values &quot;llt&quot; and &quot;ll&quot; will generate a DUID of type LLT or LL (see RFC 3315) based on the current MAC address of the device. In order to try providing a stable DUID-LLT, the time field will contain a constant timestamp that is used globally (for all profiles) and persisted to disk. The special values &quot;stable-llt&quot;, &quot;stable-ll&quot; and &quot;stable-uuid&quot; will generate a DUID of the corresponding type, derived from the connection&apos;s stable-id and a per-host unique key. You may want to include the &quot;${DEVICE}&quot; or &quot;${MAC}&quot; specifier in the stable-id, in case this profile gets activated on multiple devices. So, the link-layer address of &quot;stable-ll&quot; and &quot;stable-llt&quot; will be a generated address derived from the stable id. The DUID-LLT time value in the &quot;stable-llt&quot; option will be picked among a static timespan of three years (the upper bound of the interval is the same constant timestamp used in &quot;llt&quot;). When the property is unset, the global value provided for &quot;ipv6.dhcp-duid&quot; is used. If no global value is provided, the default &quot;lease&quot; value is assumed."
                   format="string" />
         <property name="dhcp-iaid"
-                  nmcli-description="A string containing the &quot;Identity Association Identifier&quot; (IAID) used by the DHCP client. The string can be a 32-bit number (either decimal, hexadecimal or as colon separated hexadecimal numbers). Alternatively it can be set to the special values &quot;mac&quot;, &quot;perm-mac&quot;, &quot;ifname&quot; or &quot;stable&quot;. When set to &quot;mac&quot; (or &quot;perm-mac&quot;), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to &quot;ifname&quot;, the IAID is computed by hashing the interface name. The special value &quot;stable&quot; can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be &quot;ifname&quot;. For DHCPv4, the IAID is only used with &quot;ipv4.dhcp-client-id&quot; values &quot;duid&quot; and &quot;ipv6-duid&quot; to generate the client-id. For DHCPv6, note that at the moment this property is only supported by the &quot;internal&quot; DHCPv6 plugin. The &quot;dhclient&quot; DHCPv6 plugin always derives the IAID from the MAC address. The actually used DHCPv6 IAID for a currently activated interface is exposed in the lease information of the device."
+                  nmcli-description="A string containing the &quot;Identity Association Identifier&quot; (IAID) used by the DHCP client. The string can be a 32-bit number (either decimal, hexadecimal or as colon separated hexadecimal numbers). Alternatively it can be set to the special values &quot;mac&quot;, &quot;perm-mac&quot;, &quot;ifname&quot; or &quot;stable&quot;. When set to &quot;mac&quot; (or &quot;perm-mac&quot;), the last 4 bytes of the current (or permanent) MAC address are used as IAID. When set to &quot;ifname&quot;, the IAID is computed by hashing the interface name. The special value &quot;stable&quot; can be used to generate an IAID based on the stable-id (see connection.stable-id), a per-host key and the interface name. When the property is unset, the value from global configuration is used; if no global default is set then the IAID is assumed to be &quot;ifname&quot;. For DHCPv4, the IAID is only used with &quot;ipv4.dhcp-client-id&quot; values &quot;duid&quot; and &quot;ipv6-duid&quot; to generate the client-id. For DHCPv6, note that at the moment this property is only supported by the &quot;internal&quot; DHCPv6 plugin. The actually used DHCPv6 IAID for a currently activated interface is exposed in the lease information of the device."
                   format="string" />
         <property name="dhcp-timeout"
                   nmcli-description="A timeout for a DHCP transaction in seconds. If zero (the default), a globally configured default is used. If still unspecified, a device specific timeout is used (usually 45 seconds). Set to 2147483647 (MAXINT32) for infinity."
diff --git a/src/nmcli/general.c b/src/nmcli/general.c
index a2772ca3..11704020 100644
--- a/src/nmcli/general.c
+++ b/src/nmcli/general.c
@@ -1486,6 +1486,24 @@ ac_overview(NmCli *nmc, NMActiveConnection *ac)
             }
         }
     }
+
+    {
+        NMIPConfig *ip4 = nm_active_connection_get_ip4_config(ac);
+        NMIPConfig *ip6 = nm_active_connection_get_ip6_config(ac);
+        const char *clat4;
+        const char *clat6;
+        const char *pref64;
+
+        if (ip4 && ip6) {
+            clat4  = nm_ip_config_get_clat_address(ip4);
+            clat6  = nm_ip_config_get_clat_address(ip6);
+            pref64 = nm_ip_config_get_clat_pref64(ip6);
+
+            if (clat4 && clat6 && pref64) {
+                nmc_print("\tclat inet4 %s inet6 %s pref64 %s\n", clat4, clat6, pref64);
+            }
+        }
+    }
 }
 
 void
diff --git a/src/nmcli/utils.c b/src/nmcli/utils.c
index a613c28f..7048b231 100644
--- a/src/nmcli/utils.c
+++ b/src/nmcli/utils.c
@@ -38,6 +38,14 @@ _meta_type_nmc_generic_info_get_name(const NMMetaAbstractInfo *abstract_info, gb
     return info->name;
 }
 
+static const char *
+_meta_type_nmc_generic_info_get_alias(const NMMetaAbstractInfo *abstract_info)
+{
+    const NmcMetaGenericInfo *info = (const NmcMetaGenericInfo *) abstract_info;
+
+    return info->alias;
+}
+
 static const NMMetaAbstractInfo *const *
 _meta_type_nmc_generic_info_get_nested(const NMMetaAbstractInfo *abstract_info,
                                        guint                    *out_len,
@@ -101,6 +109,7 @@ _meta_type_nmc_generic_info_get_fcn(const NMMetaAbstractInfo  *abstract_info,
 const NMMetaType nmc_meta_type_generic_info = {
     .type_name  = "nmc-generic-info",
     .get_name   = _meta_type_nmc_generic_info_get_name,
+    .get_alias  = _meta_type_nmc_generic_info_get_alias,
     .get_nested = _meta_type_nmc_generic_info_get_nested,
     .get_fcn    = _meta_type_nmc_generic_info_get_fcn,
 };
@@ -1103,8 +1112,9 @@ _print_fill(const NmcConfig    *nmc_config,
 
             nm_assert(!to_free || value == to_free);
 
-            if ((is_default && nmc_config->overview)
-                || NM_FLAGS_HAS(text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE)) {
+            if (is_default
+                && (nmc_config->overview
+                    || NM_FLAGS_HAS(text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_HIDE))) {
                 /* don't mark the entry for display. This is to shorten the output in case
                  * the property is the default value. But we only do that, if the user
                  * opts in to this behavior (-overview), or of the property marks itself
diff --git a/src/nmcli/utils.h b/src/nmcli/utils.h
index b2539bf4..effb3340 100644
--- a/src/nmcli/utils.h
+++ b/src/nmcli/utils.h
@@ -111,6 +111,7 @@ typedef enum {
     NMC_GENERIC_INFO_TYPE_IP4_CONFIG_DOMAIN,
     NMC_GENERIC_INFO_TYPE_IP4_CONFIG_SEARCHES,
     NMC_GENERIC_INFO_TYPE_IP4_CONFIG_WINS,
+    NMC_GENERIC_INFO_TYPE_IP4_CONFIG_CLAT_ADDRESS,
     _NMC_GENERIC_INFO_TYPE_IP4_CONFIG_NUM,
 
     NMC_GENERIC_INFO_TYPE_IP6_CONFIG_ADDRESS = 0,
@@ -119,6 +120,8 @@ typedef enum {
     NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DNS,
     NMC_GENERIC_INFO_TYPE_IP6_CONFIG_DOMAIN,
     NMC_GENERIC_INFO_TYPE_IP6_CONFIG_SEARCHES,
+    NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_ADDRESS,
+    NMC_GENERIC_INFO_TYPE_IP6_CONFIG_CLAT_PREF64,
     _NMC_GENERIC_INFO_TYPE_IP6_CONFIG_NUM,
 
     NMC_GENERIC_INFO_TYPE_DHCP_CONFIG_OPTION = 0,
@@ -154,6 +157,7 @@ typedef enum {
     NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_CON_PATH,
     NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_ZONE,
     NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_CONTROLLER_PATH,
+    NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_MASTER_PATH,
     _NMC_GENERIC_INFO_TYPE_CON_ACTIVE_GENERAL_NUM,
 
     NMC_GENERIC_INFO_TYPE_CON_VPN_TYPE = 0,
@@ -257,6 +261,7 @@ struct _NmcMetaGenericInfo {
     NmcGenericInfoType               info_type;
     const char                      *name;
     const char                      *name_header;
+    const char                      *alias;
     const NmcMetaGenericInfo *const *nested;
 
 #define NMC_META_GENERIC_INFO_GET_FCN_ARGS                                     \