Fixes a bug in primary IP selection.

This commit is contained in:
Ondrej Zajicek 2012-08-29 12:42:49 +02:00
parent 8ecbaf9c70
commit 0343d066da

View file

@ -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;
} }