• Yan Yan's avatar
    xfrm: Check if_id in xfrm_migrate · c1aca308
    Yan Yan authored
    This patch enables distinguishing SAs and SPs based on if_id during
    the xfrm_migrate flow. This ensures support for xfrm interfaces
    throughout the SA/SP lifecycle.
    
    When there are multiple existing SPs with the same direction,
    the same xfrm_selector and different endpoint addresses,
    xfrm_migrate might fail with ENODATA.
    
    Specifically, the code path for performing xfrm_migrate is:
      Stage 1: find policy to migrate with
        xfrm_migrate_policy_find(sel, dir, type, net)
      Stage 2: find and update state(s) with
        xfrm_migrate_state_find(mp, net)
      Stage 3: update endpoint address(es) of template(s) with
        xfrm_policy_migrate(pol, m, num_migrate)
    
    Currently "Stage 1" always returns the first xfrm_policy that
    matches, and "Stage 3" looks for the xfrm_tmpl that matches the
    old endpoint address. Thus if there are multiple xfrm_policy
    with same selector, direction, type and net, "Stage 1" might
    rertun a wrong xfrm_policy and "Stage 3" will fail with ENODATA
    because it cannot find a xfrm_tmpl with the matching endpoint
    address.
    
    The fix is to allow userspace to pass an if_id and add if_id
    to the matching rule in Stage 1 and Stage 2 since if_id is a
    unique ID for xfrm_policy and xfrm_state. For compatibility,
    if_id will only be checked if the attribute is set.
    
    Tested with additions to Android's kernel unit test suite:
    https://android-review.googlesource.com/c/kernel/tests/+/1668886Signed-off-by: default avatarYan Yan <evitayan@google.com>
    Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
    c1aca308
xfrm_policy.c 106 KB