Fixes a bug in primary IP selection.
This commit is contained in:
parent
8ecbaf9c70
commit
0343d066da
1 changed files with 12 additions and 6 deletions
|
@ -113,13 +113,19 @@ kif_request_scan(void)
|
||||||
tm_start(kif_scan_timer, 1);
|
tm_start(kif_scan_timer, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
|
||||||
prefer_scope(struct ifa *a, struct ifa *b)
|
|
||||||
{ return (a->scope > SCOPE_LINK) && (b->scope <= SCOPE_LINK); }
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
prefer_addr(struct ifa *a, struct ifa *b)
|
prefer_addr(struct ifa *a, struct ifa *b)
|
||||||
{ return ipa_compare(a->ip, b->ip) < 0; }
|
{
|
||||||
|
int sa = a->scope > SCOPE_LINK;
|
||||||
|
int sb = b->scope > SCOPE_LINK;
|
||||||
|
|
||||||
|
if (sa < sb)
|
||||||
|
return 0;
|
||||||
|
else if (sa > sb)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return ipa_compare(a->ip, b->ip) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct ifa *
|
static inline struct ifa *
|
||||||
find_preferred_ifa(struct iface *i, ip_addr prefix, ip_addr mask)
|
find_preferred_ifa(struct iface *i, ip_addr prefix, ip_addr mask)
|
||||||
|
@ -130,7 +136,7 @@ find_preferred_ifa(struct iface *i, ip_addr prefix, ip_addr mask)
|
||||||
{
|
{
|
||||||
if (!(a->flags & IA_SECONDARY) &&
|
if (!(a->flags & IA_SECONDARY) &&
|
||||||
ipa_equal(ipa_and(a->ip, mask), prefix) &&
|
ipa_equal(ipa_and(a->ip, mask), prefix) &&
|
||||||
(!b || prefer_scope(a, b) || prefer_addr(a, b)))
|
(!b || prefer_addr(a, b)))
|
||||||
b = a;
|
b = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue