static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
 {
-       int type;
        struct dst_entry *dst = skb_dst(skb);
+       struct net *net = dev_net(dst->dev);
+       struct inet6_dev *idev;
+       int type;
+
+       if (netif_is_l3_master(skb->dev) &&
+           dst->dev == net->loopback_dev)
+               idev = __in6_dev_get_safely(dev_get_by_index_rcu(net, IP6CB(skb)->iif));
+       else
+               idev = ip6_dst_idev(dst);
+
        switch (ipstats_mib_noroutes) {
        case IPSTATS_MIB_INNOROUTES:
                type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
                if (type == IPV6_ADDR_ANY) {
-                       IP6_INC_STATS(dev_net(dst->dev),
-                                     __in6_dev_get_safely(skb->dev),
-                                     IPSTATS_MIB_INADDRERRORS);
+                       IP6_INC_STATS(net, idev, IPSTATS_MIB_INADDRERRORS);
                        break;
                }
                /* FALLTHROUGH */
        case IPSTATS_MIB_OUTNOROUTES:
-               IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
-                             ipstats_mib_noroutes);
+               IP6_INC_STATS(net, idev, ipstats_mib_noroutes);
                break;
        }
+
+       /* Start over by dropping the dst for l3mdev case */
+       if (netif_is_l3_master(skb->dev))
+               skb_dst_drop(skb);
+
        icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
        kfree_skb(skb);
        return 0;