Re: rdomain IPv6 local addresses

2014-12-03 Thread Alexander Bluhm
On Wed, Nov 26, 2014 at 03:09:08PM +0100, Martin Pieuchot wrote:
 While debugging the recent route change regression I found various
 bugs in the code handling IPv6 addresses.  The most ugly one, because
 it leaves you with a null ifp pointer in your routing table, is fixed
 by the diff below.
 
 Basically if you try to remove an address from an interface, by deleting
 it for example, in one rdomain and you have the same address in another
 rdomain you wont remove the route.
 
 You can run rttest14 and rttest16 in regress/sbin/route to see what
 happens.
 
 Ok?

OK bluhm@

 
 
 Index: netinet6/in6.c
 ===
 RCS file: /home/ncvs/src/sys/netinet6/in6.c,v
 retrieving revision 1.146
 diff -u -p -r1.146 in6.c
 --- netinet6/in6.c24 Nov 2014 12:43:54 -  1.146
 +++ netinet6/in6.c26 Nov 2014 14:04:54 -
 @@ -1053,6 +1053,9 @@ in6_purgeaddr(struct ifaddr *ifa)
* XXX: we should avoid such a configuration in IPv6...
*/
   TAILQ_FOREACH(tmp, in6_ifaddr, ia_list) {
 + if (tmp-ia_ifp-if_rdomain != ifp-if_rdomain)
 + continue;
 +
   if (IN6_ARE_ADDR_EQUAL(tmp-ia_addr.sin6_addr,
   ia6-ia_addr.sin6_addr)) {
   ia6_count++;



rdomain IPv6 local addresses

2014-11-26 Thread Martin Pieuchot
While debugging the recent route change regression I found various
bugs in the code handling IPv6 addresses.  The most ugly one, because
it leaves you with a null ifp pointer in your routing table, is fixed
by the diff below.

Basically if you try to remove an address from an interface, by deleting
it for example, in one rdomain and you have the same address in another
rdomain you wont remove the route.

You can run rttest14 and rttest16 in regress/sbin/route to see what
happens.

Ok?


Index: netinet6/in6.c
===
RCS file: /home/ncvs/src/sys/netinet6/in6.c,v
retrieving revision 1.146
diff -u -p -r1.146 in6.c
--- netinet6/in6.c  24 Nov 2014 12:43:54 -  1.146
+++ netinet6/in6.c  26 Nov 2014 14:04:54 -
@@ -1053,6 +1053,9 @@ in6_purgeaddr(struct ifaddr *ifa)
 * XXX: we should avoid such a configuration in IPv6...
 */
TAILQ_FOREACH(tmp, in6_ifaddr, ia_list) {
+   if (tmp-ia_ifp-if_rdomain != ifp-if_rdomain)
+   continue;
+
if (IN6_ARE_ADDR_EQUAL(tmp-ia_addr.sin6_addr,
ia6-ia_addr.sin6_addr)) {
ia6_count++;