diff options
author | Ethan Jackson <ethan@nicira.com> | 2013-06-19 14:40:21 -0700 |
---|---|---|
committer | Ethan Jackson <ethan@nicira.com> | 2013-07-07 03:58:07 -0700 |
commit | f1ce35146bfef05de5f342813fc8a8678eed96e8 (patch) | |
tree | a878c240b639c21a464cdf508e0daa55c2ea80b5 /lib/lacp.c | |
parent | 701351f8149b8f48e09bbc5b5c0fd379439fa430 (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.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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'. */ |