- if ((oia = in6_ifaddr) != NULL) {
- for (; oia->ia_next; oia = oia->ia_next)
- continue;
- oia->ia_next = ia;
- } else
- in6_ifaddr = ia;
- ia->ia_ifa.ifa_refcnt++;
-
- ia->ia_prefixmask.sin6_len = sizeof(struct sockaddr_in6);
- ia->ia_prefixmask.sin6_family = AF_INET6;
- ia->ia_prefixmask.sin6_addr = in6mask64;
-
- bzero(&ia->ia_addr, sizeof(struct sockaddr_in6));
- ia->ia_addr.sin6_len = sizeof(struct sockaddr_in6);
- ia->ia_addr.sin6_family = AF_INET6;
- ia->ia_addr.sin6_addr.s6_addr16[0] = htons(0xfe80);
- ia->ia_addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
- ia->ia_addr.sin6_addr.s6_addr32[1] = 0;
-
- switch (type) {
- case IN6_IFT_LOOP:
- ia->ia_addr.sin6_addr.s6_addr32[2] = 0;
- ia->ia_addr.sin6_addr.s6_addr32[3] = htonl(1);
- if (strcmp(ifp->if_name, "lo") == 0) {
- ia->ia_ifa.ifa_dlt = lo_attach_inet(ifp);
- printf("in6_ifattach: IFT_LOOP setting initial ifp=%s%d initial ia=%x ifa_dlt=%x\n",
- ifp->if_name, ifp->if_unit, ia, ia->ia_ifa.ifa_dlt);
- }
- break;
- case IN6_IFT_802:
- ia->ia_ifa.ifa_rtrequest = nd6_rtrequest;
- ia->ia_ifa.ifa_flags |= RTF_CLONING;
- rtflag = RTF_CLONING;
- if (strcmp(ifp->if_name, "en") == 0) {
- ia->ia_ifa.ifa_dlt = ether_attach_inet6(ifp);
- printf("in6_ifattach: IFT_802 setting initial ifp=%s%d initial ia=%x ifa_dlt=%x\n",
- ifp->if_name, ifp->if_unit, ia, ia->ia_ifa.ifa_dlt);
- }
-
- /* fall through */
- case IN6_IFT_P2P802:
- ia->ia_ifa.ifa_rtrequest = nd6_rtrequest;
- ia->ia_ifa.ifa_flags |= RTF_CLONING;
- rtflag = RTF_CLONING;
- if (laddr == NULL)
- break;
- /* XXX use laddrlen */
- if (laddr_to_eui64(&ia->ia_addr.sin6_addr.s6_addr8[8],
- laddr, 6) != 0) {
- break;
- }
- /* invert u bit to convert EUI64 to RFC2373 interface ID. */
- ia->ia_addr.sin6_addr.s6_addr8[8] ^= 0x02;
- if (found_first_ifid == 0)
- in6_ifattach_getifid(ifp);
- bzero(&ia->ia_dstaddr, sizeof(struct sockaddr_in6));
- ia->ia_dstaddr.sin6_len = sizeof(struct sockaddr_in6);
- ia->ia_dstaddr.sin6_family = AF_INET6;
-
- if (ia->ia_ifa.ifa_dlt == 0) {
- ia->ia_ifa.ifa_dlt = ifp;
-#if DEBUG
- printf("in6_ifattach: IFT_P2P802 setting initial ifp=%s%d initial ia=%x ifa_dlt=%x\n",
- ifp->if_name, ifp->if_unit, ia, ia->ia_ifa.ifa_dlt);
-#endif
- }
- break;
- case IN6_IFT_P2P:
- ia->ia_ifa.ifa_rtrequest = nd6_rtrequest;
- ia->ia_ifa.ifa_flags |= RTF_CLONING;
- rtflag = RTF_CLONING;
- bcopy((caddr_t)first_ifid,
- (caddr_t)&ia->ia_addr.sin6_addr.s6_addr8[8],
- IFID_LEN);
- bzero(&ia->ia_dstaddr, sizeof(struct sockaddr_in6));
- ia->ia_dstaddr.sin6_len = sizeof(struct sockaddr_in6);
- ia->ia_dstaddr.sin6_family = AF_INET6;
-
- if (strcmp(ifp->if_name, "gif") == 0) {
- ia->ia_ifa.ifa_dlt = gif_attach_inet(ifp);
-#if DEBUG
- printf("in6_ifattach: IFT_P2P setting initial ifp=%s%d initial ia=%x ifa_dlt=%x\n",
- ifp->if_name, ifp->if_unit, ia, ia->ia_ifa.ifa_dlt);