Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/linux.git] / net / ipv6 / route.c
index b582a0a0f1c5a31ba926f70cf1947db00f7168ff..ad438546d9159c7499a8a14b7bcf37e1583007b1 100644 (file)
@@ -247,9 +247,9 @@ static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops,
 {
        struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags);
 
-       if (rt != NULL)
+       if (rt)
                memset(&rt->rt6i_table, 0,
-                       sizeof(*rt) - sizeof(struct dst_entry));
+                      sizeof(*rt) - sizeof(struct dst_entry));
 
        return rt;
 }
@@ -263,7 +263,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)
        if (!(rt->dst.flags & DST_HOST))
                dst_destroy_metrics_generic(dst);
 
-       if (idev != NULL) {
+       if (idev) {
                rt->rt6i_idev = NULL;
                in6_dev_put(idev);
        }
@@ -299,10 +299,10 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        struct net_device *loopback_dev =
                dev_net(dev)->loopback_dev;
 
-       if (dev != loopback_dev && idev != NULL && idev->dev == dev) {
+       if (dev != loopback_dev && idev && idev->dev == dev) {
                struct inet6_dev *loopback_idev =
                        in6_dev_get(loopback_dev);
-               if (loopback_idev != NULL) {
+               if (loopback_idev) {
                        rt->rt6i_idev = loopback_idev;
                        in6_dev_put(idev);
                }
@@ -344,7 +344,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net,
                        if (dev->ifindex == oif)
                                return sprt;
                        if (dev->flags & IFF_LOOPBACK) {
-                               if (sprt->rt6i_idev == NULL ||
+                               if (!sprt->rt6i_idev ||
                                    sprt->rt6i_idev->dev->ifindex != oif) {
                                        if (flags & RT6_LOOKUP_F_IFACE && oif)
                                                continue;
@@ -385,7 +385,7 @@ static void rt6_probe(struct rt6_info *rt)
         * to no more than one per minute.
         */
        rcu_read_lock();
-       neigh = rt ? dst_get_neighbour(&rt->dst) : NULL;
+       neigh = rt ? dst_get_neighbour_noref(&rt->dst) : NULL;
        if (!neigh || (neigh->nud_state & NUD_VALID))
                goto out;
        read_lock_bh(&neigh->lock);
@@ -432,7 +432,7 @@ static inline int rt6_check_neigh(struct rt6_info *rt)
        int m;
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(&rt->dst);
+       neigh = dst_get_neighbour_noref(&rt->dst);
        if (rt->rt6i_flags & RTF_NONEXTHOP ||
            !(rt->rt6i_flags & RTF_GATEWAY))
                m = 1;
@@ -636,7 +636,7 @@ do { \
                                goto restart; \
                } \
        } \
-} while(0)
+} while (0)
 
 static struct rt6_info *ip6_pol_route_lookup(struct net *net,
                                             struct fib6_table *table,
@@ -727,24 +727,25 @@ static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort,
                struct neighbour *neigh;
                int attempts = !in_softirq();
 
-               if (!(rt->rt6i_flags&RTF_GATEWAY)) {
+               if (!(rt->rt6i_flags & RTF_GATEWAY)) {
                        if (ort->rt6i_dst.plen != 128 &&
                            ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
                                rt->rt6i_flags |= RTF_ANYCAST;
-                       ipv6_addr_copy(&rt->rt6i_gateway, daddr);
+                       rt->rt6i_gateway = *daddr;
                }
 
                rt->rt6i_flags |= RTF_CACHE;
 
 #ifdef CONFIG_IPV6_SUBTREES
                if (rt->rt6i_src.plen && saddr) {
-                       ipv6_addr_copy(&rt->rt6i_src.addr, saddr);
+                       rt->rt6i_src.addr = *saddr;
                        rt->rt6i_src.plen = 128;
                }
 #endif
 
        retry:
-               neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway);
+               neigh = __neigh_lookup_errno(&nd_tbl, &rt->rt6i_gateway,
+                                            rt->rt6i_dev);
                if (IS_ERR(neigh)) {
                        struct net *net = dev_net(rt->rt6i_dev);
                        int saved_rt_min_interval =
@@ -785,7 +786,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort,
 
        if (rt) {
                rt->rt6i_flags |= RTF_CACHE;
-               dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst)));
+               dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_noref_raw(&ort->dst)));
        }
        return rt;
 }
@@ -819,7 +820,7 @@ restart:
        dst_hold(&rt->dst);
        read_unlock_bh(&table->tb6_lock);
 
-       if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
+       if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
                nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
        else if (!(rt->dst.flags & DST_HOST))
                nrt = rt6_alloc_clone(rt, &fl6->daddr);
@@ -875,7 +876,7 @@ void ip6_route_input(struct sk_buff *skb)
                .flowi6_iif = skb->dev->ifindex,
                .daddr = iph->daddr,
                .saddr = iph->saddr,
-               .flowlabel = (* (__be32 *) iph)&IPV6_FLOWINFO_MASK,
+               .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK,
                .flowi6_mark = skb->mark,
                .flowi6_proto = iph->nexthdr,
        };
