__be32 dst_ipaddr = htonl(dst_ip);
        __be32 src_ipaddr = htonl(src_ip);
 
-       rt = ip_route_output(&init_net, dst_ipaddr, src_ipaddr, 0, 0);
+       rt = ip_route_output(&init_net, dst_ipaddr, src_ipaddr, 0, 0,
+                            RT_SCOPE_UNIVERSE);
        if (IS_ERR(rt)) {
                ibdev_dbg(&iwdev->ibdev, "CM: ip_route_output fail\n");
                return -EINVAL;
 
        struct rtable *rt = NULL;
        int rc = 0;
 
-       rt = ip_route_output(&init_net, dst_ip, src_ip, 0, 0);
+       rt = ip_route_output(&init_net, dst_ip, src_ip, 0, 0,
+                            RT_SCOPE_UNIVERSE);
        if (IS_ERR(rt)) {
                DP_ERR(dev, "ip_route_output returned error\n");
                return -EINVAL;
 
                tags = NULL;
 
                /* Find out through which dev should the packet go */
-               rt = ip_route_output(dev_net(bond->dev), targets[i], 0,
-                                    RTO_ONLINK, 0);
+               rt = ip_route_output(dev_net(bond->dev), targets[i], 0, 0, 0,
+                                    RT_SCOPE_LINK);
                if (IS_ERR(rt)) {
                        /* there's no route to target - try to send arp
                         * probe to generate any traffic (arp_validate=0)
 
 #if defined(CONFIG_INET)
        struct rtable *rt;
 
-       rt = ip_route_output(&init_net, dst_addr->sin_addr.s_addr, 0, 0, 0);
+       rt = ip_route_output(&init_net, dst_addr->sin_addr.s_addr, 0, 0, 0,
+                            RT_SCOPE_UNIVERSE);
        if (!IS_ERR(rt)) {
                *dst = &rt->dst;
                return 0;
 
        return ip_route_output_flow(net, flp, NULL);
 }
 
+/* Simplistic IPv4 route lookup function.
+ * This is only suitable for some particular use cases: since the flowi4
+ * structure is only partially set, it may bypass some fib-rules.
+ */
 static inline struct rtable *ip_route_output(struct net *net, __be32 daddr,
-                                            __be32 saddr, u8 tos, int oif)
+                                            __be32 saddr, u8 tos, int oif,
+                                            __u8 scope)
 {
        struct flowi4 fl4 = {
                .flowi4_oif = oif,
                .flowi4_tos = tos,
+               .flowi4_scope = scope,
                .daddr = daddr,
                .saddr = saddr,
        };
+
        return ip_route_output_key(net, &fl4);
 }
 
 
                unlink_clip_vcc(clip_vcc);
                return 0;
        }
-       rt = ip_route_output(&init_net, ip, 0, 1, 0);
+       rt = ip_route_output(&init_net, ip, 0, 0, 0, RT_SCOPE_LINK);
        if (IS_ERR(rt))
                return PTR_ERR(rt);
        neigh = __neigh_lookup(&arp_tbl, &ip, rt->dst.dev, 1);
 
                                goto free_skb;
 
                        rt = ip_route_output(net, iph->daddr, 0,
-                                            RT_TOS(iph->tos), 0);
+                                            RT_TOS(iph->tos), 0,
+                                            RT_SCOPE_UNIVERSE);
                        if (!IS_ERR(rt)) {
                                /* - Bridged-and-DNAT'ed traffic doesn't
                                 *   require ip_forwarding. */
 
        /*unsigned long now; */
        struct net *net = dev_net(dev);
 
-       rt = ip_route_output(net, sip, tip, 0, l3mdev_master_ifindex_rcu(dev));
+       rt = ip_route_output(net, sip, tip, 0, l3mdev_master_ifindex_rcu(dev),
+                            RT_SCOPE_UNIVERSE);
        if (IS_ERR(rt))
                return 1;
        if (rt->dst.dev != dev) {
        if (r->arp_flags & ATF_PERM)
                r->arp_flags |= ATF_COM;
        if (!dev) {
-               struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
+               struct rtable *rt = ip_route_output(net, ip, 0, 0, 0,
+                                                   RT_SCOPE_LINK);
 
                if (IS_ERR(rt))
                        return PTR_ERR(rt);
 
        ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
        if (!dev) {
-               struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
+               struct rtable *rt = ip_route_output(net, ip, 0, 0, 0,
+                                                   RT_SCOPE_LINK);
                if (IS_ERR(rt))
                        return PTR_ERR(rt);
                dev = rt->dst.dev;
 
        if (!dev) {
                struct rtable *rt = ip_route_output(net,
                                                    imr->imr_multiaddr.s_addr,
-                                                   0, 0, 0);
+                                                   0, 0, 0,
+                                                   RT_SCOPE_UNIVERSE);
                if (!IS_ERR(rt)) {
                        dev = rt->dst.dev;
                        ip_rt_put(rt);
 
        struct in_addr daddr;
 
        memcpy(&daddr, addr, sizeof(struct in_addr));
-       rt = ip_route_output(net, daddr.s_addr, 0, 0, 0);
+       rt = ip_route_output(net, daddr.s_addr, 0, 0, 0, RT_SCOPE_UNIVERSE);
        if (IS_ERR(rt))
                return ERR_CAST(rt);