/* Most recently processed IDL sequence number. */
static unsigned int idl_seqno;
-/* Each time this timer expires, the bridge fetches systems and interface
+/* Each time this timer expires, the bridge fetches interface and mirror
* statistics and pushes them into the database. */
-#define STATS_INTERVAL (5 * 1000) /* In milliseconds. */
-static long long int stats_timer = LLONG_MIN;
-
-/* Stores the time after which rate limited statistics may be written to the
- * database. Only updated when changes to the database require rate limiting.
- */
-#define DB_LIMIT_INTERVAL (1 * 1000) /* In milliseconds. */
-static long long int db_limiter = LLONG_MIN;
+#define IFACE_STATS_INTERVAL (5 * 1000) /* In milliseconds. */
+static long long int iface_stats_timer = LLONG_MIN;
/* In some datapaths, creating and destroying OpenFlow ports can be extremely
* expensive. This can cause bridge_reconfigure() to take a long time during
uint32_t *bond_stable_ids);
static bool port_is_synthetic(const struct port *);
+static void reconfigure_system_stats(const struct ovsrec_open_vswitch *);
+static void run_system_stats(void);
+
static void bridge_configure_mirrors(struct bridge *);
static struct mirror *mirror_create(struct bridge *,
const struct ovsrec_mirror *);
iface_clear_db_record(if_cfg->cfg);
}
}
+
+ reconfigure_system_stats(ovs_cfg);
}
static bool
* forked us to exit successfully. */
daemonize_complete();
reconfiguring = false;
+
+ VLOG_INFO("%s (Open vSwitch) %s", program_name, VERSION);
}
return done;
const char *config_str;
struct iface *iface;
- if (smap_get_bool(&port->cfg->other_config, "stp-enable", false)) {
+ if (!smap_get_bool(&port->cfg->other_config, "stp-enable", true)) {
port_s->enable = false;
return;
} else {
bitmap_set1(port_num_bitmap, port_idx);
port_s->port_num = port_idx;
} else {
- if (*port_num_counter > STP_MAX_PORTS) {
+ if (*port_num_counter >= STP_MAX_PORTS) {
VLOG_ERR("port %s: too many STP ports, disabling", port->name);
port_s->enable = false;
return;
struct smap smap;
enum netdev_features current;
- enum netdev_flags flags;
int64_t bps;
int mtu;
int64_t mtu_64;
smap_destroy(&smap);
- error = netdev_get_flags(iface->netdev, &flags);
- if (!error) {
- ovsrec_interface_set_admin_state(iface->cfg,
- flags & NETDEV_UP ? "up" : "down");
- }
- else {
- ovsrec_interface_set_admin_state(iface->cfg, NULL);
- }
-
error = netdev_get_features(iface->netdev, ¤t, NULL, NULL, NULL);
if (!error) {
ovsrec_interface_set_duplex(iface->cfg,
}
}
-/* Writes 'iface''s CFM statistics to the database. */
+/* Writes 'iface''s CFM statistics to the database. 'iface' must not be
+ * synthetic. */
static void
iface_refresh_cfm_stats(struct iface *iface)
{
const struct ovsrec_interface *cfg = iface->cfg;
- int fault, error;
+ int fault, opup, error;
const uint64_t *rmps;
size_t n_rmps;
int health;
- if (iface_is_synthetic(iface)) {
- return;
- }
-
fault = ofproto_port_get_cfm_fault(iface->port->bridge->ofproto,
iface->ofp_port);
if (fault >= 0) {
ovsrec_interface_set_cfm_fault_status(cfg, NULL, 0);
}
+ opup = ofproto_port_get_cfm_opup(iface->port->bridge->ofproto,
+ iface->ofp_port);
+ if (opup >= 0) {
+ ovsrec_interface_set_cfm_remote_opstate(cfg, opup ? "up" : "down");
+ } else {
+ ovsrec_interface_set_cfm_remote_opstate(cfg, NULL);
+ }
+
error = ofproto_port_get_cfm_remote_mpids(iface->port->bridge->ofproto,
iface->ofp_port, &rmps, &n_rmps);
if (error >= 0) {
}
static void
-refresh_system_stats(const struct ovsrec_open_vswitch *cfg)
+reconfigure_system_stats(const struct ovsrec_open_vswitch *cfg)
{
- struct ovsdb_datum datum;
- struct shash stats;
+ bool enable = enable_system_stats(cfg);
- shash_init(&stats);
- if (enable_system_stats(cfg)) {
- get_system_stats(&stats);
+ system_stats_enable(enable);
+ if (!enable) {
+ ovsrec_open_vswitch_set_statistics(cfg, NULL);
}
+}
+
+static void
+run_system_stats(void)
+{
+ const struct ovsrec_open_vswitch *cfg = ovsrec_open_vswitch_first(idl);
+ struct smap *stats;
- ovsdb_datum_from_shash(&datum, &stats);
- ovsdb_idl_txn_write(&cfg->header_, &ovsrec_open_vswitch_col_statistics,
- &datum);
+ stats = system_stats_run();
+ if (stats && cfg) {
+ struct ovsdb_idl_txn *txn;
+ struct ovsdb_datum datum;
+
+ txn = ovsdb_idl_txn_create(idl);
+ ovsdb_datum_from_smap(&datum, stats);
+ ovsdb_idl_txn_write(&cfg->header_, &ovsrec_open_vswitch_col_statistics,
+ &datum);
+ ovsdb_idl_txn_commit(txn);
+ ovsdb_idl_txn_destroy(txn);
+
+ free(stats);
+ }
}
static inline const char *
}
static void
-refresh_cfm_stats(void)
+refresh_instant_stats(void)
{
static struct ovsdb_idl_txn *txn = NULL;
HMAP_FOR_EACH (br, node, &all_bridges) {
struct iface *iface;
+ struct port *port;
+
+ br_refresh_stp_status(br);
+
+ HMAP_FOR_EACH (port, hmap_node, &br->ports) {
+ port_refresh_stp_status(port);
+ }
HMAP_FOR_EACH (iface, name_node, &br->iface_by_name) {
+ enum netdev_flags flags;
+ const char *link_state;
+ int64_t link_resets;
+ int current, error;
+
+ if (iface_is_synthetic(iface)) {
+ continue;
+ }
+
+ current = ofproto_port_is_lacp_current(br->ofproto,
+ iface->ofp_port);
+ if (current >= 0) {
+ bool bl = current;
+ ovsrec_interface_set_lacp_current(iface->cfg, &bl, 1);
+ } else {
+ ovsrec_interface_set_lacp_current(iface->cfg, NULL, 0);
+ }
+
+ error = netdev_get_flags(iface->netdev, &flags);
+ if (!error) {
+ const char *state = flags & NETDEV_UP ? "up" : "down";
+ ovsrec_interface_set_admin_state(iface->cfg, state);
+ } else {
+ ovsrec_interface_set_admin_state(iface->cfg, NULL);
+ }
+
+ link_state = netdev_get_carrier(iface->netdev) ? "up" : "down";
+ ovsrec_interface_set_link_state(iface->cfg, link_state);
+
+ link_resets = netdev_get_carrier_resets(iface->netdev);
+ ovsrec_interface_set_link_resets(iface->cfg, &link_resets, 1);
+
iface_refresh_cfm_stats(iface);
}
}
bool vlan_splinters_changed;
struct bridge *br;
+ ovsrec_open_vswitch_init((struct ovsrec_open_vswitch *) &null_cfg);
+
/* (Re)configure if necessary. */
if (!reconfiguring) {
ovsdb_idl_run(idl);
reconf_txn = NULL;
}
- /* Refresh system and interface stats if necessary. */
- if (time_msec() >= stats_timer) {
+ /* Refresh interface and mirror stats if necessary. */
+ if (time_msec() >= iface_stats_timer) {
if (cfg) {
struct ovsdb_idl_txn *txn;
}
}
- refresh_system_stats(cfg);
refresh_controller_status();
ovsdb_idl_txn_commit(txn);
ovsdb_idl_txn_destroy(txn); /* XXX */
}
- stats_timer = time_msec() + STATS_INTERVAL;
+ iface_stats_timer = time_msec() + IFACE_STATS_INTERVAL;
}
- if (time_msec() >= db_limiter) {
- struct ovsdb_idl_txn *txn;
-
- txn = ovsdb_idl_txn_create(idl);
- HMAP_FOR_EACH (br, node, &all_bridges) {
- struct iface *iface;
- struct port *port;
-
- br_refresh_stp_status(br);
-
- HMAP_FOR_EACH (port, hmap_node, &br->ports) {
- port_refresh_stp_status(port);
- }
-
- HMAP_FOR_EACH (iface, name_node, &br->iface_by_name) {
- const char *link_state;
- int64_t link_resets;
- int current;
-
- if (iface_is_synthetic(iface)) {
- continue;
- }
-
- current = ofproto_port_is_lacp_current(br->ofproto,
- iface->ofp_port);
- if (current >= 0) {
- bool bl = current;
- ovsrec_interface_set_lacp_current(iface->cfg, &bl, 1);
- } else {
- ovsrec_interface_set_lacp_current(iface->cfg, NULL, 0);
- }
-
- link_state = netdev_get_carrier(iface->netdev) ? "up" : "down";
- ovsrec_interface_set_link_state(iface->cfg, link_state);
-
- link_resets = netdev_get_carrier_resets(iface->netdev);
- ovsrec_interface_set_link_resets(iface->cfg, &link_resets, 1);
- }
- }
-
- if (ovsdb_idl_txn_commit(txn) != TXN_UNCHANGED) {
- db_limiter = time_msec() + DB_LIMIT_INTERVAL;
- }
- ovsdb_idl_txn_destroy(txn);
- }
-
- refresh_cfm_stats();
+ run_system_stats();
+ refresh_instant_stats();
}
void
HMAP_FOR_EACH (br, node, &all_bridges) {
ofproto_wait(br->ofproto);
}
- poll_timer_wait_until(stats_timer);
-
- if (db_limiter > time_msec()) {
- poll_timer_wait_until(db_limiter);
- }
+ poll_timer_wait_until(iface_stats_timer);
}
+
+ system_stats_wait();
}
/* Adds some memory usage statistics for bridges into 'usage', for use with
if (iface) {
iface->cfg = cfg;
iface->type = type;
- } else if (strcmp(type, "null")) {
+ } else if (!strcmp(type, "null")) {
+ VLOG_WARN_ONCE("%s: The null interface type is deprecated and"
+ " may be removed in February 2013. Please email"
+ " dev@openvswitch.org with concerns.",
+ cfg->name);
+ } else {
bridge_queue_if_cfg(br, cfg, port);
}
}