diff options
author | Thomas Haller <thaller@redhat.com> | 2014-10-02 16:38:14 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2014-10-02 16:38:21 +0200 |
commit | 90b5b4d892f80d0b4cc447f092e89e60fbaa3732 (patch) | |
tree | 8b062bc91db26957d5317ffa609dec3463608416 | |
parent | 53b9504544cbfabb74b97b32ab52f14c7d202d93 (diff) | |
parent | b662fbf450c5c8fcb64d9b1112eec3bdd9b4cbee (diff) | |
download | NetworkManager-90b5b4d892f80d0b4cc447f092e89e60fbaa3732.tar.gz |
merge branch 'th/rh1061702_bond_options'
Add bonding option 'lacp_rate'.
https://bugzilla.redhat.com/show_bug.cgi?id=1061702
Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r-- | clients/cli/connections.c | 32 | ||||
-rw-r--r-- | clients/cli/nmcli-completion | 8 | ||||
-rw-r--r-- | libnm-core/nm-setting-bond.c | 16 | ||||
-rw-r--r-- | libnm-core/nm-setting-bond.h | 1 | ||||
-rw-r--r-- | libnm-util/nm-setting-bond.c | 16 | ||||
-rw-r--r-- | libnm-util/nm-setting-bond.h | 1 | ||||
-rw-r--r-- | src/devices/nm-device-bond.c | 1 |
7 files changed, 71 insertions, 4 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 240d0d2a10..5dc8b36815 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -368,7 +368,8 @@ usage_connection_add (void) " [downdelay <num>]\n" " [updelay <num>]\n" " [arp-interval <num>]\n" - " [arp-ip-target <num>]\n\n" + " [arp-ip-target <num>]\n" + " [lacp-rate slow (0) | fast (1)]\n\n" " bond-slave: master <master (ifname, or connection UUID or name)>\n\n" " team: [config <file>|<raw JSON data>]\n\n" " team-slave: master <master (ifname, or connection UUID or name)>\n" @@ -3121,7 +3122,8 @@ do_questionnaire_vlan (char **mtu, char **flags, char **ingress, char **egress) static void do_questionnaire_bond (char **mode, char **primary, char **miimon, char **downdelay, char **updelay, - char **arpinterval, char **arpiptarget) + char **arpinterval, char **arpiptarget, + char **lacp_rate) { char *monitor_mode; unsigned long tmp; @@ -3226,6 +3228,22 @@ do_questionnaire_bond (char **mode, char **primary, char **miimon, } } + if ( !*lacp_rate + && (g_strcmp0 (*mode, "802.3ad") == 0 || g_strcmp0 (*mode, "4") == 0)) { + do { + *lacp_rate = nmc_readline (_("LACP rate ('slow' or 'fast') [slow]: ")); + once_more = *lacp_rate && (strcmp (*lacp_rate, "slow") && + strcmp (*lacp_rate, "0") && + strcmp (*lacp_rate, "fast") && + strcmp (*lacp_rate, "1")); + if (once_more) { + printf (_("Error: 'lacp_rate': '%s' is invalid ('slow' or 'fast').\n"), + *lacp_rate); + g_free (*lacp_rate); + } + } while (once_more); + } + g_free (monitor_mode); } @@ -4187,6 +4205,8 @@ cleanup_vlan: char *bond_arpinterval = NULL; const char *bond_arpiptarget_c = NULL; char *bond_arpiptarget = NULL; + const char *bond_lacp_rate_c = NULL; + char *bond_lacp_rate = NULL; nmc_arg_t exp_args[] = { {"mode", TRUE, &bond_mode_c, FALSE}, {"primary", TRUE, &bond_primary_c, FALSE}, {"miimon", TRUE, &bond_miimon_c, FALSE}, @@ -4194,6 +4214,7 @@ cleanup_vlan: {"updelay", TRUE, &bond_updelay_c, FALSE}, {"arp-interval", TRUE, &bond_arpinterval_c, FALSE}, {"arp-ip-target", TRUE, &bond_arpiptarget_c, FALSE}, + {"lacp-rate", TRUE, &bond_lacp_rate_c, FALSE}, {NULL} }; if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error)) @@ -4207,10 +4228,12 @@ cleanup_vlan: bond_updelay = bond_updelay_c ? g_strdup (bond_updelay_c) : NULL; bond_arpinterval = bond_arpinterval_c ? g_strdup (bond_arpinterval_c) : NULL; bond_arpiptarget = bond_arpiptarget_c ? g_strdup (bond_arpiptarget_c) : NULL; + bond_lacp_rate = g_strdup (bond_lacp_rate_c); if (ask) do_questionnaire_bond (&bond_mode, &bond_primary, &bond_miimon, &bond_downdelay, &bond_updelay, - &bond_arpinterval, &bond_arpiptarget); + &bond_arpinterval, &bond_arpiptarget, + &bond_lacp_rate); /* Generate ifname if connection doesn't have one */ ifname = nm_setting_connection_get_interface_name (s_con); @@ -4258,6 +4281,8 @@ cleanup_vlan: nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL, bond_arpinterval); if (bond_arpiptarget) nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, bond_arpiptarget); + if (bond_lacp_rate) + nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_LACP_RATE, bond_lacp_rate); success = TRUE; cleanup_bond: @@ -4268,6 +4293,7 @@ cleanup_bond: g_free (bond_updelay); g_free (bond_arpinterval); g_free (bond_arpiptarget); + g_free (bond_lacp_rate); if (!success) return FALSE; diff --git a/clients/cli/nmcli-completion b/clients/cli/nmcli-completion index e6dc5b5d2d..0b3af2fc84 100644 --- a/clients/cli/nmcli-completion +++ b/clients/cli/nmcli-completion @@ -423,6 +423,12 @@ _nmcli_compl_ARGS() return 0 fi ;; + lacp-rate) + if [[ "${#words[@]}" -eq 2 ]]; then + _nmcli_list "slow fast" + return 0 + fi + ;; bt-type) if [[ "${#words[@]}" -eq 2 ]]; then _nmcli_list "panu dun-gsm dun-cdma" @@ -931,7 +937,7 @@ _nmcli() OPTIONS_MANDATORY=(dev) ;; bond) - OPTIONS_TYPED=(mode miimon downdelay updelay arp-interval arp-ip-target primary) + OPTIONS_TYPED=(mode miimon downdelay updelay arp-interval arp-ip-target primary lacp-rate) ;; bond-|bond-s|bond-sl|bond-sla|bond-slav|bond-slave) OPTIONS_TYPED=(master) diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c index c7eb9b2db5..3725553e14 100644 --- a/libnm-core/nm-setting-bond.c +++ b/libnm-core/nm-setting-bond.c @@ -111,6 +111,8 @@ static const BondDefault defaults[] = { { NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2, { "layer2", "layer3+4", "layer2+3", NULL } }, { NM_SETTING_BOND_OPTION_RESEND_IGMP, "1", TYPE_INT, 0, 255 }, + { NM_SETTING_BOND_OPTION_LACP_RATE, "0", TYPE_BOTH, 0, 1, + { "slow", "fast", NULL } }, }; /** @@ -462,6 +464,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) NULL }; int miimon = 0, arp_interval = 0; const char *arp_ip_target = NULL; + const char *lacp_rate; const char *primary; g_hash_table_iter_init (&iter, priv->options); @@ -643,6 +646,19 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } } + lacp_rate = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_LACP_RATE); + if ( lacp_rate + && (g_strcmp0 (value, "802.3ad") != 0 && g_strcmp0 (value, "4") != 0) + && (strcmp (lacp_rate, "slow") != 0 && strcmp (lacp_rate, "0") != 0)) { + g_set_error (error, + NM_SETTING_BOND_ERROR, + NM_SETTING_BOND_ERROR_INVALID_OPTION, + _("'%s' option is only valid with mode '%s'"), + NM_SETTING_BOND_OPTION_LACP_RATE, "802.3ad"); + g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); + return FALSE; + } + return _nm_setting_verify_required_virtual_interface_name (all_settings, error); } diff --git a/libnm-core/nm-setting-bond.h b/libnm-core/nm-setting-bond.h index c3cee4d550..18f5e105f6 100644 --- a/libnm-core/nm-setting-bond.h +++ b/libnm-core/nm-setting-bond.h @@ -74,6 +74,7 @@ GQuark nm_setting_bond_error_quark (void); #define NM_SETTING_BOND_OPTION_AD_SELECT "ad_select" #define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy" #define NM_SETTING_BOND_OPTION_RESEND_IGMP "resend_igmp" +#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate" typedef struct { NMSetting parent; diff --git a/libnm-util/nm-setting-bond.c b/libnm-util/nm-setting-bond.c index f321d0af2f..7d82d31d23 100644 --- a/libnm-util/nm-setting-bond.c +++ b/libnm-util/nm-setting-bond.c @@ -120,6 +120,8 @@ static const BondDefault defaults[] = { { NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2, { "layer2", "layer3+4", "layer2+3", NULL } }, { NM_SETTING_BOND_OPTION_RESEND_IGMP, "1", TYPE_INT, 0, 255 }, + { NM_SETTING_BOND_OPTION_LACP_RATE, "0", TYPE_BOTH, 0, 1, + { "slow", "fast", NULL } }, }; /** @@ -487,6 +489,7 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) NULL }; int miimon = 0, arp_interval = 0; const char *arp_ip_target = NULL; + const char *lacp_rate; const char *primary; g_hash_table_iter_init (&iter, priv->options); @@ -668,6 +671,19 @@ verify (NMSetting *setting, GSList *all_settings, GError **error) } } + lacp_rate = g_hash_table_lookup (priv->options, NM_SETTING_BOND_OPTION_LACP_RATE); + if ( lacp_rate + && (g_strcmp0 (value, "802.3ad") != 0 && g_strcmp0 (value, "4") != 0) + && (strcmp (lacp_rate, "slow") != 0 && strcmp (lacp_rate, "0") != 0)) { + g_set_error (error, + NM_SETTING_BOND_ERROR, + NM_SETTING_BOND_ERROR_INVALID_OPTION, + _("'%s' option is only valid with mode '%s'"), + NM_SETTING_BOND_OPTION_LACP_RATE, "802.3ad"); + g_prefix_error (error, "%s.%s: ", NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_OPTIONS); + return FALSE; + } + return _nm_setting_verify_deprecated_virtual_iface_name ( priv->interface_name, FALSE, NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_INTERFACE_NAME, diff --git a/libnm-util/nm-setting-bond.h b/libnm-util/nm-setting-bond.h index e7807380bf..cf969995ec 100644 --- a/libnm-util/nm-setting-bond.h +++ b/libnm-util/nm-setting-bond.h @@ -71,6 +71,7 @@ GQuark nm_setting_bond_error_quark (void); #define NM_SETTING_BOND_OPTION_AD_SELECT "ad_select" #define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy" #define NM_SETTING_BOND_OPTION_RESEND_IGMP "resend_igmp" +#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate" typedef struct { NMSetting parent; diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c index 40151d4722..e365ee6d66 100644 --- a/src/devices/nm-device-bond.c +++ b/src/devices/nm-device-bond.c @@ -360,6 +360,7 @@ apply_bonding_config (NMDevice *device) 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); + set_simple_option (device, "lacp_rate", s_bond, NM_SETTING_BOND_OPTION_LACP_RATE); return NM_ACT_STAGE_RETURN_SUCCESS; } |