NL_SET_ERR_MSG_MOD(info->extack, "FIB offload was aborted. Not configuring route");
                        return notifier_from_errno(-EINVAL);
                }
+               if (info->family == AF_INET) {
+                       struct fib_entry_notifier_info *fen_info = ptr;
+
+                       if (fen_info->fi->fib_nh_is_v6) {
+                               NL_SET_ERR_MSG_MOD(info->extack, "IPv6 gateway with IPv4 route is not supported");
+                               return notifier_from_errno(-EINVAL);
+                       }
+               }
                break;
        }
 
 
        switch (event) {
        case FIB_EVENT_ENTRY_ADD: /* fall through */
        case FIB_EVENT_ENTRY_DEL:
+               if (info->family == AF_INET) {
+                       struct fib_entry_notifier_info *fen_info = ptr;
+
+                       if (fen_info->fi->fib_nh_is_v6) {
+                               NL_SET_ERR_MSG_MOD(info->extack, "IPv6 gateway with IPv4 route is not supported");
+                               return notifier_from_errno(-EINVAL);
+                       }
+               }
+
                memcpy(&fib_work->fen_info, ptr, sizeof(fib_work->fen_info));
                /* Take referece on fib_info to prevent it from being
                 * freed while work is queued. Release it afterwards.
 
 #define fib_rtt fib_metrics->metrics[RTAX_RTT-1]
 #define fib_advmss fib_metrics->metrics[RTAX_ADVMSS-1]
        int                     fib_nhs;
+       bool                    fib_nh_is_v6;
        struct rcu_head         rcu;
        struct fib_nh           fib_nh[0];
 #define fib_dev                fib_nh[0].fib_nh_dev
 
 
        change_nexthops(fi) {
                fib_info_update_nh_saddr(net, nexthop_nh);
+               if (nexthop_nh->fib_nh_gw_family == AF_INET6)
+                       fi->fib_nh_is_v6 = true;
        } endfor_nexthops(fi)
 
        fib_rebalance(fi);