@@ -934,7 +935,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
                        in6_dev_hold(rt->rt6i_idev);
                rt->rt6i_expires = 0;
 
-               ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway);
+               rt->rt6i_gateway = ort->rt6i_gateway;
                rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES;
                rt->rt6i_metric = 0;
 
@@ -997,7 +998,7 @@ static void ip6_link_failure(struct sk_buff *skb)
 
        rt = (struct rt6_info *) skb_dst(skb);
        if (rt) {
-               if (rt->rt6i_flags&RTF_CACHE) {
+               if (rt->rt6i_flags & RTF_CACHE) {
                        dst_set_expires(&rt->dst, 0);
                        rt->rt6i_flags |= RTF_EXPIRES;
                } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT))
@@ -1067,34 +1068,38 @@ static DEFINE_SPINLOCK(icmp6_dst_lock);
 
 struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
                                  struct neighbour *neigh,
-                                 const struct in6_addr *addr)
+                                 struct flowi6 *fl6)
 {
+       struct dst_entry *dst;
        struct rt6_info *rt;
        struct inet6_dev *idev = in6_dev_get(dev);
        struct net *net = dev_net(dev);
 
-       if (unlikely(idev == NULL))
+       if (unlikely(!idev))
                return NULL;
 
        rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, dev, 0);
-       if (unlikely(rt == NULL)) {
+       if (unlikely(!rt)) {
                in6_dev_put(idev);
+               dst = ERR_PTR(-ENOMEM);
                goto out;
        }
 
        if (neigh)
                neigh_hold(neigh);
        else {
-               neigh = ndisc_get_neigh(dev, addr);
-               if (IS_ERR(neigh))
-                       neigh = NULL;
+               neigh = __neigh_lookup_errno(&nd_tbl, &fl6->daddr, dev);
+               if (IS_ERR(neigh)) {
+                       dst_free(&rt->dst);
+                       return ERR_CAST(neigh);
+               }
        }
 
        rt->dst.flags |= DST_HOST;
        rt->dst.output  = ip6_output;
        dst_set_neighbour(&rt->dst, neigh);
        atomic_set(&rt->dst.__refcnt, 1);
-       ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
+       rt->rt6i_dst.addr = fl6->daddr;
        rt->rt6i_dst.plen = 128;
        rt->rt6i_idev     = idev;
        dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
@@ -1106,8 +1111,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
 
        fib6_force_start_gc(net);
 
+       dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
+
 out:
-       return &rt->dst;
+       return dst;
 }
 
 int icmp6_dst_gc(void)
@@ -1237,15 +1244,24 @@ int ip6_route_add(struct fib6_config *cfg)
        if (cfg->fc_metric == 0)
                cfg->fc_metric = IP6_RT_PRIO_USER;
 
-       table = fib6_new_table(net, cfg->fc_table);
-       if (table == NULL) {
-               err = -ENOBUFS;
-               goto out;
+       err = -ENOBUFS;
+       if (cfg->fc_nlinfo.nlh &&
+           !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
+               table = fib6_get_table(net, cfg->fc_table);
+               if (!table) {
+                       printk(KERN_WARNING "IPv6: NLM_F_CREATE should be specified when creating new route\n");
+                       table = fib6_new_table(net, cfg->fc_table);
+               }
+       } else {
+               table = fib6_new_table(net, cfg->fc_table);
        }
 
+       if (!table)
+               goto out;
+
        rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, NULL, DST_NOCOUNT);
 
