On 16 Apr 2022, at 13:09, lic121 wrote:

> ipfix cfg creation/deleting triggers revalidation. But this does
> not cover the case where ipfix options changes, which also suppose
> to trigger revalidation.

Some small comments below, and I think we should add a test case to verify the 
cases that could yield a reconfigure.

> Fixes: a9f5ee1199e1 ("ofproto-dpif: Trigger revalidation when ipfix config 
> set.")
> Signed-off-by: lic121 <[email protected]>
> ---
>  ofproto/ofproto-dpif-ipfix.c | 46 
> ++++++++++++++++++++++++++++----------------
>  ofproto/ofproto-dpif-ipfix.h |  2 +-
>  ofproto/ofproto-dpif.c       |  7 +++----
>  3 files changed, 33 insertions(+), 22 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif-ipfix.c b/ofproto/ofproto-dpif-ipfix.c
> index fc927fe..7d316ca 100644
> --- a/ofproto/ofproto-dpif-ipfix.c
> +++ b/ofproto/ofproto-dpif-ipfix.c
> @@ -926,17 +926,19 @@ dpif_ipfix_bridge_exporter_destroy(struct 
> dpif_ipfix_bridge_exporter *exporter)
>  static void
>  dpif_ipfix_bridge_exporter_set_options(
>      struct dpif_ipfix_bridge_exporter *exporter,
> -    const struct ofproto_ipfix_bridge_exporter_options *options)
> +    const struct ofproto_ipfix_bridge_exporter_options *options,
> +    bool *options_changed)
>  {
> -    bool options_changed;
> -
>      if (!options || sset_is_empty(&options->targets)) {
>          /* No point in doing any work if there are no targets. */
> -        dpif_ipfix_bridge_exporter_clear(exporter);
> +        if (exporter->options) {
> +            dpif_ipfix_bridge_exporter_clear(exporter);
> +            *options_changed = true;
> +        }

This can return without the option changed being set, so it should become:

} else {
   *options_changed = false;
}

>          return;
>      }
>
> -    options_changed = (
> +    *options_changed = (
>          !exporter->options
>          || !ofproto_ipfix_bridge_exporter_options_equal(
>              options, exporter->options));
> @@ -945,7 +947,7 @@ dpif_ipfix_bridge_exporter_set_options(
>       * shortchanged in collectors (which indicates that opening one or
>       * more of the configured collectors failed, so that we should
>       * retry). */
> -    if (options_changed
> +    if (*options_changed
>          || collectors_count(exporter->exporter.collectors)
>              < sset_count(&options->targets)) {
>          if (!dpif_ipfix_exporter_set_options(
> @@ -957,7 +959,7 @@ dpif_ipfix_bridge_exporter_set_options(
>      }
>
>      /* Avoid reconfiguring if options didn't change. */
> -    if (!options_changed) {
> +    if (!*options_changed) {
>          return;
>      }
>
> @@ -1015,17 +1017,19 @@ dpif_ipfix_flow_exporter_destroy(struct 
> dpif_ipfix_flow_exporter *exporter)
>  static bool
>  dpif_ipfix_flow_exporter_set_options(
>      struct dpif_ipfix_flow_exporter *exporter,
> -    const struct ofproto_ipfix_flow_exporter_options *options)
> +    const struct ofproto_ipfix_flow_exporter_options *options,
> +    bool *options_changed)
>  {
> -    bool options_changed;
> -
>      if (sset_is_empty(&options->targets)) {
>          /* No point in doing any work if there are no targets. */
> -        dpif_ipfix_flow_exporter_clear(exporter);
> +        if (exporter->options) {
> +            dpif_ipfix_flow_exporter_clear(exporter);
> +            *options_changed = true;
> +        }

This can return without the option changed being set, so it should become:

} else {
   *options_changed = false;
}

>          return true;
>      }
>
> -    options_changed = (
> +    *options_changed = (
>          !exporter->options
>          || !ofproto_ipfix_flow_exporter_options_equal(
>              options, exporter->options));
> @@ -1034,7 +1038,7 @@ dpif_ipfix_flow_exporter_set_options(
>       * shortchanged in collectors (which indicates that opening one or
>       * more of the configured collectors failed, so that we should
>       * retry). */
> -    if (options_changed
> +    if (*options_changed
>          || collectors_count(exporter->exporter.collectors)
>              < sset_count(&options->targets)) {
>          if (!dpif_ipfix_exporter_set_options(
> @@ -1046,7 +1050,7 @@ dpif_ipfix_flow_exporter_set_options(
>      }
>
>      /* Avoid reconfiguring if options didn't change. */
> -    if (!options_changed) {
> +    if (!*options_changed) {
>          return true;
>      }
>
> @@ -1069,7 +1073,7 @@ remove_flow_exporter(struct dpif_ipfix *di,
>      free(node);
>  }
>
> -void
> +bool
>  dpif_ipfix_set_options(
>      struct dpif_ipfix *di,
>      const struct ofproto_ipfix_bridge_exporter_options 
> *bridge_exporter_options,
> @@ -1077,12 +1081,14 @@ dpif_ipfix_set_options(
>      size_t n_flow_exporters_options) OVS_EXCLUDED(mutex)
>  {
>      int i;
> +    bool beo_changed, feo_changed, entry_changed;

I’m not a compiler but looking at the sequence below I think feo_changed needs 
to be initialized to false.
Wondering why we do not get an error on this…

>      struct ofproto_ipfix_flow_exporter_options *options;
>      struct dpif_ipfix_flow_exporter_map_node *node;
>
>      ovs_mutex_lock(&mutex);
>      dpif_ipfix_bridge_exporter_set_options(&di->bridge_exporter,
> -                                           bridge_exporter_options);
> +                                           bridge_exporter_options,
> +                                           &beo_changed);
>
>      /* Add new flow exporters and update current flow exporters. */
>      options = (struct ofproto_ipfix_flow_exporter_options *)
> @@ -1095,10 +1101,14 @@ dpif_ipfix_set_options(
>              dpif_ipfix_flow_exporter_init(&node->exporter);
>              hmap_insert(&di->flow_exporter_map, &node->node,
>                          hash_int(options->collector_set_id, 0));
> +            feo_changed = true;
>          }
> -        if (!dpif_ipfix_flow_exporter_set_options(&node->exporter, options)) 
> {
> +        if (!dpif_ipfix_flow_exporter_set_options(&node->exporter,
> +                                                  options,
> +                                                  &entry_changed)) {
>              remove_flow_exporter(di, node);
>          }
> +        feo_changed = entry_changed ? true : feo_changed;
>          options++;
>      }
>
> @@ -1117,10 +1127,12 @@ dpif_ipfix_set_options(
>          }
>          if (i == n_flow_exporters_options) {  /* Not found. */
>              remove_flow_exporter(di, node);
> +            feo_changed = true;
>          }
>      }
>
>      ovs_mutex_unlock(&mutex);
> +    return beo_changed || feo_changed;
>  }
>
>  struct dpif_ipfix *
> diff --git a/ofproto/ofproto-dpif-ipfix.h b/ofproto/ofproto-dpif-ipfix.h
> index 1f42cd5..75c0ab8 100644
> --- a/ofproto/ofproto-dpif-ipfix.h
> +++ b/ofproto/ofproto-dpif-ipfix.h
> @@ -48,7 +48,7 @@ bool dpif_ipfix_get_bridge_exporter_output_sampling(const 
> struct dpif_ipfix *);
>  bool dpif_ipfix_get_flow_exporter_tunnel_sampling(const struct dpif_ipfix *,
>                                                    const uint32_t);
>  bool dpif_ipfix_is_tunnel_port(const struct dpif_ipfix *, odp_port_t);
> -void dpif_ipfix_set_options(
> +bool dpif_ipfix_set_options(
>      struct dpif_ipfix *,
>      const struct ofproto_ipfix_bridge_exporter_options *,
>      const struct ofproto_ipfix_flow_exporter_options *, size_t);
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 6601f23..b42a30c 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -2337,6 +2337,7 @@ set_ipfix(
>      struct dpif_ipfix *di = ofproto->ipfix;
>      bool has_options = bridge_exporter_options || flow_exporters_options;
>      bool new_di = false;
> +    bool option_changed = false;
       bool options_changed = false;

You use the variable options_changed above, so I would use the same here.

>
>      if (has_options && !di) {
>          di = ofproto->ipfix = dpif_ipfix_create();
> @@ -2346,7 +2347,7 @@ set_ipfix(
>      if (di) {
>          /* Call set_options in any case to cleanly flush the flow
>           * caches in the last exporters that are to be destroyed. */
> -        dpif_ipfix_set_options(
> +        option_changed = dpif_ipfix_set_options(
>              di, bridge_exporter_options, flow_exporters_options,
>              n_flow_exporters_options);
>
> @@ -2363,9 +2364,7 @@ set_ipfix(
>              ofproto->ipfix = NULL;
>          }
>
> -        /* TODO: need to consider ipfix option changes more than
> -         * enable/disable */
> -        if (new_di || !ofproto->ipfix) {
> +        if (new_di || option_changed) {
>              ofproto->backer->need_revalidate = REV_RECONFIGURE;
>          }
>      }
> -- 
> 1.8.3.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to