IPMRA_TABLE_MROUTE_DO_ASSERT,
        IPMRA_TABLE_MROUTE_DO_PIM,
        IPMRA_TABLE_VIFS,
+       IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE,
        __IPMRA_TABLE_MAX
 };
 #define IPMRA_TABLE_MAX (__IPMRA_TABLE_MAX - 1)
 #define IGMPMSG_NOCACHE                1               /* Kern cache fill request to mrouted */
 #define IGMPMSG_WRONGVIF       2               /* For PIM assert processing (unused) */
 #define IGMPMSG_WHOLEPKT       3               /* For PIM Register processing */
+#define IGMPMSG_WRVIFWHOLE     4               /* For PIM Register and assert processing */
 
 #endif /* _UAPI__LINUX_MROUTE_H */
 
        struct sk_buff *skb;
        int ret;
 
-       if (assert == IGMPMSG_WHOLEPKT)
+       if (assert == IGMPMSG_WHOLEPKT || assert == IGMPMSG_WRVIFWHOLE)
                skb = skb_realloc_headroom(pkt, sizeof(struct iphdr));
        else
                skb = alloc_skb(128, GFP_ATOMIC);
        if (!skb)
                return -ENOBUFS;
 
-       if (assert == IGMPMSG_WHOLEPKT) {
+       if (assert == IGMPMSG_WHOLEPKT || assert == IGMPMSG_WRVIFWHOLE) {
                /* Ugly, but we have no choice with this interface.
                 * Duplicate old header, fix ihl, length etc.
                 * And all this only to mangle msg->im_msgtype and
                skb_reset_transport_header(skb);
                msg = (struct igmpmsg *)skb_network_header(skb);
                memcpy(msg, skb_network_header(pkt), sizeof(struct iphdr));
-               msg->im_msgtype = IGMPMSG_WHOLEPKT;
+               msg->im_msgtype = assert;
                msg->im_mbz = 0;
-               msg->im_vif = mrt->mroute_reg_vif_num;
+               if (assert == IGMPMSG_WRVIFWHOLE)
+                       msg->im_vif = vifi;
+               else
+                       msg->im_vif = mrt->mroute_reg_vif_num;
                ip_hdr(skb)->ihl = sizeof(struct iphdr) >> 2;
                ip_hdr(skb)->tot_len = htons(ntohs(ip_hdr(pkt)->tot_len) +
                                             sizeof(struct iphdr));
        struct mr_table *mrt;
        struct vifctl vif;
        struct mfcctl mfc;
+       bool do_wrvifwhole;
        u32 uval;
 
        /* There's one exception to the lock - MRT_DONE which needs to unlock */
                        break;
                }
 
+               do_wrvifwhole = (val == IGMPMSG_WRVIFWHOLE);
                val = !!val;
                if (val != mrt->mroute_do_pim) {
                        mrt->mroute_do_pim = val;
                        mrt->mroute_do_assert = val;
+                       mrt->mroute_do_wrvifwhole = do_wrvifwhole;
                }
                break;
        case MRT_TABLE:
                               MFC_ASSERT_THRESH)) {
                        c->_c.mfc_un.res.last_assert = jiffies;
                        ipmr_cache_report(mrt, skb, true_vifi, IGMPMSG_WRONGVIF);
+                       if (mrt->mroute_do_wrvifwhole)
+                               ipmr_cache_report(mrt, skb, true_vifi,
+                                                 IGMPMSG_WRVIFWHOLE);
                }
                goto dont_forward;
        }
                        mrt->mroute_reg_vif_num) ||
            nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_ASSERT,
                       mrt->mroute_do_assert) ||
-           nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_PIM, mrt->mroute_do_pim))
+           nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_PIM, mrt->mroute_do_pim) ||
+           nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE,
+                      mrt->mroute_do_wrvifwhole))
                return false;
 
        return true;