about summary refs log tree commit diff
path: root/src/libnm-core-impl/nm-setting-private.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-core-impl/nm-setting-private.h')
-rw-r--r--src/libnm-core-impl/nm-setting-private.h713
1 files changed, 556 insertions, 157 deletions
diff --git a/src/libnm-core-impl/nm-setting-private.h b/src/libnm-core-impl/nm-setting-private.h
index 061fc901..7faf5d1c 100644
--- a/src/libnm-core-impl/nm-setting-private.h
+++ b/src/libnm-core-impl/nm-setting-private.h
@@ -7,7 +7,7 @@
 #define __NM_SETTING_PRIVATE_H__
 
 #if !((NETWORKMANAGER_COMPILATION) &NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_PRIVATE)
-    #error Cannot use this header.
+#error Cannot use this header.
 #endif
 
 #include "nm-setting.h"
@@ -70,24 +70,12 @@ struct _NMSettingClass {
                                  GError **            error);
 
     gboolean (*clear_secrets)(const struct _NMSettInfoSetting *sett_info,
-                              guint                            property_idx,
+                              const NMSettInfoProperty *       property_info,
                               NMSetting *                      setting,
                               NMSettingClearSecretsWithFlagsFn func,
                               gpointer                         user_data);
 
-    /* compare_property() returns a ternary, where DEFAULT means that the property should not
-     * be compared due to the compare @flags. A TRUE/FALSE result means that the property is
-     * equal/not-equal.
-     *
-     * @other may be %NULL, in which case the function only determines whether
-     * the setting should be compared (TRUE) or not (DEFAULT). */
-    NMTernary (*compare_property)(const struct _NMSettInfoSetting *sett_info,
-                                  guint                            property_idx,
-                                  NMConnection *                   con_a,
-                                  NMSetting *                      set_a,
-                                  NMConnection *                   con_b,
-                                  NMSetting *                      set_b,
-                                  NMSettingCompareFlags            flags);
+    void (*padding_1)(void);
 
     void (*duplicate_copy_properties)(const struct _NMSettInfoSetting *sett_info,
                                       NMSetting *                      src,
@@ -115,8 +103,6 @@ struct _NMSettingClass {
                                guint /* NMSettingParseFlags */ parse_flags,
                                GError **                       error);
 
-    gpointer padding[1];
-
     const struct _NMMetaSettingInfo *setting_info;
 };
 
