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)