On Tue, 2016-03-22 at 13:13 -0700, Cong Wang wrote: > On Tue, Mar 22, 2016 at 11:03 AM, Wei Wang <tracyw...@gmail.com> wrote: > > Thanks Martin and Cong. > > > > I guess then we are going with the following fix in ip6_sk_update_pmtu(): > > 1. call ip6_upate_pmtu() as it is > > 2. do a dst_check() > > 3. re-lookup() if it is invalid > > 4. and then do a ip6_dst_store()/dst_set > > Exactly, please try the attached patch. Note I did nothing more than a > compile test. > > Does it make sense to you now?
Hard to reply on your patch as it was not inlined. 1) Lot of code duplication, for some reason I do not yet understand. ip6_sk_update_pmtu() and ip6_update_pmtu() will basically do the same thing... 2) + if (sk->sk_state == TCP_ESTABLISHED) + ip6_dst_store(sk, dst, &iph->daddr, &iph->saddr); +out: ip6_dst_store() will do : np->daddr_cache = daddr; (&iph->daddr) np->saddr_cache = saddr; (&iph->saddr) So when skb is freed, daddr_cache & saddr_cache point to freed data.