return 0;
 }
 
-static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct rtable *rt)
+static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct sk_buff *skb)
 {
+       struct rtable *rt = skb_rtable(skb);
+       struct iphdr *iph = ip_hdr(skb);
        struct flowi4 fl4 = {
-               .daddr = rt->rt_key_dst,
-               .saddr = rt->rt_key_src,
-               .flowi4_tos = rt->rt_tos,
+               .daddr = iph->daddr,
+               .saddr = iph->saddr,
+               .flowi4_tos = iph->tos,
                .flowi4_oif = rt->rt_oif,
                .flowi4_iif = rt->rt_iif,
                .flowi4_mark = rt->rt_mark,
        if (IPCB(skb)->flags & IPSKB_FORWARDED)
                goto dont_forward;
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt)) {
                kfree_skb(skb);
                return PTR_ERR(mrt);
 
        pim = igmp_hdr(skb);
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt))
                goto drop;
        if (!mrt->mroute_do_pim ||
             csum_fold(skb_checksum(skb, 0, skb->len, 0))))
                goto drop;
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt))
                goto drop;
        if (__pim_rcv(mrt, skb, sizeof(*pim))) {