@@ -127,21 +113,54 @@ struct _NMSettingClass {
  */
 struct _NMSettingIPConfig {
     NMSetting parent;
+    /* In the past, this struct was public API. Preserve ABI! */
 };
 
 struct _NMSettingIPConfigClass {
     NMSettingClass parent;
 
-    /* Padding for future expansion */
-    gpointer padding[8];
+    /* In the past, this struct was public API. Preserve ABI! */
+    union {
+        gpointer _dummy;
+        int      private_offset;
+    };
+    gpointer padding[7];
 };
 
+typedef struct {
+    GPtrArray *dns;         /* array of IP address strings */
+    GPtrArray *dns_search;  /* array of domain name strings */
+    GPtrArray *dns_options; /* array of DNS options */
+    GPtrArray *addresses;   /* array of NMIPAddress */
+    GPtrArray *routes;      /* array of NMIPRoute */
+    GPtrArray *routing_rules;
+    GArray *   dhcp_reject_servers;
+    char *     method;
+    char *     gateway;
+    char *     dhcp_hostname;
+    char *     dhcp_iaid;
+    gint64     route_metric;
+    guint      dhcp_hostname_flags;
+    int        dns_priority;
+    int        dad_timeout;
+    int        dhcp_timeout;
+    int        required_timeout;
+    guint32    route_table;
+    bool       ignore_auto_routes;
+    bool       ignore_auto_dns;
+    bool       dhcp_send_hostname;
+    bool       never_default;
+    bool       may_fail;
+} NMSettingIPConfigPrivate;
+
+void _nm_setting_ip_config_private_init(gpointer self, NMSettingIPConfigPrivate *priv);
+
 /*****************************************************************************/
 
 NMSettingPriority _nm_setting_get_base_type_priority(NMSetting *setting);
 int               _nm_setting_compare_priority(gconstpointer a, gconstpointer b);
 
-int _nmtst_nm_setting_sort(NMSetting *a, NMSetting *b);
+int _nm_setting_sort_for_nm_assert(NMSetting *a, NMSetting *b);
 
 /*****************************************************************************/
 
@@ -246,6 +265,7 @@ gboolean _nm_setting_clear_secrets(NMSetting *                      setting,
  */
 #define NM_SETTING_PARAM_TO_DBUS_IGNORE_FLAGS (1 << (7 + G_PARAM_USER_SHIFT))
 
+extern const NMSettInfoPropertType nm_sett_info_propert_type_setting_name;
 extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_interface_name;
 extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_i;
 extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_u;
@@ -253,8 +273,15 @@ extern const NMSettInfoPropertType nm_sett_info_propert_type_deprecated_ignore_u
 extern const NMSettInfoPropertType nm_sett_info_propert_type_plain_i;
 extern const NMSettInfoPropertType nm_sett_info_propert_type_plain_u;
 
-extern const NMSettInfoPropertType nm_sett_info_propert_type_boolean;
-extern const NMSettInfoPropertType nm_sett_info_propert_type_string;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_boolean;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_int32;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_uint32;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_uint64;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_string;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_bytes;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_enum;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_flags;
+extern const NMSettInfoPropertType nm_sett_info_propert_type_direct_mac_address;
 
 NMSettingVerifyResult
 _nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error);
@@ -268,28 +295,47 @@ gboolean _nm_setting_aggregate(NMSetting *setting, NMConnectionAggregateType typ
 
 gboolean _nm_setting_slave_type_is_valid(const char *slave_type, const char **out_port_type);
 
-GVariant *_nm_setting_property_to_dbus_fcn_gprop(const NMSettInfoSetting *      sett_info,
-                                                 guint                          property_idx,
-                                                 NMConnection *                 connection,
-                                                 NMSetting *                    setting,
-                                                 NMConnectionSerializationFlags flags,
-                                                 const NMConnectionSerializationOptions *options);
+gboolean _nm_setting_compare_flags_check(const GParamSpec *    param_spec,
+                                         NMSettingCompareFlags flags,
+                                         NMSetting *           set_a,
+                                         NMSetting *           set_b);
 
-GVariant *
-_nm_setting_property_to_dbus_fcn_get_boolean(const NMSettInfoSetting *               sett_info,
-                                             guint                                   property_idx,
-                                             NMConnection *                          connection,
-                                             NMSetting *                             setting,
-                                             NMConnectionSerializationFlags          flags,
-                                             const NMConnectionSerializationOptions *options);
+NMTernary _nm_setting_property_compare_fcn_ignore(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_nil);
+
+NMTernary _nm_setting_property_compare_fcn_direct(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_nil);
+
+NMTernary _nm_setting_property_compare_fcn_default(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_nil);
+
+void _nm_setting_property_get_property_direct(GObject *   object,
+                                              guint       prop_id,
+                                              GValue *    value,
+                                              GParamSpec *pspec);
+
+void _nm_setting_property_set_property_direct(GObject *     object,
+                                              guint         prop_id,
+                                              const GValue *value,
+                                              GParamSpec *  pspec);
+
+GVariant *_nm_setting_property_to_dbus_fcn_ignore(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
+
+GVariant *_nm_setting_property_to_dbus_fcn_gprop(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
+
+GVariant *_nm_setting_property_to_dbus_fcn_direct(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
 
 GVariant *
-_nm_setting_property_to_dbus_fcn_get_string(const NMSettInfoSetting *               sett_info,
-                                            guint                                   property_idx,
-                                            NMConnection *                          connection,
-                                            NMSetting *                             setting,
-                                            NMConnectionSerializationFlags          flags,
-                                            const NMConnectionSerializationOptions *options);
+_nm_setting_property_to_dbus_fcn_direct_mac_address(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_setting_property_from_dbus_fcn_ignore(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_setting_property_from_dbus_fcn_direct_ip_config_gateway(
+    _NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_setting_property_from_dbus_fcn_direct_mac_address(
+    _NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_setting_property_from_dbus_fcn_direct(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_setting_property_from_dbus_fcn_gprop(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
 
 GVariant *_nm_setting_to_dbus(NMSetting *                             setting,
                               NMConnection *                          connection,
@@ -308,25 +354,33 @@ gboolean _nm_setting_property_is_regular_secret_flags(NMSetting * setting,
 
 /*****************************************************************************/
 
+const NMSettInfoProperty *
+_nm_sett_info_property_lookup_by_param_spec(const NMSettInfoSetting *sett_info,
+                                            const GParamSpec *       param_spec);
+
 static inline GArray *
-_nm_sett_info_property_override_create_array(void)
+_nm_sett_info_property_override_create_array_sized(guint reserved_size)
 {
-    return g_array_new(FALSE, FALSE, sizeof(NMSettInfoProperty));
+    return g_array_sized_new(FALSE, FALSE, sizeof(NMSettInfoProperty), reserved_size);
 }
 
-GArray *_nm_sett_info_property_override_create_array_ip_config(void);
-
-void _nm_setting_class_commit_full(NMSettingClass *            setting_class,
-                                   NMMetaSettingType           meta_type,
-                                   const NMSettInfoSettDetail *detail,
-                                   GArray *                    properties_override);
-
-static inline void
-_nm_setting_class_commit(NMSettingClass *setting_class, NMMetaSettingType meta_type)
+static inline GArray *
+_nm_sett_info_property_override_create_array(void)
 {
-    _nm_setting_class_commit_full(setting_class, meta_type, NULL, NULL);
+    /* pre-allocate a relatively large buffer to avoid frequent re-allocations.
+     * Note that the buffer is only short-lived and will be destroyed by
+     * _nm_setting_class_commit(). */
+    return _nm_sett_info_property_override_create_array_sized(20);
 }
 
+GArray *_nm_sett_info_property_override_create_array_ip_config(int addr_family);
+
+void _nm_setting_class_commit(NMSettingClass *            setting_class,
+                              NMMetaSettingType           meta_type,
+                              const NMSettInfoSettDetail *detail,
+                              GArray *                    properties_override,
+                              gint16                      private_offset);
+
 #define NM_SETT_INFO_SETT_GENDATA(...)                         \
     ({                                                         \
         static const NMSettInfoSettGendata _g = {__VA_ARGS__}; \
@@ -341,11 +395,10 @@ _nm_setting_class_commit(NMSettingClass *setting_class, NMMetaSettingType meta_t
         .dbus_type = _dbus_type, __VA_ARGS__                 \
     }
 
-#define NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(_dbus_type, ...)                           \
-    {                                                                                   \
-        .dbus_type = _dbus_type, .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_gprop, \
-        __VA_ARGS__                                                                     \
-    }
+#define NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT(_dbus_type, ...)                                  \
+    NM_SETT_INFO_PROPERT_TYPE_DBUS_INIT(_dbus_type,                                            \
+                                        .to_dbus_fcn = _nm_setting_property_to_dbus_fcn_gprop, \
+                                        __VA_ARGS__)
 
 #define NM_SETT_INFO_PROPERT_TYPE(init)               \
     ({                                                \
@@ -372,11 +425,14 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p
     g_array_append_vals(properties_override, prop_info, 1);
 }
 
-#define _nm_properties_override_gobj(properties_override, p_param_spec, p_property_type, ...) \
-    _nm_properties_override((properties_override),                                            \
-                            NM_SETT_INFO_PROPERTY(.name          = NULL,                      \
-                                                  .param_spec    = (p_param_spec),            \
-                                                  .property_type = (p_property_type),         \
+#define _nm_properties_override_gobj(properties_override,                             \
+                                     p_param_spec,                                    \
+                                     p_property_type,                                 \
+                                     ... /* extra NMSettInfoProperty fields */)       \
+    _nm_properties_override((properties_override),                                    \
+                            NM_SETT_INFO_PROPERTY(.name          = NULL,              \
+                                                  .param_spec    = (p_param_spec),    \
+                                                  .property_type = (p_property_type), \
                                                   __VA_ARGS__))
 
 #define _nm_properties_override_dbus(properties_override, p_name, p_property_type) \
@@ -386,123 +442,452 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p
 
 /*****************************************************************************/
 
-#define _nm_setting_property_define_boolean_full(properties_override,                           \
+/* Define "direct" properties. These are properties that have a GParamSpec and
+ * NMSettInfoPropertType.direct_type != NM_VALUE_TYPE_NONE.
+ *
+ * With this, the location of the data is known at
+ *
+ *    _nm_setting_get_private(setting, sett_info, property_info->direct_offset)
+ *
+ * which allows to generically handle the property operations (like get, set, compare).
+ */
+
+#define _nm_setting_property_define_direct_boolean(properties_override,                        \
+                                                   obj_properties,                             \
+                                                   prop_name,                                  \
+                                                   prop_id,                                    \
+                                                   default_value,                              \
+                                                   param_flags,                                \
+                                                   private_struct_type,                        \
+                                                   private_struct_field,                       \
+                                                   ... /* extra NMSettInfoProperty fields */)  \
+    G_STMT_START                                                                               \
+    {                                                                                          \
+        const gboolean _default_value = (default_value);                                       \
+        GParamSpec *   _param_spec;                                                            \
+                                                                                               \
+        G_STATIC_ASSERT(                                                                       \
+            !NM_FLAGS_ANY((param_flags),                                                       \
+                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE        \
+                            | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)));                         \
+                                                                                               \
+        nm_assert(NM_IN_SET(_default_value, 0, 1));                                            \
+                                                                                               \
+        _param_spec =                                                                          \
+            g_param_spec_boolean("" prop_name "",                                              \
+                                 "",                                                           \
+                                 "",                                                           \
+                                 _default_value,                                               \
+                                 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));  \
+                                                                                               \
+        (obj_properties)[(prop_id)] = _param_spec;                                             \
+                                                                                               \
+        _nm_properties_override_gobj(                                                          \
+            (properties_override),                                                             \
+            _param_spec,                                                                       \
+            &nm_sett_info_propert_type_direct_boolean,                                         \
+            .direct_offset =                                                                   \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(bool, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                      \
+    }                                                                                          \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_uint32(properties_override,                            \
+                                                  obj_properties,                                 \
+                                                  prop_name,                                      \
+                                                  prop_id,                                        \
+                                                  min_value,                                      \
+                                                  max_value,                                      \
+                                                  default_value,                                  \
+                                                  param_flags,                                    \
+                                                  private_struct_type,                            \
+                                                  private_struct_field,                           \
+                                                  ... /* extra NMSettInfoProperty fields */)      \
+    G_STMT_START                                                                                  \
+    {                                                                                             \
+        GParamSpec *_param_spec;                                                                  \
+                                                                                                  \
+        G_STATIC_ASSERT(                                                                          \
+            !NM_FLAGS_ANY((param_flags),                                                          \
+                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE)));       \
+        G_STATIC_ASSERT((min_value) <= (guint64) (default_value));                                \
+        G_STATIC_ASSERT((default_value) <= (guint64) (max_value));                                \
+        G_STATIC_ASSERT((max_value) <= (guint64) G_MAXUINT32);                                    \
+                                                                                                  \
+        _param_spec =                                                                             \
+            g_param_spec_uint("" prop_name "",                                                    \
+                              "",                                                                 \
+                              "",                                                                 \
+                              (min_value),                                                        \
+                              (max_value),                                                        \
+                              (default_value),                                                    \
+                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));        \
+                                                                                                  \
+        (obj_properties)[(prop_id)] = _param_spec;                                                \
+                                                                                                  \
+        _nm_properties_override_gobj(                                                             \
+            (properties_override),                                                                \
+            _param_spec,                                                                          \
+            &nm_sett_info_propert_type_direct_uint32,                                             \
+            .direct_offset =                                                                      \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(guint32, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                         \
+    }                                                                                             \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_int32(properties_override,                            \
+                                                 obj_properties,                                 \
+                                                 prop_name,                                      \
+                                                 prop_id,                                        \
+                                                 min_value,                                      \
+                                                 max_value,                                      \
+                                                 default_value,                                  \
+                                                 param_flags,                                    \
+                                                 private_struct_type,                            \
+                                                 private_struct_field,                           \
+                                                 ... /* extra NMSettInfoProperty fields */)      \
+    G_STMT_START                                                                                 \
+    {                                                                                            \
+        GParamSpec *_param_spec;                                                                 \
+                                                                                                 \
+        G_STATIC_ASSERT(                                                                         \
+            !NM_FLAGS_ANY((param_flags),                                                         \
+                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE)));      \
+        G_STATIC_ASSERT((min_value) >= (gint64) (G_MININT32));                                   \
+        G_STATIC_ASSERT((min_value) <= (gint64) (default_value));                                \
+        G_STATIC_ASSERT((default_value) <= (gint64) (max_value));                                \
+        G_STATIC_ASSERT((max_value) <= (gint64) G_MAXUINT32);                                    \
+                                                                                                 \
+        _param_spec =                                                                            \
+            g_param_spec_int("" prop_name "",                                                    \
+                             "",                                                                 \
+                             "",                                                                 \
+                             (min_value),                                                        \
+                             (max_value),                                                        \
+                             (default_value),                                                    \
+                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));        \
+                                                                                                 \
+        (obj_properties)[(prop_id)] = _param_spec;                                               \
+                                                                                                 \
+        _nm_properties_override_gobj(                                                            \
+            (properties_override),                                                               \
+            _param_spec,                                                                         \
+            &nm_sett_info_propert_type_direct_int32,                                             \
+            .direct_offset =                                                                     \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(gint32, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                        \
+    }                                                                                            \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_uint64(properties_override,                            \
+                                                  obj_properties,                                 \
+                                                  prop_name,                                      \
+                                                  prop_id,                                        \
+                                                  min_value,                                      \
+                                                  max_value,                                      \
+                                                  default_value,                                  \
+                                                  param_flags,                                    \
+                                                  private_struct_type,                            \
+                                                  private_struct_field,                           \
+                                                  ... /* extra NMSettInfoProperty fields */)      \
+    G_STMT_START                                                                                  \
+    {                                                                                             \
+        GParamSpec *_param_spec;                                                                  \
+                                                                                                  \
+        G_STATIC_ASSERT(                                                                          \
+            !NM_FLAGS_ANY((param_flags),                                                          \
+                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE)));       \
+        G_STATIC_ASSERT((min_value) <= (default_value));                                          \
+        G_STATIC_ASSERT((default_value) == 0 || (default_value) -1u < (max_value));               \
+        G_STATIC_ASSERT((max_value) <= G_MAXUINT64);                                              \
+                                                                                                  \
+        _param_spec =                                                                             \
+            g_param_spec_uint64("" prop_name "",                                                  \
+                                "",                                                               \
+                                "",                                                               \
+                                (min_value),                                                      \
+                                (max_value),                                                      \
+                                (default_value),                                                  \
+                                G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));      \
+                                                                                                  \
+        (obj_properties)[(prop_id)] = _param_spec;                                                \
+                                                                                                  \
+        _nm_properties_override_gobj(                                                             \
+            (properties_override),                                                                \
+            _param_spec,                                                                          \
+            &nm_sett_info_propert_type_direct_uint64,                                             \
+            .direct_offset =                                                                      \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(guint64, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                         \
+    }                                                                                             \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_string_full(properties_override,                       \
+                                                       obj_properties,                            \
+                                                       prop_name,                                 \
+                                                       prop_id,                                   \
+                                                       param_flags,                               \
+                                                       property_type,                             \
+                                                       private_struct_type,                       \
+                                                       private_struct_field,                      \
+                                                       ... /* extra NMSettInfoProperty fields */) \
+    G_STMT_START                                                                                  \
+    {                                                                                             \
+        GParamSpec *                 _param_spec;                                                 \
+        const NMSettInfoPropertType *_property_type = (property_type);                            \
+                                                                                                  \
+        G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags),                                              \
+                                      ~(NM_SETTING_PARAM_SECRET | NM_SETTING_PARAM_FUZZY_IGNORE   \
+                                        | NM_SETTING_PARAM_INFERRABLE                             \
+                                        | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)));                \
+                                                                                                  \
+        nm_assert(_property_type);                                                                \
+        nm_assert(g_variant_type_equal(_property_type->dbus_type, "s"));                          \
+        nm_assert(_property_type->direct_type == NM_VALUE_TYPE_STRING);                           \
+        nm_assert(_property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_direct);        \
+                                                                                                  \
+        _param_spec =                                                                             \
+            g_param_spec_string("" prop_name "",                                                  \
+                                "",                                                               \
+                                "",                                                               \
+                                NULL,                                                             \
+                                G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));      \
+                                                                                                  \
+        (obj_properties)[(prop_id)] = _param_spec;                                                \
+                                                                                                  \
+        _nm_properties_override_gobj(                                                             \
+            (properties_override),                                                                \
+            _param_spec,                                                                          \
+            _property_type,                                                                       \
+            .direct_offset =                                                                      \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(char *, private_struct_type, private_struct_field),  \
+            __VA_ARGS__);                                                                         \
+    }                                                                                             \
+    G_STMT_END
+
+#define _nm_setting_property_define_direct_string(properties_override,                       \
+                                                  obj_properties,                            \
+                                                  prop_name,                                 \
+                                                  prop_id,                                   \
+                                                  param_flags,                               \
+                                                  private_struct_type,                       \
+                                                  private_struct_field,                      \
+                                                  ... /* extra NMSettInfoProperty fields */) \
+    _nm_setting_property_define_direct_string_full((properties_override),                    \
+                                                   (obj_properties),                         \
+                                                   prop_name,                                \
+                                                   (prop_id),                                \
+                                                   (param_flags),                            \
+                                                   &nm_sett_info_propert_type_direct_string, \
+                                                   private_struct_type,                      \
+                                                   private_struct_field,                     \
+                                                   __VA_ARGS__)
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_bytes(properties_override,                              \
+                                                 obj_properties,                                   \
+                                                 prop_name,                                        \
+                                                 prop_id,                                          \
+                                                 param_flags,                                      \
+                                                 private_struct_type,                              \
+                                                 private_struct_field,                             \
+                                                 ... /* extra NMSettInfoProperty fields */)        \
+    G_STMT_START                                                                                   \
+    {                                                                                              \
+        GParamSpec *_param_spec;                                                                   \
+                                                                                                   \
+        G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags),                                               \
+                                      ~(NM_SETTING_PARAM_SECRET | NM_SETTING_PARAM_INFERRABLE      \
+                                        | NM_SETTING_PARAM_FUZZY_IGNORE)));                        \
+                                                                                                   \
+        _param_spec =                                                                              \
+            g_param_spec_boxed("" prop_name "",                                                    \
+                               "",                                                                 \
+                               "",                                                                 \
+                               G_TYPE_BYTES,                                                       \
+                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));        \
+                                                                                                   \
+        (obj_properties)[(prop_id)] = _param_spec;                                                 \
+                                                                                                   \
+        _nm_properties_override_gobj(                                                              \
+            (properties_override),                                                                 \
+            _param_spec,                                                                           \
+            &nm_sett_info_propert_type_direct_bytes,                                               \
+            .direct_offset =                                                                       \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(GBytes *, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                          \
+    }                                                                                              \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_enum(properties_override,                             \
+                                                obj_properties,                                  \
+                                                prop_name,                                       \
+                                                prop_id,                                         \
+                                                gtype_enum,                                      \
+                                                default_value,                                   \
+                                                param_flags,                                     \
+                                                private_struct_type,                             \
+                                                private_struct_field,                            \
+                                                ... /* extra NMSettInfoProperty fields */)       \
+    G_STMT_START                                                                                 \
+    {                                                                                            \
+        GParamSpec *_param_spec;                                                                 \
+                                                                                                 \
+        G_STATIC_ASSERT(                                                                         \
+            !NM_FLAGS_ANY((param_flags),                                                         \
+                          ~(NM_SETTING_PARAM_REAPPLY_IMMEDIATELY | NM_SETTING_PARAM_FUZZY_IGNORE \
+                            | NM_SETTING_PARAM_INFERRABLE)));                                    \
+                                                                                                 \
+        _param_spec =                                                                            \
+            g_param_spec_enum("" prop_name "",                                                   \
+                              "",                                                                \
+                              "",                                                                \
+                              (gtype_enum),                                                      \
+                              (default_value),                                                   \
+                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));       \
+                                                                                                 \
+        (obj_properties)[(prop_id)] = _param_spec;                                               \
+                                                                                                 \
+        _nm_properties_override_gobj(                                                            \
+            (properties_override),                                                               \
+            _param_spec,                                                                         \
+            &nm_sett_info_propert_type_direct_enum,                                              \
+            .direct_offset =                                                                     \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(int, private_struct_type, private_struct_field),    \
+            __VA_ARGS__);                                                                        \
+    }                                                                                            \
+    G_STMT_END
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_ternary_enum(properties_override,  \
+                                                        obj_properties,       \
+                                                        prop_name,            \
+                                                        prop_id,              \
+                                                        param_flags,          \
+                                                        private_struct_type,  \
+                                                        private_struct_field, \
+                                                        ...)                  \
+    _nm_setting_property_define_direct_enum((properties_override),            \
+                                            (obj_properties),                 \
+                                            prop_name,                        \
+                                            (prop_id),                        \
+                                            NM_TYPE_TERNARY,                  \
+                                            NM_TERNARY_DEFAULT,               \
+                                            (param_flags),                    \
+                                            private_struct_type,              \
+                                            private_struct_field,             \
+                                            __VA_ARGS__)
+
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_flags(properties_override,                           \
                                                  obj_properties,                                \
                                                  prop_name,                                     \
                                                  prop_id,                                       \
+                                                 gtype_flags,                                   \
                                                  default_value,                                 \
                                                  param_flags,                                   \
-                                                 property_type,                                 \
-                                                 get_fcn,                                       \
-                                                 ...)                                           \
+                                                 private_struct_type,                           \
+                                                 private_struct_field,                          \
+                                                 ... /* extra NMSettInfoProperty fields */)     \
     G_STMT_START                                                                                \
     {                                                                                           \
-        const gboolean                     _default_value = (default_value);                    \
-        GParamSpec *                       _param_spec;                                         \
-        const NMSettInfoPropertType *const _property_type = (property_type);                    \
+        GParamSpec *_param_spec;                                                                \
                                                                                                 \
         G_STATIC_ASSERT(                                                                        \
             !NM_FLAGS_ANY((param_flags),                                                        \
-                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE         \
-                            | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)));                          \
-                                                                                                \
-        nm_assert(_property_type);                                                              \
-        nm_assert(_property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_get_boolean); \
-                                                                                                \
-        nm_assert(NM_IN_SET(_default_value, 0, 1));                                             \
+                          ~(NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE)));     \
                                                                                                 \
         _param_spec =                                                                           \
-            g_param_spec_boolean("" prop_name "",                                               \
-                                 "",                                                            \
-                                 "",                                                            \
-                                 _default_value,                                                \
-                                 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));   \
+            g_param_spec_flags("" prop_name "",                                                 \
+                               "",                                                              \
+                               "",                                                              \
+                               (gtype_flags),                                                   \
+                               (default_value),                                                 \
+                               G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));     \
                                                                                                 \
         (obj_properties)[(prop_id)] = _param_spec;                                              \
                                                                                                 \
-        _nm_properties_override_gobj((properties_override),                                     \
-                                     _param_spec,                                               \
-                                     _property_type,                                            \
-                                     .to_dbus_data.get_boolean =                                \
-                                         (gboolean(*)(NMSetting *)) (get_fcn),                  \
-                                     __VA_ARGS__);                                              \
+        _nm_properties_override_gobj(                                                           \
+            (properties_override),                                                              \
+            _param_spec,                                                                        \
+            &nm_sett_info_propert_type_direct_flags,                                            \
+            .direct_offset =                                                                    \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(guint, private_struct_type, private_struct_field), \
+            __VA_ARGS__);                                                                       \
     }                                                                                           \
     G_STMT_END
 
-#define _nm_setting_property_define_boolean(properties_override,                 \
-                                            obj_properties,                      \
-                                            prop_name,                           \
-                                            prop_id,                             \
-                                            default_value,                       \
-                                            param_flags,                         \
-                                            get_fcn,                             \
-                                            ...)                                 \
-    _nm_setting_property_define_boolean_full((properties_override),              \
-                                             (obj_properties),                   \
-                                             prop_name,                          \
-                                             (prop_id),                          \
-                                             (default_value),                    \
-                                             (param_flags),                      \
-                                             &nm_sett_info_propert_type_boolean, \
-                                             (get_fcn),                          \
-                                             __VA_ARGS__)
+/*****************************************************************************/
+
+#define _nm_setting_property_define_direct_secret_flags(properties_override,                       \
+                                                        obj_properties,                            \
+                                                        prop_name,                                 \
+                                                        prop_id,                                   \
+                                                        private_struct_type,                       \
+                                                        private_struct_field,                      \
+                                                        ... /* extra NMSettInfoProperty fields */) \
+    _nm_setting_property_define_direct_flags((properties_override),                                \
+                                             (obj_properties),                                     \
+                                             prop_name,                                            \
+                                             (prop_id),                                            \
+                                             NM_TYPE_SETTING_SECRET_FLAGS,                         \
+                                             NM_SETTING_SECRET_FLAG_NONE,                          \
+                                             NM_SETTING_PARAM_NONE,                                \
+                                             private_struct_type,                                  \
+                                             private_struct_field,                                 \
+                                             ##__VA_ARGS__)
 
 /*****************************************************************************/
 
-#define _nm_setting_property_define_string_full(properties_override,                            \
-                                                obj_properties,                                 \
-                                                prop_name,                                      \
-                                                prop_id,                                        \
-                                                param_flags,                                    \
-                                                property_type,                                  \
-                                                get_fcn,                                        \
-                                                ...)                                            \
-    G_STMT_START                                                                                \
-    {                                                                                           \
-        GParamSpec *                       _param_spec;                                         \
-        const NMSettInfoPropertType *const _property_type = (property_type);                    \
-                                                                                                \
-        G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags),                                            \
-                                      ~(NM_SETTING_PARAM_SECRET | NM_SETTING_PARAM_FUZZY_IGNORE \
-                                        | NM_SETTING_PARAM_INFERRABLE                           \
-                                        | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)));              \
-        nm_assert(_property_type);                                                              \
-        nm_assert(_property_type->to_dbus_fcn == _nm_setting_property_to_dbus_fcn_get_string);  \
-                                                                                                \
-        _param_spec =                                                                           \
-            g_param_spec_string("" prop_name "",                                                \
-                                "",                                                             \
-                                "",                                                             \
-                                NULL,                                                           \
-                                G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));    \
-                                                                                                \
-        (obj_properties)[(prop_id)] = _param_spec;                                              \
-                                                                                                \
-        _nm_properties_override_gobj((properties_override),                                     \
-                                     _param_spec,                                               \
-                                     _property_type,                                            \
-                                     .to_dbus_data.get_string =                                 \
-                                         (const char *(*) (NMSetting *) ) (get_fcn),            \
-                                     __VA_ARGS__);                                              \
-    }                                                                                           \
+#define _nm_setting_property_define_direct_mac_address(properties_override,                       \
+                                                       obj_properties,                            \
+                                                       prop_name,                                 \
+                                                       prop_id,                                   \
+                                                       param_flags,                               \
+                                                       private_struct_type,                       \
+                                                       private_struct_field,                      \
+                                                       ... /* extra NMSettInfoProperty fields */) \
+    G_STMT_START                                                                                  \
+    {                                                                                             \
+        GParamSpec *_param_spec;                                                                  \
+                                                                                                  \
+        G_STATIC_ASSERT(!NM_FLAGS_ANY((param_flags),                                              \
+                                      ~(NM_SETTING_PARAM_SECRET | NM_SETTING_PARAM_FUZZY_IGNORE   \
+                                        | NM_SETTING_PARAM_INFERRABLE                             \
+                                        | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY)));                \
+                                                                                                  \
+        _param_spec =                                                                             \
+            g_param_spec_string("" prop_name "",                                                  \
+                                "",                                                               \
+                                "",                                                               \
+                                NULL,                                                             \
+                                G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | (param_flags));      \
+                                                                                                  \
+        (obj_properties)[(prop_id)] = _param_spec;                                                \
+                                                                                                  \
+        _nm_properties_override_gobj(                                                             \
+            (properties_override),                                                                \
+            _param_spec,                                                                          \
+            &nm_sett_info_propert_type_direct_mac_address,                                        \
+            .direct_offset =                                                                      \
+                NM_STRUCT_OFFSET_ENSURE_TYPE(char *, private_struct_type, private_struct_field),  \
+            __VA_ARGS__);                                                                         \
+    }                                                                                             \
     G_STMT_END
 
