added "remote_ip=flow" and "local_ip=flow" options.
- New "check-oftest" Makefile target for running OFTest against Open
vSwitch. See README-OFTest for details.
+ - The flow eviction threshold has been moved to the Open_vSwitch table.
v1.11.0 - xx xxx xxxx
* For hysteresis, the number of subfacets to drop the governor is
* smaller than the number needed to trigger its creation. */
n_subfacets = hmap_count(&ofproto->subfacets);
- if (n_subfacets * 4 < ofproto->up.flow_eviction_threshold
+ if (n_subfacets * 4 < flow_eviction_threshold
&& governor_is_idle(ofproto->governor)) {
governor_destroy(ofproto->governor);
ofproto->governor = NULL;
size_t n_subfacets;
n_subfacets = hmap_count(&ofproto->subfacets);
- if (n_subfacets * 2 <= ofproto->up.flow_eviction_threshold) {
+ if (n_subfacets * 2 <= flow_eviction_threshold) {
return true;
}
* that is installed in the kernel gets dropped in the appropriate bucket.
* After the histogram has been built, we compute the cutoff so that only
* the most-recently-used 1% of subfacets (but at least
- * ofproto->up.flow_eviction_threshold flows) are kept cached. At least
+ * flow_eviction_threshold flows) are kept cached. At least
* the most-recently-used bucket of subfacets is kept, so actually an
* arbitrary number of subfacets can be kept in any given expiration run
* (though the next run will delete most of those unless they receive
int i;
total = hmap_count(&ofproto->subfacets);
- if (total <= ofproto->up.flow_eviction_threshold) {
+ if (total <= flow_eviction_threshold) {
return N_BUCKETS * BUCKET_WIDTH;
}
do {
subtotal += buckets[bucket++];
} while (bucket < N_BUCKETS &&
- subtotal < MAX(ofproto->up.flow_eviction_threshold, total / 100));
+ subtotal < MAX(flow_eviction_threshold, total / 100));
if (VLOG_IS_DBG_ENABLED()) {
struct ds s;
/* Settings. */
uint64_t fallback_dpid; /* Datapath ID if no better choice found. */
uint64_t datapath_id; /* Datapath ID. */
- unsigned flow_eviction_threshold; /* Threshold at which to begin flow
- * table eviction. Only affects the
- * ofproto-dpif implementation */
bool forward_bpdu; /* Option to allow forwarding of BPDU frames
* when NORMAL action is invoked. */
char *mfr_desc; /* Manufacturer (NULL for default)b. */
* is expirable, otherwise empty. */
};
+/* Threshold at which to begin flow table eviction. Only affects the
+ * ofproto-dpif implementation */
+extern unsigned flow_eviction_threshold;
+
static inline struct rule *
rule_from_cls_rule(const struct cls_rule *cls_rule)
{
static size_t n_ofproto_classes;
static size_t allocated_ofproto_classes;
+unsigned flow_eviction_threshold = OFPROTO_FLOW_EVICTION_THRESHOLD_DEFAULT;
+
/* Map from datapath name to struct ofproto, for use by unixctl commands. */
static struct hmap all_ofprotos = HMAP_INITIALIZER(&all_ofprotos);
hmap_insert(&all_ofprotos, &ofproto->hmap_node,
hash_string(ofproto->name, 0));
ofproto->datapath_id = 0;
- ofproto_set_flow_eviction_threshold(ofproto,
- OFPROTO_FLOW_EVICTION_THRESHOLD_DEFAULT);
ofproto->forward_bpdu = false;
ofproto->fallback_dpid = pick_fallback_dpid();
ofproto->mfr_desc = NULL;
/* Sets the number of flows at which eviction from the kernel flow table
* will occur. */
void
-ofproto_set_flow_eviction_threshold(struct ofproto *ofproto, unsigned threshold)
+ofproto_set_flow_eviction_threshold(unsigned threshold)
{
- if (threshold < OFPROTO_FLOW_EVICTION_THRESHOLD_MIN) {
- ofproto->flow_eviction_threshold = OFPROTO_FLOW_EVICTION_THRESHOLD_MIN;
- } else {
- ofproto->flow_eviction_threshold = threshold;
- }
+ flow_eviction_threshold = MAX(OFPROTO_FLOW_EVICTION_THRESHOLD_MIN,
+ threshold);
}
/* If forward_bpdu is true, the NORMAL action will forward frames with
void ofproto_set_extra_in_band_remotes(struct ofproto *,
const struct sockaddr_in *, size_t n);
void ofproto_set_in_band_queue(struct ofproto *, int queue_id);
-void ofproto_set_flow_eviction_threshold(struct ofproto *, unsigned threshold);
+void ofproto_set_flow_eviction_threshold(unsigned threshold);
void ofproto_set_forward_bpdu(struct ofproto *, bool forward_bpdu);
void ofproto_set_mac_table_config(struct ofproto *, unsigned idle_time,
size_t max_entries);
const unsigned long int *splinter_vlans);
static void bridge_refresh_ofp_port(struct bridge *);
static void bridge_configure_datapath_id(struct bridge *);
-static void bridge_configure_flow_eviction_threshold(struct bridge *);
static void bridge_configure_netflow(struct bridge *);
static void bridge_configure_forward_bpdu(struct bridge *);
static void bridge_configure_mac_table(struct bridge *);
ovs_assert(!reconfiguring);
reconfiguring = true;
+ ofproto_set_flow_eviction_threshold(
+ smap_get_int(&ovs_cfg->other_config, "flow-eviction-threshold",
+ OFPROTO_FLOW_EVICTION_THRESHOLD_DEFAULT));
+
/* Destroy "struct bridge"s, "struct port"s, and "struct iface"s according
* to 'ovs_cfg' while update the "if_cfg_queue", with only very minimal
* configuration otherwise.
}
}
bridge_configure_mirrors(br);
- bridge_configure_flow_eviction_threshold(br);
bridge_configure_forward_bpdu(br);
bridge_configure_mac_table(br);
bridge_configure_remotes(br, managers, n_managers);
bridge_configure_stp(br);
bridge_configure_tables(br);
bridge_configure_dp_desc(br);
+
+ if (smap_get(&br->cfg->other_config, "flow-eviction-threshold")) {
+ /* XXX: Remove this warning message eventually. */
+ VLOG_WARN_ONCE("As of June 2013, flow-eviction-threshold has been"
+ " moved to the Open_vSwitch table. Ignoring its"
+ " setting in the bridge table.");
+ }
}
free(managers);
return ok;
}
-/* Set Flow eviction threshold */
-static void
-bridge_configure_flow_eviction_threshold(struct bridge *br)
-{
- const char *threshold_str;
- unsigned threshold;
-
- threshold_str = smap_get(&br->cfg->other_config,
- "flow-eviction-threshold");
- if (threshold_str) {
- threshold = strtoul(threshold_str, NULL, 10);
- } else {
- threshold = OFPROTO_FLOW_EVICTION_THRESHOLD_DEFAULT;
- }
- ofproto_set_flow_eviction_threshold(br->ofproto, threshold);
-}
-
/* Set forward BPDU option. */
static void
bridge_configure_forward_bpdu(struct bridge *br)
functions use the above config option during hot upgrades.
</p>
</column>
+
+ <column name="other_config" key="flow-eviction-threshold"
+ type='{"type": "integer", "minInteger": 0}'>
+ <p>
+ A number of flows as a nonnegative integer. This sets number of
+ flows at which eviction from the datapath flow table will be
+ triggered. If there are a large number of flows then increasing this
+ value to around the number of flows present can result in reduced CPU
+ usage and packet loss.
+ </p>
+ <p>
+ The default is 1000. Values below 100 will be rounded up to 100.
+ </p>
+ </column>
</group>
<group title="Status">
datapath ID.
</column>
- <column name="other_config" key="flow-eviction-threshold"
- type='{"type": "integer", "minInteger": 0}'>
- <p>
- A number of flows as a nonnegative integer. This sets number of
- flows at which eviction from the kernel flow table will be triggered.
- If there are a large number of flows then increasing this value to
- around the number of flows present can result in reduced CPU usage
- and packet loss.
- </p>
- <p>
- The default is 1000. Values below 100 will be rounded up to 100.
- </p>
- </column>
-
<column name="other_config" key="forward-bpdu"
type='{"type": "boolean"}'>
Option to allow forwarding of BPDU frames when NORMAL action is