ipv6 netns: Address labels per namespace
This pacth makes IPv6 address labels per network namespace. It keeps the global label tables, ip6addrlbl_table, but adds a 'net' member to each ip6addrlbl_entry. This new member is taken into account when matching labels. Changelog ========= * v1: Initial version * v2: * Minize the penalty when network namespaces are not configured: * the 'net' member is added only if CONFIG_NET_NS is defined. This saves space when network namespaces are not configured. * 'net' value is retrieved with the inlined function ip6addrlbl_net() that always return &init_net when CONFIG_NET_NS is not defined. * 'net' member in ip6addrlbl_entry renamed to the less generic 'lbl_net' name (helps code search). Signed-off-by: Benjamin Thery <benjamin.thery@bull.net> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
This commit is contained in:
committed by
YOSHIFUJI Hideaki
parent
2b5ead4644
commit
3de232554a
@ -964,7 +964,8 @@ static inline int ipv6_saddr_preferred(int type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ipv6_get_saddr_eval(struct ipv6_saddr_score *score,
|
||||
static int ipv6_get_saddr_eval(struct net *net,
|
||||
struct ipv6_saddr_score *score,
|
||||
struct ipv6_saddr_dst *dst,
|
||||
int i)
|
||||
{
|
||||
@ -1043,7 +1044,8 @@ static int ipv6_get_saddr_eval(struct ipv6_saddr_score *score,
|
||||
break;
|
||||
case IPV6_SADDR_RULE_LABEL:
|
||||
/* Rule 6: Prefer matching label */
|
||||
ret = ipv6_addr_label(&score->ifa->addr, score->addr_type,
|
||||
ret = ipv6_addr_label(net,
|
||||
&score->ifa->addr, score->addr_type,
|
||||
score->ifa->idev->dev->ifindex) == dst->label;
|
||||
break;
|
||||
#ifdef CONFIG_IPV6_PRIVACY
|
||||
@ -1097,7 +1099,7 @@ int ipv6_dev_get_saddr(struct net_device *dst_dev,
|
||||
dst.addr = daddr;
|
||||
dst.ifindex = dst_dev ? dst_dev->ifindex : 0;
|
||||
dst.scope = __ipv6_addr_src_scope(dst_type);
|
||||
dst.label = ipv6_addr_label(daddr, dst_type, dst.ifindex);
|
||||
dst.label = ipv6_addr_label(net, daddr, dst_type, dst.ifindex);
|
||||
dst.prefs = prefs;
|
||||
|
||||
hiscore->rule = -1;
|
||||
@ -1165,8 +1167,8 @@ int ipv6_dev_get_saddr(struct net_device *dst_dev,
|
||||
for (i = 0; i < IPV6_SADDR_RULE_MAX; i++) {
|
||||
int minihiscore, miniscore;
|
||||
|
||||
minihiscore = ipv6_get_saddr_eval(hiscore, &dst, i);
|
||||
miniscore = ipv6_get_saddr_eval(score, &dst, i);
|
||||
minihiscore = ipv6_get_saddr_eval(net, hiscore, &dst, i);
|
||||
miniscore = ipv6_get_saddr_eval(net, score, &dst, i);
|
||||
|
||||
if (minihiscore > miniscore) {
|
||||
if (i == IPV6_SADDR_RULE_SCOPE &&
|
||||
|
Reference in New Issue
Block a user