/** * nm_setting_bond_get_option_default: * @setting: the #NMSettingBond * @name: the name of the option * * Returns: the value of the bond option if not overridden by an entry in * the #NMSettingBond:options property. **/ const char * nm_setting_bond_get_option_default (NMSettingBond *setting, const char *name) { const char *mode; guint i; g_return_val_if_fail (NM_IS_SETTING_BOND (setting), NULL); g_return_val_if_fail (nm_setting_bond_validate_option (name, NULL), NULL); if (nm_streq (name, NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM)) { /* The default value depends on the current mode */ mode = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_MODE); if ( nm_streq0 (mode, "4") || nm_streq0 (mode, "802.3ad")) return "00:00:00:00:00:00"; else return ""; } for (i = 0; i < G_N_ELEMENTS (defaults); i++) { if (g_strcmp0 (defaults[i].opt, name) == 0) return defaults[i].val; } /* Any option that passes nm_setting_bond_validate_option() should also be found in defaults */ g_assert_not_reached (); }
static void set_simple_option (NMDevice *device, const char *attr, NMSettingBond *s_bond, const char *opt) { const char *value; value = nm_setting_bond_get_option_by_name (s_bond, opt); if (!value) value = nm_setting_bond_get_option_default (s_bond, opt); set_bond_attr (device, attr, value); }
static void populate_ui (CEPageBond *self) { CEPageBondPrivate *priv = CE_PAGE_BOND_GET_PRIVATE (self); NMSettingBond *setting = priv->setting; const char *mode, *primary, *frequency, *updelay, *downdelay, *raw_targets; char *targets; int mode_idx = MODE_BALANCE_RR; guint32 mtu_def, mtu_val; /* Mode */ mode = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_MODE); if (mode) { if (!strcmp (mode, "balance-rr")) mode_idx = MODE_BALANCE_RR; else if (!strcmp (mode, "active-backup")) mode_idx = MODE_ACTIVE_BACKUP; else if (!strcmp (mode, "balance-xor")) mode_idx = MODE_BALANCE_XOR; else if (!strcmp (mode, "broadcast")) mode_idx = MODE_BROADCAST; else if (!strcmp (mode, "802.3ad")) mode_idx = MODE_802_3AD; else if (!strcmp (mode, "balance-tlb")) mode_idx = MODE_BALANCE_TLB; else if (!strcmp (mode, "balance-alb")) mode_idx = MODE_BALANCE_ALB; } gtk_combo_box_set_active (priv->mode, mode_idx); g_signal_connect (priv->mode, "changed", G_CALLBACK (bonding_mode_changed), self); bonding_mode_changed (priv->mode, self); /* Primary */ primary = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_PRIMARY); gtk_entry_set_text (priv->primary, primary ? primary : ""); /* Monitoring mode/frequency */ frequency = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_ARP_INTERVAL); if (frequency) { gtk_combo_box_set_active (priv->monitoring, MONITORING_ARP); } else { gtk_combo_box_set_active (priv->monitoring, MONITORING_MII); frequency = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_MIIMON); } g_signal_connect (priv->monitoring, "changed", G_CALLBACK (monitoring_mode_changed), self); monitoring_mode_changed (priv->monitoring, self); if (frequency) gtk_spin_button_set_value (priv->frequency, (gdouble) atoi (frequency)); else gtk_spin_button_set_value (priv->frequency, 0.0); g_signal_connect (priv->frequency, "value-changed", G_CALLBACK (frequency_changed), self); updelay = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_UPDELAY); if (updelay) gtk_spin_button_set_value (priv->updelay, (gdouble) atoi (updelay)); else gtk_spin_button_set_value (priv->updelay, 0.0); g_signal_connect (priv->updelay, "value-changed", G_CALLBACK (delay_changed), self); downdelay = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_DOWNDELAY); if (downdelay) gtk_spin_button_set_value (priv->downdelay, (gdouble) atoi (downdelay)); else gtk_spin_button_set_value (priv->downdelay, 0.0); g_signal_connect (priv->downdelay, "value-changed", G_CALLBACK (delay_changed), self); /* ARP targets */ raw_targets = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); targets = prettify_targets (raw_targets); if (targets) { gtk_entry_set_text (priv->arp_targets, targets); g_free (targets); } /* MTU */ if (priv->wired) { mtu_def = ce_get_property_default (NM_SETTING (priv->wired), NM_SETTING_WIRED_MTU); mtu_val = nm_setting_wired_get_mtu (priv->wired); } else { mtu_def = mtu_val = 0; } g_signal_connect (priv->mtu, "output", G_CALLBACK (ce_spin_output_with_automatic), GINT_TO_POINTER (mtu_def)); gtk_spin_button_set_value (priv->mtu, (gdouble) mtu_val); }
static void bond_options_changed (GObject *object, GParamSpec *pspec, gpointer user_data) { NMSettingBond *s_bond = NM_SETTING_BOND (object); NmtPageBond *bond = NMT_PAGE_BOND (user_data); NmtPageBondPrivate *priv = NMT_PAGE_BOND_GET_PRIVATE (bond); const char *val; char **ips; if (priv->updating) return; priv->updating = TRUE; val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_MODE); nmt_newt_popup_set_active_id (priv->mode, val); if (!strcmp (val, "active-backup")) { nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->primary), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_PRIMARY); nmt_newt_entry_set_text (priv->primary, val); } else nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->primary), FALSE); if (priv->monitoring_mode == NMT_PAGE_BOND_MONITORING_UNKNOWN) { val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); if (val && strcmp (val, "0") != 0) priv->monitoring_mode = NMT_PAGE_BOND_MONITORING_ARP; else priv->monitoring_mode = NMT_PAGE_BOND_MONITORING_MII; } nmt_newt_popup_set_active (priv->monitoring, priv->monitoring_mode); if (priv->monitoring_mode == NMT_PAGE_BOND_MONITORING_MII) { nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->miimon), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_MIIMON); nmt_newt_entry_set_text (priv->miimon, val); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->updelay), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_UPDELAY); nmt_newt_entry_set_text (priv->updelay, val); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->downdelay), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY); nmt_newt_entry_set_text (priv->downdelay, val); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->arp_interval), FALSE); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->arp_ip_target), FALSE); } else { nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->arp_interval), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); nmt_newt_entry_set_text (priv->arp_interval, val); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->arp_ip_target), TRUE); val = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); ips = g_strsplit (val, ",", -1); g_object_set (G_OBJECT (priv->arp_ip_target), "strings", ips, NULL); g_strfreev (ips); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->miimon), FALSE); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->updelay), FALSE); nmt_newt_widget_set_visible (NMT_NEWT_WIDGET (priv->downdelay), FALSE); } priv->updating = FALSE; }
static NMActStageReturn apply_bonding_config (NMDevice *device) { NMConnection *connection; NMSettingBond *s_bond; int ifindex = nm_device_get_ifindex (device); const char *mode, *value; char *contents; gboolean set_arp_interval = TRUE; /* Option restrictions: * * arp_interval conflicts miimon > 0 * arp_interval conflicts [ alb, tlb ] * arp_validate needs [ active-backup ] * downdelay needs miimon * updelay needs miimon * primary needs [ active-backup, tlb, alb ] * * clearing miimon requires that arp_interval be 0, but clearing * arp_interval doesn't require miimon to be 0 */ connection = nm_device_get_applied_connection (device); g_assert (connection); s_bond = nm_connection_get_setting_bond (connection); g_assert (s_bond); mode = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_MODE); if (mode == NULL) mode = "balance-rr"; value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_MIIMON); if (value && atoi (value)) { /* clear arp interval */ set_bond_attr (device, "arp_interval", "0"); set_arp_interval = FALSE; set_bond_attr (device, "miimon", value); set_simple_option (device, "updelay", s_bond, NM_SETTING_BOND_OPTION_UPDELAY); set_simple_option (device, "downdelay", s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY); } else if (!value) { /* If not given, and arp_interval is not given, default to 100 */ long int val_int; char *end; value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); errno = 0; val_int = strtol (value ? value : "0", &end, 10); if (!value || (val_int == 0 && errno == 0 && *end == '\0')) set_bond_attr (device, "miimon", "100"); } /* The stuff after 'mode' requires the given mode or doesn't care */ set_bond_attr (device, "mode", mode); /* arp_interval not compatible with ALB, TLB */ if (g_strcmp0 (mode, "balance-alb") == 0 || g_strcmp0 (mode, "balance-tlb") == 0) set_arp_interval = FALSE; if (set_arp_interval) { set_simple_option (device, "arp_interval", s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); /* Just let miimon get cleared automatically; even setting miimon to * 0 (disabled) clears arp_interval. */ } value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_VALIDATE); /* arp_validate > 0 only valid in active-backup mode */ if ( value && g_strcmp0 (value, "0") != 0 && g_strcmp0 (value, "none") != 0 && g_strcmp0 (mode, "active-backup") == 0) set_bond_attr (device, "arp_validate", value); else set_bond_attr (device, "arp_validate", "0"); if ( g_strcmp0 (mode, "active-backup") == 0 || g_strcmp0 (mode, "balance-alb") == 0 || g_strcmp0 (mode, "balance-tlb") == 0) { value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_PRIMARY); set_bond_attr (device, "primary", value ? value : ""); } /* Clear ARP targets */ contents = nm_platform_sysctl_master_get_option (nm_device_get_platform (device), ifindex, "arp_ip_target"); set_arp_targets (device, contents, " \n", "-"); g_free (contents); /* Add new ARP targets */ value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); set_arp_targets (device, value, ",", "+"); set_simple_option (device, "primary_reselect", s_bond, NM_SETTING_BOND_OPTION_PRIMARY_RESELECT); set_simple_option (device, "fail_over_mac", s_bond, NM_SETTING_BOND_OPTION_FAIL_OVER_MAC); set_simple_option (device, "use_carrier", s_bond, NM_SETTING_BOND_OPTION_USE_CARRIER); set_simple_option (device, "ad_select", s_bond, NM_SETTING_BOND_OPTION_AD_SELECT); set_simple_option (device, "xmit_hash_policy", s_bond, NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY); set_simple_option (device, "resend_igmp", s_bond, NM_SETTING_BOND_OPTION_RESEND_IGMP); if ( g_strcmp0 (mode, "4") == 0 || g_strcmp0 (mode, "802.3ad") == 0) set_simple_option (device, "lacp_rate", s_bond, NM_SETTING_BOND_OPTION_LACP_RATE); return NM_ACT_STAGE_RETURN_SUCCESS; }
static void populate_ui (CEPageBond *self) { CEPageBondPrivate *priv = CE_PAGE_BOND_GET_PRIVATE (self); NMSettingBond *setting = priv->setting; const char *mode, *frequency, *updelay, *downdelay, *raw_targets; char *targets; int mode_idx = MODE_BALANCE_RR; /* Mode */ mode = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_MODE); if (mode) { if (!strcmp (mode, "balance-rr")) mode_idx = MODE_BALANCE_RR; else if (!strcmp (mode, "active-backup")) mode_idx = MODE_ACTIVE_BACKUP; else if (!strcmp (mode, "balance-xor")) mode_idx = MODE_BALANCE_XOR; else if (!strcmp (mode, "broadcast")) mode_idx = MODE_BROADCAST; else if (!strcmp (mode, "802.3ad")) mode_idx = MODE_802_3AD; else if (!strcmp (mode, "balance-tlb")) mode_idx = MODE_BALANCE_TLB; else if (!strcmp (mode, "balance-alb")) mode_idx = MODE_BALANCE_ALB; } gtk_combo_box_set_active (priv->mode, mode_idx); g_signal_connect (priv->mode, "changed", G_CALLBACK (bonding_mode_changed), self); bonding_mode_changed (priv->mode, self); /* Monitoring mode/frequency */ frequency = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_ARP_INTERVAL); if (frequency) { gtk_combo_box_set_active (priv->monitoring, MONITORING_ARP); } else { gtk_combo_box_set_active (priv->monitoring, MONITORING_MII); frequency = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_MIIMON); } g_signal_connect (priv->monitoring, "changed", G_CALLBACK (monitoring_mode_changed), self); monitoring_mode_changed (priv->monitoring, self); if (frequency) gtk_spin_button_set_value (priv->frequency, (gdouble) atoi (frequency)); else gtk_spin_button_set_value (priv->frequency, 0.0); g_signal_connect (priv->frequency, "value-changed", G_CALLBACK (frequency_changed), self); updelay = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_UPDELAY); if (updelay) gtk_spin_button_set_value (priv->updelay, (gdouble) atoi (updelay)); else gtk_spin_button_set_value (priv->updelay, 0.0); g_signal_connect (priv->updelay, "value-changed", G_CALLBACK (delay_changed), self); downdelay = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_DOWNDELAY); if (downdelay) gtk_spin_button_set_value (priv->downdelay, (gdouble) atoi (downdelay)); else gtk_spin_button_set_value (priv->downdelay, 0.0); g_signal_connect (priv->downdelay, "value-changed", G_CALLBACK (delay_changed), self); /* ARP targets */ raw_targets = nm_setting_bond_get_option_by_name (setting, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); targets = prettify_targets (raw_targets); if (targets) { gtk_entry_set_text (priv->arp_targets, targets); g_free (targets); } }