On Fri, Apr 22, 2022 at 11:41:25AM +0200, Eelco Chaudron wrote:
> 
> 
> 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.

Thanks for the review, will address the commnents in the next version.

> 
> > Fixes: a9f5ee1199e1 ("ofproto-dpif: Trigger revalidation when ipfix config 
> > set.")
> > Signed-off-by: lic121 <lic...@chinatelecom.cn>
> > ---
> >  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
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to