This commit refines the connectivity module by defining wrappers for each related operation.
Signed-off-by: Alex Wang <al...@nicira.com> --- lib/bfd.c | 2 +- lib/cfm.c | 2 +- lib/connectivity.c | 45 ++++++++++++++++++++++++++++++++++----------- lib/connectivity.h | 4 +++- lib/lacp.c | 4 ++-- lib/netdev-provider.h | 11 +++++------ lib/rstp-state-machines.c | 4 ++-- lib/rstp.c | 2 +- lib/stp.c | 6 +++--- ofproto/bond.c | 6 +++--- ofproto/ofproto-dpif.c | 2 +- ofproto/ofproto.c | 4 ++-- vswitchd/bridge.c | 6 +++--- 13 files changed, 61 insertions(+), 37 deletions(-) diff --git a/lib/bfd.c b/lib/bfd.c index 3db1d57..86378d4 100644 --- a/lib/bfd.c +++ b/lib/bfd.c @@ -1198,7 +1198,7 @@ bfd_decay_update(struct bfd * bfd) OVS_REQUIRES(mutex) static void bfd_status_changed(struct bfd *bfd) OVS_REQUIRES(mutex) { - seq_change(connectivity_seq_get()); + connectivity_seq_change(); bfd->status_changed = true; } diff --git a/lib/cfm.c b/lib/cfm.c index 23c1c6f..fa0503c 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -338,7 +338,7 @@ cfm_init(void) static void cfm_status_changed(struct cfm *cfm) OVS_REQUIRES(mutex) { - seq_change(connectivity_seq_get()); + connectivity_seq_change(); cfm->status_changed = true; } diff --git a/lib/connectivity.c b/lib/connectivity.c index c80b5f1..59f8a39 100644 --- a/lib/connectivity.c +++ b/lib/connectivity.c @@ -15,22 +15,21 @@ */ #include <config.h> + #include "connectivity.h" #include "ovs-thread.h" #include "seq.h" -static struct seq *connectivity_seq; - /* Provides a global seq for connectivity changes. * - * Connectivity monitoring modules should call seq_change() on the returned - * object whenever the status of a port changes, whether the cause is local or - * remote. - * - * Clients can seq_wait() on this object for changes to netdev flags, features, - * ethernet addresses, carrier changes, and bfd/cfm/lacp/stp status. */ -struct seq * -connectivity_seq_get(void) + * Connectivity monitoring modules should use the public functions in this + * module to report, check or wait on link/port status change. + * */ +static struct seq *connectivity_seq; + +/* Runs only once to initialize 'connectivity_seq'. */ +static void +connectivity_seq_init(void) { static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; @@ -38,6 +37,30 @@ connectivity_seq_get(void) connectivity_seq = seq_create(); ovsthread_once_done(&once); } +} + +/* Reads and returns the current 'connectivity_seq' value. */ +uint64_t +connectivity_seq_read(void) +{ + connectivity_seq_init(); - return connectivity_seq; + return seq_read(connectivity_seq); +} + +/* Changes the 'connectivity_seq'. */ +void +connectivity_seq_change(void) +{ + connectivity_seq_init(); + seq_change(connectivity_seq); +} + +/* Wakes the caller up when 'connectivity_seq''s sequence number + * changes from 'value'. */ +void +connectivity_seq_wait(uint64_t value) +{ + connectivity_seq_init(); + seq_wait(connectivity_seq, value); } diff --git a/lib/connectivity.h b/lib/connectivity.h index 123e886..f00f960 100644 --- a/lib/connectivity.h +++ b/lib/connectivity.h @@ -20,6 +20,8 @@ #include <stdint.h> /* For tracking connectivity changes globally. */ -struct seq *connectivity_seq_get(void); +uint64_t connectivity_seq_read(void); +void connectivity_seq_change(void); +void connectivity_seq_wait(uint64_t value); #endif /* connectivity.h */ diff --git a/lib/lacp.c b/lib/lacp.c index 6f52652..219355a 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -528,7 +528,7 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex) slave_set_defaulted(slave); } if (slave->status != old_status) { - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } } } @@ -561,7 +561,7 @@ lacp_run(struct lacp *lacp, lacp_send_pdu *send_pdu) OVS_EXCLUDED(mutex) : LACP_SLOW_TIME_TX); timer_set_duration(&slave->tx, duration); - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } } lacp_unlock(); diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 3fdc732..6c94c7f 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -64,7 +64,7 @@ static void netdev_change_seq_changed(const struct netdev *netdev_) { struct netdev *netdev = CONST_CAST(struct netdev *, netdev_); - seq_change(connectivity_seq_get()); + connectivity_seq_change(); netdev->change_seq++; if (!netdev->change_seq) { netdev->change_seq++; @@ -187,11 +187,10 @@ struct netdev *netdev_rxq_get_netdev(const struct netdev_rxq *); * ========================== * * Minimally, implementations are required to report changes to netdev flags, - * features, ethernet address or carrier through connectivity_seq. Changes to - * other properties are allowed to cause notification through this interface, - * although implementations should try to avoid this. connectivity_seq_get() - * can be used to acquire a reference to the struct seq. The interface is - * described in detail in seq.h. */ + * features, ethernet address or carrier through connectivity_seq_*() + * interfaces. Changes to other properties are allowed to cause notification + * through these interfaces, although implementations should try to avoid this. + * Please check connectivity.h for detailed description. */ struct netdev_class { /* Type of netdevs in this class, e.g. "system", "tap", "gre", etc. * diff --git a/lib/rstp-state-machines.c b/lib/rstp-state-machines.c index 3202018..6d187b2 100644 --- a/lib/rstp-state-machines.c +++ b/lib/rstp-state-machines.c @@ -220,7 +220,7 @@ move_rstp__(struct rstp *rstp) } } num_iterations++; - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } if (num_iterations >= MAX_RSTP_ITERATIONS) { VLOG_ERR("%s: move_rstp() reached the iteration safeguard limit!", @@ -402,7 +402,7 @@ updt_roles_tree__(struct rstp *r) /* no break */ } } - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } static void diff --git a/lib/rstp.c b/lib/rstp.c index 3b314b4..3d41c2b 100644 --- a/lib/rstp.c +++ b/lib/rstp.c @@ -1130,7 +1130,7 @@ rstp_port_set_state__(struct rstp_port *p, enum rstp_state state) if (state != p->rstp_state && !p->state_changed) { p->state_changed = true; - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } p->rstp_state = state; } diff --git a/lib/stp.c b/lib/stp.c index 1e88cba..232c2bb 100644 --- a/lib/stp.c +++ b/lib/stp.c @@ -1158,7 +1158,7 @@ stp_configuration_update(struct stp *stp) OVS_REQUIRES(mutex) { stp_root_selection(stp); stp_designated_port_selection(stp); - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } static bool @@ -1289,7 +1289,7 @@ stp_set_port_state(struct stp_port *p, enum stp_state state) if (p < p->stp->first_changed_port) { p->stp->first_changed_port = p; } - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } p->state = state; } @@ -1308,7 +1308,7 @@ stp_topology_change_detection(struct stp *stp) OVS_REQUIRES(mutex) } stp->fdb_needs_flush = true; stp->topology_change_detected = true; - seq_change(connectivity_seq_get()); + connectivity_seq_change(); VLOG_INFO_RL(&rl, "%s: detected topology change.", stp->name); } diff --git a/ofproto/bond.c b/ofproto/bond.c index c4b3a3a..44c427c 100644 --- a/ofproto/bond.c +++ b/ofproto/bond.c @@ -493,7 +493,7 @@ bond_active_slave_changed(struct bond *bond) netdev_get_etheraddr(bond->active_slave->netdev, mac); memcpy(bond->active_slave_mac, mac, sizeof bond->active_slave_mac); bond->active_slave_changed = true; - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } static void @@ -639,7 +639,7 @@ bond_run(struct bond *bond, enum lacp_status lacp_status) /* Enable slaves based on link status and LACP feedback. */ HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) { bond_link_status_update(slave); - slave->change_seq = seq_read(connectivity_seq_get()); + slave->change_seq = connectivity_seq_read(); } if (!bond->active_slave || !bond->active_slave->enabled) { bond_choose_active_slave(bond); @@ -664,7 +664,7 @@ bond_wait(struct bond *bond) poll_timer_wait_until(slave->delay_expires); } - seq_wait(connectivity_seq_get(), slave->change_seq); + connectivity_seq_wait(slave->change_seq); } if (bond->bond_revalidate) { diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 1b4ad12..37e6ef9 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1529,7 +1529,7 @@ run(struct ofproto *ofproto_) dpif_ipfix_run(ofproto->ipfix); } - new_seq = seq_read(connectivity_seq_get()); + new_seq = connectivity_seq_read(); if (ofproto->change_seq != new_seq) { struct ofport_dpif *ofport; diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index b3909ad..1af6552 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -1596,7 +1596,7 @@ ofproto_run(struct ofproto *p) } } - new_seq = seq_read(connectivity_seq_get()); + new_seq = connectivity_seq_read(); if (new_seq != p->change_seq) { struct sset devnames; const char *devname; @@ -1638,7 +1638,7 @@ ofproto_wait(struct ofproto *p) if (p->ofproto_class->port_poll_wait) { p->ofproto_class->port_poll_wait(p); } - seq_wait(connectivity_seq_get(), p->change_seq); + connectivity_seq_wait(p->change_seq); connmgr_wait(p->connmgr); } diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 4d84732..f52987e 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -598,7 +598,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) bridge_destroy(br); } else { /* Trigger storing datapath version. */ - seq_change(connectivity_seq_get()); + connectivity_seq_change(); } } } @@ -2717,7 +2717,7 @@ run_status_update(void) /* Rate limit the update. Do not start a new update if the * previous one is not done. */ - seq = seq_read(connectivity_seq_get()); + seq = connectivity_seq_read(); if (seq != connectivity_seqno || status_txn_try_again) { struct bridge *br; @@ -2784,7 +2784,7 @@ status_update_wait(void) } else if (status_txn_try_again) { poll_timer_wait_until(time_msec() + STATUS_CHECK_AGAIN_MSEC); } else { - seq_wait(connectivity_seq_get(), connectivity_seqno); + connectivity_seq_wait(connectivity_seqno); } } -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev