Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions teamsyncd/teamsync.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,18 @@ void TeamSync::addLag(const string &lagName, int ifindex, bool admin_state,
auto tsync = m_teamSelectables[lagName];
if (tsync->admin_state == admin_state && tsync->oper_state == oper_state && tsync->mtu == mtu)
return;

bool oper_state_changed = (tsync->oper_state != oper_state);
tsync->admin_state = admin_state;
tsync->oper_state = oper_state;
tsync->mtu = mtu;
lag_update = false;

/* If oper state changed, trigger member status update immediately */
if (oper_state_changed)
{
tsync->onChange();
}
}

FieldValueTuple s("state", "ok");
Expand Down Expand Up @@ -338,6 +346,16 @@ int TeamSync::TeamPortSync::onChange()
}

team_get_port_enabled(m_team, ifindex, &enabled);

/* If LAG is operationally down, force all members to disabled
* to ensure traffic is not forwarded through any member */
if (!oper_state && enabled)
{
SWSS_LOG_NOTICE("LAG %s is oper down, forcing member %s to disabled",
m_lagName.c_str(), ifname);
enabled = false;
}

tmp_lag_members[string(ifname)] = enabled;
}

Expand Down
2 changes: 1 addition & 1 deletion teamsyncd/teamsync.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ class TeamSync : public NetMsg

int getFd() override;
uint64_t readData() override;
int onChange();

/* member_name -> enabled|disabled */
std::map<std::string, bool> m_lagMembers;
bool admin_state;
bool oper_state;
unsigned int mtu;
protected:
int onChange();
static int teamdHandler(struct team_handle *th, void *arg,
team_change_type_mask_t type_mask);
static const struct team_change_handler gPortChangeHandler;
Expand Down