]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv6/anycast.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arjan/linux...
[linux-2.6-omap-h63xx.git] / net / ipv6 / anycast.c
index 463bd95d6b13598e8d77b2a1227681549e7ac4ff..8336cd81cb4ffbef03708de15f2faad55a5f936d 100644 (file)
@@ -48,29 +48,6 @@ static int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr);
 /* Big ac list lock for all the sockets */
 static DEFINE_RWLOCK(ipv6_sk_ac_lock);
 
-static int
-ip6_onlink(struct in6_addr *addr, struct net_device *dev)
-{
-       struct inet6_dev        *idev;
-       struct inet6_ifaddr     *ifa;
-       int     onlink;
-
-       onlink = 0;
-       rcu_read_lock();
-       idev = __in6_dev_get(dev);
-       if (idev) {
-               read_lock_bh(&idev->lock);
-               for (ifa=idev->addr_list; ifa; ifa=ifa->if_next) {
-                       onlink = ipv6_prefix_equal(addr, &ifa->addr,
-                                                  ifa->prefix_len);
-                       if (onlink)
-                               break;
-               }
-               read_unlock_bh(&idev->lock);
-       }
-       rcu_read_unlock();
-       return onlink;
-}
 
 /*
  *     socket join an anycast group
@@ -83,7 +60,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, struct in6_addr *addr)
        struct inet6_dev *idev;
        struct ipv6_ac_socklist *pac;
        struct net *net = sock_net(sk);
-       int     ishost = !ipv6_devconf.forwarding;
+       int     ishost = !net->ipv6.devconf_all->forwarding;
        int     err = 0;
 
        if (!capable(CAP_NET_ADMIN))
@@ -142,7 +119,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, struct in6_addr *addr)
         * This obviates the need for propagating anycast routes while
         * still allowing some non-router anycast participation.
         */
-       if (!ip6_onlink(addr, dev)) {
+       if (!ipv6_chk_prefix(addr, dev)) {
                if (ishost)
                        err = -EADDRNOTAVAIL;
                if (err)
@@ -337,9 +314,7 @@ int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr)
        idev->ac_list = aca;
        write_unlock_bh(&idev->lock);
 
-       dst_hold(&rt->u.dst);
-       if (ip6_ins_rt(rt))
-               dst_release(&rt->u.dst);
+       ip6_ins_rt(rt);
 
        addrconf_join_solict(dev, &aca->aca_addr);
 
@@ -381,10 +356,7 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr)
        addrconf_leave_solict(idev, &aca->aca_addr);
 
        dst_hold(&aca->aca_rt->u.dst);
-       if (ip6_del_rt(aca->aca_rt))
-               dst_free(&aca->aca_rt->u.dst);
-       else
-               dst_release(&aca->aca_rt->u.dst);
+       ip6_del_rt(aca->aca_rt);
 
        aca_put(aca);
        return 0;