[ovs-dev] [PATCH ovn] controller: add datapath meter capability check

Lorenzo Bianconi lorenzo.bianconi at redhat.com
Wed Aug 25 19:00:46 UTC 2021


> On 18/08/2021 09:32, Lorenzo Bianconi wrote:
> > Dump datapath meter capabilities before configuring meters in
> > ovn-controller
> > 
> > Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi at redhat.com>
> > ---
> >  controller/lflow.c   | 10 +++++++++-
> >  controller/lflow.h   |  3 +++
> >  controller/pinctrl.c | 10 ++++++++++
> >  3 files changed, 22 insertions(+), 1 deletion(-)
> > 
> > diff --git a/controller/lflow.c b/controller/lflow.c
> > index 923d8f0a4..7d5b987cf 100644
> > --- a/controller/lflow.c
> > +++ b/controller/lflow.c
> > @@ -47,6 +47,8 @@ COVERAGE_DEFINE(lflow_run);
> >  /* Contains "struct expr_symbol"s for fields supported by OVN lflows. */
> >  static struct shash symtab;
> >  
> > +static bool lflow_dp_meter = true;
> > +
> >  void
> >  lflow_init(void)
> >  {
> > @@ -648,7 +650,7 @@ add_matches_to_flow_table(const struct sbrec_logical_flow *lflow,
> >          .ct_snat_vip_ptable = OFTABLE_CT_SNAT_HAIRPIN,
> >          .fdb_ptable = OFTABLE_GET_FDB,
> >          .fdb_lookup_ptable = OFTABLE_LOOKUP_FDB,
> > -        .ctrl_meter_id = ctrl_meter_id,
> > +        .ctrl_meter_id = lflow_dp_meter ? ctrl_meter_id : NX_CTLR_NO_METER,
> >      };
> >      ovnacts_encode(ovnacts->data, ovnacts->size, &ep, &ofpacts);
> >  
> > @@ -762,6 +764,12 @@ convert_match_to_expr(const struct sbrec_logical_flow *lflow,
> >      return expr_simplify(e);
> >  }
> >  
> > +void
> 
> I think you need *some* kind of synchronization here. Maybe not a mutex
> but perhaps an atomic read/write.

Hi Mark,

Thx for the review.
ack, I will use atomic_bool here.

> 
> > +lflow_meter_supported(bool val)
> > +{
> > +    lflow_dp_meter = val;
> > +}
> > +
> >  static bool
> >  consider_logical_flow__(const struct sbrec_logical_flow *lflow,
> >                          const struct sbrec_datapath_binding *dp,
> > diff --git a/controller/lflow.h b/controller/lflow.h
> > index 61ffbc0cc..d22c39861 100644
> > --- a/controller/lflow.h
> > +++ b/controller/lflow.h
> > @@ -191,4 +191,7 @@ bool lflow_handle_changed_mc_groups(struct lflow_ctx_in *,
> >                                      struct lflow_ctx_out *);
> >  bool lflow_handle_changed_port_bindings(struct lflow_ctx_in *,
> >                                          struct lflow_ctx_out *);
> > +
> > +void lflow_meter_supported(bool val);
> > +
> >  #endif /* controller/lflow.h */
> > diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> > index cc3edaaf4..f9d453ad2 100644
> > --- a/controller/pinctrl.c
> > +++ b/controller/pinctrl.c
> > @@ -39,6 +39,7 @@
> >  #include "openvswitch/ofp-switch.h"
> >  #include "openvswitch/ofp-util.h"
> >  #include "openvswitch/vlog.h"
> > +#include "openvswitch/ofp-meter.h"
> >  #include "lib/random.h"
> >  #include "lib/crc32c.h"
> >  
> > @@ -549,6 +550,10 @@ queue_msg(struct rconn *swconn, struct ofpbuf *msg)
> >  static void
> >  pinctrl_setup(struct rconn *swconn)
> >  {
> > +    /* dump datapath meter capabilities. */
> > +    queue_msg(swconn, ofpraw_alloc(OFPRAW_OFPST13_METER_FEATURES_REQUEST,
> > +                                   rconn_get_version(swconn), 0));
> > +
> 
> Is pinctrl the right place to do this? Should this not be done in the
> main controller thread on start up?

I added it here just to reuse the ovs-vswtichd connection managament, but we can move it to
the main controller thread (in this case we can probably even just use a bool
since the variable will be mostly read only). I will work on a v2.

Regrads,
Lorenzo

> 
> >      /* Fetch the switch configuration.  The response later will allow us to
> >       * change the miss_send_len to UINT16_MAX, so that we can enable
> >       * asynchronous messages. */
> > @@ -3258,6 +3263,11 @@ pinctrl_recv(struct rconn *swconn, const struct ofp_header *oh,
> >          set_switch_config(swconn, &config);
> >      } else if (type == OFPTYPE_PACKET_IN) {
> >          process_packet_in(swconn, oh);
> > +    } else if (type == OFPTYPE_METER_FEATURES_STATS_REPLY) {
> > +        struct ofputil_meter_features mf;
> > +
> > +        ofputil_decode_meter_features(oh, &mf);
> > +        lflow_meter_supported(mf.max_meters > 0);
> >      } else {
> >          if (VLOG_IS_DBG_ENABLED()) {
> >              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(30, 300);
> > 
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 


More information about the dev mailing list