-#define _nm_setting_property_define_string(properties_override,                \
-                                           obj_properties,                     \
-                                           prop_name,                          \
-                                           prop_id,                            \
-                                           param_flags,                        \
-                                           get_fcn,                            \
-                                           ...)                                \
-    _nm_setting_property_define_string_full((properties_override),             \
-                                            (obj_properties),                  \
-                                            prop_name,                         \
-                                            (prop_id),                         \
-                                            (param_flags),                     \
-                                            &nm_sett_info_propert_type_string, \
-                                            (get_fcn),                         \
-                                            __VA_ARGS__)
-
 /*****************************************************************************/
 
 gboolean _nm_setting_use_legacy_property(NMSetting * setting,
@@ -520,6 +905,20 @@ gboolean _nm_setting_should_compare_secret_property(NMSetting *           settin
 NMBridgeVlan *_nm_bridge_vlan_dup(const NMBridgeVlan *vlan);
 NMBridgeVlan *_nm_bridge_vlan_dup_and_seal(const NMBridgeVlan *vlan);
 
+gboolean _nm_utils_bridge_vlans_from_dbus(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
+GVariant *_nm_utils_bridge_vlans_to_dbus(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
+
+NMTernary _nm_setting_ip_config_compare_fcn_addresses(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_nil);
+
+NMTernary _nm_setting_ip_config_compare_fcn_routes(_NM_SETT_INFO_PROP_COMPARE_FCN_ARGS _nm_nil);
+
+gboolean _nm_utils_hwaddr_cloned_not_set(_NM_SETT_INFO_PROP_MISSING_FROM_DBUS_FCN_ARGS _nm_nil);
+
+GVariant *_nm_utils_hwaddr_cloned_get(_NM_SETT_INFO_PROP_TO_DBUS_FCN_ARGS _nm_nil);
+
+gboolean _nm_utils_hwaddr_cloned_set(_NM_SETT_INFO_PROP_FROM_DBUS_FCN_ARGS _nm_nil);
+
 /*****************************************************************************/
 
 #endif /* NM_SETTING_PRIVATE_H */