struct sk_buff *skb;
        int ret;
 
+       mroute_sk = rcu_dereference(mrt->mroute_sk);
+       if (!mroute_sk)
+               return -EINVAL;
+
        if (assert == IGMPMSG_WHOLEPKT || assert == IGMPMSG_WRVIFWHOLE)
                skb = skb_realloc_headroom(pkt, sizeof(struct iphdr));
        else
                msg = (struct igmpmsg *)skb_network_header(skb);
                msg->im_vif = vifi;
                msg->im_vif_hi = vifi >> 8;
-               skb_dst_set(skb, dst_clone(skb_dst(pkt)));
+               ipv4_pktinfo_prepare(mroute_sk, pkt);
+               memcpy(skb->cb, pkt->cb, sizeof(skb->cb));
                /* Add our header */
                igmp = skb_put(skb, sizeof(struct igmphdr));
                igmp->type = assert;
                skb->transport_header = skb->network_header;
        }
 
-       mroute_sk = rcu_dereference(mrt->mroute_sk);
-       if (!mroute_sk) {
-               kfree_skb(skb);
-               return -EINVAL;
-       }
-
        igmpmsg_netlink_event(mrt, skb);
 
        /* Deliver to mrouted */