]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ipv4/fib_frontend.c
ipv4: Optimize flow initialization in fib_validate_source().
[karo-tx-linux.git] / net / ipv4 / fib_frontend.c
index ad0778a3fa531c154cbcd68e8af94384237884a3..fe10bcd0f307fc94f3e67d3f05054359a07aa4a9 100644 (file)
@@ -193,19 +193,21 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
                        u32 *itag, u32 mark)
 {
        struct in_device *in_dev;
-       struct flowi fl = {
-               .fl4_dst = src,
-               .fl4_src = dst,
-               .fl4_tos = tos,
-               .mark = mark,
-               .iif = oif
-       };
+       struct flowi fl;
        struct fib_result res;
        int no_addr, rpf, accept_local;
        bool dev_match;
        int ret;
        struct net *net;
 
+       fl.oif = 0;
+       fl.iif = oif;
+       fl.mark = mark;
+       fl.fl4_dst = src;
+       fl.fl4_src = dst;
+       fl.fl4_tos = tos;
+       fl.fl4_scope = RT_SCOPE_UNIVERSE;
+
        no_addr = rpf = accept_local = 0;
        in_dev = __in_dev_get_rcu(dev);
        if (in_dev) {
@@ -890,10 +892,12 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
                fib_sync_up(dev);
 #endif
+               fib_update_nh_saddrs(dev);
                rt_cache_flush(dev_net(dev), -1);
                break;
        case NETDEV_DOWN:
                fib_del_ifaddr(ifa);
+               fib_update_nh_saddrs(dev);
                if (ifa->ifa_dev->ifa_list == NULL) {
                        /* Last address was deleted from this interface.
                         * Disable IP.