#define OFP_PORT_ACTION_WINDOW 10
static void add_del_bridges(const struct ovsrec_open_vswitch *);
+static void bridge_run__(void);
static void bridge_create(const struct ovsrec_bridge *);
static void bridge_destroy(struct bridge *);
static struct bridge *bridge_lookup(const char *name);
COVERAGE_INC(bridge_reconfigure);
- ofproto_set_flow_eviction_threshold(
- smap_get_int(&ovs_cfg->other_config, "flow-eviction-threshold",
- OFPROTO_FLOW_EVICTION_THRESHOLD_DEFAULT));
+ ofproto_set_flow_limit(smap_get_int(&ovs_cfg->other_config, "flow-limit",
+ OFPROTO_FLOW_LIMIT_DEFAULT));
- ofproto_set_n_handler_threads(
- smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0));
+ ofproto_set_threads(
+ smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0),
+ smap_get_int(&ovs_cfg->other_config, "n-revalidator-threads", 0));
bridge_configure_flow_miss_model(smap_get(&ovs_cfg->other_config,
"force-miss-model"));
}
}
free(managers);
+
+ /* The ofproto-dpif provider does some final reconfiguration in its
+ * ->type_run() function. We have to call it before notifying the database
+ * client that reconfiguration is complete, otherwise there is a very
+ * narrow race window in which e.g. ofproto/trace will not recognize the
+ * new configuration (sometimes this causes unit test failures). */
+ bridge_run__();
}
/* Delete ofprotos which aren't configured or have the wrong type. Create
enum ofproto_flow_miss_model model = OFPROTO_HANDLE_MISS_AUTO;
if (opt) {
- if (strcmp(opt, "with-facets")) {
+ if (!strcmp(opt, "with-facets")) {
model = OFPROTO_HANDLE_MISS_WITH_FACETS;
- } else if (strcmp(opt, "without-facets")) {
+ } else if (!strcmp(opt, "without-facets")) {
model = OFPROTO_HANDLE_MISS_WITHOUT_FACETS;
}
}
}
}
-static inline const char *
+static const char *
ofp12_controller_role_to_str(enum ofp12_controller_role role)
{
switch (role) {
}
}
\f
+static void
+bridge_run__(void)
+{
+ struct bridge *br;
+ struct sset types;
+ const char *type;
+
+ /* Let each datapath type do the work that it needs to do. */
+ sset_init(&types);
+ ofproto_enumerate_types(&types);
+ SSET_FOR_EACH (type, &types) {
+ ofproto_type_run(type);
+ }
+ sset_destroy(&types);
+
+ /* Let each bridge do the work that it needs to do. */
+ HMAP_FOR_EACH (br, node, &all_bridges) {
+ ofproto_run(br->ofproto);
+ }
+}
+
void
bridge_run(void)
{
static struct ovsrec_open_vswitch null_cfg;
const struct ovsrec_open_vswitch *cfg;
- struct sset types;
- const char *type;
bool vlan_splinters_changed;
struct bridge *br;
"flow-restore-wait", false));
}
- /* Let each datapath type do the work that it needs to do. */
- sset_init(&types);
- ofproto_enumerate_types(&types);
- SSET_FOR_EACH (type, &types) {
- ofproto_type_run(type);
- }
- sset_destroy(&types);
-
- /* Let each bridge do the work that it needs to do. */
- HMAP_FOR_EACH (br, node, &all_bridges) {
- ofproto_run(br->ofproto);
- }
+ bridge_run__();
/* Re-configure SSL. We do this on every trip through the main loop,
* instead of just when the database changes, because the contents of the
bridge_get_memory_usage(struct simap *usage)
{
struct bridge *br;
+ struct sset types;
+ const char *type;
+
+ sset_init(&types);
+ ofproto_enumerate_types(&types);
+ SSET_FOR_EACH (type, &types) {
+ ofproto_type_get_memory_usage(type, usage);
+ }
+ sset_destroy(&types);
HMAP_FOR_EACH (br, node, &all_bridges) {
ofproto_get_memory_usage(br->ofproto, usage);