On 5 Jan 2022, at 15:35, Ilya Maximets wrote:

> On 1/3/22 11:19, Eelco Chaudron wrote:
>> Hi Ilya,
>>
>> As you reviewed the v1, I’m wondering if this can get into the next release?
>
> Hi.  Sorry, this one fell through the cracks.

No problem, same here, I noticed it when picking up some related work :)

> It seems to be a bug fix, so we'll need to backport it anyway.
> I'll try to get to this patch in a near future.

ACK.

> Best regards, Ilya Maximets.
>
>>
>> I've also added the original authors of the fixes patches; maybe they can 
>> review?
>>
>> Eelco
>>
>> On 21 Jun 2021, at 11:20, Eelco Chaudron wrote:
>>
>>> For patch ports, the is_last_action value is not propagated and is
>>> always set to true. This causes non-reversible actions to modify the
>>> packet, and the original content is not preserved when processing
>>> the remaining actions.
>>>
>>> This patch propagates the is_last_action flag for patch port related
>>> actions. In addition, it also fixes a general last action propagation
>>> to the individual actions.
>>>
>>> Fixed check_pkt_larger as last action, as it is a valid case for the
>>> drop action, so it should not be skipped.
>>>
>>> Fixes: feee58b95 ("ofproto-dpif-xlate: Keep track of the last action")
>>> Fixes: 5b34f8fc3 ("Add a new OVS action check_pkt_larger")
>>> Signed-off-by: Eelco Chaudron <echau...@redhat.com>
>>>
>>> ---
>>> v2: Fixed additional last action propagation to individual actions.
>>>     Fixed problem with the check_pkt_larger now that that the correct
>>>     last action state is passed.
>>>
>>>  ofproto/ofproto-dpif-xlate.c |   27 ++++++++++++---------------
>>>  tests/ofproto-dpif.at        |   28 ++++++++++++++++++++++++++++
>>>  2 files changed, 40 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>>> index 7108c8a30..7b35f6a32 100644
>>> --- a/ofproto/ofproto-dpif-xlate.c
>>> +++ b/ofproto/ofproto-dpif-xlate.c
>>> @@ -460,7 +460,7 @@ static void xlate_commit_actions(struct xlate_ctx *ctx);
>>>
>>>  static void
>>>  patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
>>> -                  struct xport *out_dev);
>>> +                  struct xport *out_dev, bool is_last_action);
>>>
>>>  static void
>>>  ctx_trigger_freeze(struct xlate_ctx *ctx)
>>> @@ -3598,7 +3598,7 @@ propagate_tunnel_data_to_flow(struct xlate_ctx *ctx, 
>>> struct eth_addr dmac,
>>>  static int
>>>  native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
>>>                       const struct flow *flow, odp_port_t tunnel_odp_port,
>>> -                     bool truncate)
>>> +                     bool truncate, bool is_last_action)
>>>  {
>>>      struct netdev_tnl_build_header_params tnl_params;
>>>      struct ovs_action_push_tnl tnl_push_data;
>>> @@ -3728,7 +3728,7 @@ native_tunnel_output(struct xlate_ctx *ctx, const 
>>> struct xport *xport,
>>>          entry->tunnel_hdr.hdr_size = tnl_push_data.header_len;
>>>          entry->tunnel_hdr.operation = ADD;
>>>
>>> -        patch_port_output(ctx, xport, out_dev);
>>> +        patch_port_output(ctx, xport, out_dev, is_last_action);
>>>
>>>          /* Similar to the stats update in revalidation, the x_cache entries
>>>           * are populated by the previous translation are used to update the
>>> @@ -3822,7 +3822,7 @@ xlate_flow_is_protected(const struct xlate_ctx *ctx, 
>>> const struct flow *flow, co
>>>   */
>>>  static void
>>>  patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
>>> -                  struct xport *out_dev)
>>> +                  struct xport *out_dev, bool is_last_action)
>>>  {
>>>      struct flow *flow = &ctx->xin->flow;
>>>      struct flow old_flow = ctx->xin->flow;
>>> @@ -3864,8 +3864,9 @@ patch_port_output(struct xlate_ctx *ctx, const struct 
>>> xport *in_dev,
>>>      if (!process_special(ctx, out_dev) && may_receive(out_dev, ctx)) {
>>>          if (xport_stp_forward_state(out_dev) &&
>>>              xport_rstp_forward_state(out_dev)) {
>>> +
>>>              xlate_table_action(ctx, flow->in_port.ofp_port, 0, true, true,
>>> -                               false, true, clone_xlate_actions);
>>> +                               false, is_last_action, clone_xlate_actions);
>>>              if (!ctx->freezing) {
>>>                  xlate_action_set(ctx);
>>>              }
>>> @@ -3880,7 +3881,7 @@ patch_port_output(struct xlate_ctx *ctx, const struct 
>>> xport *in_dev,
>>>              mirror_mask_t old_mirrors2 = ctx->mirrors;
>>>
>>>              xlate_table_action(ctx, flow->in_port.ofp_port, 0, true, true,
>>> -                               false, true, clone_xlate_actions);
>>> +                               false, is_last_action, clone_xlate_actions);
>>>              ctx->mirrors = old_mirrors2;
>>>              ctx->base_flow = old_base_flow;
>>>              ctx->odp_actions->size = old_size;
>>> @@ -4107,7 +4108,7 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct 
>>> flow *flow,
>>>  static void
>>>  compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
>>>                          const struct xlate_bond_recirc *xr, bool check_stp,
>>> -                        bool is_last_action OVS_UNUSED, bool truncate)
>>> +                        bool is_last_action, bool truncate)
>>>  {
>>>      const struct xport *xport = get_ofp_port(ctx->xbridge, ofp_port);
>>>      struct flow_wildcards *wc = ctx->wc;
>>> @@ -4144,7 +4145,7 @@ compose_output_action__(struct xlate_ctx *ctx, 
>>> ofp_port_t ofp_port,
>>>         if (truncate) {
>>>             xlate_report_error(ctx, "Cannot truncate output to patch port");
>>>         }
>>> -       patch_port_output(ctx, xport, xport->peer);
>>> +       patch_port_output(ctx, xport, xport->peer, is_last_action);
>>>         return;
>>>      }
>>>
>>> @@ -4239,7 +4240,8 @@ compose_output_action__(struct xlate_ctx *ctx, 
>>> ofp_port_t ofp_port,
>>>                             xr->recirc_id);
>>>          } else if (is_native_tunnel) {
>>>              /* Output to native tunnel port. */
>>> -            native_tunnel_output(ctx, xport, flow, odp_port, truncate);
>>> +            native_tunnel_output(ctx, xport, flow, odp_port, truncate,
>>> +                                 is_last_action);
>>>              flow->tunnel = flow_tnl; /* Restore tunnel metadata */
>>>
>>>          } else if (terminate_native_tunnel(ctx, flow, wc,
>>> @@ -6742,7 +6744,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t 
>>> ofpacts_len,
>>>          const struct ofpact_set_field *set_field;
>>>          const struct mf_field *mf;
>>>          bool last = is_last_action && ofpact_last(a, ofpacts, ofpacts_len)
>>> -                    && ctx->action_set.size;
>>> +                    && !ctx->action_set.size;
>>>
>>>          if (ctx->error) {
>>>              break;
>>> @@ -7145,11 +7147,6 @@ do_xlate_actions(const struct ofpact *ofpacts, 
>>> size_t ofpacts_len,
>>>              break;
>>>
>>>          case OFPACT_CHECK_PKT_LARGER: {
>>> -            if (last) {
>>> -                /* If this is last action, then there is no need to
>>> -                 * translate the action. */
>>> -                break;
>>> -            }
>>>              const struct ofpact *remaining_acts = ofpact_next(a);
>>>              size_t remaining_acts_len = 
>>> ofpact_remaining_len(remaining_acts,
>>>                                                               ofpacts,
>>> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
>>> index 31064ed95..adf24d671 100644
>>> --- a/tests/ofproto-dpif.at
>>> +++ b/tests/ofproto-dpif.at
>>> @@ -8416,6 +8416,34 @@ AT_CHECK([sed -n 
>>> 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout],
>>>  OVS_VSWITCHD_STOP
>>>  AT_CLEANUP
>>>
>>> +
>>> +AT_SETUP([ofproto-dpif - patch ports - meter (clone)])
>>> +
>>> +OVS_VSWITCHD_START(
>>> +  [add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 -- \
>>> +   add-port br0 p1 -- set Interface p1 type=patch \
>>> +                                       options:peer=p2 ofport_request=2 -- 
>>> \
>>> +   add-br br1 -- \
>>> +   set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
>>> +   set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
>>> +                  fail-mode=secure -- \
>>> +   add-port br1 p2 -- set Interface p2 type=patch \
>>> +                                       options:peer=p1 -- \
>>> +   add-port br1 p3 -- set Interface p3 type=dummy ofport_request=3])
>>> +
>>> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br1 'meter=1 pktps stats 
>>> bands=type=drop rate=2'])
>>> +AT_CHECK([ovs-ofctl del-flows br0])
>>> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-flow br0 
>>> in_port=local,ip,actions=2,1])
>>> +AT_CHECK([ovs-ofctl -O OpenFlow13 add-flow br1 
>>> in_port=1,ip,actions=meter:1,3])
>>> +
>>> +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 
>>> 'in_port(100),eth(src=f8:bc:12:44:34:b6,dst=f8:bc:12:46:58:e0),eth_type(0x0800),ipv4(src=10.1.1.22,dst=10.0.0.3,proto=6,tos=0,ttl=64,frag=no),tcp(src=53295,dst=8080)'],
>>>  [0], [stdout])
>>> +AT_CHECK([tail -1 stdout], [0],
>>> +  [Datapath actions: clone(meter(0),3),1
>>> +])
>>> +
>>> +OVS_VSWITCHD_STOP
>>> +AT_CLEANUP
>>> +
>>>  dnl ----------------------------------------------------------------------
>>>  AT_BANNER([ofproto-dpif -- megaflows])
>>>
>>>
>>> _______________________________________________
>>> dev mailing list
>>> d...@openvswitch.org
>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to