kern/98622: [carp] carp with IPv6 broken on 6.1 (regression)

Hajimu UMEMOTO ume at FreeBSD.org
Thu Jul 27 16:50:15 UTC 2006


The following reply was made to PR kern/98622; it has been noted by GNATS.

From: Hajimu UMEMOTO <ume at FreeBSD.org>
To: Gavin Atkinson <gavin.atkinson at ury.york.ac.uk>
Cc: bug-followup at FreeBSD.org, Philippe.Pegon at crc.u-strasbg.fr, ume at FreeBSD.org
Subject: Re: kern/98622: [carp] carp with IPv6 broken on 6.1 (regression)
Date: Fri, 28 Jul 2006 01:46:04 +0900

 Hi,
 
 >>>>> On Thu, 27 Jul 2006 17:03:40 +0100 (BST)
 >>>>> Gavin Atkinson <gavin.atkinson at ury.york.ac.uk> said:
 
 
 gavin.atkinson> I can confirm this worked in 6.0-R and is broken in 6.1-R, and I can 
 gavin.atkinson> confirm it was the commit by ume at freebsd.org mentioned in the past log
 gavin.atkinson> entries of this PR that broke it:
 gavin.atkinson> http://docs.FreeBSD.org/cgi/mid.cgi?200511042026.jA4KQGX9038319
 
 ipcarp.c:1.27.2.3 changed to just use the scope API rather than hard
 coded scope things, and itself seems correct.  However, it might
 change some semantics.
 I don't have an environment for testing CARP.  Please backout 1.27.2.3
 by applying the following patch, and let me the result.
 
 Index: sys/netinet/ip_carp.c
 diff -u -p sys/netinet/ip_carp.c.orig sys/netinet/ip_carp.c
 --- sys/netinet/ip_carp.c.orig	Mon Dec 26 06:59:20 2005
 +++ sys/netinet/ip_carp.c	Mon Jul 10 16:50:22 2006
 @@ -269,7 +269,8 @@ carp_hmac_prepare(struct carp_softc *sc)
  	TAILQ_FOREACH(ifa, &SC2IFP(sc)->if_addrlist, ifa_list) {
  		if (ifa->ifa_addr->sa_family == AF_INET6) {
  			in6 = ifatoia6(ifa)->ia_addr.sin6_addr;
 -			in6_clearscope(&in6);
 +			if (IN6_IS_ADDR_LINKLOCAL(&in6))
 +				in6.s6_addr16[1] = 0;
  			SHA1Update(&sc->sc_sha1, (void *)&in6, sizeof(in6));
  		}
  	}
 @@ -1543,7 +1544,7 @@ carp_set_addr6(struct carp_softc *sc, st
  	struct in6_ifaddr *ia, *ia_if;
  	struct ip6_moptions *im6o = &sc->sc_im6o;
  	struct in6_multi_mship *imm;
 -	struct in6_addr in6;
 +	struct sockaddr_in6 addr;
  	int own, error;
  
  	if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
 @@ -1592,25 +1593,25 @@ carp_set_addr6(struct carp_softc *sc, st
  		im6o->im6o_multicast_ifp = ifp;
  
  		/* join CARP multicast address */
 -		bzero(&in6, sizeof(in6));
 -		in6.s6_addr16[0] = htons(0xff02);
 -		in6.s6_addr8[15] = 0x12;
 -		if (in6_setscope(&in6, ifp, NULL) != 0)
 -			goto cleanup;
 -		if ((imm = in6_joingroup(ifp, &in6, &error, 0)) == NULL)
 +		bzero(&addr, sizeof(addr));
 +		addr.sin6_family = AF_INET6;
 +		addr.sin6_len = sizeof(addr);
 +		addr.sin6_addr.s6_addr16[0] = htons(0xff02);
 +		addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
 +		addr.sin6_addr.s6_addr8[15] = 0x12;
 +		if ((imm = in6_joingroup(ifp, &addr.sin6_addr, &error, 0)) == NULL)
  			goto cleanup;
  		LIST_INSERT_HEAD(&im6o->im6o_memberships, imm, i6mm_chain);
  
  		/* join solicited multicast address */
 -		bzero(&in6, sizeof(in6));
 -		in6.s6_addr16[0] = htons(0xff02);
 -		in6.s6_addr32[1] = 0;
 -		in6.s6_addr32[2] = htonl(1);
 -		in6.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
 -		in6.s6_addr8[12] = 0xff;
 -		if (in6_setscope(&in6, ifp, NULL) != 0)
 -			goto cleanup;
 -		if ((imm = in6_joingroup(ifp, &in6, &error, 0)) == NULL)
 +		bzero(&addr.sin6_addr, sizeof(addr.sin6_addr));
 +		addr.sin6_addr.s6_addr16[0] = htons(0xff02);
 +		addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
 +		addr.sin6_addr.s6_addr32[1] = 0;
 +		addr.sin6_addr.s6_addr32[2] = htonl(1);
 +		addr.sin6_addr.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
 +		addr.sin6_addr.s6_addr8[12] = 0xff;
 +		if ((imm = in6_joingroup(ifp, &addr.sin6_addr, &error, 0)) == NULL)
  			goto cleanup;
  		LIST_INSERT_HEAD(&im6o->im6o_memberships, imm, i6mm_chain);
  	}
 
 Sincerely,
 
 --
 Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
 ume at mahoroba.org  ume@{,jp.}FreeBSD.org
 http://www.imasy.org/~ume/


More information about the freebsd-bugs mailing list