about summary refs log tree commit diff
path: root/src/nmcli
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2025-02-12 13:46:55 +0100
committerMichael Biebl <biebl@debian.org>2025-02-12 13:46:55 +0100
commitec170f43021cdc93a65151f4646875cd3aa42a13 (patch)
treeedd6f226af21951b7b4ae1954308594413610513 /src/nmcli
parentd5d9f6796c16f29776c619f464811917e46521f4 (diff)
parent8bdf070ff046f482f6eb5e2b15ebc216f5d1e3da (diff)
Update upstream source from tag 'upstream/1.51.90'
Update to upstream version '1.51.90'
with Debian dir 5ed61494ac9853892cd39fb1e4debd23f234a5b9
Diffstat (limited to 'src/nmcli')
-rw-r--r--src/nmcli/common.c8
-rw-r--r--src/nmcli/common.h2
-rw-r--r--src/nmcli/connections.c45
-rw-r--r--src/nmcli/devices.c24
-rw-r--r--src/nmcli/gen-metadata-nm-settings-nmcli.c13
-rw-r--r--src/nmcli/gen-metadata-nm-settings-nmcli.xml.in110
-rw-r--r--src/nmcli/general.c4
-rw-r--r--src/nmcli/settings.c53
-rw-r--r--src/nmcli/settings.h3
-rw-r--r--src/nmcli/utils.c27
-rw-r--r--src/nmcli/utils.h4
11 files changed, 234 insertions, 59 deletions
diff --git a/src/nmcli/common.c b/src/nmcli/common.c
index fbabdffc..2ced70f3 100644
--- a/src/nmcli/common.c
+++ b/src/nmcli/common.c
@@ -355,7 +355,7 @@ print_ip_config(NMIPConfig      *cfg,
     }
 
     if (!nmc_print_table(nmc_config,
-                         (gpointer[]){cfg, NULL},
+                         (gpointer[]) {cfg, NULL},
                          NULL,
                          NULL,
                          addr_family == AF_INET
@@ -386,7 +386,7 @@ print_dhcp_config(NMDhcpConfig    *dhcp,
     }
 
     if (!nmc_print_table(nmc_config,
-                         (gpointer[]){dhcp, NULL},
+                         (gpointer[]) {dhcp, NULL},
                          NULL,
                          NULL,
                          addr_family == AF_INET
@@ -1399,7 +1399,7 @@ call_cmd(NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *c
 
             nmc->should_wait++;
             call  = g_slice_new(CmdCall);
-            *call = (CmdCall){
+            *call = (CmdCall) {
                 .cmd  = cmd,
                 .argc = argc,
                 .argv = nm_strv_dup(argv, argc, TRUE),
@@ -1430,7 +1430,7 @@ call_cmd(NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *c
 
         nmc->should_wait++;
         call  = g_slice_new(CmdCall);
-        *call = (CmdCall){
+        *call = (CmdCall) {
             .cmd  = cmd,
             .argc = argc,
             .argv = nm_strv_dup(argv, argc, TRUE),
diff --git a/src/nmcli/common.h b/src/nmcli/common.h
index 3784da35..892b2d4e 100644
--- a/src/nmcli/common.h
+++ b/src/nmcli/common.h
@@ -70,7 +70,7 @@ nmc_do_cmd(NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const
 void nmc_complete_strv(const char *prefix, gssize nargs, const char *const *args);
 
 #define nmc_complete_strings(prefix, ...) \
-    nmc_complete_strv((prefix), NM_NARG(__VA_ARGS__), (const char *const[]){__VA_ARGS__})
+    nmc_complete_strv((prefix), NM_NARG(__VA_ARGS__), (const char *const[]) {__VA_ARGS__})
 
 void nmc_complete_bool(const char *prefix);
 
diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c
index 002dd402..bccec3a1 100644
--- a/src/nmcli/connections.c
+++ b/src/nmcli/connections.c
@@ -113,7 +113,7 @@ _add_connection_info_new(NmCli *nmc, NMConnection *orig_connection, NMConnection
     AddConnectionInfo *info;
 
     info  = g_slice_new(AddConnectionInfo);
-    *info = (AddConnectionInfo){
+    *info = (AddConnectionInfo) {
         .nmc       = nmc,
         .orig_id   = orig_connection ? g_strdup(nm_connection_get_id(orig_connection)) : NULL,
         .orig_uuid = orig_connection ? g_strdup(nm_connection_get_uuid(orig_connection)) : NULL,
@@ -1075,7 +1075,7 @@ const NmcMetaGenericInfo
     "," NM_SETTING_PROXY_SETTING_NAME "," NM_SETTING_TC_CONFIG_SETTING_NAME            \
     "," NM_SETTING_SRIOV_SETTING_NAME "," NM_SETTING_ETHTOOL_SETTING_NAME              \
     "," NM_SETTING_OVS_DPDK_SETTING_NAME "," NM_SETTING_HOSTNAME_SETTING_NAME          \
-    "," NM_SETTING_HSR_SETTING_NAME
+    "," NM_SETTING_HSR_SETTING_NAME "," NM_SETTING_IPVLAN_SETTING_NAME
 /* NM_SETTING_DUMMY_SETTING_NAME NM_SETTING_WIMAX_SETTING_NAME */
 
 const NmcMetaGenericInfo *const nmc_fields_con_active_details_groups[] = {
@@ -1763,7 +1763,7 @@ nmc_active_connection_details(NMActiveConnection *acon, NmCli *nmc)
 
             nmc_print_table(
                 &nmc->nmc_config,
-                (gpointer[]){acon, NULL},
+                (gpointer[]) {acon, NULL},
                 NULL,
                 NULL,
                 NMC_META_GENERIC_GROUP("GENERAL", metagen_con_active_general, N_("GROUP")),
@@ -1820,7 +1820,7 @@ nmc_active_connection_details(NMActiveConnection *acon, NmCli *nmc)
         if (nmc_fields_con_active_details_groups[group_idx]->nested == metagen_con_active_vpn) {
             if (NM_IS_VPN_CONNECTION(acon)) {
                 nmc_print_table(&nmc->nmc_config,
-                                (gpointer[]){acon, NULL},
+                                (gpointer[]) {acon, NULL},
                                 NULL,
                                 NULL,
                                 NMC_META_GENERIC_GROUP("VPN", metagen_con_active_vpn, N_("NAME")),
@@ -1883,8 +1883,23 @@ split_required_fields_for_con_show(const char *input,
         for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
             if (is_all || is_common
                 || !g_ascii_strcasecmp(s_mutable, nm_meta_setting_infos[i].setting_name)) {
-                if (dot)
+                gs_free char *to_free = NULL;
+
+                if (dot) {
+                    /* If there was a dot we have 'setting.property'. Some properties has different
+                     * name for the user than internally in libnm and D-Bus. Make the conversion
+                     * from user names to libnm names.
+                     */
+                    const char *prop_user = dot + 1;
+                    const char *prop_libnm =
+                        nmc_setting_propname_user_to_libnm(s_mutable, prop_user);
+                    if (prop_user != prop_libnm) {
+                        to_free   = g_strdup_printf("%s.%s", s_mutable, prop_libnm);
+                        s_mutable = to_free;
+                    }
                     *dot = '.';
+                }
+
                 g_string_append(str1, s_mutable);
                 g_string_append_c(str1, ',');
                 found = TRUE;
@@ -3143,9 +3158,6 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const
     const char           *pwds       = NULL;
     gs_free_error GError *error      = NULL;
     gs_strfreev char    **arg_arr    = NULL;
-    int                   arg_num;
-    const char *const   **argv_ptr;
-    int                  *argc_ptr;
 
     /*
      * Set default timeout for connection activation.
@@ -3155,8 +3167,6 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const
         nmc->timeout = 90;
 
     next_arg(nmc, &argc, &argv, NULL);
-    argv_ptr = &argv;
-    argc_ptr = &argc;
 
     if (argc == 0 && nmc->ask) {
         gs_free char *line = NULL;
@@ -3165,13 +3175,12 @@ do_connection_up(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const
         g_return_if_fail(!nmc->complete);
 
         line = nmc_readline(&nmc->nmc_config, PROMPT_CONNECTION);
-        nmc_string_to_arg_array(line, NULL, TRUE, &arg_arr, &arg_num);
-        argv_ptr = (const char *const **) &arg_arr;
-        argc_ptr = &arg_num;
+        nmc_string_to_arg_array(line, NULL, TRUE, &arg_arr, &argc);
+        argv = (const char *const *) arg_arr;
     }
 
     if (argc > 0 && !nm_streq(*argv, "ifname")) {
-        connection = get_connection(nmc, argc_ptr, argv_ptr, NULL, NULL, NULL, &error);
+        connection = get_connection(nmc, &argc, &argv, NULL, NULL, NULL, &error);
         if (!connection) {
             g_string_printf(nmc->return_text, _("Error: %s."), error->message);
             nmc->return_value = error->code;
@@ -4398,7 +4407,7 @@ set_property(NMClient              *client,
     }
 
     /* Don't ask for this property in interactive mode. */
-    disable_options(setting_name, property_name);
+    disable_options(setting_name, nmc_setting_propname_user_to_libnm(setting_name, property_name));
 
     return TRUE;
 }
@@ -6919,7 +6928,7 @@ nmcli_editor_tab_completion(const char *text, int start, int end)
     return match_array;
 }
 
-#define NMCLI_EDITOR_HISTORY ".nmcli-history"
+#define NMCLI_EDITOR_HISTORY "nmcli-history"
 
 static void
 load_history_cmds(const char *uuid)
@@ -6931,7 +6940,7 @@ load_history_cmds(const char *uuid)
     size_t    i;
     GError   *err = NULL;
 
-    filename = g_build_filename(g_get_home_dir(), NMCLI_EDITOR_HISTORY, NULL);
+    filename = g_build_filename(g_get_user_cache_dir(), NMCLI_EDITOR_HISTORY, NULL);
     kf       = g_key_file_new();
     if (!g_key_file_load_from_file(kf, filename, G_KEY_FILE_KEEP_COMMENTS, &err)) {
         if (g_error_matches(err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE))
@@ -6967,7 +6976,7 @@ save_history_cmds(const char *uuid)
     if (!hist)
         return;
 
-    filename = g_build_filename(g_get_home_dir(), NMCLI_EDITOR_HISTORY, NULL);
+    filename = g_build_filename(g_get_user_cache_dir(), NMCLI_EDITOR_HISTORY, NULL);
 
     kf = g_key_file_new();
 
diff --git a/src/nmcli/devices.c b/src/nmcli/devices.c
index f6163757..b308e440 100644
--- a/src/nmcli/devices.c
+++ b/src/nmcli/devices.c
@@ -1675,7 +1675,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
 
             nmc_print_table(
                 &nmc->nmc_config,
-                (gpointer[]){device, NULL},
+                (gpointer[]) {device, NULL},
                 NULL,
                 NULL,
                 NMC_META_GENERIC_GROUP("GENERAL", metagen_device_detail_general, N_("NAME")),
@@ -1690,7 +1690,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
             gs_free char *f = section_fld ? g_strdup_printf("CAPABILITIES.%s", section_fld) : NULL;
 
             nmc_print_table(&nmc->nmc_config,
-                            (gpointer[]){device, NULL},
+                            (gpointer[]) {device, NULL},
                             NULL,
                             NULL,
                             NMC_META_GENERIC_GROUP("CAPABILITIES",
@@ -1708,7 +1708,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
                 section_fld ? g_strdup_printf("INTERFACE-FLAGS.%s", section_fld) : NULL;
 
             nmc_print_table(&nmc->nmc_config,
-                            (gpointer[]){device, NULL},
+                            (gpointer[]) {device, NULL},
                             NULL,
                             NULL,
                             NMC_META_GENERIC_GROUP("INTERFACE-FLAGS",
@@ -1727,7 +1727,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
                     section_fld ? g_strdup_printf("WIFI-PROPERTIES.%s", section_fld) : NULL;
 
                 nmc_print_table(&nmc->nmc_config,
-                                (gpointer[]){device, NULL},
+                                (gpointer[]) {device, NULL},
                                 NULL,
                                 NULL,
                                 NMC_META_GENERIC_GROUP("WIFI-PROPERTIES",
@@ -1791,7 +1791,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
                     section_fld ? g_strdup_printf("WIRED-PROPERTIES.%s", section_fld) : NULL;
 
                 nmc_print_table(&nmc->nmc_config,
-                                (gpointer[]){device, NULL},
+                                (gpointer[]) {device, NULL},
                                 NULL,
                                 NULL,
                                 NMC_META_GENERIC_GROUP("WIRED-PROPERTIES",
@@ -1920,7 +1920,7 @@ show_device_info(NMDevice *device, NmCli *nmc)
             gs_free char *f = section_fld ? g_strdup_printf("CONNECTIONS.%s", section_fld) : NULL;
 
             nmc_print_table(&nmc->nmc_config,
-                            (gpointer[]){device, NULL},
+                            (gpointer[]) {device, NULL},
                             NULL,
                             NULL,
                             NMC_META_GENERIC_GROUP("CONNECTIONS",
@@ -2102,7 +2102,7 @@ add_and_activate_info_new(NmCli      *nmc,
     AddAndActivateInfo *info;
 
     info  = g_slice_new(AddAndActivateInfo);
-    *info = (AddAndActivateInfo){
+    *info = (AddAndActivateInfo) {
         .nmc             = nmc,
         .device          = g_object_ref(device),
         .hotspot         = hotspot,
@@ -2639,7 +2639,7 @@ do_device_modify(const NMCCommand *cmd, NmCli *nmc, int argc, const char *const
     nmc->should_wait++;
 
     info  = g_slice_new(ModifyInfo);
-    *info = (ModifyInfo){
+    *info = (ModifyInfo) {
         .nmc  = nmc,
         .argc = argc,
         .argv = nm_strv_dup(argv, argc, TRUE),
@@ -3535,7 +3535,7 @@ do_device_wifi_list(const NMCCommand *cmd, NmCli *nmc, int argc, const char *con
     }
 
     scan_info  = g_slice_new(ScanInfo);
-    *scan_info = (ScanInfo){
+    *scan_info = (ScanInfo) {
         .out_indices        = g_array_ref(out_indices),
         .tmpl               = tmpl,
         .bssid_user         = g_strdup(bssid_user),
@@ -3557,7 +3557,7 @@ do_device_wifi_list(const NMCCommand *cmd, NmCli *nmc, int argc, const char *con
             timeout_msec = 15000;
 
         wifi_list_data  = g_slice_new(WifiListData);
-        *wifi_list_data = (WifiListData){
+        *wifi_list_data = (WifiListData) {
             .wifi       = wifi,
             .scan_info  = scan_info,
             .timeout_id = g_timeout_add(timeout_msec, wifi_list_scan_timeout, wifi_list_data),
@@ -4113,7 +4113,7 @@ generate_wpa_key(char *key, size_t len)
         int c;
 
         do {
-            c = nm_random_u64_range_full(48, 122, TRUE);
+            c = nm_random_u64_range(48, 122);
             /* skip characters that look similar */
         } while (NM_IN_SET(c, '1', 'l', 'I', '0', 'O', 'Q', '8', 'B', '5', 'S')
                  || !g_ascii_isalnum(c));
@@ -4136,7 +4136,7 @@ generate_wep_key(char *key, size_t len)
     for (i = 0; i < 10; i++) {
         int digit;
 
-        digit  = nm_random_u64_range_full(0, 16, TRUE);
+        digit  = nm_random_u64_range(0, 16);
         key[i] = hexdigits[digit];
     }
     key[10] = '\0';
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.c b/src/nmcli/gen-metadata-nm-settings-nmcli.c
index 1764da73..2ba95995 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.c
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.c
@@ -124,6 +124,8 @@ get_ethtool_format(const NMMetaPropertyInfo *prop_info)
     case NM_ETHTOOL_TYPE_PAUSE:
     case NM_ETHTOOL_TYPE_EEE:
         return g_strdup("ternary");
+    case NM_ETHTOOL_TYPE_FEC:
+        return g_strdup("flags (NMSettingEthtoolFecMode)");
     case NM_ETHTOOL_TYPE_UNKNOWN:
         nm_assert_not_reached();
     };
@@ -158,6 +160,8 @@ get_multilist_format(const NMMetaPropertyInfo *prop_info)
             return g_strdup("list of IPv4 addresses");
         case NM_META_PROPERTY_TYPE_FORMAT_IPV6:
             return g_strdup("list of IPv6 addresses");
+        case NM_META_PROPERTY_TYPE_FORMAT_IPV4_IPV6:
+            return g_strdup("list of IPv4 or IPv6 addresses");
         default:
             prop_abort(prop_info, "unsupported item format (%d)", item_fmt);
             break;
@@ -198,6 +202,8 @@ get_property_format(const NMMetaPropertyInfo *prop_info)
         return g_strdup("IPv4 address");
     case NM_META_PROPERTY_TYPE_FORMAT_IPV6:
         return g_strdup("IPv6 address");
+    case NM_META_PROPERTY_TYPE_FORMAT_IPV4_IPV6:
+        return g_strdup("IPv4 or IPv6 address");
     case NM_META_PROPERTY_TYPE_FORMAT_BYTES:
         return g_strdup("bytes");
     case NM_META_PROPERTY_TYPE_FORMAT_PATH:
@@ -330,6 +336,13 @@ append_ethtool_valid_values(const NMMetaPropertyInfo *prop_info, GPtrArray *vali
     case NM_ETHTOOL_TYPE_EEE:
         append_vals(valid_values, "on", "off", "ignore");
         break;
+    case NM_ETHTOOL_TYPE_FEC:
+        _append_enum_valid_values(NM_TYPE_SETTING_ETHTOOL_FEC_MODE,
+                                  0,
+                                  G_MAXUINT,
+                                  NULL,
+                                  valid_values);
+        break;
     case NM_ETHTOOL_TYPE_UNKNOWN:
         nm_assert_not_reached();
     }
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
index ae3a388b..9aa1751e 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -629,7 +629,7 @@
                   alias="type"
                   nmcli-description="Base type of the connection. For hardware-dependent connections, should contain the setting name of the hardware-type specific setting (ie, &quot;802-3-ethernet&quot; or &quot;802-11-wireless&quot; or &quot;bluetooth&quot;, etc), and for non-hardware dependent connections like VPN or otherwise, should contain the setting name of that setting type (ie, &quot;vpn&quot; or &quot;bridge&quot;, etc)."
                   format="string"
-                  values="6lowpan, 802-11-olpc-mesh, 802-11-wireless, 802-3-ethernet, adsl, bluetooth, bond, bridge, cdma, dummy, generic, gsm, hsr, infiniband, ip-tunnel, loopback, macsec, macvlan, ovs-bridge, ovs-dpdk, ovs-interface, ovs-patch, ovs-port, pppoe, team, tun, veth, vlan, vpn, vrf, vxlan, wifi-p2p, wimax, wireguard, wpan" />
+                  values="6lowpan, 802-11-olpc-mesh, 802-11-wireless, 802-3-ethernet, adsl, bluetooth, bond, bridge, cdma, dummy, generic, gsm, hsr, infiniband, ip-tunnel, ipvlan, loopback, macsec, macvlan, ovs-bridge, ovs-dpdk, ovs-interface, ovs-patch, ovs-port, pppoe, team, tun, veth, vlan, vpn, vrf, vxlan, wifi-p2p, wimax, wireguard, wpan" />
         <property name="interface-name"
                   alias="ifname"
                   nmcli-description="The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface."
@@ -702,6 +702,17 @@
                   nmcli-description="If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping."
                   format="integer"
                   values="0 - 600" />
+        <property name="ip-ping-timeout"
+                  nmcli-description="If greater than zero, delay success of IP addressing until either the specified timeout (in seconds) is reached, or a target IP address replies to a ping. The property specifies the timeout for the &quot;ip-ping-addresses&quot;. This property is incompatible with &quot;gateway-ping-timeout&quot;, you cannot set these two properties at the same time."
+                  format="integer"
+                  values="0 - 600" />
+        <property name="ip-ping-addresses"
+                  nmcli-description="The property specifies a list of target IP addresses for pinging. When multiple targets are set, NetworkManager will start multiple ping processes in parallel. This property can only be set if connection.ip-ping-timeout is set. The ip-ping-timeout is used to delay the success of IP addressing until either the specified timeout (in seconds) is reached, or an target IP address replies to a ping. Configuring &quot;ip-ping-addresses&quot; may delay reaching the systemd&apos;s network-online.target due to waiting for the ping operations to complete or timeout."
+                  format="list of IPv4 or IPv6 addresses" />
+        <property name="ip-ping-addresses-require-all"
+                  nmcli-description="The property determines whether it is sufficient for any ping check to succeed among &quot;ip-ping-addresses&quot;, or if all ping checks must succeed for &quot;ip-ping-addresses&quot;."
+                  format="choice (NMTernary)"
+                  values="default (-1), false/no (0), true/yes (1)" />
         <property name="metered"
                   nmcli-description="Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately."
                   format="ternary"
@@ -1085,6 +1096,10 @@
         <property name="channels-combined"
                   format="integer"
                   values="0 - 4294967295" />
+        <property name="fec-mode"
+                  nmcli-description="The Forward Error Correction(FEC) encoding modes to set. Not all devices support all options. May be any combination of auto, off, rs, baser, llrs."
+                  format="flags (NMSettingEthtoolFecMode)"
+                  values="auto (0x2), off (0x4), rs (0x8), baser (0x10), llrs (0x20)" />
     </setting>
     <setting name="generic" >
         <property name="device-handler"
@@ -1149,6 +1164,40 @@
         <property name="initial-eps-bearer-apn"
                   nmcli-description="For LTE modems, this sets the APN for the initial EPS bearer that is set up when attaching to the network.  Setting this parameter implies initial-eps-bearer-configure to be TRUE."
                   format="string" />
+        <property name="initial-eps-bearer-username"
+                  nmcli-description="For LTE modems, this sets the username for the initial EPS bearer that is set up when attaching to the network.  Setting this parameter implies initial-eps-bearer-configure to be TRUE."
+                  format="string" />
+        <property name="initial-eps-bearer-password"
+                  nmcli-description="For LTE modems, this sets the password for the initial EPS bearer that is set up when attaching to the network.  Setting this parameter implies initial-eps-bearer-configure to be TRUE."
+                  format="string" />
+        <property name="initial-eps-bearer-password-flags"
+                  nmcli-description="Flags indicating how to handle the &quot;initial-eps-bearer-password&quot; property."
+                  format="flags (NMSettingSecretFlags)"
+                  values="none (0x0), agent-owned (0x1), not-saved (0x2), not-required (0x4)" />
+        <property name="initial-eps-bearer-noauth"
+                  nmcli-description="For LTE modems, this sets NOAUTH authentication method for the initial EPS bearer that is set up when attaching to the network. If TRUE, do not require the other side to authenticate itself to the client. If FALSE, require authentication from the remote side.  In almost all cases, this should be TRUE."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="initial-eps-bearer-refuse-eap"
+                  nmcli-description="For LTE modems, this disables EAP authentication method for the initial EPS bearer that is set up when attaching to the network."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="initial-eps-bearer-refuse-pap"
+                  nmcli-description="For LTE modems, this disables PAP authentication method for the initial EPS bearer that is set up when attaching to the network."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="initial-eps-bearer-refuse-chap"
+                  nmcli-description="For LTE modems, this disables CHAP authentication method for the initial EPS bearer that is set up when attaching to the network."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="initial-eps-bearer-refuse-mschap"
+                  nmcli-description="For LTE modems, this disables MSCHAP authentication method for the initial EPS bearer that is set up when attaching to the network."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="initial-eps-bearer-refuse-mschapv2"
+                  nmcli-description="For LTE modems, this disables MSCHAPV2 authentication method for the initial EPS bearer that is set up when attaching to the network."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
     </setting>
     <setting name="hostname" >
         <property name="priority"
@@ -1276,7 +1325,7 @@
                   format="string"
                   values="auto, link-local, manual, shared, disabled" />
         <property name="dns"
-                  nmcli-description="Array of IP addresses of DNS servers. For DoT (DNS over TLS), the SNI server name can be specified by appending &quot;#example.com&quot; to the IP address of the DNS server. This currently only has effect when using systemd-resolved."
+                  nmcli-description="Array of DNS servers. Each server can be specified either as a plain IP address (optionally followed by a &quot;#&quot; and the SNI server name for DNS over TLS) or with a URI syntax. When it is specified as an URI, the following forms are supported: dns+udp://ADDRESS[:PORT], dns+tls://ADDRESS[:PORT][SERVERNAME] . When using the URI syntax, IPv6 addresses must be enclosed in square brackets (&apos;[&apos;, &apos;]&apos;)."
                   format="list of IPv4 addresses" />
         <property name="dns-search"
                   nmcli-description="List of DNS search domains. Domains starting with a tilde (&apos;~&apos;) are considered &apos;routing&apos; domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting. When set on a profile that also enabled DHCP, the DNS search list received automatically (option 119 for DHCPv4 and option 24 for DHCPv6) gets merged with the manual list. This can be prevented by setting &quot;ignore-auto-dns&quot;. Note that if no DNS searches are configured, the fallback will be derived from the domain from DHCP (option 15)."
@@ -1318,6 +1367,10 @@
                   nmcli-description="Whether the DHCP client will send RELEASE message when bringing the connection down. The default value is &quot;default&quot; (-1). When the default value is specified, then the global value from NetworkManager configuration is looked up, if not set, it is considered as FALSE."
                   format="ternary"
                   values="true/yes/on, false/no/off, default/unknown" />
+        <property name="routed-dns"
+                  nmcli-description="Whether to add routes for DNS servers. When enabled, NetworkManager adds a route for each DNS server that is associated with this connection either statically (defined in the connection profile) or dynamically (for example, retrieved via DHCP). The route guarantees that the DNS server is reached via this interface. When set to &quot;default&quot; (-1), the value from global configuration is used; if no global default is defined, this feature is disabled."
+                  format="choice (NMSettingIPConfigRoutedDns)"
+                  values="default (-1), no (0), yes (1)" />
         <property name="ignore-auto-routes"
                   nmcli-description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured routes are ignored and only routes specified in the &quot;routes&quot; property, if any, are used."
                   format="boolean"
@@ -1342,9 +1395,13 @@
                   values="0 - 2147483647"
                   special-values="default (0), infinity (2147483647)" />
         <property name="dhcp-send-hostname"
-                  nmcli-description="If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the &quot;dhcp-hostname&quot; property is NULL and this property is TRUE, the current persistent hostname of the computer is sent."
+                  nmcli-description="Since 1.52 this property is deprecated and is only used as fallback value for dhcp-send-hostname if it&apos;s set to &apos;default&apos;. This is only done to avoid breaking existing configurations, the new property should be used from now on."
                   format="boolean"
                   values="true/yes/on, false/no/off" />
+        <property name="dhcp-send-hostname-v2"
+                  nmcli-description="If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the dhcp-hostname property is NULL and this property is TRUE, the current persistent hostname of the computer is sent. The default value is default (-1). In this case the global value from NetworkManager configuration is looked up. If it&apos;s not set, the value from dhcp-send-hostname-deprecated, which defaults to TRUE, is used for backwards compatibility. In the future this will change and, in absence of a global default, it will always fallback to TRUE."
+                  format="choice (NMTernary)"
+                  values="default (-1), false/no (0), true/yes (1)" />
         <property name="dhcp-hostname"
                   nmcli-description="If the &quot;dhcp-send-hostname&quot; property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and &quot;dhcp-fqdn&quot; are mutually exclusive and cannot be set at the same time."
                   format="string" />
@@ -1376,10 +1433,14 @@
         <property name="dhcp-vendor-class-identifier"
                   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."
+                  format="choice (NMSettingIP4DhcpIpv6OnlyPreferred)"
+                  values="default (-1), no (0), yes (1)" />
         <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;."
+                  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)"
-                  values="default (0), auto (1), disabled (2), enabled (3)" />
+                  values="default (0), auto (1), disabled (2), enabled (3), fallback (4)" />
         <property name="dhcp-reject-servers"
                   nmcli-description="Array of servers from which DHCP offers must be rejected. This property is useful to avoid getting a lease from misconfigured or rogue servers. For DHCPv4, each element must be an IPv4 address, optionally followed by a slash and a prefix length (e.g. &quot;192.168.122.0/24&quot;). This property is currently not implemented for DHCPv6."
                   format="list of IPv4 addresses" />
@@ -1387,6 +1448,14 @@
                   nmcli-description="VPN connections will default to add the route automatically unless this setting is set to FALSE. For other connection types, adding such an automatic route is currently not supported and setting this to TRUE has no effect."
                   format="ternary"
                   values="true/yes/on, false/no/off, default/unknown" />
+        <property name="shared-dhcp-range"
+                  nmcli-description="This option allows you to specify a custom DHCP range for the shared connection method. The value is expected to be in `&lt;START_ADDRESS&gt;,&lt;END_ADDRESS&gt;` format. The range should be part of network set by ipv4.address option and it should not contain network address or broadcast address. If this option is not specified, the DHCP range will be automatically determined based on the interface address. The range will be selected to be adjacent to the interface address, either before or after it, with the larger possible range being preferred. The range will be adjusted to fill the available address space, except for networks with a prefix length greater than 24, which will be treated as if they have a prefix length of 24."
+                  format="string" />
+        <property name="shared-dhcp-lease-time"
+                  nmcli-description="This option allows you to specify a custom DHCP lease time for the shared connection method in seconds. The value should be either a number between 120 and 31536000 (one year) If this option is not specified, 3600 (one hour) is used. Special values are 0 for default value of 1 hour and 2147483647 (MAXINT32) for infinite lease time."
+                  format="integer"
+                  values="0 - 2147483647"
+                  special-values="default (0), infinity (2147483647)" />
     </setting>
     <setting name="ipv6" >
         <property name="method"
@@ -1394,7 +1463,7 @@
                   format="string"
                   values="ignore, auto, dhcp, link-local, manual, shared, disabled" />
         <property name="dns"
-                  nmcli-description="Array of IP addresses of DNS servers. For DoT (DNS over TLS), the SNI server name can be specified by appending &quot;#example.com&quot; to the IP address of the DNS server. This currently only has effect when using systemd-resolved."
+                  nmcli-description="Array of DNS servers. Each server can be specified either as a plain IP address (optionally followed by a &quot;#&quot; and the SNI server name for DNS over TLS) or with a URI syntax. When it is specified as an URI, the following forms are supported: dns+udp://ADDRESS[:PORT], dns+tls://ADDRESS[:PORT][SERVERNAME] . When using the URI syntax, IPv6 addresses must be enclosed in square brackets (&apos;[&apos;, &apos;]&apos;)."
                   format="list of IPv6 addresses" />
         <property name="dns-search"
                   nmcli-description="List of DNS search domains. Domains starting with a tilde (&apos;~&apos;) are considered &apos;routing&apos; domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names. When using a DNS plugin that supports Conditional Forwarding or Split DNS, then the search domains specify which name servers to query. This makes the behavior different from running with plain /etc/resolv.conf. For more information see also the dns-priority setting. When set on a profile that also enabled DHCP, the DNS search list received automatically (option 119 for DHCPv4 and option 24 for DHCPv6) gets merged with the manual list. This can be prevented by setting &quot;ignore-auto-dns&quot;. Note that if no DNS searches are configured, the fallback will be derived from the domain from DHCP (option 15)."
@@ -1436,6 +1505,10 @@
                   nmcli-description="Whether the DHCP client will send RELEASE message when bringing the connection down. The default value is &quot;default&quot; (-1). When the default value is specified, then the global value from NetworkManager configuration is looked up, if not set, it is considered as FALSE."
                   format="ternary"
                   values="true/yes/on, false/no/off, default/unknown" />
+        <property name="routed-dns"
+                  nmcli-description="Whether to add routes for DNS servers. When enabled, NetworkManager adds a route for each DNS server that is associated with this connection either statically (defined in the connection profile) or dynamically (for example, retrieved via DHCP). The route guarantees that the DNS server is reached via this interface. When set to &quot;default&quot; (-1), the value from global configuration is used; if no global default is defined, this feature is disabled."
+                  format="choice (NMSettingIPConfigRoutedDns)"
+                  values="default (-1), no (0), yes (1)" />
         <property name="ignore-auto-routes"
                   nmcli-description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured routes are ignored and only routes specified in the &quot;routes&quot; property, if any, are used."
                   format="boolean"
@@ -1499,9 +1572,13 @@
                   values="0 - 2147483647"
                   special-values="default (0), infinity (2147483647)" />
         <property name="dhcp-send-hostname"
-                  nmcli-description="If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the &quot;dhcp-hostname&quot; property is NULL and this property is TRUE, the current persistent hostname of the computer is sent."
+                  nmcli-description="Since 1.52 this property is deprecated and is only used as fallback value for dhcp-send-hostname if it&apos;s set to &apos;default&apos;. This is only done to avoid breaking existing configurations, the new property should be used from now on."
                   format="boolean"
                   values="true/yes/on, false/no/off" />
+        <property name="dhcp-send-hostname-v2"
+                  nmcli-description="If TRUE, a hostname is sent to the DHCP server when acquiring a lease. Some DHCP servers use this hostname to update DNS databases, essentially providing a static hostname for the computer.  If the dhcp-hostname property is NULL and this property is TRUE, the current persistent hostname of the computer is sent. The default value is default (-1). In this case the global value from NetworkManager configuration is looked up. If it&apos;s not set, the value from dhcp-send-hostname-deprecated, which defaults to TRUE, is used for backwards compatibility. In the future this will change and, in absence of a global default, it will always fallback to TRUE."
+                  format="choice (NMTernary)"
+                  values="default (-1), false/no (0), true/yes (1)" />
         <property name="dhcp-hostname"
                   nmcli-description="If the &quot;dhcp-send-hostname&quot; property is TRUE, then the specified name will be sent to the DHCP server when acquiring a lease. This property and &quot;dhcp-fqdn&quot; are mutually exclusive and cannot be set at the same time."
                   format="string" />
@@ -1517,6 +1594,25 @@
                   nmcli-description="Configure the token for draft-chown-6man-tokenised-ipv6-identifiers-02 IPv6 tokenized interface identifiers. Useful with eui64 addr-gen-mode. When set, the token is used as IPv6 interface identifier instead of the hardware address. This only applies to addresses from stateless autoconfiguration, not to IPv6 link local addresses."
                   format="string" />
     </setting>
+    <setting name="ipvlan" >
+        <property name="parent"
+                  alias="dev"
+                  nmcli-description="If given, specifies the parent interface name or parent connection UUID from which this IPVLAN interface should be created. If this property is not specified, the connection must contain an &quot;802-3-ethernet&quot; setting with a &quot;mac-address&quot; property."
+                  format="string" />
+        <property name="mode"
+                  alias="mode"
+                  nmcli-description="The IPVLAN mode. Valid values: l2 (1), l3 (2), l3s (3)"
+                  format="choice (NMSettingIpvlanMode)"
+                  values="l2 (1), l3 (2), l3s (3)" />
+        <property name="private"
+                  nmcli-description="Whether the interface should be put in private mode."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+        <property name="vepa"
+                  nmcli-description="Whether the interface should be put in VEPA mode."
+                  format="boolean"
+                  values="true/yes/on, false/no/off" />
+    </setting>
     <setting name="link" >
         <property name="gso-max-segments"
                   nmcli-description="The maximum segments of a Generic Segment Offload packet the device should accept. The value must be between 0 and 4294967295. When set to -1, the existing value is preserved."
diff --git a/src/nmcli/general.c b/src/nmcli/general.c
index ea070e05..c6c266a2 100644
--- a/src/nmcli/general.c
+++ b/src/nmcli/general.c
@@ -500,7 +500,7 @@ show_nm_status(NmCli *nmc, const char *pretty_header_name, const char *print_fld
         fields_str = nmc->required_fields;
 
     if (!nmc_print_table(&nmc->nmc_config,
-                         (gpointer[]){nmc, NULL},
+                         (gpointer[]) {nmc, NULL},
                          NULL,
                          pretty_header_name ?: N_("NetworkManager status"),
                          (const NMMetaAbstractInfo *const *) metagen_general_status,
@@ -733,7 +733,7 @@ show_general_logging(NmCli *nmc)
         fields_str = nmc->required_fields;
 
     if (!nmc_print_table(&nmc->nmc_config,
-                         (gpointer const[]){&d, NULL},
+                         (gpointer const[]) {&d, NULL},
                          NULL,
                          _("NetworkManager logging"),
                          (const NMMetaAbstractInfo *const *) metagen_general_logging,
diff --git a/src/nmcli/settings.c b/src/nmcli/settings.c
index 636df466..85f4ad83 100644
--- a/src/nmcli/settings.c
+++ b/src/nmcli/settings.c
@@ -503,7 +503,7 @@ _env_get_env_flags(const NMMetaEnvironment *environment, gpointer environment_us
 
 /*****************************************************************************/
 
-const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment){
+const NMMetaEnvironment *const nmc_meta_environment = &((NMMetaEnvironment) {
     .warn_fcn           = _env_warn_fcn_handle,
     .get_nm_devices     = _env_get_nm_devices,
     .get_nm_connections = _env_get_nm_connections,
@@ -525,6 +525,8 @@ get_property_val(NMSetting            *setting,
         NM_IN_SET(get_type, NM_META_ACCESSOR_GET_TYPE_PARSABLE, NM_META_ACCESSOR_GET_TYPE_PRETTY),
         NULL);
 
+    prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop);
+
     if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) {
         if (property_info->property_type->get_fcn) {
             NMMetaAccessorGetOutFlags out_flags = NM_META_ACCESSOR_GET_OUT_FLAGS_NONE;
@@ -593,8 +595,11 @@ nmc_setting_set_property(NMClient              *client,
                                    NM_META_ACCESSOR_MODIFIER_ADD),
                          FALSE);
 
+    prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop);
+
     if (!(property_info = nm_meta_property_info_find_by_setting(setting, prop)))
         goto out_fail_read_only;
+
     if (!property_info->property_type->set_fcn)
         goto out_fail_read_only;
 
@@ -661,8 +666,12 @@ nmc_setting_get_valid_properties(NMSetting *setting)
     num = setting_info ? setting_info->properties_num : 0;
 
     valid_props = g_new(char *, num + 1);
-    for (i = 0; i < num; i++)
-        valid_props[i] = g_strdup(setting_info->properties[i]->property_name);
+    for (i = 0; i < num; i++) {
+        const char *prop =
+            nmc_setting_propname_libnm_to_user(setting_info->general->setting_name,
+                                               setting_info->properties[i]->property_name);
+        valid_props[i] = g_strdup(prop);
+    }
 
     valid_props[num] = NULL;
     return valid_props;
@@ -678,6 +687,8 @@ nmc_setting_get_property_allowed_values(NMSetting *setting, const char *prop, ch
 
     *out_to_free = NULL;
 
+    prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop);
+
     if ((property_info = nm_meta_property_info_find_by_setting(setting, prop))) {
         if (property_info->property_type->values_fcn) {
             return property_info->property_type->values_fcn(property_info, out_to_free);
@@ -711,6 +722,8 @@ nmc_setting_get_property_desc(NMSetting *setting, const char *prop)
 
     g_return_val_if_fail(NM_IS_SETTING(setting), FALSE);
 
+    prop = nmc_setting_propname_user_to_libnm(nm_setting_get_name(setting), prop);
+
     property_info = nm_meta_property_info_find_by_setting(setting, prop);
     if (!property_info)
         return NULL;
@@ -764,13 +777,43 @@ setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one
 
     if (!nmc_print_table(
             nmc_config,
-            (gpointer[]){setting, NULL},
+            (gpointer[]) {setting, NULL},
             NULL,
             NULL,
-            (const NMMetaAbstractInfo *const[]){(const NMMetaAbstractInfo *) setting_info, NULL},
+            (const NMMetaAbstractInfo *const[]) {(const NMMetaAbstractInfo *) setting_info, NULL},
             fields_str,
             &error))
         return FALSE;
 
     return TRUE;
 }
+
+const char *
+nmc_setting_propname_user_to_libnm(const char *setting_name, const char *prop)
+{
+    if (NM_IN_STRSET(setting_name,
+                     NM_SETTING_IP4_CONFIG_SETTING_NAME,
+                     NM_SETTING_IP6_CONFIG_SETTING_NAME)) {
+        if (nm_streq0(prop, "dhcp-send-hostname"))
+            return NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME_V2;
+        else if (nm_streq0(prop, "dhcp-send-hostname-deprecated"))
+            return NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME;
+    }
+
+    return prop;
+}
+
+const char *
+nmc_setting_propname_libnm_to_user(const char *setting_name, const char *prop)
+{
+    if (NM_IN_STRSET(setting_name,
+                     NM_SETTING_IP4_CONFIG_SETTING_NAME,
+                     NM_SETTING_IP6_CONFIG_SETTING_NAME)) {
+        if (nm_streq0(prop, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME_V2))
+            return "dhcp-send-hostname";
+        else if (nm_streq0(prop, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME))
+            return "dhcp-send-hostname-deprecated";
+    }
+
+    return prop;
+}
diff --git a/src/nmcli/settings.h b/src/nmcli/settings.h
index 9cbf13c4..c1d0e387 100644
--- a/src/nmcli/settings.h
+++ b/src/nmcli/settings.h
@@ -34,4 +34,7 @@ gboolean nmc_setting_set_property(NMClient              *client,
 
 gboolean setting_details(const NmcConfig *nmc_config, NMSetting *setting, const char *one_prop);
 
+const char *nmc_setting_propname_user_to_libnm(const char *setting_name, const char *prop);
+const char *nmc_setting_propname_libnm_to_user(const char *setting_name, const char *prop);
+
 #endif /* NMC_SETTINGS_H */
diff --git a/src/nmcli/utils.c b/src/nmcli/utils.c
index c65a5486..a613c28f 100644
--- a/src/nmcli/utils.c
+++ b/src/nmcli/utils.c
@@ -1016,6 +1016,8 @@ _print_fill(const NmcConfig    *nmc_config,
         PrintDataHeaderCell      *header_cell;
         guint                     col_idx;
         const NMMetaAbstractInfo *info;
+        const char               *setting_name;
+        gboolean                  is_prop;
 
         col = &cols[i_col];
         if (!col->is_leaf)
@@ -1036,14 +1038,23 @@ _print_fill(const NmcConfig    *nmc_config,
         header_cell->to_print = FALSE;
 
         header_cell->title = nm_meta_abstract_info_get_name(info, TRUE);
-        if (nmc_config->multiline_output && col->parent_col
-            && NM_IN_SET(info->meta_type,
-                         &nm_meta_type_property_info,
-                         &nmc_meta_type_generic_info)) {
-            header_cell->title = g_strdup_printf(
-                "%s.%s",
-                nm_meta_abstract_info_get_name(col->parent_col->selection_item->info, FALSE),
-                header_cell->title);
+
+        is_prop =
+            col->parent_col
+            && NM_IN_SET(info->meta_type, &nm_meta_type_property_info, &nmc_meta_type_generic_info);
+
+        if (is_prop) {
+            /* Some properties has different name for the user than internally in
+             * libnm and D-Bus. Make the conversion from libnm names to user names.
+             */
+            setting_name =
+                nm_meta_abstract_info_get_name(col->parent_col->selection_item->info, FALSE);
+            header_cell->title =
+                nmc_setting_propname_libnm_to_user(setting_name, header_cell->title);
+        }
+
+        if (nmc_config->multiline_output && is_prop) {
+            header_cell->title         = g_strdup_printf("%s.%s", setting_name, header_cell->title);
             header_cell->title_to_free = TRUE;
         }
     }
diff --git a/src/nmcli/utils.h b/src/nmcli/utils.h
index b68a3803..b2539bf4 100644
--- a/src/nmcli/utils.h
+++ b/src/nmcli/utils.h
@@ -269,13 +269,13 @@ struct _NmcMetaGenericInfo {
 };
 
 #define NMC_META_GENERIC(n, ...) \
-    (&((NmcMetaGenericInfo){.meta_type = &nmc_meta_type_generic_info, .name = n, __VA_ARGS__}))
+    (&((NmcMetaGenericInfo) {.meta_type = &nmc_meta_type_generic_info, .name = n, __VA_ARGS__}))
 
 #define NMC_META_GENERIC_WITH_NESTED(n, nest, ...) \
     NMC_META_GENERIC(n, .nested = (nest), __VA_ARGS__)
 
 #define NMC_META_GENERIC_GROUP(_group_name, _nested, _name_header)                       \
-    ((const NMMetaAbstractInfo *const *) ((const NmcMetaGenericInfo *const[]){           \
+    ((const NMMetaAbstractInfo *const *) ((const NmcMetaGenericInfo *const[]) {          \
         NMC_META_GENERIC_WITH_NESTED(_group_name, _nested, .name_header = _name_header), \
         NULL,                                                                            \
     }))