From 20a32aca20c6ade055afc16c0ce46d4c0bf8185b Mon Sep 17 00:00:00 2001 From: Christian Wiese Date: Wed, 17 Oct 2012 11:24:58 +0200 Subject: [PATCH] bird: add upstream fixes for version 1.3.8 --- network/bird/bird-1.3.8-upstream-fixes.patch | 107 +++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 network/bird/bird-1.3.8-upstream-fixes.patch diff --git a/network/bird/bird-1.3.8-upstream-fixes.patch b/network/bird/bird-1.3.8-upstream-fixes.patch new file mode 100644 index 000000000..181c8e149 --- /dev/null +++ b/network/bird/bird-1.3.8-upstream-fixes.patch @@ -0,0 +1,107 @@ +# --- SDE-COPYRIGHT-NOTE-BEGIN --- +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# +# Filename: package/.../bird/bird-1.3.8-upstream-fixes.patch +# Copyright (C) 2012 The OpenSDE Project +# +# More information can be found in the files COPYING and README. +# +# This patch file is dual-licensed. It is available under the license the +# patched project is licensed under, as long as it is an OpenSource license +# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms +# of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# --- SDE-COPYRIGHT-NOTE-END --- + +commit 8ecbaf9c70b802a1200ad37f2bfd4bc64173c5fe +Author: Ondrej Zajicek +Date: Thu Aug 16 13:09:26 2012 +0200 + + Fixes a bug with neighbor cache and overlapping IP prefixes. + + When there are overlapping IP prefixes and one disappears, + neighbors associated with it was removed even if there + is another covering IP prefix. + +diff --git a/nest/neighbor.c b/nest/neighbor.c +index 506d9bd..9dce811 100644 +--- a/nest/neighbor.c ++++ b/nest/neighbor.c +@@ -114,7 +114,7 @@ neighbor * + neigh_find2(struct proto *p, ip_addr *a, struct iface *ifa, unsigned flags) + { + neighbor *n; +- int class, scope = -1; ; ++ int class, scope = -1; + unsigned int h = neigh_hash(p, a); + struct iface *i; + +@@ -240,7 +240,21 @@ neigh_down(neighbor *n) + n->proto->neigh_notify(n); + rem_node(&n->n); + if (n->flags & NEF_STICKY) +- add_tail(&sticky_neigh_list, &n->n); ++ { ++ add_tail(&sticky_neigh_list, &n->n); ++ ++ /* Respawn neighbor if there is another matching prefix */ ++ struct iface *i; ++ int scope; ++ ++ if (!n->iface) ++ WALK_LIST(i, iface_list) ++ if ((scope = if_connected(&n->addr, i)) >= 0) ++ { ++ neigh_up(n, i, scope); ++ return; ++ } ++ } + else + sl_free(neigh_slab, n); + } + + +commit 0343d066dab077d1391640c53198199b16bef993 +Author: Ondrej Zajicek +Date: Wed Aug 29 12:42:49 2012 +0200 + + Fixes a bug in primary IP selection. + +diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c +index 2bd1bc4..2128e13 100644 +--- a/sysdep/unix/krt.c ++++ b/sysdep/unix/krt.c +@@ -114,12 +114,18 @@ kif_request_scan(void) + } + + static inline int +-prefer_scope(struct ifa *a, struct ifa *b) +-{ return (a->scope > SCOPE_LINK) && (b->scope <= SCOPE_LINK); } +- +-static inline int + 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 * + 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) && + ipa_equal(ipa_and(a->ip, mask), prefix) && +- (!b || prefer_scope(a, b) || prefer_addr(a, b))) ++ (!b || prefer_addr(a, b))) + b = a; + } +