-       if (rt == NULL) {
+       if (!rt) {
                err = -ENOMEM;
                goto out;
        }
@@ -1294,8 +1310,9 @@ int ip6_route_add(struct fib6_config *cfg)
           they would result in kernel looping; promote them to reject routes
         */
        if ((cfg->fc_flags & RTF_REJECT) ||
-           (dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK)
-                                             && !(cfg->fc_flags&RTF_LOCAL))) {
+           (dev && (dev->flags & IFF_LOOPBACK) &&
+            !(addr_type & IPV6_ADDR_LOOPBACK) &&
+            !(cfg->fc_flags & RTF_LOCAL))) {
                /* hold loopback dev/idev if we haven't done so. */
                if (dev != net->loopback_dev) {
                        if (dev) {
@@ -1322,7 +1339,7 @@ int ip6_route_add(struct fib6_config *cfg)
                int gwa_type;
 
                gw_addr = &cfg->fc_gateway;
-               ipv6_addr_copy(&rt->rt6i_gateway, gw_addr);
+               rt->rt6i_gateway = *gw_addr;
                gwa_type = ipv6_addr_type(gw_addr);
 
                if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
@@ -1336,13 +1353,13 @@ int ip6_route_add(struct fib6_config *cfg)
                           some exceptions. --ANK
                         */
                        err = -EINVAL;
-                       if (!(gwa_type&IPV6_ADDR_UNICAST))
+                       if (!(gwa_type & IPV6_ADDR_UNICAST))
                                goto out;
 
                        grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);
 
                        err = -EHOSTUNREACH;
-                       if (grt == NULL)
+                       if (!grt)
                                goto out;
                        if (dev) {
                                if (dev != grt->rt6i_dev) {
@@ -1355,7 +1372,7 @@ int ip6_route_add(struct fib6_config *cfg)
                                dev_hold(dev);
                                in6_dev_hold(grt->rt6i_idev);
                        }
-                       if (!(grt->rt6i_flags&RTF_GATEWAY))
+                       if (!(grt->rt6i_flags & RTF_GATEWAY))
                                err = 0;
                        dst_release(&grt->dst);
 
@@ -1363,12 +1380,12 @@ int ip6_route_add(struct fib6_config *cfg)
                                goto out;
                }
                err = -EINVAL;
-               if (dev == NULL || (dev->flags&IFF_LOOPBACK))
+               if (!dev || (dev->flags & IFF_LOOPBACK))
                        goto out;
        }
 
        err = -ENODEV;
-       if (dev == NULL)
+       if (!dev)
                goto out;
 
        if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
@@ -1376,7 +1393,7 @@ int ip6_route_add(struct fib6_config *cfg)
                        err = -EINVAL;
                        goto out;
                }
-               ipv6_addr_copy(&rt->rt6i_prefsrc.addr, &cfg->fc_prefsrc);
+               rt->rt6i_prefsrc.addr = cfg->fc_prefsrc;
                rt->rt6i_prefsrc.plen = 128;
        } else
                rt->rt6i_prefsrc.plen = 0;
@@ -1465,7 +1482,7 @@ static int ip6_route_del(struct fib6_config *cfg)
        int err = -ESRCH;
 
        table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
-       if (table == NULL)
+       if (!table)
                return err;
 
        read_lock_bh(&table->tb6_lock);
@@ -1477,7 +1494,7 @@ static int ip6_route_del(struct fib6_config *cfg)
        if (fn) {
                for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
                        if (cfg->fc_ifindex &&
-                           (rt->rt6i_dev == NULL ||
+                           (!rt->rt6i_dev ||
                             rt->rt6i_dev->ifindex != cfg->fc_ifindex))
                                continue;
                        if (cfg->fc_flags & RTF_GATEWAY &&
@@ -1573,7 +1590,7 @@ static struct rt6_info *ip6_route_redirect(const struct in6_addr *dest,
                },
        };
 
-       ipv6_addr_copy(&rdfl.gateway, gateway);
+       rdfl.gateway = *gateway;
 
        if (rt6_need_strict(dest))
                flags |= RT6_LOOKUP_F_IFACE;
@@ -1618,18 +1635,18 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
        dst_confirm(&rt->dst);
 
        /* Duplicate redirect: silently ignore. */
-       if (neigh == dst_get_neighbour_raw(&rt->dst))
+       if (neigh == dst_get_neighbour_noref_raw(&rt->dst))
                goto out;
 
        nrt = ip6_rt_copy(rt, dest);
-       if (nrt == NULL)
+       if (!nrt)
                goto out;
 
        nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
        if (on_link)
                nrt->rt6i_flags &= ~RTF_GATEWAY;
 
-       ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key);
+       nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
        dst_set_neighbour(&nrt->dst, neigh_clone(neigh));
 
        if (ip6_ins_rt(nrt))
@@ -1639,7 +1656,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
        netevent.new = &nrt->dst;
        call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
 
-       if (rt->rt6i_flags&RTF_CACHE) {
+       if (rt->rt6i_flags & RTF_CACHE) {
                ip6_del_rt(rt);
                return;
        }
@@ -1660,7 +1677,7 @@ static void rt6_do_pmtu_disc(const struct in6_addr *daddr, const struct in6_addr
        int allfrag = 0;
 again:
        rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
-       if (rt == NULL)
+       if (!rt)
                return;
 
        if (rt6_check_expired(rt)) {
@@ -1710,7 +1727,7 @@ again:
           1. It is connected route. Action: COW
           2. It is gatewayed route or NONEXTHOP route. Action: clone it.
         */
-       if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
+       if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
                nrt = rt6_alloc_cow(rt, daddr, saddr);
        else
                nrt = rt6_alloc_clone(rt, daddr);
@@ -1775,7 +1792,7 @@ static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort,
                rt->dst.output = ort->dst.output;
                rt->dst.flags |= DST_HOST;
 
-               ipv6_addr_copy(&rt->rt6i_dst.addr, dest);
+               rt->rt6i_dst.addr = *dest;
                rt->rt6i_dst.plen = 128;
                dst_copy_metrics(&rt->dst, &ort->dst);
                rt->dst.error = ort->dst.error;
@@ -1785,7 +1802,7 @@ static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort,
                rt->dst.lastuse = jiffies;
                rt->rt6i_expires = 0;
 
-               ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway);
+               rt->rt6i_gateway = ort->rt6i_gateway;
                rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES;
                rt->rt6i_metric = 0;
 
@@ -1808,7 +1825,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net,
        struct fib6_table *table;
 
        table = fib6_get_table(net, RT6_TABLE_INFO);
-       if (table == NULL)
+       if (!table)
                return NULL;
 
        write_lock_bh(&table->tb6_lock);
@@ -1848,8 +1865,8 @@ static struct rt6_info *rt6_add_route_info(struct net *net,
                .fc_nlinfo.nl_net = net,
        };
 
-       ipv6_addr_copy(&cfg.fc_dst, prefix);
-       ipv6_addr_copy(&cfg.fc_gateway, gwaddr);
+       cfg.fc_dst = *prefix;
+       cfg.fc_gateway = *gwaddr;
 
        /* We should treat it as a default route if prefix length is 0. */
        if (!prefixlen)
@@ -1867,7 +1884,7 @@ struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_dev
        struct fib6_table *table;
 
        table = fib6_get_table(dev_net(dev), RT6_TABLE_DFLT);
-       if (table == NULL)
+       if (!table)
                return NULL;
 
        write_lock_bh(&table->tb6_lock);
@@ -1898,7 +1915,7 @@ struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
                .fc_nlinfo.nl_net = dev_net(dev),
        };
 
-       ipv6_addr_copy(&cfg.fc_gateway, gwaddr);
+       cfg.fc_gateway = *gwaddr;
 
        ip6_route_add(&cfg);
 
@@ -1912,7 +1929,7 @@ void rt6_purge_dflt_routers(struct net *net)
 
        /* NOTE: Keep consistent with rt6_get_dflt_router */
        table = fib6_get_table(net, RT6_TABLE_DFLT);
-       if (table == NULL)
+       if (!table)
                return;
 
 restart:
@@ -1944,9 +1961,9 @@ static void rtmsg_to_fib6_config(struct net *net,
 
        cfg->fc_nlinfo.nl_net = net;
 
-       ipv6_addr_copy(&cfg->fc_dst, &rtmsg->rtmsg_dst);
-       ipv6_addr_copy(&cfg->fc_src, &rtmsg->rtmsg_src);
-       ipv6_addr_copy(&cfg->fc_gateway, &rtmsg->rtmsg_gateway);
+       cfg->fc_dst = rtmsg->rtmsg_dst;
+       cfg->fc_src = rtmsg->rtmsg_src;
+       cfg->fc_gateway = rtmsg->rtmsg_gateway;
 }
 
 int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg)
@@ -2045,14 +2062,14 @@ static int ip6_pkt_prohibit_out(struct sk_buff *skb)
 
 struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
                                    const struct in6_addr *addr,
-                                   int anycast)
+                                   bool anycast)
 {
        struct net *net = dev_net(idev->dev);
        struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
                                            net->loopback_dev, 0);
        struct neighbour *neigh;
 
-       if (rt == NULL) {
+       if (!rt) {
                if (net_ratelimit())
                        pr_warning("IPv6:  Maximum number of routes reached,"
                                   " consider increasing route/max_size.\n");
@@ -2072,7 +2089,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
                rt->rt6i_flags |= RTF_ANYCAST;
        else
                rt->rt6i_flags |= RTF_LOCAL;
-       neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway);
+       neigh = __neigh_lookup_errno(&nd_tbl, &rt->rt6i_gateway, rt->rt6i_dev);
        if (IS_ERR(neigh)) {
                dst_free(&rt->dst);
 
@@ -2080,7 +2097,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
        }
        dst_set_neighbour(&rt->dst, neigh);
 
-       ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
+       rt->rt6i_dst.addr = *addr;
        rt->rt6i_dst.plen = 128;
        rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL);
 
@@ -2098,7 +2115,7 @@ int ip6_route_get_saddr(struct net *net,
        struct inet6_dev *idev = ip6_dst_idev((struct dst_entry*)rt);
        int err = 0;
        if (rt->rt6i_prefsrc.plen)
-               ipv6_addr_copy(saddr, &rt->rt6i_prefsrc.addr);
+               *saddr = rt->rt6i_prefsrc.addr;
        else
                err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
                                         daddr, prefs, saddr);
@@ -2118,7 +2135,7 @@ static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg)
        struct net *net = ((struct arg_dev_net_ip *)arg)->net;
        struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
 
