• Florian Westphal's avatar
    xfrm: policy: add 2nd-level saddr trees for inexact policies · 6ac098b2
    Florian Westphal authored
    This adds the fourth and final search class, containing policies
    where both saddr and daddr have prefix lengths (i.e., not wildcards).
    
    Inexact policies now end up in one of the following four search classes:
    
    1. "Any:Any" list, containing policies where both saddr and daddr are
       wildcards or have very coarse prefixes, e.g. 10.0.0.0/8 and the like.
    2. "saddr:any" list, containing policies with a fixed saddr/prefixlen,
       but without destination restrictions.
       These lists are stored in rbtree nodes; each node contains those
       policies matching saddr/prefixlen.
    3. "Any:daddr" list. Similar to 2), except for policies where only the
       destinations are specified.
    4. "saddr:daddr" lists, containing only those policies that
       match the given source/destination network.
       The root of the saddr/daddr nodes gets stored in the nodes of the
       'daddr' tree.
    
    This diagram illustrates the list classes, and their
    placement in the lookup hierarchy:
    
        xfrm_pol_inexact_bin = hash(dir,type,family,if_id);
          |
          +---- root_d: sorted by daddr:prefix
          |                 |
          |        xfrm_pol_inexact_node
          |                 |
          |                 +- root: sorted by saddr/prefix
          |                 |              |
          |                 |         xfrm_pol_inexact_node
          |                 |              |
          |                 |              + root: unused
          |                 |              |
          |                 |              + hhead: saddr:daddr policies
          |                 |
          |                 +- coarse policies and all any:daddr policies
          |
          +---- root_s: sorted by saddr:prefix
          |                 |
          |        xfrm_pol_inexact_node
          |                 |
          |                 + root: unused
          |                 |
          |                 + hhead: saddr:any policies
          |
          +---- coarse policies and all any:any policies
    
    lookup for an inexact policy returns pointers to the four relevant list
    classes, after which each of the lists needs to be searched for the policy
    with the higher priority.
    
    This will only speed up lookups in case we have many policies and a
    sizeable portion of these have disjunct saddr/daddr addresses.
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
    6ac098b2
xfrm_policy.c 101 KB