diff options
author | Ben Pfaff <blp@ovn.org> | 2018-08-23 15:09:02 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2018-10-18 08:15:32 -0700 |
commit | 1273c5733c346c835c753e1a42a67e7458ec30c6 (patch) | |
tree | 18b15aa60d64f5a5255f6aeb8e0b782d562a8a64 /ofproto | |
parent | 16361b111b5091c7d18221e06f83d26998881863 (diff) | |
download | openvswitch-1273c5733c346c835c753e1a42a67e7458ec30c6.tar.gz |
ofproto-dpif: Refactor port_run().
This makes port_run() easier to understand but should not change its
behavior.
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Numan Siddique <nusididq@redhat.com>
Diffstat (limited to 'ofproto')
-rw-r--r-- | ofproto/ofproto-dpif.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 435bcf933..3fec959b4 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3569,45 +3569,49 @@ ofport_update_peer(struct ofport_dpif *ofport) free(peer_name); } -static void -port_run(struct ofport_dpif *ofport) +static bool +may_enable_port(struct ofport_dpif *ofport) { - long long int carrier_seq = netdev_get_carrier_resets(ofport->up.netdev); - bool carrier_changed = carrier_seq != ofport->carrier_seq; - bool enable = netdev_get_carrier(ofport->up.netdev); - bool cfm_enable = false; - bool bfd_enable = false; - - ofport->carrier_seq = carrier_seq; - - if (ofport->cfm) { - int cfm_opup = cfm_get_opup(ofport->cfm); - - cfm_enable = !cfm_get_fault(ofport->cfm); - - if (cfm_opup >= 0) { - cfm_enable = cfm_enable && cfm_opup; - } + /* Carrier must be up. */ + if (!netdev_get_carrier(ofport->up.netdev)) { + return false; } - if (ofport->bfd) { - bfd_enable = bfd_forwarding(ofport->bfd); + /* If CFM or BFD is enabled, then at least one of them must report that the + * port is up. */ + if ((ofport->bfd || ofport->cfm) + && !(ofport->cfm + && !cfm_get_fault(ofport->cfm) + && cfm_get_opup(ofport->cfm) != 0) + && !(ofport->bfd + && bfd_forwarding(ofport->bfd))) { + return false; } - if (ofport->bfd || ofport->cfm) { - enable = enable && (cfm_enable || bfd_enable); + /* If LACP is enabled, it must report that the link is enabled. */ + if (ofport->bundle + && !lacp_slave_may_enable(ofport->bundle->lacp, ofport)) { + return false; } - if (ofport->bundle) { - enable = enable && lacp_slave_may_enable(ofport->bundle->lacp, ofport); - if (carrier_changed) { - lacp_slave_carrier_changed(ofport->bundle->lacp, ofport); - } + return true; +} + +static void +port_run(struct ofport_dpif *ofport) +{ + long long int carrier_seq = netdev_get_carrier_resets(ofport->up.netdev); + bool carrier_changed = carrier_seq != ofport->carrier_seq; + ofport->carrier_seq = carrier_seq; + if (carrier_changed && ofport->bundle) { + lacp_slave_carrier_changed(ofport->bundle->lacp, ofport); } + bool enable = may_enable_port(ofport); if (ofport->up.may_enable != enable) { - struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofport->up.ofproto); + ofport->up.may_enable = enable; + struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofport->up.ofproto); ofproto->backer->need_revalidate = REV_PORT_TOGGLED; if (ofport->rstp_port) { @@ -3627,8 +3631,6 @@ port_run(struct ofport_dpif *ofport) ofproto_port_set_state(&ofport->up, of_state); } } - - ofport->up.may_enable = enable; } static int |