summaryrefslogtreecommitdiff
path: root/src/devices/nm-device-bond.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/nm-device-bond.c')
-rw-r--r--src/devices/nm-device-bond.c976
1 files changed, 469 insertions, 507 deletions
diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
index 40bd185b80..b73a8f6fe9 100644
--- a/src/devices/nm-device-bond.c
+++ b/src/devices/nm-device-bond.c
@@ -22,279 +22,255 @@ _LOG_DECLARE_SELF(NMDeviceBond);
/*****************************************************************************/
-#define OPTIONS_APPLY_SUBSET \
- NM_SETTING_BOND_OPTION_MIIMON, \
- NM_SETTING_BOND_OPTION_UPDELAY, \
- NM_SETTING_BOND_OPTION_DOWNDELAY, \
- NM_SETTING_BOND_OPTION_ARP_INTERVAL, \
- NM_SETTING_BOND_OPTION_ARP_VALIDATE, \
- NM_SETTING_BOND_OPTION_PRIMARY, \
- NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM, \
- NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO, \
- NM_SETTING_BOND_OPTION_AD_SELECT, \
- NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY, \
- NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE, \
- NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS, \
- NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, \
- NM_SETTING_BOND_OPTION_LACP_RATE, \
- NM_SETTING_BOND_OPTION_LP_INTERVAL, \
- NM_SETTING_BOND_OPTION_MIN_LINKS, \
- NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE, \
- NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, \
- NM_SETTING_BOND_OPTION_RESEND_IGMP, \
- NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB, \
- NM_SETTING_BOND_OPTION_USE_CARRIER, \
- NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, \
- NM_SETTING_BOND_OPTION_NUM_GRAT_ARP
-
-#define OPTIONS_REAPPLY_SUBSET \
- NM_SETTING_BOND_OPTION_MIIMON, \
- NM_SETTING_BOND_OPTION_UPDELAY, \
- NM_SETTING_BOND_OPTION_DOWNDELAY, \
- NM_SETTING_BOND_OPTION_ARP_INTERVAL, \
- NM_SETTING_BOND_OPTION_ARP_VALIDATE, \
- NM_SETTING_BOND_OPTION_PRIMARY, \
- NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM, \
- NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO, \
- NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE, \
- NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS, \
- NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, \
- NM_SETTING_BOND_OPTION_LP_INTERVAL, \
- NM_SETTING_BOND_OPTION_MIN_LINKS, \
- NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE, \
- NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, \
- NM_SETTING_BOND_OPTION_RESEND_IGMP, \
- NM_SETTING_BOND_OPTION_USE_CARRIER, \
- NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, \
- NM_SETTING_BOND_OPTION_NUM_GRAT_ARP
-
-#define OPTIONS_REAPPLY_FULL \
- OPTIONS_REAPPLY_SUBSET, \
- NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, \
- NM_SETTING_BOND_OPTION_ARP_IP_TARGET
+#define OPTIONS_APPLY_SUBSET \
+ NM_SETTING_BOND_OPTION_MIIMON, NM_SETTING_BOND_OPTION_UPDELAY, \
+ NM_SETTING_BOND_OPTION_DOWNDELAY, NM_SETTING_BOND_OPTION_ARP_INTERVAL, \
+ NM_SETTING_BOND_OPTION_ARP_VALIDATE, NM_SETTING_BOND_OPTION_PRIMARY, \
+ NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM, NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO, \
+ NM_SETTING_BOND_OPTION_AD_SELECT, NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY, \
+ NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE, NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS, \
+ NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, NM_SETTING_BOND_OPTION_LACP_RATE, \
+ NM_SETTING_BOND_OPTION_LP_INTERVAL, NM_SETTING_BOND_OPTION_MIN_LINKS, \
+ NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE, NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, \
+ NM_SETTING_BOND_OPTION_RESEND_IGMP, NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB, \
+ NM_SETTING_BOND_OPTION_USE_CARRIER, NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, \
+ NM_SETTING_BOND_OPTION_NUM_GRAT_ARP
+
+#define OPTIONS_REAPPLY_SUBSET \
+ NM_SETTING_BOND_OPTION_MIIMON, NM_SETTING_BOND_OPTION_UPDELAY, \
+ NM_SETTING_BOND_OPTION_DOWNDELAY, NM_SETTING_BOND_OPTION_ARP_INTERVAL, \
+ NM_SETTING_BOND_OPTION_ARP_VALIDATE, NM_SETTING_BOND_OPTION_PRIMARY, \
+ NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM, NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO, \
+ NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE, NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS, \
+ NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, NM_SETTING_BOND_OPTION_LP_INTERVAL, \
+ NM_SETTING_BOND_OPTION_MIN_LINKS, NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE, \
+ NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, NM_SETTING_BOND_OPTION_RESEND_IGMP, \
+ NM_SETTING_BOND_OPTION_USE_CARRIER, NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, \
+ NM_SETTING_BOND_OPTION_NUM_GRAT_ARP
+
+#define OPTIONS_REAPPLY_FULL \
+ OPTIONS_REAPPLY_SUBSET, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, \
+ NM_SETTING_BOND_OPTION_ARP_IP_TARGET
/*****************************************************************************/
struct _NMDeviceBond {
- NMDevice parent;
+ NMDevice parent;
};
struct _NMDeviceBondClass {
- NMDeviceClass parent;
+ NMDeviceClass parent;
};
-G_DEFINE_TYPE (NMDeviceBond, nm_device_bond, NM_TYPE_DEVICE)
+G_DEFINE_TYPE(NMDeviceBond, nm_device_bond, NM_TYPE_DEVICE)
/*****************************************************************************/
static NMDeviceCapabilities
-get_generic_capabilities (NMDevice *dev)
+get_generic_capabilities(NMDevice *dev)
{
- return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
+ return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
}
static gboolean
-complete_connection (NMDevice *device,
- NMConnection *connection,
- const char *specific_object,
- NMConnection *const*existing_connections,
- GError **error)
+complete_connection(NMDevice * device,
+ NMConnection * connection,
+ const char * specific_object,
+ NMConnection *const *existing_connections,
+ GError ** error)
{
- NMSettingBond *s_bond;
-
- nm_utils_complete_generic (nm_device_get_platform (device),
- connection,
- NM_SETTING_BOND_SETTING_NAME,
- existing_connections,
- NULL,
- _("Bond connection"),
- "bond",
- NULL,
- TRUE);
-
- s_bond = nm_connection_get_setting_bond (connection);
- if (!s_bond) {
- s_bond = (NMSettingBond *) nm_setting_bond_new ();
- nm_connection_add_setting (connection, NM_SETTING (s_bond));
- }
-
- return TRUE;
+ NMSettingBond *s_bond;
+
+ nm_utils_complete_generic(nm_device_get_platform(device),
+ connection,
+ NM_SETTING_BOND_SETTING_NAME,
+ existing_connections,
+ NULL,
+ _("Bond connection"),
+ "bond",
+ NULL,
+ TRUE);
+
+ s_bond = nm_connection_get_setting_bond(connection);
+ if (!s_bond) {
+ s_bond = (NMSettingBond *) nm_setting_bond_new();
+ nm_connection_add_setting(connection, NM_SETTING(s_bond));
+ }
+
+ return TRUE;
}
/*****************************************************************************/
static gboolean
-_set_bond_attr (NMDevice *device, const char *attr, const char *value)
+_set_bond_attr(NMDevice *device, const char *attr, const char *value)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
- int ifindex = nm_device_get_ifindex (device);
- gboolean ret;
-
- ret = nm_platform_sysctl_master_set_option (nm_device_get_platform (device),
- ifindex,
- attr,
- value);
- if (!ret)
- _LOGW (LOGD_PLATFORM, "failed to set bonding attribute '%s' to '%s'", attr, value);
- return ret;
+ NMDeviceBond *self = NM_DEVICE_BOND(device);
+ int ifindex = nm_device_get_ifindex(device);
+ gboolean ret;
+
+ ret =
+ nm_platform_sysctl_master_set_option(nm_device_get_platform(device), ifindex, attr, value);
+ if (!ret)
+ _LOGW(LOGD_PLATFORM, "failed to set bonding attribute '%s' to '%s'", attr, value);
+ return ret;
}
-#define _set_bond_attr_take(device, attr, value) \
- G_STMT_START { \
- gs_free char *_tmp = (value); \
- \
- _set_bond_attr (device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, _tmp); \
- } G_STMT_END
+#define _set_bond_attr_take(device, attr, value) \
+ G_STMT_START \
+ { \
+ gs_free char *_tmp = (value); \
+ \
+ _set_bond_attr(device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, _tmp); \
+ } \
+ G_STMT_END
#define _set_bond_attr_printf(device, attr, fmt, ...) \
- _set_bond_attr_take ((device), (attr), g_strdup_printf (fmt, __VA_ARGS__))
+ _set_bond_attr_take((device), (attr), g_strdup_printf(fmt, __VA_ARGS__))
static gboolean
-ignore_option (NMSettingBond *s_bond, const char *option, const char *value)
+ignore_option(NMSettingBond *s_bond, const char *option, const char *value)
{
- const char *defvalue;
+ const char *defvalue;
- if (nm_streq0 (option, NM_SETTING_BOND_OPTION_MIIMON)) {
- /* The default value for miimon, when missing in the setting, is
+ if (nm_streq0(option, NM_SETTING_BOND_OPTION_MIIMON)) {
+ /* The default value for miimon, when missing in the setting, is
* 0 if arp_interval is != 0, and 100 otherwise. So, let's ignore
* miimon=0 (which means that miimon is disabled) and accept any
* other value. Adding miimon=100 does not cause any harm.
*/
- defvalue = "0";
- } else
- defvalue = nm_setting_bond_get_option_default (s_bond, option);
+ defvalue = "0";
+ } else
+ defvalue = nm_setting_bond_get_option_default(s_bond, option);
- return nm_streq0 (value, defvalue);
+ return nm_streq0(value, defvalue);
}
static void
-update_connection (NMDevice *device, NMConnection *connection)
+update_connection(NMDevice *device, NMConnection *connection)
{
- NMSettingBond *s_bond = nm_connection_get_setting_bond (connection);
- int ifindex = nm_device_get_ifindex (device);
- NMBondMode mode = NM_BOND_MODE_UNKNOWN;
- const char **options;
-
- if (!s_bond) {
- s_bond = (NMSettingBond *) nm_setting_bond_new ();
- nm_connection_add_setting (connection, (NMSetting *) s_bond);
- }
-
- /* Read bond options from sysfs and update the Bond setting to match */
- options = nm_setting_bond_get_valid_options (NULL);
- for (; options[0]; options++) {
- const char *option = options[0];
- gs_free char *value = NULL;
- char *p;
-
- if (NM_IN_STRSET (option, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE))
- continue;
-
- value = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
- ifindex,
- option);
-
- if ( value
- && _nm_setting_bond_get_option_type (s_bond, option) == NM_BOND_OPTION_TYPE_BOTH) {
- p = strchr (value, ' ');
- if (p)
- *p = '\0';
- }
-
- if (mode == NM_BOND_MODE_UNKNOWN) {
- if (value && nm_streq (option, NM_SETTING_BOND_OPTION_MODE))
- mode = _nm_setting_bond_mode_from_string (value);
- if (mode == NM_BOND_MODE_UNKNOWN)
- continue;
- }
-
- if (!_nm_setting_bond_option_supported (option, mode))
- continue;
-
- if ( value
- && value[0]
- && !ignore_option (s_bond, option, value)) {
- /* Replace " " with "," for arp_ip_targets from the kernel */
- if (nm_streq (option, NM_SETTING_BOND_OPTION_ARP_IP_TARGET)) {
- for (p = value; *p; p++) {
- if (*p == ' ')
- *p = ',';
- }
- }
-
- nm_setting_bond_add_option (s_bond, option, value);
- }
- }
+ NMSettingBond *s_bond = nm_connection_get_setting_bond(connection);
+ int ifindex = nm_device_get_ifindex(device);
+ NMBondMode mode = NM_BOND_MODE_UNKNOWN;
+ const char ** options;
+
+ if (!s_bond) {
+ s_bond = (NMSettingBond *) nm_setting_bond_new();
+ nm_connection_add_setting(connection, (NMSetting *) s_bond);
+ }
+
+ /* Read bond options from sysfs and update the Bond setting to match */
+ options = nm_setting_bond_get_valid_options(NULL);
+ for (; options[0]; options++) {
+ const char * option = options[0];
+ gs_free char *value = NULL;
+ char * p;
+
+ if (NM_IN_STRSET(option, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE))
+ continue;
+
+ value =
+ nm_platform_sysctl_master_get_option(nm_device_get_platform(device), ifindex, option);
+
+ if (value && _nm_setting_bond_get_option_type(s_bond, option) == NM_BOND_OPTION_TYPE_BOTH) {
+ p = strchr(value, ' ');
+ if (p)
+ *p = '\0';
+ }
+
+ if (mode == NM_BOND_MODE_UNKNOWN) {
+ if (value && nm_streq(option, NM_SETTING_BOND_OPTION_MODE))
+ mode = _nm_setting_bond_mode_from_string(value);
+ if (mode == NM_BOND_MODE_UNKNOWN)
+ continue;
+ }
+
+ if (!_nm_setting_bond_option_supported(option, mode))
+ continue;
+
+ if (value && value[0] && !ignore_option(s_bond, option, value)) {
+ /* Replace " " with "," for arp_ip_targets from the kernel */
+ if (nm_streq(option, NM_SETTING_BOND_OPTION_ARP_IP_TARGET)) {
+ for (p = value; *p; p++) {
+ if (*p == ' ')
+ *p = ',';
+ }
+ }
+
+ nm_setting_bond_add_option(s_bond, option, value);
+ }
+ }
}
static gboolean
-master_update_slave_connection (NMDevice *self,
- NMDevice *slave,
- NMConnection *connection,
- GError **error)
+master_update_slave_connection(NMDevice * self,
+ NMDevice * slave,
+ NMConnection *connection,
+ GError ** error)
{
- g_object_set (nm_connection_get_setting_connection (connection),
- NM_SETTING_CONNECTION_MASTER, nm_device_get_iface (self),
- NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_BOND_SETTING_NAME,
- NULL);
- return TRUE;
+ g_object_set(nm_connection_get_setting_connection(connection),
+ NM_SETTING_CONNECTION_MASTER,
+ nm_device_get_iface(self),
+ NM_SETTING_CONNECTION_SLAVE_TYPE,
+ NM_SETTING_BOND_SETTING_NAME,
+ NULL);
+ return TRUE;
}
static void
-set_arp_targets (NMDevice *device,
- const char *cur_arp_ip_target,
- const char *new_arp_ip_target)
+set_arp_targets(NMDevice *device, const char *cur_arp_ip_target, const char *new_arp_ip_target)
{
- gs_unref_ptrarray GPtrArray *free_list = NULL;
- gs_free const char **cur_strv = NULL;
- gs_free const char **new_strv = NULL;
- gsize cur_len;
- gsize new_len;
- gsize i;
- gsize j;
-
- cur_strv = nm_utils_strsplit_set_full (cur_arp_ip_target, NM_ASCII_SPACES, NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP);
- new_strv = nm_utils_bond_option_arp_ip_targets_split (new_arp_ip_target);
-
- cur_len = NM_PTRARRAY_LEN (cur_strv);
- new_len = NM_PTRARRAY_LEN (new_strv);
-
- if (new_len > 0) {
- for (j = 0, i = 0; i < new_len; i++) {
- const char *s;
- in_addr_t a4;
-
- s = new_strv[i];
- if (nm_utils_parse_inaddr_bin (AF_INET, s, NULL, &a4)) {
- char sbuf[INET_ADDRSTRLEN];
-
- _nm_utils_inet4_ntop (a4, sbuf);
- if (!nm_streq (s, sbuf)) {
- if (!free_list)
- free_list = g_ptr_array_new_with_free_func (g_free);
- s = g_strdup (sbuf);
- g_ptr_array_add (free_list, (gpointer) s);
- }
- }
-
- if (nm_utils_strv_find_first ((char **) new_strv, i, s) < 0)
- new_strv[j++] = s;
- }
- new_strv[j] = NULL;
- new_len = j;
- }
-
- if ( cur_len == 0
- && new_len == 0)
- return;
-
- if (_nm_utils_strv_equal ((char **) cur_strv, (char **) new_strv))
- return;
-
- for (i = 0; i < cur_len; i++)
- _set_bond_attr_printf (device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "-%s", cur_strv[i]);
- for (i = 0; i < new_len; i++)
- _set_bond_attr_printf (device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "+%s", new_strv[i]);
+ gs_unref_ptrarray GPtrArray *free_list = NULL;
+ gs_free const char ** cur_strv = NULL;
+ gs_free const char ** new_strv = NULL;
+ gsize cur_len;
+ gsize new_len;
+ gsize i;
+ gsize j;
+
+ cur_strv = nm_utils_strsplit_set_full(cur_arp_ip_target,
+ NM_ASCII_SPACES,
+ NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP);
+ new_strv = nm_utils_bond_option_arp_ip_targets_split(new_arp_ip_target);
+
+ cur_len = NM_PTRARRAY_LEN(cur_strv);
+ new_len = NM_PTRARRAY_LEN(new_strv);
+
+ if (new_len > 0) {
+ for (j = 0, i = 0; i < new_len; i++) {
+ const char *s;
+ in_addr_t a4;
+
+ s = new_strv[i];
+ if (nm_utils_parse_inaddr_bin(AF_INET, s, NULL, &a4)) {
+ char sbuf[INET_ADDRSTRLEN];
+
+ _nm_utils_inet4_ntop(a4, sbuf);
+ if (!nm_streq(s, sbuf)) {
+ if (!free_list)
+ free_list = g_ptr_array_new_with_free_func(g_free);
+ s = g_strdup(sbuf);
+ g_ptr_array_add(free_list, (gpointer) s);
+ }
+ }
+
+ if (nm_utils_strv_find_first((char **) new_strv, i, s) < 0)
+ new_strv[j++] = s;
+ }
+ new_strv[j] = NULL;
+ new_len = j;
+ }
+
+ if (cur_len == 0 && new_len == 0)
+ return;
+
+ if (_nm_utils_strv_equal((char **) cur_strv, (char **) new_strv))
+ return;
+
+ for (i = 0; i < cur_len; i++)
+ _set_bond_attr_printf(device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "-%s", cur_strv[i]);
+ for (i = 0; i < new_len; i++)
+ _set_bond_attr_printf(device, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "+%s", new_strv[i]);
}
/*
@@ -302,376 +278,362 @@ set_arp_targets (NMDevice *device,
* the default value if no value was set.
*/
static void
-set_bond_attr_or_default (NMDevice *device,
- NMSettingBond *s_bond,
- const char *opt)
+set_bond_attr_or_default(NMDevice *device, NMSettingBond *s_bond, const char *opt)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
- const char *value;
-
- value = nm_setting_bond_get_option_or_default (s_bond, opt);
- if (!value) {
- if ( _LOGT_ENABLED (LOGD_BOND)
- && nm_setting_bond_get_option_by_name (s_bond, opt))
- _LOGT (LOGD_BOND, "bond option '%s' not set as it conflicts with other options", opt);
- return;
- }
-
- _set_bond_attr (device, opt, value);
+ NMDeviceBond *self = NM_DEVICE_BOND(device);
+ const char * value;
+
+ value = nm_setting_bond_get_option_or_default(s_bond, opt);
+ if (!value) {
+ if (_LOGT_ENABLED(LOGD_BOND) && nm_setting_bond_get_option_by_name(s_bond, opt))
+ _LOGT(LOGD_BOND, "bond option '%s' not set as it conflicts with other options", opt);
+ return;
+ }
+
+ _set_bond_attr(device, opt, value);
}
static void
-set_bond_attrs_or_default (NMDevice *device, NMSettingBond *s_bond, const char *const *attr_v)
+set_bond_attrs_or_default(NMDevice *device, NMSettingBond *s_bond, const char *const *attr_v)
{
- nm_assert (NM_IS_DEVICE (device));
- nm_assert (s_bond);
- nm_assert (attr_v);
+ nm_assert(NM_IS_DEVICE(device));
+ nm_assert(s_bond);
+ nm_assert(attr_v);
- for ( ; *attr_v ; ++attr_v)
- set_bond_attr_or_default (device, s_bond, *attr_v);
+ for (; *attr_v; ++attr_v)
+ set_bond_attr_or_default(device, s_bond, *attr_v);
}
static void
-set_bond_arp_ip_targets (NMDevice *device, NMSettingBond *s_bond)
+set_bond_arp_ip_targets(NMDevice *device, NMSettingBond *s_bond)
{
- int ifindex = nm_device_get_ifindex (device);
- gs_free char *cur_arp_ip_target = NULL;
-
- /* ARP targets: clear and initialize the list */
- cur_arp_ip_target = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
- ifindex,
- NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
- set_arp_targets (device,
- cur_arp_ip_target,
- nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
+ int ifindex = nm_device_get_ifindex(device);
+ gs_free char *cur_arp_ip_target = NULL;
+
+ /* ARP targets: clear and initialize the list */
+ cur_arp_ip_target = nm_platform_sysctl_master_get_option(nm_device_get_platform(device),
+ ifindex,
+ NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
+ set_arp_targets(
+ device,
+ cur_arp_ip_target,
+ nm_setting_bond_get_option_or_default(s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
}
static gboolean
-apply_bonding_config (NMDeviceBond *self)
+apply_bonding_config(NMDeviceBond *self)
{
- NMDevice *device = NM_DEVICE (self);
- NMSettingBond *s_bond;
- NMBondMode mode;
- const char *mode_str;
+ NMDevice * device = NM_DEVICE(self);
+ NMSettingBond *s_bond;
+ NMBondMode mode;
+ const char * mode_str;
- s_bond = nm_device_get_applied_setting (device, NM_TYPE_SETTING_BOND);
- g_return_val_if_fail (s_bond, FALSE);
+ s_bond = nm_device_get_applied_setting(device, NM_TYPE_SETTING_BOND);
+ g_return_val_if_fail(s_bond, FALSE);
- mode_str = nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_MODE);
- mode = _nm_setting_bond_mode_from_string (mode_str);
- g_return_val_if_fail (mode != NM_BOND_MODE_UNKNOWN, FALSE);
+ mode_str = nm_setting_bond_get_option_or_default(s_bond, NM_SETTING_BOND_OPTION_MODE);
+ mode = _nm_setting_bond_mode_from_string(mode_str);
+ g_return_val_if_fail(mode != NM_BOND_MODE_UNKNOWN, FALSE);
- /* Set mode first, as some other options (e.g. arp_interval) are valid
+ /* Set mode first, as some other options (e.g. arp_interval) are valid
* only for certain modes.
*/
- set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MODE);
+ set_bond_attr_or_default(device, s_bond, NM_SETTING_BOND_OPTION_MODE);
- set_bond_arp_ip_targets (device, s_bond);
+ set_bond_arp_ip_targets(device, s_bond);
- set_bond_attrs_or_default (device,
- s_bond,
- NM_MAKE_STRV (OPTIONS_APPLY_SUBSET));
- return TRUE;
+ set_bond_attrs_or_default(device, s_bond, NM_MAKE_STRV(OPTIONS_APPLY_SUBSET));
+ return TRUE;
}
static NMActStageReturn
-act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason)
+act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
- NMActStageReturn ret = NM_ACT_STAGE_RETURN_SUCCESS;
-
- /* Interface must be down to set bond options */
- nm_device_take_down (device, TRUE);
- if (!apply_bonding_config (self))
- ret = NM_ACT_STAGE_RETURN_FAILURE;
- else {
- if (!nm_device_hw_addr_set_cloned (device,
- nm_device_get_applied_connection (device),
- FALSE))
- ret = NM_ACT_STAGE_RETURN_FAILURE;
- }
- nm_device_bring_up (device, TRUE, NULL);
-
- return ret;
+ NMDeviceBond * self = NM_DEVICE_BOND(device);
+ NMActStageReturn ret = NM_ACT_STAGE_RETURN_SUCCESS;
+
+ /* Interface must be down to set bond options */
+ nm_device_take_down(device, TRUE);
+ if (!apply_bonding_config(self))
+ ret = NM_ACT_STAGE_RETURN_FAILURE;
+ else {
+ if (!nm_device_hw_addr_set_cloned(device, nm_device_get_applied_connection(device), FALSE))
+ ret = NM_ACT_STAGE_RETURN_FAILURE;
+ }
+ nm_device_bring_up(device, TRUE, NULL);
+
+ return ret;
}
static gboolean
-enslave_slave (NMDevice *device,
- NMDevice *slave,
- NMConnection *connection,
- gboolean configure)
+enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
+ NMDeviceBond *self = NM_DEVICE_BOND(device);
- nm_device_master_check_slave_physical_port (device, slave, LOGD_BOND);
+ nm_device_master_check_slave_physical_port(device, slave, LOGD_BOND);
- if (configure) {
- gboolean success;
+ if (configure) {
+ gboolean success;
- nm_device_take_down (slave, TRUE);
- success = nm_platform_link_enslave (nm_device_get_platform (device),
- nm_device_get_ip_ifindex (device),
- nm_device_get_ip_ifindex (slave));
- nm_device_bring_up (slave, TRUE, NULL);
+ nm_device_take_down(slave, TRUE);
+ success = nm_platform_link_enslave(nm_device_get_platform(device),
+ nm_device_get_ip_ifindex(device),
+ nm_device_get_ip_ifindex(slave));
+ nm_device_bring_up(slave, TRUE, NULL);
- if (!success) {
- _LOGI (LOGD_BOND, "enslaved bond slave %s: failed", nm_device_get_ip_iface (slave));
- return FALSE;
- }
+ if (!success) {
+ _LOGI(LOGD_BOND, "enslaved bond slave %s: failed", nm_device_get_ip_iface(slave));
+ return FALSE;
+ }
- _LOGI (LOGD_BOND, "enslaved bond slave %s", nm_device_get_ip_iface (slave));
- } else
- _LOGI (LOGD_BOND, "bond slave %s was enslaved", nm_device_get_ip_iface (slave));
+ _LOGI(LOGD_BOND, "enslaved bond slave %s", nm_device_get_ip_iface(slave));
+ } else
+ _LOGI(LOGD_BOND, "bond slave %s was enslaved", nm_device_get_ip_iface(slave));
- return TRUE;
+ return TRUE;
}
static void
-release_slave (NMDevice *device,
- NMDevice *slave,
- gboolean configure)
+release_slave(NMDevice *device, NMDevice *slave, gboolean configure)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
- gboolean success;
- gs_free char *address = NULL;
- int ifindex_slave;
- int ifindex;
-
- if (configure) {
- ifindex = nm_device_get_ifindex (device);
- if ( ifindex <= 0
- || !nm_platform_link_get (nm_device_get_platform (device), ifindex))
- configure = FALSE;
- }
-
- ifindex_slave = nm_device_get_ip_ifindex (slave);
-
- if (ifindex_slave <= 0)
- _LOGD (LOGD_BOND, "bond slave %s is already released", nm_device_get_ip_iface (slave));
-
- if (configure) {
- /* When the last slave is released the bond MAC will be set to a random
+ NMDeviceBond *self = NM_DEVICE_BOND(device);
+ gboolean success;
+ gs_free char *address = NULL;
+ int ifindex_slave;
+ int ifindex;
+
+ if (configure) {
+ ifindex = nm_device_get_ifindex(device);
+ if (ifindex <= 0 || !nm_platform_link_get(nm_device_get_platform(device), ifindex))
+ configure = FALSE;
+ }
+
+ ifindex_slave = nm_device_get_ip_ifindex(slave);
+
+ if (ifindex_slave <= 0)
+ _LOGD(LOGD_BOND, "bond slave %s is already released", nm_device_get_ip_iface(slave));
+
+ if (configure) {
+ /* When the last slave is released the bond MAC will be set to a random
* value by kernel; remember the current one and restore it afterwards.
*/
- address = g_strdup (nm_device_get_hw_address (device));
-
- if (ifindex_slave > 0) {
- success = nm_platform_link_release (nm_device_get_platform (device),
- nm_device_get_ip_ifindex (device),
- ifindex_slave);
-
- if (success) {
- _LOGI (LOGD_BOND, "released bond slave %s",
- nm_device_get_ip_iface (slave));
- } else {
- _LOGW (LOGD_BOND, "failed to release bond slave %s",
- nm_device_get_ip_iface (slave));
- }
- }
-
- nm_platform_process_events (nm_device_get_platform (device));
- if (nm_device_update_hw_address (device))
- nm_device_hw_addr_set (device, address, "restore", FALSE);
-
- /* Kernel bonding code "closes" the slave when releasing it, (which clears
+ address = g_strdup(nm_device_get_hw_address(device));
+
+ if (ifindex_slave > 0) {
+ success = nm_platform_link_release(nm_device_get_platform(device),
+ nm_device_get_ip_ifindex(device),
+ ifindex_slave);
+
+ if (success) {
+ _LOGI(LOGD_BOND, "released bond slave %s", nm_device_get_ip_iface(slave));
+ } else {
+ _LOGW(LOGD_BOND, "failed to release bond slave %s", nm_device_get_ip_iface(slave));
+ }
+ }
+
+ nm_platform_process_events(nm_device_get_platform(device));
+ if (nm_device_update_hw_address(device))
+ nm_device_hw_addr_set(device, address, "restore", FALSE);
+
+ /* Kernel bonding code "closes" the slave when releasing it, (which clears
* IFF_UP), so we must bring it back up here to ensure carrier changes and
* other state is noticed by the now-released slave.
*/
- if (ifindex_slave > 0) {
- if (!nm_device_bring_up (slave, TRUE, NULL))
- _LOGW (LOGD_BOND, "released bond slave could not be brought up.");
- }
- } else {
- if (ifindex_slave > 0) {
- _LOGI (LOGD_BOND, "bond slave %s was released",
- nm_device_get_ip_iface (slave));
- }
- }
+ if (ifindex_slave > 0) {
+ if (!nm_device_bring_up(slave, TRUE, NULL))
+ _LOGW(LOGD_BOND, "released bond slave could not be brought up.");
+ }
+ } else {
+ if (ifindex_slave > 0) {
+ _LOGI(LOGD_BOND, "bond slave %s was released", nm_device_get_ip_iface(slave));
+ }
+ }
}
static gboolean
-create_and_realize (NMDevice *device,
- NMConnection *connection,
- NMDevice *parent,
- const NMPlatformLink **out_plink,
- GError **error)
+create_and_realize(NMDevice * device,
+ NMConnection * connection,
+ NMDevice * parent,
+ const NMPlatformLink **out_plink,
+ GError ** error)
{
- const char *iface = nm_device_get_iface (device);
- int r;
-
- g_assert (iface);
-
- r = nm_platform_link_bond_add (nm_device_get_platform (device), iface, out_plink);
- if (r < 0) {
- g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
- "Failed to create bond interface '%s' for '%s': %s",
- iface,
- nm_connection_get_id (connection),
- nm_strerror (r));
- return FALSE;
- }
- return TRUE;
+ const char *iface = nm_device_get_iface(device);
+ int r;
+
+ g_assert(iface);
+
+ r = nm_platform_link_bond_add(nm_device_get_platform(device), iface, out_plink);
+ if (r < 0) {
+ g_set_error(error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create bond interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id(connection),
+ nm_strerror(r));
+ return FALSE;
+ }
+ return TRUE;
}
static gboolean
-can_reapply_change (NMDevice *device,
- const char *setting_name,
- NMSetting *s_old,
- NMSetting *s_new,
- GHashTable *diffs,
- GError **error)
+can_reapply_change(NMDevice * device,
+ const char *setting_name,
+ NMSetting * s_old,
+ NMSetting * s_new,
+ GHashTable *diffs,
+ GError ** error)
{
- NMDeviceClass *device_class;
-
- /* Only handle bond setting here, delegate other settings to parent class */
- if (nm_streq (setting_name, NM_SETTING_BOND_SETTING_NAME)) {
- NMSettingBond *s_a = NM_SETTING_BOND (s_old);
- NMSettingBond *s_b = NM_SETTING_BOND (s_new);
- const char **option_list;
-
- if (!nm_device_hash_check_invalid_keys (diffs,
- NM_SETTING_BOND_SETTING_NAME,
- error,
- NM_SETTING_BOND_OPTIONS))
- return FALSE;
-
- option_list = nm_setting_bond_get_valid_options (NULL);
-
- for (; *option_list; ++option_list) {
- const char *name = *option_list;
-
- /* We support changes to these */
- if (NM_IN_STRSET (name, OPTIONS_REAPPLY_FULL))
- continue;
-
- /* Reject any other changes */
- if (!nm_streq0 (nm_setting_bond_get_option_normalized (s_a, name),
- nm_setting_bond_get_option_normalized (s_b, name))) {
- g_set_error (error,
- NM_DEVICE_ERROR,
- NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
- "Can't reapply '%s' bond option",
- name);
- return FALSE;
- }
- }
-
- return TRUE;
- }
-
- device_class = NM_DEVICE_CLASS (nm_device_bond_parent_class);
- return device_class->can_reapply_change (device,
- setting_name,
- s_old,
- s_new,
- diffs,
- error);
+ NMDeviceClass *device_class;
+
+ /* Only handle bond setting here, delegate other settings to parent class */
+ if (nm_streq(setting_name, NM_SETTING_BOND_SETTING_NAME)) {
+ NMSettingBond *s_a = NM_SETTING_BOND(s_old);
+ NMSettingBond *s_b = NM_SETTING_BOND(s_new);
+ const char ** option_list;
+
+ if (!nm_device_hash_check_invalid_keys(diffs,
+ NM_SETTING_BOND_SETTING_NAME,
+ error,
+ NM_SETTING_BOND_OPTIONS))
+ return FALSE;
+
+ option_list = nm_setting_bond_get_valid_options(NULL);
+
+ for (; *option_list; ++option_list) {
+ const char *name = *option_list;
+
+ /* We support changes to these */
+ if (NM_IN_STRSET(name, OPTIONS_REAPPLY_FULL))
+ continue;
+
+ /* Reject any other changes */
+ if (!nm_streq0(nm_setting_bond_get_option_normalized(s_a, name),
+ nm_setting_bond_get_option_normalized(s_b, name))) {
+ g_set_error(error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ "Can't reapply '%s' bond option",
+ name);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ device_class = NM_DEVICE_CLASS(nm_device_bond_parent_class);
+ return device_class->can_reapply_change(device, setting_name, s_old, s_new, diffs, error);
}
static void
-reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_new)
+reapply_connection(NMDevice *device, NMConnection *con_old, NMConnection *con_new)
{
- NMDeviceBond *self = NM_DEVICE_BOND (device);
- NMSettingBond *s_bond;
- const char *value;
- NMBondMode mode;
+ NMDeviceBond * self = NM_DEVICE_BOND(device);
+ NMSettingBond *s_bond;
+ const char * value;
+ NMBondMode mode;
- NM_DEVICE_CLASS (nm_device_bond_parent_class)->reapply_connection (device,
- con_old,
- con_new);
+ NM_DEVICE_CLASS(nm_device_bond_parent_class)->reapply_connection(device, con_old, con_new);
- _LOGD (LOGD_BOND, "reapplying bond settings");
- s_bond = nm_connection_get_setting_bond (con_new);
- g_return_if_fail (s_bond);
+ _LOGD(LOGD_BOND, "reapplying bond settings");
+ s_bond = nm_connection_get_setting_bond(con_new);
+ g_return_if_fail(s_bond);
- value = nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_MODE);
- mode = _nm_setting_bond_mode_from_string (value);
- g_return_if_fail (mode != NM_BOND_MODE_UNKNOWN);
+ value = nm_setting_bond_get_option_or_default(s_bond, NM_SETTING_BOND_OPTION_MODE);
+ mode = _nm_setting_bond_mode_from_string(value);
+ g_return_if_fail(mode != NM_BOND_MODE_UNKNOWN);
- /* Below we set only the bond options that kernel allows to modify
+ /* Below we set only the bond options that kernel allows to modify
* while keeping the bond interface up */
- set_bond_arp_ip_targets (device, s_bond);
+ set_bond_arp_ip_targets(device, s_bond);
- set_bond_attrs_or_default (device,
- s_bond,
- NM_MAKE_STRV (OPTIONS_REAPPLY_SUBSET));
+ set_bond_attrs_or_default(device, s_bond, NM_MAKE_STRV(OPTIONS_REAPPLY_SUBSET));
}
/*****************************************************************************/
static void
-nm_device_bond_init (NMDeviceBond * self)
+nm_device_bond_init(NMDeviceBond *self)
{
- nm_assert (nm_device_is_master (NM_DEVICE (self)));
+ nm_assert(nm_device_is_master(NM_DEVICE(self)));
}
static const NMDBusInterfaceInfoExtended interface_info_device_bond = {
- .parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT (
- NM_DBUS_INTERFACE_DEVICE_BOND,
- .signals = NM_DEFINE_GDBUS_SIGNAL_INFOS (
- &nm_signal_info_property_changed_legacy,
- ),
- .properties = NM_DEFINE_GDBUS_PROPERTY_INFOS (
- NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("HwAddress", "s", NM_DEVICE_HW_ADDRESS),
- NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Carrier", "b", NM_DEVICE_CARRIER),
- NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Slaves", "ao", NM_DEVICE_SLAVES),
- ),
- ),
- .legacy_property_changed = TRUE,
+ .parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT(
+ NM_DBUS_INTERFACE_DEVICE_BOND,
+ .signals = NM_DEFINE_GDBUS_SIGNAL_INFOS(&nm_signal_info_property_changed_legacy, ),
+ .properties = NM_DEFINE_GDBUS_PROPERTY_INFOS(
+ NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L("HwAddress",
+ "s",
+ NM_DEVICE_HW_ADDRESS),
+ NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L("Carrier", "b", NM_DEVICE_CARRIER),
+ NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L("Slaves",
+ "ao",
+ NM_DEVICE_SLAVES), ), ),
+ .legacy_property_changed = TRUE,
};
static void
-nm_device_bond_class_init (NMDeviceBondClass *klass)
+nm_device_bond_class_init(NMDeviceBondClass *klass)
{
- NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (klass);
- NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
+ NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS(klass);
+ NMDeviceClass * device_class = NM_DEVICE_CLASS(klass);
- dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_device_bond);
+ dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS(&interface_info_device_bond);
- device_class->connection_type_supported = NM_SETTING_BOND_SETTING_NAME;
- device_class->connection_type_check_compatible = NM_SETTING_BOND_SETTING_NAME;
- device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_BOND);
+ device_class->connection_type_supported = NM_SETTING_BOND_SETTING_NAME;
+ device_class->connection_type_check_compatible = NM_SETTING_BOND_SETTING_NAME;
+ device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES(NM_LINK_TYPE_BOND);
- device_class->is_master = TRUE;
- device_class->get_generic_capabilities = get_generic_capabilities;
- device_class->complete_connection = complete_connection;
+ device_class->is_master = TRUE;
+ device_class->get_generic_capabilities = get_generic_capabilities;
+ device_class->complete_connection = complete_connection;
- device_class->update_connection = update_connection;
- device_class->master_update_slave_connection = master_update_slave_connection;
+ device_class->update_connection = update_connection;
+ device_class->master_update_slave_connection = master_update_slave_connection;
- device_class->create_and_realize = create_and_realize;
- device_class->act_stage1_prepare = act_stage1_prepare;
- device_class->get_configured_mtu = nm_device_get_configured_mtu_for_wired;
- device_class->enslave_slave = enslave_slave;
- device_class->release_slave = release_slave;
- device_class->can_reapply_change = can_reapply_change;
- device_class->reapply_connection = reapply_connection;
+ device_class->create_and_realize = create_and_realize;
+ device_class->act_stage1_prepare = act_stage1_prepare;
+ device_class->get_configured_mtu = nm_device_get_configured_mtu_for_wired;
+ device_class->enslave_slave = enslave_slave;
+ device_class->release_slave = release_slave;
+ device_class->can_reapply_change = can_reapply_change;
+ device_class->reapply_connection = reapply_connection;
}
/*****************************************************************************/
-#define NM_TYPE_BOND_DEVICE_FACTORY (nm_bond_device_factory_get_type ())
-#define NM_BOND_DEVICE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_BOND_DEVICE_FACTORY, NMBondDeviceFactory))
+#define NM_TYPE_BOND_DEVICE_FACTORY (nm_bond_device_factory_get_type())
+#define NM_BOND_DEVICE_FACTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_BOND_DEVICE_FACTORY, NMBondDeviceFactory))
static NMDevice *
-create_device (NMDeviceFactory *factory,
- const char *iface,
- const NMPlatformLink *plink,
- NMConnection *connection,
- gboolean *out_ignore)
+create_device(NMDeviceFactory * factory,
+ const char * iface,
+ const NMPlatformLink *plink,
+ NMConnection * connection,
+ gboolean * out_ignore)
{
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BOND,
- NM_DEVICE_IFACE, iface,
- NM_DEVICE_DRIVER, "bonding",
- NM_DEVICE_TYPE_DESC, "Bond",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BOND,
- NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_BOND,
- NULL);
+ return (NMDevice *) g_object_new(NM_TYPE_DEVICE_BOND,
+ NM_DEVICE_IFACE,
+ iface,
+ NM_DEVICE_DRIVER,
+ "bonding",
+ NM_DEVICE_TYPE_DESC,
+ "Bond",
+ NM_DEVICE_DEVICE_TYPE,
+ NM_DEVICE_TYPE_BOND,
+ NM_DEVICE_LINK_TYPE,
+ NM_LINK_TYPE_BOND,
+ NULL);
}
-NM_DEVICE_FACTORY_DEFINE_INTERNAL (BOND, Bond, bond,
- NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_BOND)
- NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_BOND_SETTING_NAME),
- factory_class->create_device = create_device;
-);
+NM_DEVICE_FACTORY_DEFINE_INTERNAL(
+ BOND,
+ Bond,
+ bond,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES(NM_LINK_TYPE_BOND)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES(NM_SETTING_BOND_SETTING_NAME),
+ factory_class->create_device = create_device;);