aboutsummaryrefslogtreecommitdiff
path: root/lib/lacp.c
diff options
context:
space:
mode:
authorEthan Jackson <ethan@nicira.com>2013-06-19 14:40:21 -0700
committerEthan Jackson <ethan@nicira.com>2013-07-07 03:58:07 -0700
commitf1ce35146bfef05de5f342813fc8a8678eed96e8 (patch)
treea878c240b639c21a464cdf508e0daa55c2ea80b5 /lib/lacp.c
parent701351f8149b8f48e09bbc5b5c0fd379439fa430 (diff)
lacp: Handle unknown slaves in lacp_process_packet().
In future patches, ofproto-dpif-xlate may be temporarily out of sync with ofproto-dpif proper, and pass an unknown ofport to lacp_process_packet(). This patch handles that edge case gracefully. Signed-off-by: Ethan Jackson <ethan@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'lib/lacp.c')
-rw-r--r--lib/lacp.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/lacp.c b/lib/lacp.c
index 9daca3bd..64cdbe72 100644
--- a/lib/lacp.c
+++ b/lib/lacp.c
@@ -279,6 +279,10 @@ lacp_process_packet(struct lacp *lacp, const void *slave_,
const struct lacp_pdu *pdu;
long long int tx_rate;
+ if (!slave) {
+ return;
+ }
+
pdu = parse_lacp_packet(packet);
if (!pdu) {
VLOG_WARN_RL(&rl, "%s: received an unparsable LACP PDU.", lacp->name);
@@ -374,6 +378,10 @@ lacp_slave_carrier_changed(const struct lacp *lacp, const void *slave_)
if (lacp) {
struct slave *slave = slave_lookup(lacp, slave_);
+ if (!slave) {
+ return;
+ }
+
if (slave->status == LACP_CURRENT || slave->lacp->active) {
slave_set_expired(slave);
}
@@ -395,7 +403,8 @@ bool
lacp_slave_may_enable(const struct lacp *lacp, const void *slave_)
{
if (lacp) {
- return slave_may_enable__(slave_lookup(lacp, slave_));
+ struct slave *slave = slave_lookup(lacp, slave_);
+ return slave ? slave_may_enable__(slave) : false;
} else {
return true;
}
@@ -407,7 +416,8 @@ lacp_slave_may_enable(const struct lacp *lacp, const void *slave_)
bool
lacp_slave_is_current(const struct lacp *lacp, const void *slave_)
{
- return slave_lookup(lacp, slave_)->status != LACP_DEFAULTED;
+ struct slave *slave = slave_lookup(lacp, slave_);
+ return slave ? slave->status != LACP_DEFAULTED : false;
}
/* This function should be called periodically to update 'lacp'. */