X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vswitchd%2Fbridge.c;h=a12274d3d4b2085527d451a7ee6be90ef01155cc;hb=fb2ec1e9a8ff955d4c6ef6a787ba8f8100b3a846;hp=f325afa6857d71a4ec3bddad10d34b5c4557bcbc;hpb=61c7584076dfb778697dcc132f5bcabdd42c9d9c;p=sliver-openvswitch.git diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index f325afa68..a12274d3d 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -176,6 +176,7 @@ static long long int iface_stats_timer = LLONG_MIN; #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); @@ -492,12 +493,12 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) 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_threads( - smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0)); + 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")); @@ -601,6 +602,13 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg) } } 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 @@ -876,9 +884,9 @@ bridge_configure_flow_miss_model(const char *opt) 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; } } @@ -1394,10 +1402,8 @@ iface_set_netdev_config(const struct ovsrec_interface *iface_cfg, return netdev_set_config(netdev, &iface_cfg->options); } -/* Opens a network device for 'if_cfg' and configures it. If '*ofp_portp' - * is OFPP_NONE, adds the network device to br->ofproto and stores the OpenFlow - * port number in '*ofp_portp'; otherwise leaves br->ofproto and '*ofp_portp' - * untouched. +/* Opens a network device for 'if_cfg' and configures it. Adds the network + * device to br->ofproto and stores the OpenFlow port number in '*ofp_portp'. * * If successful, returns 0 and stores the network device in '*netdevp'. On * failure, returns a positive errno value and stores NULL in '*netdevp'. */ @@ -2252,13 +2258,32 @@ instant_stats_wait(void) } } +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; @@ -2301,18 +2326,7 @@ bridge_run(void) "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