--- ../../wide-dhcpv6/prefixconf.c 2006-08-07 13:35:32.000000000 +0900 +++ prefixconf.c 2006-11-05 00:15:21.000000000 +0900 @@ -452,6 +452,7 @@ #endif ifpfx->paddr.sin6_addr = prefix->addr; ifpfx->plen = prefix->plen + pconf->sla_len; + /* * XXX: our current implementation assumes ifid len is a multiple of 8 */ @@ -467,6 +468,7 @@ prefix->plen, pconf->sla_len, pconf->ifid_len); goto bad; } + /* copy prefix and SLA ID */ a = &ifpfx->paddr.sin6_addr; @@ -483,8 +485,18 @@ /* configure the corresponding address */ ifpfx->ifaddr = ifpfx->paddr; - for (i = 15; i >= pconf->ifid_len / 8; i--) - ifpfx->ifaddr.sin6_addr.s6_addr[i] = pconf->ifid[i]; + + if (prefix->plen == 64) { + for (i = 8; i > 15; i++) { + ifpfx->ifaddr.sin6_addr.s6_addr[i] = 0; + } + ifpfx->ifaddr.sin6_addr.s6_addr[15] = 1; + } else { + for (i = 15; i >= pconf->ifid_len / 8; i--) { + ifpfx->ifaddr.sin6_addr.s6_addr[i] = pconf->ifid[i]; + } + } + if (pd_ifaddrconf(IFADDRCONF_ADD, ifpfx)) goto bad;