Hi Xin,

> To fix this duplicated policies issue, and also fix the issue in
> commit ed17b8d377ea ("xfrm: fix a warning in xfrm_policy_insert_list"),
> when doing add/del/get/update on user interfaces, this patch is to change
> to look up a policy with both mark and mask by doing:
> 
>   mark.v == pol->mark.v && mark.m == pol->mark.m

Looks good, thanks a lot for your work on this.  All tests in our
regression test suite complete successfully with this patch applied.

Tested-by: Tobias Brunner <tob...@strongswan.org>

> and leave the check:
> 
>   ((mark.v & mark.m) & pol->mark.m) == pol->mark.v.
> 
> for tx/rx path only.

If you are referring to the check in xfrm_policy_match() it's actually:

  (fl->flowi_mark & pol->mark.m) != pol->mark.v

Or more generically something like:

  (mark & pol->mark.m) == pol->mark.v

As we only have the mark on the packets/flow (no mask) to match against.

> -static bool xfrm_policy_mark_match(struct xfrm_policy *policy,
> +static bool xfrm_policy_mark_match(const struct xfrm_mark *mark,
>                                  struct xfrm_policy *pol)
>  {
> -     if (policy->mark.v == pol->mark.v &&
> -         policy->priority == pol->priority)
> -             return true;
> -
> -     return false;
> +     return mark->v == pol->mark.v && mark->m == pol->mark.m;
>  }

I guess you could make that function `static inline`.

Regards,
Tobias

Reply via email to