On Thu, 2021-12-30 at 08:03 +0000, Peng He wrote:
> considering a multi-thread PMD setting, when the frags are
> reassembled
> in one PMD, another thread might call *ipf_execute_reass_pkts* and
> 'steal'
> the reassembled packets into its ipf ctx, then this reassembled
> packet will enter into another ipf context and causes errors.
> 
> This happends when there are multiple CT zones, and frags are
> reassembled in ct(zone=X) might be 'stealed' into the ct(zone=Y).
> 
> Signed-off-by: Peng He <hepeng.0...@bytedance.com>
> ---
>  lib/conntrack.c |  2 +-
>  lib/ipf.c       | 10 ++++++++--
>  lib/ipf.h       |  1 +
>  3 files changed, 10 insertions(+), 3 deletions(-)
> 

Hello Peng,

This patch appears to make a number of tests fail. For example:

make check-system-userspace TESTSUITEFLAGS="-v 65 66 74 75 76 77 78 79
122"


-M

> diff --git a/lib/conntrack.c b/lib/conntrack.c
> index 72999f1ae..aafa6b536 100644
> --- a/lib/conntrack.c
> +++ b/lib/conntrack.c
> @@ -1443,7 +1443,7 @@ conntrack_execute(struct conntrack *ct, struct
> dp_packet_batch *pkt_batch,
>                    const struct nat_action_info_t *nat_action_info,
>                    long long now, uint32_t tp_id, struct ipf_ctx
> *ipf_ctx)
>  {
> -    ipf_preprocess_conntrack(ct->ipf, pkt_batch, now, dl_type, zone,
> +    ipf_preprocess_conntrack(ct->ipf, pkt_batch, ipf_ctx, now,
> dl_type, zone,
>                               ct->hash_basis);
>  
>      struct dp_packet *packet;
> diff --git a/lib/ipf.c b/lib/ipf.c
> index ef302e59c..bca34f59c 100644
> --- a/lib/ipf.c
> +++ b/lib/ipf.c
> @@ -1139,7 +1139,8 @@ ipf_send_expired_frags(struct ipf *ipf, struct
> dp_packet_batch *pb,
>  /* Adds a reassmebled packet to a packet batch to be processed by
> the caller.
>   */
>  static void
> -ipf_execute_reass_pkts(struct ipf *ipf, struct dp_packet_batch *pb)
> +ipf_execute_reass_pkts(struct ipf *ipf, struct dp_packet_batch *pb,
> +                       struct ipf_ctx *ctx)
>  {
>      if (ovs_list_is_empty(&ipf->reassembled_pkt_list)) {
>          return;
> @@ -1149,6 +1150,10 @@ ipf_execute_reass_pkts(struct ipf *ipf, struct
> dp_packet_batch *pb)
>      struct reassembled_pkt *rp, *next;
>  
>      LIST_FOR_EACH_SAFE (rp, next, rp_list_node, &ipf-
> >reassembled_pkt_list) {
> +        if (ctx && !ipf_ctx_eq(rp->list, ctx, rp->pkt)) {
> +            continue;
> +        }
> +
>          if (!rp->list->reass_execute_ctx &&
>              ipf_dp_packet_batch_add(pb, rp->pkt, false)) {
>              rp->list->reass_execute_ctx = rp->pkt;
> @@ -1250,6 +1255,7 @@ ipf_post_execute_reass_pkts(struct ipf *ipf,
>   * be added to the batch to be sent through conntrack. */
>  void
>  ipf_preprocess_conntrack(struct ipf *ipf, struct dp_packet_batch
> *pb,
> +                         struct ipf_ctx *ipf_ctx,
>                           long long now, ovs_be16 dl_type,
>                           uint16_t zone, uint32_t hash_basis)
>  {
> @@ -1258,7 +1264,7 @@ ipf_preprocess_conntrack(struct ipf *ipf,
> struct dp_packet_batch *pb,
>      }
>  
>      if (ipf_get_enabled(ipf) || atomic_count_get(&ipf->nfrag)) {
> -        ipf_execute_reass_pkts(ipf, pb);
> +        ipf_execute_reass_pkts(ipf, pb, ipf_ctx);
>      }
>  }
>  
> diff --git a/lib/ipf.h b/lib/ipf.h
> index 7bbf453af..8974f15ae 100644
> --- a/lib/ipf.h
> +++ b/lib/ipf.h
> @@ -49,6 +49,7 @@ struct ipf_ctx {
>  struct ipf *ipf_init(void);
>  void ipf_destroy(struct ipf *ipf);
>  void ipf_preprocess_conntrack(struct ipf *ipf, struct
> dp_packet_batch *pb,
> +                              struct ipf_ctx *ctx,
>                                long long now, ovs_be16 dl_type,
> uint16_t zone,
>                                uint32_t hash_basis);
>  

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

Reply via email to