From owner-freebsd-stable@FreeBSD.ORG Fri Mar 11 05:38:40 2011 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 325E4106564A for ; Fri, 11 Mar 2011 05:38:40 +0000 (UTC) (envelope-from ume@mahoroba.org) Received: from mail.mahoroba.org (ent.mahoroba.org [IPv6:2001:2f0:104:8010::1]) by mx1.freebsd.org (Postfix) with ESMTP id B0CCF8FC08 for ; Fri, 11 Mar 2011 05:38:38 +0000 (UTC) Received: from ameno.mahoroba.org (IDENT:hIBoUY14ra6fG17fMTMriYz9pnmrKFaKzsZgfXZn/hEpjZGD1LvUe2zsueoOdBrL@ameno.mahoroba.org [IPv6:2001:2f0:104:8010:20a:79ff:fe69:ee6b]) (user=ume mech=DIGEST-MD5 bits=0) by mail.mahoroba.org (8.14.4/8.14.4) with ESMTP/inet6 id p2B5cVPQ068033 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 11 Mar 2011 14:38:31 +0900 (JST) (envelope-from ume@mahoroba.org) Date: Fri, 11 Mar 2011 14:38:31 +0900 Message-ID: From: Hajimu UMEMOTO To: Carl Johnson In-Reply-To: <87oc5i5j5n.fsf@oak.localnet> References: <87oc5i5j5n.fsf@oak.localnet> User-Agent: xcite1.60> Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?ISO-2022-JP-2?B?R29qGyQoRCtXGyhC?=) APEL/10.8 Emacs/23.2 (i386-portbld-freebsd8.1) MULE/6.0 (HANACHIRUSATO) X-Operating-System: FreeBSD 8.2-RELEASE X-PGP-Key: http://www.imasy.or.jp/~ume/publickey.asc X-PGP-Fingerprint: 1F00 0B9E 2164 70FC 6DC5 BF5F 04E9 F086 BF90 71FE Organization: Internet Mutual Aid Society, YOKOHAMA X-PGP-Key: http://www.imasy.or.jp/~ume/publickey.asc X-PGP-Fingerprint: 1F00 0B9E 2164 70FC 6DC5 BF5F 04E9 F086 BF90 71FE MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: multipart/mixed; boundary="Multipart_Fri_Mar_11_14:38:28_2011-1" X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (mail.mahoroba.org [IPv6:2001:2f0:104:8010::1]); Fri, 11 Mar 2011 14:38:31 +0900 (JST) X-Virus-Scanned: clamav-milter 0.97 at asuka.mahoroba.org X-Virus-Status: Clean X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on asuka.mahoroba.org Cc: freebsd-stable@freebsd.org Subject: Re: if_bridge and IPv6 X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Mar 2011 05:38:40 -0000 --Multipart_Fri_Mar_11_14:38:28_2011-1 Content-Type: text/plain; charset=US-ASCII Hi, >>>>> On Thu, 10 Mar 2011 21:19:00 -0800 >>>>> Carl Johnson said: carlj> You should be able to do something like the following: carlj> ifconfig bridge0 inet6 fe80:: eui64 add carlj> That assumes that it has a MAC address already assigned. I can't help carlj> if it doesn't have one yet. Unfortunately, eui64 option doesn't support link-local address. You need to specify link-local address, explicitly. Here is a patch to support it. Sincerely, --Multipart_Fri_Mar_11_14:38:28_2011-1 Content-Type: text/x-patch; type=patch; charset=US-ASCII Content-Disposition: attachment; filename="ifconfig-af_inet6.c-linklocal.diff" Content-Transfer-Encoding: 7bit Index: sbin/ifconfig/af_inet6.c diff -u -p sbin/ifconfig/af_inet6.c.orig sbin/ifconfig/af_inet6.c --- sbin/ifconfig/af_inet6.c.orig 2009-11-21 20:28:57.783110487 +0900 +++ sbin/ifconfig/af_inet6.c 2009-11-23 21:00:02.212252557 +0900 @@ -36,6 +36,9 @@ static const char rcsid[] = #include #include #include +#include +#include +#include #include #include @@ -130,6 +133,56 @@ setip6vltime(const char *seconds, int du setip6lifetime("vltime", seconds, s, afp); } +static struct sockaddr_dl * +getsdl(struct ifaddrs *ifap, char *ifname) +{ + struct ifaddrs *ifa; + struct sockaddr_dl *sdl = NULL; + + for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifname != NULL && strcmp(ifa->ifa_name, ifname) != 0) + continue; + if (ifa->ifa_addr == NULL) + continue; + if (ifa->ifa_addr->sa_family != AF_LINK) + continue; + sdl = (struct sockaddr_dl *)ifa->ifa_addr; + if (sdl == NULL) + continue; + if (sdl->sdl_type != IFT_ETHER || + sdl->sdl_alen != ETHER_ADDR_LEN) { + sdl = NULL; + continue; + } + break; + } + return (sdl); +} + +static void +link2eui64(struct ifaddrs *ifap, struct in6_addr *in6) +{ + struct sockaddr_dl *sdl; + char *cp; + + sdl = getsdl(ifap, name); + if (sdl == NULL) { + sdl = getsdl(ifap, NULL); + if (sdl == NULL) + errx(EXIT_FAILURE, "cannot find interface information"); + } + cp = (char *)(sdl->sdl_data + sdl->sdl_nlen); + in6->s6_addr[8] = cp[0]; + in6->s6_addr[8] ^= 0x02; /* reverse the u/l bit*/ + in6->s6_addr[9] = cp[1]; + in6->s6_addr[10] = cp[2]; + in6->s6_addr[11] = 0xff; + in6->s6_addr[12] = 0xfe; + in6->s6_addr[13] = cp[3]; + in6->s6_addr[14] = cp[4]; + in6->s6_addr[15] = cp[5]; +} + static void setip6eui64(const char *cmd, int dummy __unused, int s, const struct afswtch *afp) @@ -156,10 +209,13 @@ setip6eui64(const char *cmd, int dummy _ } } } - if (!lladdr) - errx(EXIT_FAILURE, "could not determine link local address"); - - memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8); + if (!lladdr) { + if (!IN6_IS_ADDR_LINKLOCAL(in6)) + errx(EXIT_FAILURE, + "could not determine link local address"); + link2eui64(ifap, in6); + } else + memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8); freeifaddrs(ifap); } --Multipart_Fri_Mar_11_14:38:28_2011-1 Content-Type: text/plain; charset=US-ASCII -- Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan ume@mahoroba.org ume@{,jp.}FreeBSD.org http://www.imasy.org/~ume/ --Multipart_Fri_Mar_11_14:38:28_2011-1--