[IPSEC]: Fix policy updates missed by sockets
authorDavid S. Miller <davem@sunset.davemloft.net>
Thu, 22 Dec 2005 15:39:48 +0000 (07:39 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Thu, 22 Dec 2005 15:39:48 +0000 (07:39 -0800)
commit9b78a82c1cf19aa813bdaa184fa840a3ba811750
tree5500cc243037614ed8787b39a3f1baa0246443c9
parent4c7e6895027362889422e5dc437dc3238b6b4745
[IPSEC]: Fix policy updates missed by sockets

The problem is that when new policies are inserted, sockets do not see
the update (but all new route lookups do).

This bug is related to the SA insertion stale route issue solved
recently, and this policy visibility problem can be fixed in a similar
way.

The fix is to flush out the bundles of all policies deeper than the
policy being inserted.  Consider beginning state of "outgoing"
direction policy list:

policy A --> policy B --> policy C --> policy D

First, realize that inserting a policy into a list only potentially
changes IPSEC routes for that direction.  Therefore we need not bother
considering the policies for other directions.  We need only consider
the existing policies in the list we are doing the inserting.

Consider new policy "B'", inserted after B.

policy A --> policy B --> policy B' --> policy C --> policy D

Two rules:

1) If policy A or policy B matched before the insertion, they
   appear before B' and thus would still match after inserting
   B'

2) Policy C and D, now "shadowed" and after policy B', potentially
   contain stale routes because policy B' might be selected
   instead of them.

Therefore we only need flush routes assosciated with policies
appearing after a newly inserted policy, if any.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/xfrm/xfrm_policy.c