mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 16:30:07 +01:00
bonding: add support to lacp_active option
The valid values for this option are 0 (off) and 1 (on). By default the value is 1 (on). Please notice that this option is only compatible with 802.3AD mode.
This commit is contained in:
parent
ddd2fd46b0
commit
6cde20fecc
8 changed files with 75 additions and 4 deletions
|
|
@ -40,7 +40,7 @@
|
|||
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, NM_SETTING_BOND_OPTION_PEER_NOTIF_DELAY, \
|
||||
NM_SETTING_BOND_OPTION_ARP_MISSED_MAX
|
||||
NM_SETTING_BOND_OPTION_ARP_MISSED_MAX, NM_SETTING_BOND_OPTION_LACP_ACTIVE
|
||||
|
||||
#define OPTIONS_REAPPLY_SUBSET \
|
||||
NM_SETTING_BOND_OPTION_MIIMON, NM_SETTING_BOND_OPTION_UPDELAY, \
|
||||
|
|
@ -52,7 +52,8 @@
|
|||
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, \
|
||||
NM_SETTING_BOND_OPTION_PEER_NOTIF_DELAY, NM_SETTING_BOND_OPTION_ARP_MISSED_MAX
|
||||
NM_SETTING_BOND_OPTION_PEER_NOTIF_DELAY, NM_SETTING_BOND_OPTION_ARP_MISSED_MAX, \
|
||||
NM_SETTING_BOND_OPTION_LACP_ACTIVE
|
||||
|
||||
#define OPTIONS_REAPPLY_FULL \
|
||||
OPTIONS_REAPPLY_SUBSET, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, \
|
||||
|
|
@ -439,6 +440,9 @@ _platform_lnk_bond_init_from_setting(NMSettingBond *s_bond, NMPlatformLnkBond *p
|
|||
.num_grat_arp = _v_u8(s_bond, NM_SETTING_BOND_OPTION_NUM_GRAT_ARP),
|
||||
.all_ports_active = _v_u8(s_bond, NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE),
|
||||
.arp_missed_max = _v_u8(s_bond, NM_SETTING_BOND_OPTION_ARP_MISSED_MAX),
|
||||
.lacp_active = _v_fcn(_nm_setting_bond_lacp_active_from_string,
|
||||
s_bond,
|
||||
NM_SETTING_BOND_OPTION_LACP_ACTIVE),
|
||||
.lacp_rate = _v_fcn(_nm_setting_bond_lacp_rate_from_string,
|
||||
s_bond,
|
||||
NM_SETTING_BOND_OPTION_LACP_RATE),
|
||||
|
|
@ -465,6 +469,7 @@ _platform_lnk_bond_init_from_setting(NMSettingBond *s_bond, NMPlatformLnkBond *p
|
|||
props->resend_igmp_has = props->resend_igmp != 1;
|
||||
props->lp_interval_has = props->lp_interval != 1;
|
||||
props->tlb_dynamic_lb_has = NM_IN_SET(props->mode, NM_BOND_MODE_TLB, NM_BOND_MODE_ALB);
|
||||
props->lacp_active_has = NM_IN_SET(props->mode, NM_BOND_MODE_8023AD);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -86,6 +86,20 @@ NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(
|
|||
{"follow", NM_BOND_FAIL_OVER_MAC_FOLLOW},
|
||||
{"none", NM_BOND_FAIL_OVER_MAC_NONE}, );
|
||||
|
||||
NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(
|
||||
_nm_setting_bond_lacp_active_from_string,
|
||||
NMBondLacpActive,
|
||||
{
|
||||
G_STATIC_ASSERT_EXPR(_NM_BOND_LACP_ACTIVE_NUM <= 2);
|
||||
|
||||
if (name && name[0] < '0' + _NM_BOND_LACP_ACTIVE_NUM && name[0] >= '0' && name[1] == '\0') {
|
||||
return name[0] - '0';
|
||||
}
|
||||
},
|
||||
{ return NM_BOND_LACP_ACTIVE_ON; },
|
||||
{"off", NM_BOND_LACP_ACTIVE_OFF},
|
||||
{"on", NM_BOND_LACP_ACTIVE_ON}, );
|
||||
|
||||
NM_UTILS_STRING_TABLE_LOOKUP_DEFINE(
|
||||
_nm_setting_bond_lacp_rate_from_string,
|
||||
NMBondLacpRate,
|
||||
|
|
|
|||
|
|
@ -95,6 +95,18 @@ typedef enum {
|
|||
|
||||
NMBondFailOverMac _nm_setting_bond_fail_over_mac_from_string(const char *str);
|
||||
|
||||
typedef enum {
|
||||
NM_BOND_LACP_ACTIVE_UNKNOWN = -1,
|
||||
|
||||
/* The numeric values correspond to kernel's numbering. */
|
||||
NM_BOND_LACP_ACTIVE_OFF = 0,
|
||||
NM_BOND_LACP_ACTIVE_ON = 1,
|
||||
|
||||
_NM_BOND_LACP_ACTIVE_NUM,
|
||||
} NMBondLacpActive;
|
||||
|
||||
NMBondLacpActive _nm_setting_bond_lacp_active_from_string(const char *str);
|
||||
|
||||
typedef enum {
|
||||
NM_BOND_LACP_RATE_UNKNOWN = -1,
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ static const char *const valid_options_lst[] = {
|
|||
NM_SETTING_BOND_OPTION_LP_INTERVAL,
|
||||
NM_SETTING_BOND_OPTION_PEER_NOTIF_DELAY,
|
||||
NM_SETTING_BOND_OPTION_ARP_MISSED_MAX,
|
||||
NM_SETTING_BOND_OPTION_LACP_ACTIVE,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
@ -155,8 +156,9 @@ static char const *const _option_default_strv_arp_validate[] =
|
|||
NM_MAKE_STRV("none", "active", "backup", "all", "filter", "filter_active", "filter_backup");
|
||||
static char const *const _option_default_strv_fail_over_mac[] =
|
||||
NM_MAKE_STRV("none", "active", "follow");
|
||||
static char const *const _option_default_strv_lacp_rate[] = NM_MAKE_STRV("slow", "fast");
|
||||
static char const *const _option_default_strv_mode[] = NM_MAKE_STRV("balance-rr",
|
||||
static char const *const _option_default_strv_lacp_rate[] = NM_MAKE_STRV("slow", "fast");
|
||||
static char const *const _option_default_strv_lacp_active[] = NM_MAKE_STRV("off", "on");
|
||||
static char const *const _option_default_strv_mode[] = NM_MAKE_STRV("balance-rr",
|
||||
"active-backup",
|
||||
"balance-xor",
|
||||
"broadcast",
|
||||
|
|
@ -202,6 +204,8 @@ static NM_UTILS_STRING_TABLE_LOOKUP_STRUCT_DEFINE(
|
|||
{NM_SETTING_BOND_OPTION_DOWNDELAY, {"0", NM_BOND_OPTION_TYPE_INT, 0, G_MAXINT}},
|
||||
{NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
|
||||
{"none", NM_BOND_OPTION_TYPE_BOTH, 0, 2, _option_default_strv_fail_over_mac}},
|
||||
{NM_SETTING_BOND_OPTION_LACP_ACTIVE,
|
||||
{"on", NM_BOND_OPTION_TYPE_BOTH, 0, 1, _option_default_strv_lacp_active}},
|
||||
{NM_SETTING_BOND_OPTION_LACP_RATE,
|
||||
{"slow", NM_BOND_OPTION_TYPE_BOTH, 0, 1, _option_default_strv_lacp_rate}},
|
||||
{NM_SETTING_BOND_OPTION_LP_INTERVAL, {"1", NM_BOND_OPTION_TYPE_INT, 1, G_MAXINT}},
|
||||
|
|
@ -855,6 +859,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
|
|||
const char *mode_str;
|
||||
const char *arp_ip_target = NULL;
|
||||
const char *lacp_rate;
|
||||
const char *lacp_active;
|
||||
const char *primary;
|
||||
const char *s;
|
||||
NMBondMode bond_mode;
|
||||
|
|
@ -1085,6 +1090,18 @@ verify(NMSetting *setting, NMConnection *connection, GError **error)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
lacp_active = _bond_get_option(self, NM_SETTING_BOND_OPTION_LACP_ACTIVE);
|
||||
if (lacp_active && bond_mode != NM_BOND_MODE_8023AD) {
|
||||
g_set_error(error,
|
||||
NM_CONNECTION_ERROR,
|
||||
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
||||
_("'%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;
|
||||
}
|
||||
|
||||
if (_bond_get_option(self, NM_SETTING_BOND_OPTION_NUM_GRAT_ARP)
|
||||
&& _bond_get_option(self, NM_SETTING_BOND_OPTION_NUM_UNSOL_NA)
|
||||
&& num_grat_arp != num_unsol_na) {
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ G_BEGIN_DECLS
|
|||
#define NM_SETTING_BOND_OPTION_LP_INTERVAL "lp_interval"
|
||||
#define NM_SETTING_BOND_OPTION_PEER_NOTIF_DELAY "peer_notif_delay"
|
||||
#define NM_SETTING_BOND_OPTION_ARP_MISSED_MAX "arp_missed_max"
|
||||
#define NM_SETTING_BOND_OPTION_LACP_ACTIVE "lacp_active"
|
||||
|
||||
typedef struct _NMSettingBondClass NMSettingBondClass;
|
||||
|
||||
|
|
|
|||
|
|
@ -180,6 +180,7 @@ G_STATIC_ASSERT(RTA_MAX == (__RTA_MAX - 1));
|
|||
/*****************************************************************************/
|
||||
|
||||
#define IFLA_BOND_PEER_NOTIF_DELAY 28
|
||||
#define IFLA_BOND_AD_LACP_ACTIVE 29
|
||||
#define IFLA_BOND_MISSED_MAX 30
|
||||
|
||||
#undef IFLA_BOND_MAX
|
||||
|
|
@ -1608,6 +1609,7 @@ _parse_lnk_bond(const char *kind, struct nlattr *info_data)
|
|||
[IFLA_BOND_TLB_DYNAMIC_LB] = {.type = NLA_U8},
|
||||
[IFLA_BOND_PEER_NOTIF_DELAY] = {.type = NLA_U32},
|
||||
[IFLA_BOND_MISSED_MAX] = {.type = NLA_U8},
|
||||
[IFLA_BOND_AD_LACP_ACTIVE] = {.type = NLA_U8},
|
||||
};
|
||||
NMPlatformLnkBond *props;
|
||||
struct nlattr *tb[G_N_ELEMENTS(policy)];
|
||||
|
|
@ -1692,6 +1694,10 @@ _parse_lnk_bond(const char *kind, struct nlattr *info_data)
|
|||
props->packets_per_port = nla_get_u32(tb[IFLA_BOND_PACKETS_PER_SLAVE]);
|
||||
if (tb[IFLA_BOND_AD_LACP_RATE])
|
||||
props->lacp_rate = nla_get_u8(tb[IFLA_BOND_AD_LACP_RATE]);
|
||||
if (tb[IFLA_BOND_AD_LACP_ACTIVE]) {
|
||||
props->lacp_active = nla_get_u8(tb[IFLA_BOND_AD_LACP_ACTIVE]);
|
||||
props->lacp_active_has = TRUE;
|
||||
}
|
||||
if (tb[IFLA_BOND_AD_SELECT])
|
||||
props->ad_select = nla_get_u8(tb[IFLA_BOND_AD_SELECT]);
|
||||
if (tb[IFLA_BOND_AD_ACTOR_SYS_PRIO])
|
||||
|
|
@ -4747,6 +4753,8 @@ _nl_msg_new_link_set_linkinfo(struct nl_msg *msg, NMLinkType link_type, gconstpo
|
|||
NLA_PUT_U8(msg, IFLA_BOND_FAIL_OVER_MAC, props->fail_over_mac);
|
||||
if (props->lacp_rate)
|
||||
NLA_PUT_U8(msg, IFLA_BOND_AD_LACP_RATE, props->lacp_rate);
|
||||
if (props->lacp_active_has)
|
||||
NLA_PUT_U8(msg, IFLA_BOND_AD_LACP_ACTIVE, props->lacp_active);
|
||||
if (props->num_grat_arp)
|
||||
NLA_PUT_U8(msg, IFLA_BOND_NUM_PEER_NOTIF, props->num_grat_arp);
|
||||
|
||||
|
|
|
|||
|
|
@ -6187,6 +6187,7 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
|
|||
char sbuf_miimon[30];
|
||||
char sbuf_updelay[30];
|
||||
char sbuf_downdelay[30];
|
||||
char sbuf_lacp_active[30];
|
||||
char sbuf_peer_notif_delay[60];
|
||||
char sbuf_resend_igmp[30];
|
||||
char sbuf_lp_interval[30];
|
||||
|
|
@ -6223,6 +6224,7 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
|
|||
" all_ports_active %u"
|
||||
" arp_missed_max %u"
|
||||
" lacp_rate %u"
|
||||
"%s" /* lacp_active */
|
||||
" ad_select %u"
|
||||
" use_carrier %d"
|
||||
"%s" /* tlb_dynamic_lb */,
|
||||
|
|
@ -6274,6 +6276,12 @@ nm_platform_lnk_bond_to_string(const NMPlatformLnkBond *lnk, char *buf, gsize le
|
|||
lnk->all_ports_active,
|
||||
lnk->arp_missed_max,
|
||||
lnk->lacp_rate,
|
||||
lnk->lacp_active_has || lnk->lacp_active != 0
|
||||
? nm_sprintf_buf(sbuf_lacp_active,
|
||||
" lacp_active%s %u",
|
||||
!lnk->lacp_active_has ? "?" : "",
|
||||
lnk->lacp_active)
|
||||
: "",
|
||||
lnk->ad_select,
|
||||
(int) lnk->use_carrier,
|
||||
lnk->tlb_dynamic_lb_has ? nm_sprintf_buf(sbuf_tlb_dynamic_lb,
|
||||
|
|
@ -8043,12 +8051,14 @@ nm_platform_lnk_bond_hash_update(const NMPlatformLnkBond *obj, NMHashState *h)
|
|||
obj->arp_ip_targets_num,
|
||||
obj->fail_over_mac,
|
||||
obj->lacp_rate,
|
||||
obj->lacp_active,
|
||||
obj->num_grat_arp,
|
||||
obj->mode,
|
||||
obj->primary_reselect,
|
||||
obj->xmit_hash_policy,
|
||||
NM_HASH_COMBINE_BOOLS(guint16,
|
||||
obj->downdelay_has,
|
||||
obj->lacp_active_has,
|
||||
obj->lp_interval_has,
|
||||
obj->miimon_has,
|
||||
obj->peer_notif_delay_has,
|
||||
|
|
@ -8090,11 +8100,13 @@ nm_platform_lnk_bond_cmp(const NMPlatformLnkBond *a, const NMPlatformLnkBond *b)
|
|||
NM_CMP_FIELD(a, b, arp_missed_max);
|
||||
NM_CMP_FIELD(a, b, fail_over_mac);
|
||||
NM_CMP_FIELD(a, b, lacp_rate);
|
||||
NM_CMP_FIELD(a, b, lacp_active);
|
||||
NM_CMP_FIELD(a, b, num_grat_arp);
|
||||
NM_CMP_FIELD(a, b, mode);
|
||||
NM_CMP_FIELD(a, b, primary_reselect);
|
||||
NM_CMP_FIELD(a, b, xmit_hash_policy);
|
||||
NM_CMP_FIELD_BOOL(a, b, downdelay_has);
|
||||
NM_CMP_FIELD_BOOL(a, b, lacp_active_has);
|
||||
NM_CMP_FIELD_BOOL(a, b, lp_interval_has);
|
||||
NM_CMP_FIELD_BOOL(a, b, miimon_has);
|
||||
NM_CMP_FIELD_BOOL(a, b, peer_notif_delay_has);
|
||||
|
|
|
|||
|
|
@ -785,12 +785,14 @@ typedef struct {
|
|||
guint8 arp_missed_max;
|
||||
guint8 arp_ip_targets_num;
|
||||
guint8 fail_over_mac;
|
||||
guint8 lacp_active;
|
||||
guint8 lacp_rate;
|
||||
guint8 num_grat_arp;
|
||||
guint8 mode;
|
||||
guint8 primary_reselect;
|
||||
guint8 xmit_hash_policy;
|
||||
bool downdelay_has : 1;
|
||||
bool lacp_active_has : 1;
|
||||
bool lp_interval_has : 1;
|
||||
bool miimon_has : 1;
|
||||
bool peer_notif_delay_has : 1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue