|
@@ -18,6 +18,7 @@ struct route_info {
|
|
__u8 prefix[0]; /* 0,8 or 16 */
|
|
__u8 prefix[0]; /* 0,8 or 16 */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#include <net/addrconf.h>
|
|
#include <net/flow.h>
|
|
#include <net/flow.h>
|
|
#include <net/ip6_fib.h>
|
|
#include <net/ip6_fib.h>
|
|
#include <net/sock.h>
|
|
#include <net/sock.h>
|
|
@@ -88,9 +89,23 @@ int ip6_route_add(struct fib6_config *cfg);
|
|
int ip6_ins_rt(struct rt6_info *);
|
|
int ip6_ins_rt(struct rt6_info *);
|
|
int ip6_del_rt(struct rt6_info *);
|
|
int ip6_del_rt(struct rt6_info *);
|
|
|
|
|
|
-int ip6_route_get_saddr(struct net *net, struct rt6_info *rt,
|
|
|
|
- const struct in6_addr *daddr, unsigned int prefs,
|
|
|
|
- struct in6_addr *saddr);
|
|
|
|
|
|
+static inline int ip6_route_get_saddr(struct net *net, struct rt6_info *rt,
|
|
|
|
+ const struct in6_addr *daddr,
|
|
|
|
+ unsigned int prefs,
|
|
|
|
+ struct in6_addr *saddr)
|
|
|
|
+{
|
|
|
|
+ struct inet6_dev *idev =
|
|
|
|
+ rt ? ip6_dst_idev((struct dst_entry *)rt) : NULL;
|
|
|
|
+ int err = 0;
|
|
|
|
+
|
|
|
|
+ if (rt && rt->rt6i_prefsrc.plen)
|
|
|
|
+ *saddr = rt->rt6i_prefsrc.addr;
|
|
|
|
+ else
|
|
|
|
+ err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
|
|
|
|
+ daddr, prefs, saddr);
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
|
|
struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
|
|
struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
|
|
const struct in6_addr *saddr, int oif, int flags);
|
|
const struct in6_addr *saddr, int oif, int flags);
|