From owner-freebsd-bugs@FreeBSD.ORG Thu Jul 27 16:50:15 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 434E716A4DF for ; Thu, 27 Jul 2006 16:50:15 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id C29A843D7B for ; Thu, 27 Jul 2006 16:50:14 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k6RGoEQQ055055 for ; Thu, 27 Jul 2006 16:50:14 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k6RGoEWI055054; Thu, 27 Jul 2006 16:50:14 GMT (envelope-from gnats) Date: Thu, 27 Jul 2006 16:50:14 GMT Message-Id: <200607271650.k6RGoEWI055054@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Hajimu UMEMOTO Cc: Subject: Re: kern/98622: [carp] carp with IPv6 broken on 6.1 (regression) X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Hajimu UMEMOTO List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Jul 2006 16:50:15 -0000 The following reply was made to PR kern/98622; it has been noted by GNATS. From: Hajimu UMEMOTO To: Gavin Atkinson Cc: bug-followup@FreeBSD.org, Philippe.Pegon@crc.u-strasbg.fr, ume@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 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@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@mahoroba.org ume@{,jp.}FreeBSD.org http://www.imasy.org/~ume/