The split into ipv6_get_saddr() and ipv6_dev_get_saddr() isn't necessary
anymore, so they can be merged into just the function ipv6_get_saddr().

Signed-off-by: Ville Nuorvala <[EMAIL PROTECTED]>
---
 include/net/addrconf.h |    5 +----
 net/ipv6/addrconf.c    |   21 ++++++---------------
 net/ipv6/ndisc.c       |    2 +-
 net/ipv6/route.c       |    5 +++--
 4 files changed, 11 insertions(+), 22 deletions(-)

diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 44f1b67..d075693 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -67,10 +67,7 @@ #endif
 extern struct inet6_ifaddr *   ipv6_get_ifaddr(struct in6_addr *addr,
                                                struct net_device *dev,
                                                int strict);
-extern int                     ipv6_get_saddr(struct dst_entry *dst,
-                                              struct in6_addr *daddr,
-                                              struct in6_addr *saddr);
-extern int                     ipv6_dev_get_saddr(struct net_device *dev,
+extern int                     ipv6_get_saddr(int pref_if,
                                               struct in6_addr *daddr,
                                               struct in6_addr *saddr);
 extern int                     ipv6_get_lladdr(struct net_device *dev, struct 
in6_addr *);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index c186763..09a22c8 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -904,8 +904,7 @@ static int inline ipv6_saddr_label(const
        return 1;
 }

-int ipv6_dev_get_saddr(struct net_device *daddr_dev,
-                      struct in6_addr *daddr, struct in6_addr *saddr)
+int ipv6_get_saddr(int pref_if, struct in6_addr *daddr, struct in6_addr *saddr)
 {
        struct ipv6_saddr_score hiscore;
        struct inet6_ifaddr *ifa_result = NULL;
@@ -937,7 +936,7 @@ int ipv6_dev_get_saddr(struct net_device
                 */
                if ((daddr_type & IPV6_ADDR_MULTICAST ||
                     daddr_scope <= IPV6_ADDR_SCOPE_LINKLOCAL) &&
-                   daddr_dev && dev != daddr_dev)
+                   pref_if && dev->ifindex != pref_if)
                        continue;

                idev = __in6_dev_get(dev);
@@ -1062,13 +1061,13 @@ #endif

                        /* Rule 5: Prefer outgoing interface */
                        if (hiscore.rule < 5) {
-                               if (daddr_dev == NULL ||
-                                   daddr_dev == ifa_result->idev->dev)
+                               if (!pref_if ||
+                                   pref_if == ifa_result->idev->dev->ifindex)
                                        hiscore.attrs |= IPV6_SADDR_SCORE_OIF;
                                hiscore.rule++;
                        }
-                       if (daddr_dev == NULL ||
-                           daddr_dev == ifa->idev->dev) {
+                       if (!pref_if ||
+                           pref_if == ifa->idev->dev->ifindex) {
                                score.attrs |= IPV6_SADDR_SCORE_OIF;
                                if (!(hiscore.attrs & IPV6_SADDR_SCORE_OIF)) {
                                        score.rule = 5;
@@ -1158,14 +1157,6 @@ record_it:
        return 0;
 }

-
-int ipv6_get_saddr(struct dst_entry *dst,
-                  struct in6_addr *daddr, struct in6_addr *saddr)
-{
-       return ipv6_dev_get_saddr(dst ? ((struct rt6_info 
*)dst)->rt6i_idev->dev : NULL, daddr, saddr);
-}
-
-
 int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr)
 {
        struct inet6_dev *idev;
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 0304b5f..3ac4e12 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -449,7 +449,7 @@ static void ndisc_send_na(struct net_dev
                src_addr = solicited_addr;
                in6_ifa_put(ifp);
        } else {
-               if (ipv6_dev_get_saddr(dev, daddr, &tmpaddr))
+               if (ipv6_get_saddr(dev->ifindex, daddr, &tmpaddr))
                        return;
                src_addr = &tmpaddr;
        }
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index b7b8148..7cd7747 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -748,8 +748,9 @@ restart:
        read_unlock_bh(&table->tb6_lock);

        if (!has_saddr) {
+               int oif = rt->rt6i_dev->ifindex;
                /* policy rule doesn't restrict source address */
-               if (ipv6_get_saddr(&rt->u.dst, &fl->fl6_dst, &saddr))
+               if (ipv6_get_saddr(oif, &fl->fl6_dst, &saddr))
                        goto no_saddr;
                has_saddr = RT6_LOOKUP_F_HAS_SADDR;
                ipv6_addr_copy(&fl->fl6_src, &saddr);
@@ -2051,7 +2052,7 @@ #endif
                NLA_PUT_U32(skb, RTA_IIF, iif);
        else if (dst) {
                struct in6_addr saddr_buf;
-               if (!ipv6_get_saddr(&rt->u.dst, dst, &saddr_buf))
+               if (!ipv6_get_saddr(rt->rt6i_dev->ifindex, dst, &saddr_buf))
                        NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf);
        }

-- 
1.4.2.3

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to