|
@@ -211,7 +211,8 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = {
|
|
|
.accept_ra_mtu = 1,
|
|
|
.stable_secret = {
|
|
|
.initialized = false,
|
|
|
- }
|
|
|
+ },
|
|
|
+ .use_oif_addrs_only = 0,
|
|
|
};
|
|
|
|
|
|
static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
|
|
@@ -253,6 +254,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
|
|
|
.stable_secret = {
|
|
|
.initialized = false,
|
|
|
},
|
|
|
+ .use_oif_addrs_only = 0,
|
|
|
};
|
|
|
|
|
|
/* Check if a valid qdisc is available */
|
|
@@ -1472,11 +1474,16 @@ int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
|
|
|
* include addresses assigned to interfaces
|
|
|
* belonging to the same site as the outgoing
|
|
|
* interface.)
|
|
|
+ * - "It is RECOMMENDED that the candidate source addresses
|
|
|
+ * be the set of unicast addresses assigned to the
|
|
|
+ * interface that will be used to send to the destination
|
|
|
+ * (the 'outgoing' interface)." (RFC 6724)
|
|
|
*/
|
|
|
if (dst_dev) {
|
|
|
+ idev = __in6_dev_get(dst_dev);
|
|
|
if ((dst_type & IPV6_ADDR_MULTICAST) ||
|
|
|
- dst.scope <= IPV6_ADDR_SCOPE_LINKLOCAL) {
|
|
|
- idev = __in6_dev_get(dst_dev);
|
|
|
+ dst.scope <= IPV6_ADDR_SCOPE_LINKLOCAL ||
|
|
|
+ (idev && idev->cnf.use_oif_addrs_only)) {
|
|
|
use_oif_addr = true;
|
|
|
}
|
|
|
}
|
|
@@ -4607,6 +4614,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf,
|
|
|
array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local;
|
|
|
array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu;
|
|
|
/* we omit DEVCONF_STABLE_SECRET for now */
|
|
|
+ array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only;
|
|
|
}
|
|
|
|
|
|
static inline size_t inet6_ifla6_size(void)
|
|
@@ -5605,6 +5613,14 @@ static struct addrconf_sysctl_table
|
|
|
.mode = 0600,
|
|
|
.proc_handler = addrconf_sysctl_stable_secret,
|
|
|
},
|
|
|
+ {
|
|
|
+ .procname = "use_oif_addrs_only",
|
|
|
+ .data = &ipv6_devconf.use_oif_addrs_only,
|
|
|
+ .maxlen = sizeof(int),
|
|
|
+ .mode = 0644,
|
|
|
+ .proc_handler = proc_dointvec,
|
|
|
+
|
|
|
+ },
|
|
|
{
|
|
|
/* sentinel */
|
|
|
}
|