-       if (((void *)rt->rt6i_dev == dev || dev == NULL) &&
+       if (((void *)rt->rt6i_dev == dev || !dev) &&
            rt != net->ipv6.ip6_null_entry &&
            ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
                /* remove prefsrc entry */
@@ -2148,7 +2165,7 @@ static int fib6_ifdown(struct rt6_info *rt, void *arg)
        const struct arg_dev_net *adn = arg;
        const struct net_device *dev = adn->dev;
 
-       if ((rt->rt6i_dev == dev || dev == NULL) &&
+       if ((rt->rt6i_dev == dev || !dev) &&
            rt != adn->net->ipv6.ip6_null_entry) {
                RT6_TRACE("deleted by ifdown %p\n", rt);
                return -1;
@@ -2185,7 +2202,7 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
        */
 
        idev = __in6_dev_get(arg->dev);
-       if (idev == NULL)
+       if (!idev)
                return 0;
 
        /* For administrative MTU increase, there is no way to discover
@@ -2365,7 +2382,7 @@ static int rt6_fill_node(struct net *net,
        }
 
        nlh = nlmsg_put(skb, pid, seq, type, sizeof(*rtm), flags);
-       if (nlh == NULL)
+       if (!nlh)
                return -EMSGSIZE;
 
        rtm = nlmsg_data(nlh);
@@ -2379,25 +2396,25 @@ static int rt6_fill_node(struct net *net,
                table = RT6_TABLE_UNSPEC;
        rtm->rtm_table = table;
        NLA_PUT_U32(skb, RTA_TABLE, table);
-       if (rt->rt6i_flags&RTF_REJECT)
+       if (rt->rt6i_flags & RTF_REJECT)
                rtm->rtm_type = RTN_UNREACHABLE;
-       else if (rt->rt6i_flags&RTF_LOCAL)
+       else if (rt->rt6i_flags & RTF_LOCAL)
                rtm->rtm_type = RTN_LOCAL;
-       else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK))
+       else if (rt->rt6i_dev && (rt->rt6i_dev->flags & IFF_LOOPBACK))
                rtm->rtm_type = RTN_LOCAL;
        else
                rtm->rtm_type = RTN_UNICAST;
        rtm->rtm_flags = 0;
        rtm->rtm_scope = RT_SCOPE_UNIVERSE;
        rtm->rtm_protocol = rt->rt6i_protocol;
-       if (rt->rt6i_flags&RTF_DYNAMIC)
+       if (rt->rt6i_flags & RTF_DYNAMIC)
                rtm->rtm_protocol = RTPROT_REDIRECT;
        else if (rt->rt6i_flags & RTF_ADDRCONF)
                rtm->rtm_protocol = RTPROT_KERNEL;
-       else if (rt->rt6i_flags&RTF_DEFAULT)
+       else if (rt->rt6i_flags & RTF_DEFAULT)
                rtm->rtm_protocol = RTPROT_RA;
 
-       if (rt->rt6i_flags&RTF_CACHE)
+       if (rt->rt6i_flags & RTF_CACHE)
                rtm->rtm_flags |= RTM_F_CLONED;
 
        if (dst) {
@@ -2437,7 +2454,7 @@ static int rt6_fill_node(struct net *net,
 
        if (rt->rt6i_prefsrc.plen) {
                struct in6_addr saddr_buf;
-               ipv6_addr_copy(&saddr_buf, &rt->rt6i_prefsrc.addr);
+               saddr_buf = rt->rt6i_prefsrc.addr;
                NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf);
        }
 
@@ -2445,7 +2462,7 @@ static int rt6_fill_node(struct net *net,
                goto nla_put_failure;
 
        rcu_read_lock();
-       n = dst_get_neighbour(&rt->dst);
+       n = dst_get_neighbour_noref(&rt->dst);
        if (n)
                NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key);
        rcu_read_unlock();
@@ -2511,14 +2528,14 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
                if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
                        goto errout;
 
-               ipv6_addr_copy(&fl6.saddr, nla_data(tb[RTA_SRC]));
+               fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
        }
 
        if (tb[RTA_DST]) {
                if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
                        goto errout;
 
-               ipv6_addr_copy(&fl6.daddr, nla_data(tb[RTA_DST]));
+               fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
        }
 
        if (tb[RTA_IIF])
@@ -2537,7 +2554,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void
        }
 
        skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
-       if (skb == NULL) {
+       if (!skb) {
                err = -ENOBUFS;
                goto errout;
        }
@@ -2572,10 +2589,10 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info)
        int err;
 
        err = -ENOBUFS;
-       seq = info->nlh != NULL ? info->nlh->nlmsg_seq : 0;
+       seq = info->nlh ? info->nlh->nlmsg_seq : 0;
 
        skb = nlmsg_new(rt6_nlmsg_size(), gfp_any());
-       if (skb == NULL)
+       if (!skb)
                goto errout;
 
        err = rt6_fill_node(net, skb, rt, NULL, NULL, 0,
@@ -2642,7 +2659,7 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
        seq_puts(m, "00000000000000000000000000000000 00 ");
 #endif
        rcu_read_lock();
-       n = dst_get_neighbour(&rt->dst);
+       n = dst_get_neighbour_noref(&rt->dst);
        if (n) {
                seq_printf(m, "%pi6", n->primary_key);
        } else {
This page took 0.047508 seconds and 5 git commands to generate.