goto out;
        }
 
-       if (!(dev->flags & IFF_UP)) {
+       if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
                NL_SET_ERR_MSG(extack, "Nexthop device is not up");
                err = -ENETDOWN;
                goto out;
                                     const struct in6_addr *addr,
                                     bool anycast, gfp_t gfp_flags)
 {
-       u32 tb_id;
-       struct net_device *dev = idev->dev;
-       struct fib6_info *f6i;
-
-       f6i = fib6_info_alloc(gfp_flags);
-       if (!f6i)
-               return ERR_PTR(-ENOMEM);
+       struct fib6_config cfg = {
+               .fc_table = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL,
+               .fc_ifindex = idev->dev->ifindex,
+               .fc_flags = RTF_UP | RTF_ADDRCONF | RTF_NONEXTHOP,
+               .fc_dst = *addr,
+               .fc_dst_len = 128,
+               .fc_protocol = RTPROT_KERNEL,
+               .fc_nlinfo.nl_net = net,
+               .fc_ignore_dev_down = true,
+       };
 
-       f6i->fib6_metrics = ip_fib_metrics_init(net, NULL, 0, NULL);
-       f6i->dst_nocount = true;
-       f6i->dst_host = true;
-       f6i->fib6_protocol = RTPROT_KERNEL;
-       f6i->fib6_flags = RTF_UP | RTF_NONEXTHOP;
        if (anycast) {
-               f6i->fib6_type = RTN_ANYCAST;
-               f6i->fib6_flags |= RTF_ANYCAST;
+               cfg.fc_type = RTN_ANYCAST;
+               cfg.fc_flags |= RTF_ANYCAST;
        } else {
-               f6i->fib6_type = RTN_LOCAL;
-               f6i->fib6_flags |= RTF_LOCAL;
+               cfg.fc_type = RTN_LOCAL;
+               cfg.fc_flags |= RTF_LOCAL;
        }
 
-       f6i->fib6_nh.nh_gw = *addr;
-       dev_hold(dev);
-       f6i->fib6_nh.nh_dev = dev;
-       f6i->fib6_dst.addr = *addr;
-       f6i->fib6_dst.plen = 128;
-       tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL;
-       f6i->fib6_table = fib6_get_table(net, tb_id);
-
-       return f6i;
+       return ip6_route_info_create(&cfg, gfp_flags, NULL);
 }
 
 /* remove deleted ip from prefsrc entries */