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