summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorAdrian Moreno <amorenoz@redhat.com>2023-02-24 12:05:04 +0100
committerIlya Maximets <i.maximets@ovn.org>2023-02-27 21:18:59 +0100
commitf1f278f5e125be47038379e208de6d2508ace277 (patch)
tree8424fb2959fb2d67c8bca161fe2d517132cd3b03 /ofproto
parentb5313a8ceca8ee45b3e8fd862324c6a43f562bd9 (diff)
downloadopenvswitch-f1f278f5e125be47038379e208de6d2508ace277.tar.gz
ipfix: Make template and stats interval configurable.
Add options to the IPFIX table configure the interval to send statistics and template information. Reviewed-by: Simon Horman <simon.horman@corigine.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-ipfix.c38
-rw-r--r--ofproto/ofproto.h9
2 files changed, 37 insertions, 10 deletions
diff --git a/ofproto/ofproto-dpif-ipfix.c b/ofproto/ofproto-dpif-ipfix.c
index f13478a88..e6c2968f7 100644
--- a/ofproto/ofproto-dpif-ipfix.c
+++ b/ofproto/ofproto-dpif-ipfix.c
@@ -140,6 +140,8 @@ struct dpif_ipfix_exporter {
struct ovs_list cache_flow_start_timestamp_list; /* ipfix_flow_cache_entry. */
uint32_t cache_active_timeout; /* In seconds. */
uint32_t cache_max_flows;
+ uint32_t stats_interval;
+ uint32_t template_interval;
char *virtual_obs_id;
uint8_t virtual_obs_len;
@@ -174,11 +176,6 @@ struct dpif_ipfix {
#define IPFIX_VERSION 0x000a
-/* When using UDP, IPFIX Template Records must be re-sent regularly.
- * The standard default interval is 10 minutes (600 seconds).
- * Cf. IETF RFC 5101 Section 10.3.6. */
-#define IPFIX_TEMPLATE_INTERVAL 600
-
/* Cf. IETF RFC 5101 Section 3.1. */
OVS_PACKED(
struct ipfix_header {
@@ -637,6 +634,8 @@ ofproto_ipfix_bridge_exporter_options_equal(
&& a->sampling_rate == b->sampling_rate
&& a->cache_active_timeout == b->cache_active_timeout
&& a->cache_max_flows == b->cache_max_flows
+ && a->stats_interval == b->stats_interval
+ && a->template_interval == b->template_interval
&& a->enable_tunnel_sampling == b->enable_tunnel_sampling
&& a->enable_input_sampling == b->enable_input_sampling
&& a->enable_output_sampling == b->enable_output_sampling
@@ -674,6 +673,8 @@ ofproto_ipfix_flow_exporter_options_equal(
return (a->collector_set_id == b->collector_set_id
&& a->cache_active_timeout == b->cache_active_timeout
&& a->cache_max_flows == b->cache_max_flows
+ && a->stats_interval == b->stats_interval
+ && a->template_interval == b->template_interval
&& a->enable_tunnel_sampling == b->enable_tunnel_sampling
&& sset_equals(&a->targets, &b->targets)
&& nullable_string_is_equal(a->virtual_obs_id, b->virtual_obs_id));
@@ -712,6 +713,9 @@ dpif_ipfix_exporter_init(struct dpif_ipfix_exporter *exporter)
ovs_list_init(&exporter->cache_flow_start_timestamp_list);
exporter->cache_active_timeout = 0;
exporter->cache_max_flows = 0;
+ exporter->stats_interval = OFPROTO_IPFIX_DEFAULT_TEMPLATE_INTERVAL;
+ exporter->template_interval = OFPROTO_IPFIX_DEFAULT_TEMPLATE_INTERVAL;
+ exporter->last_stats_sent_time = 0;
exporter->virtual_obs_id = NULL;
exporter->virtual_obs_len = 0;
hmap_init(&exporter->domains);
@@ -734,6 +738,9 @@ dpif_ipfix_exporter_clear(struct dpif_ipfix_exporter *exporter)
exporter->last_stats_sent_time = 0;
exporter->cache_active_timeout = 0;
exporter->cache_max_flows = 0;
+ exporter->stats_interval = OFPROTO_IPFIX_DEFAULT_TEMPLATE_INTERVAL;
+ exporter->template_interval = OFPROTO_IPFIX_DEFAULT_TEMPLATE_INTERVAL;
+ exporter->last_stats_sent_time = 0;
free(exporter->virtual_obs_id);
exporter->virtual_obs_id = NULL;
exporter->virtual_obs_len = 0;
@@ -761,6 +768,8 @@ dpif_ipfix_exporter_set_options(struct dpif_ipfix_exporter *exporter,
const struct sset *targets,
const uint32_t cache_active_timeout,
const uint32_t cache_max_flows,
+ const uint32_t stats_interval,
+ const uint32_t template_interval,
const char *virtual_obs_id) OVS_REQUIRES(mutex)
{
size_t virtual_obs_len;
@@ -775,6 +784,8 @@ dpif_ipfix_exporter_set_options(struct dpif_ipfix_exporter *exporter,
}
exporter->cache_active_timeout = cache_active_timeout;
exporter->cache_max_flows = cache_max_flows;
+ exporter->stats_interval = stats_interval;
+ exporter->template_interval = template_interval;
virtual_obs_len = virtual_obs_id ? strlen(virtual_obs_id) : 0;
if (virtual_obs_len > IPFIX_VIRTUAL_OBS_MAX_LEN) {
VLOG_WARN_RL(&rl, "Virtual obsevation ID too long (%d bytes), "
@@ -1007,6 +1018,7 @@ dpif_ipfix_bridge_exporter_set_options(
if (!dpif_ipfix_exporter_set_options(
&exporter->exporter, &options->targets,
options->cache_active_timeout, options->cache_max_flows,
+ options->stats_interval, options->template_interval,
options->virtual_obs_id)) {
return;
}
@@ -1022,6 +1034,14 @@ dpif_ipfix_bridge_exporter_set_options(
exporter->probability =
MAX(1, UINT32_MAX / exporter->options->sampling_rate);
+ /* Configure static observation_domain_id. */
+ struct dpif_ipfix_domain *dom;
+ HMAP_FOR_EACH_SAFE (dom, hmap_node, &(exporter->exporter.domains)) {
+ dpif_ipfix_exporter_del_domain(&exporter->exporter, dom);
+ }
+ dpif_ipfix_exporter_insert_domain(&exporter->exporter,
+ options->obs_domain_id);
+
/* Run over the cache as some entries might have expired after
* changing the timeouts. */
dpif_ipfix_cache_expire_now(&exporter->exporter, false);
@@ -1102,6 +1122,7 @@ dpif_ipfix_flow_exporter_set_options(
if (!dpif_ipfix_exporter_set_options(
&exporter->exporter, &options->targets,
options->cache_active_timeout, options->cache_max_flows,
+ options->stats_interval, options->template_interval,
options->virtual_obs_id)) {
return false;
}
@@ -2882,7 +2903,7 @@ dpif_ipfix_should_send_template(struct dpif_ipfix_exporter *exporter,
observation_domain_id);
}
- if ((domain->last_template_set_time + IPFIX_TEMPLATE_INTERVAL)
+ if ((domain->last_template_set_time + exporter->template_interval)
<= export_time_sec) {
domain->last_template_set_time = export_time_sec;
return true;
@@ -2922,10 +2943,7 @@ dpif_ipfix_cache_expire(struct dpif_ipfix_exporter *exporter,
break;
}
- /* XXX: Make frequency of the (Options) Template and Exporter Process
- * Statistics transmission configurable.
- * Cf. IETF RFC 5101 Section 4.3. and 10.3.6. */
- if ((exporter->last_stats_sent_time + IPFIX_TEMPLATE_INTERVAL)
+ if ((exporter->last_stats_sent_time + exporter->stats_interval)
<= export_time_sec) {
exporter->last_stats_sent_time = export_time_sec;
ipfix_send_exporter_data_msg(exporter, export_time_sec);
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index 4e15167ab..c79f372bc 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -72,6 +72,11 @@ struct ofproto_sflow_options {
char *control_ip;
};
+/* When using UDP, IPFIX Template Records must be re-sent regularly.
+ * The standard default interval is 10 minutes (600 seconds).
+ * Cf. IETF RFC 5101 Section 10.3.6. */
+#define OFPROTO_IPFIX_DEFAULT_TEMPLATE_INTERVAL 600
+
struct ofproto_ipfix_bridge_exporter_options {
struct sset targets;
uint32_t sampling_rate;
@@ -79,6 +84,8 @@ struct ofproto_ipfix_bridge_exporter_options {
uint32_t obs_point_id; /* Bridge-wide Observation Point ID. */
uint32_t cache_active_timeout;
uint32_t cache_max_flows;
+ uint32_t template_interval;
+ uint32_t stats_interval;
bool enable_tunnel_sampling;
bool enable_input_sampling;
bool enable_output_sampling;
@@ -90,6 +97,8 @@ struct ofproto_ipfix_flow_exporter_options {
struct sset targets;
uint32_t cache_active_timeout;
uint32_t cache_max_flows;
+ uint32_t template_interval;
+ uint32_t stats_interval;
bool enable_tunnel_sampling;
char *virtual_obs_id;
};