diff --git a/man/nm-settings-nmcli.xsl b/man/nm-settings-nmcli.xsl
index 5f6783d362..794ee507b1 100644
--- a/man/nm-settings-nmcli.xsl
+++ b/man/nm-settings-nmcli.xsl
@@ -181,6 +181,11 @@
Valid values:
+
+
+ Special values:
+
+
diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c
index afe74045be..2b2209d9f9 100644
--- a/src/libnmc-setting/nm-meta-setting-desc.c
+++ b/src/libnmc-setting/nm-meta-setting-desc.c
@@ -5672,9 +5672,6 @@ static const NMMetaPropertyInfo *const property_infos_CONNECTION[] = {
.set_fcn = _set_fcn_connection_metered,
.doc_format = NM_META_PROPERTY_TYPE_FORMAT_TERNARY,
),
- .property_typ_data = DEFINE_PROPERTY_TYP_DATA (
- .values_static = NM_MAKE_STRV ("yes", "no", "unknown"),
- ),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_LLDP,
.property_type = &_pt_gobject_enum,
diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.c b/src/nmcli/gen-metadata-nm-settings-nmcli.c
index f81bb6ee28..f29c91805c 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.c
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.c
@@ -402,6 +402,65 @@ get_property_valid_values(const NMMetaPropertyInfo *prop_info)
return valid_values;
}
+static void
+append_int_special_values(const NMMetaPropertyInfo *prop_info, GPtrArray *special_values)
+{
+ const NMMetaPropertyTypData *prop_typ_data = prop_info->property_typ_data;
+
+ if (prop_typ_data && prop_typ_data->subtype.gobject_int.value_infos) {
+ GType gtype = _property_get_gtype(prop_info);
+ bool is_uint = NM_IN_SET(gtype, G_TYPE_UINT, G_TYPE_UINT64);
+ guint base = prop_typ_data->subtype.gobject_int.base;
+ const NMMetaUtilsIntValueInfo *v = prop_typ_data->subtype.gobject_int.value_infos;
+
+ if (!(base == 0 || base == 10 || (is_uint && base == 16))) {
+ if (is_uint)
+ prop_abort(prop_info, "only base 10 supported for signed int");
+ else
+ prop_abort(prop_info, "only base 10 or 16 supported for uint");
+ }
+
+ for (; v->nick != NULL; v++) {
+ char *v_str;
+ if (base == 16)
+ v_str = g_strdup_printf("%s (0x%lx)", v->nick, v->value.u64);
+ else if (is_uint)
+ v_str = g_strdup_printf("%s (%lu)", v->nick, v->value.u64);
+ else
+ v_str = g_strdup_printf("%s (%ld)", v->nick, v->value.i64);
+
+ g_ptr_array_add(special_values, v_str);
+ }
+ }
+}
+
+static GPtrArray *
+get_property_special_values(const NMMetaPropertyInfo *prop_info)
+{
+ const NMMetaPropertyType *prop_type = prop_info->property_type;
+ const NMMetaPropertyTypData *prop_typ_data = prop_info->property_typ_data;
+ NMMetaPropertyTypeFormat fmt = prop_type->doc_format;
+ GPtrArray *special_values = g_ptr_array_new_full(16, g_free);
+
+ switch (fmt) {
+ case NM_META_PROPERTY_TYPE_FORMAT_INT:
+ append_int_special_values(prop_info, special_values);
+ break;
+ case NM_META_PROPERTY_TYPE_FORMAT_MAC:
+ if (prop_typ_data
+ && prop_typ_data->subtype.mac.mode == NM_META_PROPERTY_TYPE_MAC_MODE_CLONED)
+ append_vals(special_values, "preserve", "permanent", "random", "stable");
+ break;
+ case NM_META_PROPERTY_TYPE_FORMAT_MTU:
+ g_ptr_array_add(special_values, g_strdup("auto"));
+ break;
+ default:
+ break;
+ }
+
+ return special_values;
+}
+
int
main(int argc, char *argv[])
{
@@ -424,13 +483,15 @@ main(int argc, char *argv[])
g_print(" >\n");
for (i_property = 0; i_property < sett_info->properties_num; i_property++) {
- const NMMetaPropertyInfo *prop_info = sett_info->properties[i_property];
- gs_free char *name = NULL;
- gs_free char *alias = NULL;
- gs_free char *descr = NULL;
- gs_free char *fmt = NULL;
- gs_unref_ptrarray GPtrArray *vals_arr = NULL;
- gs_free char *vals_str = NULL;
+ const NMMetaPropertyInfo *prop_info = sett_info->properties[i_property];
+ gs_free char *name = NULL;
+ gs_free char *alias = NULL;
+ gs_free char *descr = NULL;
+ gs_free char *fmt = NULL;
+ gs_unref_ptrarray GPtrArray *vals_arr = NULL;
+ gs_free char *vals_str = NULL;
+ gs_unref_ptrarray GPtrArray *specials_arr = NULL;
+ gs_free char *specials_str = NULL;
g_print("%sproperty_name));
@@ -470,6 +531,15 @@ main(int argc, char *argv[])
_xml_escape_attribute(vals_str));
}
+ specials_arr = get_property_special_values(prop_info);
+ if (specials_arr->len) {
+ g_ptr_array_add(specials_arr, NULL);
+ specials_str = g_strjoinv(", ", (char **) specials_arr->pdata);
+ g_print("\n%sspecial-values=%s",
+ _indent_level(2 * INDENT + 10),
+ _xml_escape_attribute(specials_str));
+ }
+
g_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 cbf3345b12..6a8d3af527 100644
--- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
+++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in
@@ -50,7 +50,8 @@
+ format="MAC address"
+ special-values="preserve, permanent, random, stable" />
@@ -64,7 +65,8 @@
+ format="integer"
+ special-values="auto" />
@@ -347,7 +349,8 @@
+ format="MAC address"
+ special-values="preserve, permanent, random, stable" />
@@ -357,7 +360,8 @@
+ format="integer"
+ special-values="auto" />
@@ -594,7 +598,8 @@
values="none (0x0), agent-owned (0x1), not-saved (0x2), not-required (0x4)" />
+ format="integer"
+ special-values="auto" />
+ values="-1 - 2147483647"
+ special-values="default (-1), forever (0)" />
+ values="true/yes/on, false/no/off, default/unknown" />
+ values="-1 - 7"
+ special-values="unset (-1)" />
+ values="-1 - 7"
+ special-values="unset (-1)" />
+ values="-1 - 7"
+ special-values="unset (-1)" />
+ format="integer"
+ special-values="auto" />
+ format="integer"
+ special-values="auto" />
+ values="-1 - 65535"
+ special-values="default (-1)" />
+ format="integer"
+ special-values="auto" />
+ values="0 - 4294967295"
+ special-values="unspec (0), main (254)" />
+ values="0 - 2147483647"
+ special-values="default (0), infinity (2147483647)" />
+ values="-1 - 2147483647"
+ special-values="default (-1), infinity (2147483647)" />
+ values="-1 - 30000"
+ special-values="default (-1), off (0)" />
@@ -1332,7 +1349,8 @@
+ values="0 - 4294967295"
+ special-values="unspec (0), main (254)" />
+ values="-1 - 2147483647"
+ special-values="default (-1), infinity (2147483647)" />
+ values="0 - 2147483647"
+ special-values="default (0), infinity (2147483647)" />
+ format="integer"
+ special-values="auto" />
@@ -1386,7 +1407,8 @@
+ values="0 - 2147483647"
+ special-values="default (0), infinity (2147483647)" />
+ values="-1 - 4294967295"
+ special-values="default (-1)" />
+ values="-1 - 4294967295"
+ special-values="default (-1)" />
+ values="-1 - 4294967295"
+ special-values="default (-1)" />
+ values="-1 - 4294967295"
+ special-values="default (-1)" />
+ format="integer"
+ special-values="auto" />
+ format="integer"
+ special-values="auto" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), disabled (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), disabled (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (50)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (65535)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (1)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (0), default (0)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (255)" />
+ values="-2147483648 - 2147483647"
+ special-values="unset (-1), default (0)" />
@@ -2056,7 +2095,8 @@
values="true/yes/on, false/no/off" />
+ format="integer"
+ special-values="auto" />
+ values="0 - 65535"
+ special-values="unset (0xffff)" />
+ values="0 - 65535"
+ special-values="unset (0xffff)" />
+ values="-32768 - 32767"
+ special-values="default (-1)" />
+ values="-32768 - 32767"
+ special-values="default (-1)" />
diff --git a/tools/generate-docs-nm-property-infos.py b/tools/generate-docs-nm-property-infos.py
index d7e3c8c29b..13b33fcdea 100755
--- a/tools/generate-docs-nm-property-infos.py
+++ b/tools/generate-docs-nm-property-infos.py
@@ -125,6 +125,7 @@ keywords = collections.OrderedDict(
("variable", KEYWORD_XML_TYPE_ATTR),
("format", KEYWORD_XML_TYPE_ATTR),
("values", KEYWORD_XML_TYPE_ATTR),
+ ("special-values", KEYWORD_XML_TYPE_ATTR),
("default", KEYWORD_XML_TYPE_ATTR),
("example", KEYWORD_XML_TYPE_ATTR),
("description", KEYWORD_XML_TYPE_ELEM),
diff --git a/tools/generate-docs-nm-settings-docs-merge.py b/tools/generate-docs-nm-settings-docs-merge.py
index e44dac9c93..5d4e00a1eb 100755
--- a/tools/generate-docs-nm-settings-docs-merge.py
+++ b/tools/generate-docs-nm-settings-docs-merge.py
@@ -297,6 +297,7 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
node_set_attr(property_node, "type", properties_attrs)
node_set_attr(property_node, "values", properties_attrs)
+ node_set_attr(property_node, "special-values", properties_attrs)
node_set_attr(property_node, "default", properties_attrs)
node_set_attr(property_node, "alias", properties_attrs)