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>
This commit is contained in:
@@ -368,7 +368,8 @@ usage_connection_add (void)
|
|||||||
" [downdelay <num>]\n"
|
" [downdelay <num>]\n"
|
||||||
" [updelay <num>]\n"
|
" [updelay <num>]\n"
|
||||||
" [arp-interval <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"
|
" bond-slave: master <master (ifname, or connection UUID or name)>\n\n"
|
||||||
" team: [config <file>|<raw JSON data>]\n\n"
|
" team: [config <file>|<raw JSON data>]\n\n"
|
||||||
" team-slave: master <master (ifname, or connection UUID or name)>\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
|
static void
|
||||||
do_questionnaire_bond (char **mode, char **primary, char **miimon,
|
do_questionnaire_bond (char **mode, char **primary, char **miimon,
|
||||||
char **downdelay, char **updelay,
|
char **downdelay, char **updelay,
|
||||||
char **arpinterval, char **arpiptarget)
|
char **arpinterval, char **arpiptarget,
|
||||||
|
char **lacp_rate)
|
||||||
{
|
{
|
||||||
char *monitor_mode;
|
char *monitor_mode;
|
||||||
unsigned long tmp;
|
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);
|
g_free (monitor_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4187,6 +4205,8 @@ cleanup_vlan:
|
|||||||
char *bond_arpinterval = NULL;
|
char *bond_arpinterval = NULL;
|
||||||
const char *bond_arpiptarget_c = NULL;
|
const char *bond_arpiptarget_c = NULL;
|
||||||
char *bond_arpiptarget = 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},
|
nmc_arg_t exp_args[] = { {"mode", TRUE, &bond_mode_c, FALSE},
|
||||||
{"primary", TRUE, &bond_primary_c, FALSE},
|
{"primary", TRUE, &bond_primary_c, FALSE},
|
||||||
{"miimon", TRUE, &bond_miimon_c, FALSE},
|
{"miimon", TRUE, &bond_miimon_c, FALSE},
|
||||||
@@ -4194,6 +4214,7 @@ cleanup_vlan:
|
|||||||
{"updelay", TRUE, &bond_updelay_c, FALSE},
|
{"updelay", TRUE, &bond_updelay_c, FALSE},
|
||||||
{"arp-interval", TRUE, &bond_arpinterval_c, FALSE},
|
{"arp-interval", TRUE, &bond_arpinterval_c, FALSE},
|
||||||
{"arp-ip-target", TRUE, &bond_arpiptarget_c, FALSE},
|
{"arp-ip-target", TRUE, &bond_arpiptarget_c, FALSE},
|
||||||
|
{"lacp-rate", TRUE, &bond_lacp_rate_c, FALSE},
|
||||||
{NULL} };
|
{NULL} };
|
||||||
|
|
||||||
if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
|
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_updelay = bond_updelay_c ? g_strdup (bond_updelay_c) : NULL;
|
||||||
bond_arpinterval = bond_arpinterval_c ? g_strdup (bond_arpinterval_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_arpiptarget = bond_arpiptarget_c ? g_strdup (bond_arpiptarget_c) : NULL;
|
||||||
|
bond_lacp_rate = g_strdup (bond_lacp_rate_c);
|
||||||
if (ask)
|
if (ask)
|
||||||
do_questionnaire_bond (&bond_mode, &bond_primary, &bond_miimon,
|
do_questionnaire_bond (&bond_mode, &bond_primary, &bond_miimon,
|
||||||
&bond_downdelay, &bond_updelay,
|
&bond_downdelay, &bond_updelay,
|
||||||
&bond_arpinterval, &bond_arpiptarget);
|
&bond_arpinterval, &bond_arpiptarget,
|
||||||
|
&bond_lacp_rate);
|
||||||
|
|
||||||
/* Generate ifname if connection doesn't have one */
|
/* Generate ifname if connection doesn't have one */
|
||||||
ifname = nm_setting_connection_get_interface_name (s_con);
|
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);
|
nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL, bond_arpinterval);
|
||||||
if (bond_arpiptarget)
|
if (bond_arpiptarget)
|
||||||
nm_setting_bond_add_option (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET, 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;
|
success = TRUE;
|
||||||
cleanup_bond:
|
cleanup_bond:
|
||||||
@@ -4268,6 +4293,7 @@ cleanup_bond:
|
|||||||
g_free (bond_updelay);
|
g_free (bond_updelay);
|
||||||
g_free (bond_arpinterval);
|
g_free (bond_arpinterval);
|
||||||
g_free (bond_arpiptarget);
|
g_free (bond_arpiptarget);
|
||||||
|
g_free (bond_lacp_rate);
|
||||||
if (!success)
|
if (!success)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@@ -423,6 +423,12 @@ _nmcli_compl_ARGS()
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
lacp-rate)
|
||||||
|
if [[ "${#words[@]}" -eq 2 ]]; then
|
||||||
|
_nmcli_list "slow fast"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
bt-type)
|
bt-type)
|
||||||
if [[ "${#words[@]}" -eq 2 ]]; then
|
if [[ "${#words[@]}" -eq 2 ]]; then
|
||||||
_nmcli_list "panu dun-gsm dun-cdma"
|
_nmcli_list "panu dun-gsm dun-cdma"
|
||||||
@@ -931,7 +937,7 @@ _nmcli()
|
|||||||
OPTIONS_MANDATORY=(dev)
|
OPTIONS_MANDATORY=(dev)
|
||||||
;;
|
;;
|
||||||
bond)
|
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)
|
bond-|bond-s|bond-sl|bond-sla|bond-slav|bond-slave)
|
||||||
OPTIONS_TYPED=(master)
|
OPTIONS_TYPED=(master)
|
||||||
|
@@ -111,6 +111,8 @@ static const BondDefault defaults[] = {
|
|||||||
{ NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2,
|
{ NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2,
|
||||||
{ "layer2", "layer3+4", "layer2+3", NULL } },
|
{ "layer2", "layer3+4", "layer2+3", NULL } },
|
||||||
{ NM_SETTING_BOND_OPTION_RESEND_IGMP, "1", TYPE_INT, 0, 255 },
|
{ 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 };
|
NULL };
|
||||||
int miimon = 0, arp_interval = 0;
|
int miimon = 0, arp_interval = 0;
|
||||||
const char *arp_ip_target = NULL;
|
const char *arp_ip_target = NULL;
|
||||||
|
const char *lacp_rate;
|
||||||
const char *primary;
|
const char *primary;
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, priv->options);
|
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);
|
return _nm_setting_verify_required_virtual_interface_name (all_settings, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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_AD_SELECT "ad_select"
|
||||||
#define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy"
|
#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_RESEND_IGMP "resend_igmp"
|
||||||
|
#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NMSetting parent;
|
NMSetting parent;
|
||||||
|
@@ -120,6 +120,8 @@ static const BondDefault defaults[] = {
|
|||||||
{ NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2,
|
{ NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY, "0", TYPE_BOTH, 0, 2,
|
||||||
{ "layer2", "layer3+4", "layer2+3", NULL } },
|
{ "layer2", "layer3+4", "layer2+3", NULL } },
|
||||||
{ NM_SETTING_BOND_OPTION_RESEND_IGMP, "1", TYPE_INT, 0, 255 },
|
{ 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 };
|
NULL };
|
||||||
int miimon = 0, arp_interval = 0;
|
int miimon = 0, arp_interval = 0;
|
||||||
const char *arp_ip_target = NULL;
|
const char *arp_ip_target = NULL;
|
||||||
|
const char *lacp_rate;
|
||||||
const char *primary;
|
const char *primary;
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, priv->options);
|
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 (
|
return _nm_setting_verify_deprecated_virtual_iface_name (
|
||||||
priv->interface_name, FALSE,
|
priv->interface_name, FALSE,
|
||||||
NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_INTERFACE_NAME,
|
NM_SETTING_BOND_SETTING_NAME, NM_SETTING_BOND_INTERFACE_NAME,
|
||||||
|
@@ -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_AD_SELECT "ad_select"
|
||||||
#define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy"
|
#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_RESEND_IGMP "resend_igmp"
|
||||||
|
#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
NMSetting parent;
|
NMSetting parent;
|
||||||
|
@@ -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, "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, "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, "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;
|
return NM_ACT_STAGE_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user