From: Krzysztof Oledzki <[EMAIL PROTECTED]> Date: Mon, 19 Dec 2005 10:37:14 +0100 (CET)
> OK. With this patch kernel switches to new SA immediately, but only for > ping. TCP (ssh) session between Cisco and Linux is still protected by the > old SA. Ok, we're making progress :-) When the bundles get flushed, xfrm_prune_bundles() accumulates all the per-policy bundles into a list and runs dst_free() on each and every one. Unless marked obsolete already (these dst's should not be marked obsolete), it invokes __dst_free() which marks the dst as obsolete and this in turn should trigger the cached socket route check here in __sk_dst_check(). static inline struct dst_entry * __sk_dst_check(struct sock *sk, u32 cookie) { struct dst_entry *dst = sk->sk_dst_cache; if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) { sk->sk_dst_cache = NULL; dst_release(dst); return NULL; } return dst; } Oh, that's the bug, dst->ops->check() is xfrm_dst_check(). That tests validity using "stable_bundle()" which thinks the dst is still valid. Please add these two lines: if (dst->obsolete) return NULL; at the beginning of xfrm_dst_check() and all should be fine. Dziekuje bardzo for all of your testing so far Krzysztof. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html