[ovs-dev] [PATCH ovn v5 4/9] ofctrl_check_and_add_flow: Replace the actions of an existing flow if actions have changed.
Dumitru Ceara
dceara at redhat.com
Fri May 15 12:40:29 UTC 2020
On 5/15/20 2:23 PM, Numan Siddique wrote:
>
>
> On Wed, May 13, 2020 at 7:24 PM Dumitru Ceara <dceara at redhat.com
> <mailto:dceara at redhat.com>> wrote:
>
> On 5/11/20 11:46 AM, numans at ovn.org <mailto:numans at ovn.org> wrote:
> > From: Numan Siddique <numans at ovn.org <mailto:numans at ovn.org>>
> >
> > If ofctrl_check_and_add_flow(F') is called where flow F' has
> match-actions (M, A2)
> > and if there already exists a flow F with match-actions (M, A1) in
> the desired flow
> > table, then this function doesn't update the existing flow F with
> new actions
> > actions A2.
> >
> > This patch is required for the upcoming patch in this series which
> > adds incremental processing for OVS interface in the flow output
> stage.
> > Since we will be not be clearing the flow output data if these changes
> > are handled incrementally, some of the existing flows will be updated
> > with new actions. One such example would be flows in physical
> > table OFTABLE_LOCAL_OUTPUT (table 33). And this patch is required to
> > update such flows. Otherwise we will have incomplete actions
> installed.
> >
> > Signed-off-by: Numan Siddique <numans at ovn.org <mailto:numans at ovn.org>>
>
> Hi Numan,
>
> I think the title of the commit should be "ofctrl: Replace the actions
> of an existing flow if actions have changed."
>
> > ---
> > controller/ofctrl.c | 23 ++++++++++++++++-------
> > 1 file changed, 16 insertions(+), 7 deletions(-)
> >
> > diff --git a/controller/ofctrl.c b/controller/ofctrl.c
> > index 4b51cd86e..8f2f13767 100644
> > --- a/controller/ofctrl.c
> > +++ b/controller/ofctrl.c
> > @@ -667,14 +667,23 @@ ofctrl_check_and_add_flow(struct
> ovn_desired_flow_table *flow_table,
> >
> > ovn_flow_log(f, "ofctrl_add_flow");
> >
> > - if (ovn_flow_lookup(&flow_table->match_flow_table, f, true)) {
> > - if (log_duplicate_flow) {
> > - static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(5, 5);
> > - if (!VLOG_DROP_DBG(&rl)) {
> > - char *s = ovn_flow_to_string(f);
> > - VLOG_DBG("dropping duplicate flow: %s", s);
> > - free(s);
> > + struct ovn_flow *existing_f =
> > + ovn_flow_lookup(&flow_table->match_flow_table, f, true);
> > + if (existing_f) {
> > + if (ofpacts_equal(f->ofpacts, f->ofpacts_len,
> > + existing_f->ofpacts,
> existing_f->ofpacts_len)) {
> > + if (log_duplicate_flow) {
> > + static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(5, 5);
> > + if (!VLOG_DROP_DBG(&rl)) {
> > + char *s = ovn_flow_to_string(f);
> > + VLOG_DBG("dropping duplicate flow: %s", s);
> > + free(s);
> > + }
> > }
> > + } else {
> > + free(existing_f->ofpacts);
> > + existing_f->ofpacts = xmemdup(f->ofpacts,
> f->ofpacts_len);
> > + existing_f->ofpacts_len = f->ofpacts_len;
>
> We could avoid the free(existing_f->ofpacts) followed by xmemdup by
> swapping f->ofpacts with existing_f->ofpacts (same for ofpacts_len).
> We'd probably need a function for that and we'd have to call it in
> ofctrl_add_or_append_flow() too.
>
>
> Good idea. I'll do as suggested. But I don't think we can do the same for
> ofctrl_add_or_append_flow() as it appends the actions.
>
You're right, we can't do it in ofctrl_add_or_append_flow(), thanks for
double checking.
Regards,
Dumitru
More information about the dev
mailing list