Lines Matching defs:ia
187 in6_newaddrmsg(struct in6_ifaddr *ia, int cmd)
194 ifa = &ia->ia_ifa;
208 fibnum = ia62ifa(ia)->ifa_ifp->if_fib;
211 rt_addrmsg(cmd, &ia->ia_ifa, fibnum);
215 rt_addrmsg(cmd, &ia->ia_ifa, fibnum);
268 struct in6_ifaddr *ia = NULL;
432 ia = in6ifa_ifpwithaddr(ifp, &sa6->sin6_addr);
434 ia = NULL;
456 if (ia == NULL) {
495 if (ia == NULL) {
504 ifr->ifr_addr = ia->ia_addr;
514 ifr->ifr_dstaddr = ia->ia_dstaddr;
520 ifr->ifr_addr = ia->ia_prefixmask;
524 ifr->ifr_ifru.ifru_flags6 = ia->ia6_flags;
542 ifr->ifr_ifru.ifru_lifetime = ia->ia6_lifetime;
543 if (ia->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
554 if (ia->ia6_lifetime.ia6t_vltime <
555 maxexpire - ia->ia6_updatetime) {
556 retlt->ia6t_expire = ia->ia6_updatetime +
557 ia->ia6_lifetime.ia6t_vltime;
561 if (ia->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
572 if (ia->ia6_lifetime.ia6t_pltime <
573 maxexpire - ia->ia6_updatetime) {
574 retlt->ia6t_preferred = ia->ia6_updatetime +
575 ia->ia6_lifetime.ia6t_pltime;
588 error = in6_addifaddr(ifp, ifra, ia);
589 ia = NULL;
593 in6_purgeifaddr(ia);
594 EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
612 if (ia != NULL)
613 ifa_free(&ia->ia_ifa);
674 struct in6_ifaddr *ia, int flags, struct in6_multi **in6m_sol)
704 LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
721 LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
744 LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
756 LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
774 LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain);
787 struct in6_ifaddr *ia, int flags)
791 if ((error = in6_validate_ifra(ifp, ifra, ia, flags)) != 0)
794 if (ia == NULL) {
796 if ((ia = in6_alloc_ifa(ifp, ifra, flags)) == NULL)
800 error = in6_update_ifa_internal(ifp, ifra, ia, hostIsNew, flags);
803 in6_unlink_ifa(ia, ifp);
804 ifa_free(&ia->ia_ifa);
810 error = in6_broadcast_ifa(ifp, ifra, ia, flags);
838 struct in6_ifaddr *ia, int flags)
877 if (ia == NULL && ifra->ifra_prefixmask.sin6_len == 0)
887 * In this case, ia must not be NULL. We just use its prefix
890 plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL);
951 if (ia == NULL)
956 if (ia != NULL && ifra->ifra_prefixmask.sin6_len != 0) {
963 if (ia->ia_prefixmask.sin6_len != 0 &&
964 in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL) != plen) {
967 ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
982 struct in6_ifaddr *ia;
989 ia = (struct in6_ifaddr *)ifa_alloc(sizeof(*ia), M_NOWAIT);
990 if (ia == NULL)
992 LIST_INIT(&ia->ia6_memberships);
994 ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
995 ia->ia_addr.sin6_family = AF_INET6;
996 ia->ia_addr.sin6_len = sizeof(ia->ia_addr);
998 ia->ia_addr = ifra->ifra_addr;
999 ia->ia6_createtime = time_uptime;
1005 ia->ia_ifa.ifa_dstaddr =
1006 (struct sockaddr *)&ia->ia_dstaddr;
1008 ia->ia_ifa.ifa_dstaddr = NULL;
1012 ia->ia_ifa.ifa_netmask = (struct sockaddr *)&ia->ia_prefixmask;
1014 ia->ia_prefixmask.sin6_family = AF_INET6;
1015 ia->ia_prefixmask.sin6_len = ifra->ifra_prefixmask.sin6_len;
1016 ia->ia_prefixmask.sin6_addr = ifra->ifra_prefixmask.sin6_addr;
1019 ia->ia_ifp = ifp;
1020 ifa_ref(&ia->ia_ifa); /* if_addrhead */
1022 CK_STAILQ_INSERT_TAIL(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
1025 ifa_ref(&ia->ia_ifa); /* in6_ifaddrhead */
1027 CK_STAILQ_INSERT_TAIL(&V_in6_ifaddrhead, ia, ia_link);
1028 CK_LIST_INSERT_HEAD(IN6ADDR_HASH(&ia->ia_addr.sin6_addr), ia, ia6_hash);
1031 return (ia);
1043 struct in6_ifaddr *ia, int hostIsNew, int flags)
1048 ia->ia6_updatetime = time_uptime;
1055 ia->ia6_lifetime = ifra->ifra_lifetime;
1056 if (ia->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME) {
1057 ia->ia6_lifetime.ia6t_expire =
1058 time_uptime + ia->ia6_lifetime.ia6t_vltime;
1060 ia->ia6_lifetime.ia6t_expire = 0;
1061 if (ia->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME) {
1062 ia->ia6_lifetime.ia6t_preferred =
1063 time_uptime + ia->ia6_lifetime.ia6t_pltime;
1065 ia->ia6_lifetime.ia6t_preferred = 0;
1072 ia->ia6_lifetime.ia6t_pltime = 0;
1073 ia->ia6_lifetime.ia6t_preferred = time_uptime;
1079 ia->ia6_flags = ifra->ifra_flags;
1086 ia->ia6_flags &= ~IN6_IFF_DUPLICATED; /* safety */
1094 ia->ia6_flags |= IN6_IFF_TENTATIVE;
1097 error = in6_notify_ifa(ifp, ia, ifra, hostIsNew);
1111 struct in6_ifaddr *ia, int flags)
1117 if ((error = nd6_add_ifa_lle(ia)) != 0) {
1118 in6_purgeaddr(&ia->ia_ifa);
1119 ifa_free(&ia->ia_ifa);
1126 error = in6_update_ifa_join_mc(ifp, ifra, ia, flags, &in6m_sol);
1128 in6_purgeaddr(&ia->ia_ifa);
1129 ifa_free(&ia->ia_ifa);
1135 if ((ia->ia6_flags & IN6_IFF_TENTATIVE)) {
1164 nd6_dad_start((struct ifaddr *)ia, delay);
1167 in6_newaddrmsg(ia, RTM_ADD);
1168 ifa_free(&ia->ia_ifa);
1177 in6_handle_dstaddr_rtrequest(int cmd, struct in6_ifaddr *ia)
1180 struct ifaddr *ifa = &ia->ia_ifa;
1194 .sin6_addr = ia->ia_dstaddr.sin6_addr,
1216 ifa_is_p2p(struct in6_ifaddr *ia)
1220 plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL); /* XXX */
1222 if ((plen == 128) && (ia->ia_dstaddr.sin6_family == AF_INET6) &&
1223 !IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr, &ia->ia_dstaddr.sin6_addr))
1230 in6_addifaddr(struct ifnet *ifp, struct in6_aliasreq *ifra, struct in6_ifaddr *ia)
1241 if ((error = in6_update_ifa(ifp, ifra, ia, 0)) != 0)
1243 if (ia != NULL) {
1244 if (ia->ia_ifa.ifa_carp)
1245 (*carp_detach_p)(&ia->ia_ifa, true);
1246 ifa_free(&ia->ia_ifa);
1248 if ((ia = in6ifa_ifpwithaddr(ifp, &ifra->ifra_addr.sin6_addr)) == NULL) {
1258 error = (*carp_attach_p)(&ia->ia_ifa,
1313 (*carp_detach_p)(&ia->ia_ifa, false);
1319 if (ia->ia6_ndpr == NULL) {
1320 ia->ia6_ndpr = pr;
1328 if ((ia->ia6_flags & IN6_IFF_AUTOCONF) &&
1331 if ((e = in6_tmpifadd(ia, 1, 0)) != 0) {
1369 if (ia != NULL)
1370 ifa_free(&ia->ia_ifa);
1378 struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
1390 if (ia->ia_flags & IFA_RTSELF) {
1391 error = ifa_del_loopback_route((struct ifaddr *)ia,
1392 (struct sockaddr *)&ia->ia_addr);
1394 ia->ia_flags &= ~IFA_RTSELF;
1401 while ((imm = LIST_FIRST(&ia->ia6_memberships)) != NULL) {
1408 if ((ia->ia_flags & IFA_ROUTE) && ifa_is_p2p(ia)) {
1409 error = in6_handle_dstaddr_rtrequest(RTM_DELETE, ia);
1413 ia->ia_flags &= ~IFA_ROUTE;
1416 in6_newaddrmsg(ia, RTM_DELETE);
1417 in6_unlink_ifa(ia, ifp);
1421 * Removes @ia from the corresponding interfaces and unlinks corresponding
1425 in6_purgeifaddr(struct in6_ifaddr *ia)
1439 pr = ia->ia6_ndpr;
1440 in6_purgeaddr(&ia->ia_ifa);
1451 in6_unlink_ifa(struct in6_ifaddr *ia, struct ifnet *ifp)
1457 CK_STAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifaddr, ifa_link);
1459 ifa_free(&ia->ia_ifa); /* if_addrhead */
1467 CK_STAILQ_REMOVE(&V_in6_ifaddrhead, ia, in6_ifaddr, ia_link);
1468 CK_LIST_REMOVE(ia, ia6_hash);
1476 if (ia->ia6_ndpr == NULL) {
1479 "%s has no prefix\n", ip6_sprintf(ip6buf, IA6_IN6(ia))));
1481 ia->ia6_ndpr->ndpr_addrcnt--;
1483 if (ia->ia6_ndpr->ndpr_addrcnt == 0)
1485 ia->ia6_ndpr = NULL;
1488 nd6_rem_ifa_lle(ia, remove_lle);
1495 if ((ia->ia6_flags & IN6_IFF_AUTOCONF)) {
1498 ifa_free(&ia->ia_ifa); /* in6_ifaddrhead */
1508 in6_notify_ifa(struct ifnet *ifp, struct in6_ifaddr *ia,
1533 error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia);
1545 !IN6_ARE_ADDR_EQUAL(&pdst->sin6_addr, &ia->ia_dstaddr.sin6_addr)) {
1546 if ((ia->ia_flags & IFA_ROUTE) != 0 &&
1547 (in6_handle_dstaddr_rtrequest(RTM_DELETE, ia) != 0)) {
1550 ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
1553 ia->ia_flags &= ~IFA_ROUTE;
1554 ia->ia_dstaddr = *pdst;
1564 if (!(ia->ia_flags & IFA_ROUTE) && ifa_is_p2p(ia)) {
1565 error = in6_handle_dstaddr_rtrequest(RTM_ADD, ia);
1568 ia->ia_flags |= IFA_ROUTE;
1574 if (!(ia->ia_flags & IFA_RTSELF) && V_nd6_useloopback) {
1575 error = ifa_add_loopback_route((struct ifaddr *)ia,
1576 (struct sockaddr *)&ia->ia_addr);
1578 ia->ia_flags |= IFA_RTSELF;
1584 ifa_ref(&ia->ia_ifa);
1585 EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
1587 ifa_free(&ia->ia_ifa);
1626 struct in6_ifaddr *ia;
1629 CK_LIST_FOREACH(ia, IN6ADDR_HASH(addr), ia6_hash) {
1630 if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), addr)) {
1632 zoneid != ia->ia_addr.sin6_scope_id)
1635 ifa_ref(&ia->ia_ifa);
1640 return (ia);
1780 struct in6_ifaddr *ia;
1786 CK_STAILQ_FOREACH(ia, &V_in6_ifaddrhead, ia_link) {
1787 if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
1788 &ia->ia_prefixmask.sin6_addr)) {
1806 struct in6_ifaddr *ia;
1809 CK_LIST_FOREACH(ia, IN6ADDR_HASH(in6), ia6_hash) {
1810 if (IN6_ARE_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr)) {
1826 struct in6_ifaddr *ia;
1829 CK_LIST_FOREACH(ia, IN6ADDR_HASH(in6), ia6_hash) {
1830 if (IN6_ARE_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr) &&
1831 (ia->ia_ifa.ifa_carp == NULL ||
1832 carp_master_p(&ia->ia_ifa)) &&
1833 ia->ia_ifa.ifa_ifp->if_fib == fib) {
1874 struct in6_ifaddr *ia;
1877 CK_LIST_FOREACH(ia, IN6ADDR_HASH(&sa6->sin6_addr), ia6_hash) {
1878 if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), &sa6->sin6_addr)) {
1879 if (ia->ia6_flags & IN6_IFF_DEPRECATED) {
2053 struct in6_ifaddr *ia;
2059 ia = (struct in6_ifaddr *)ifa;
2060 if (ia->ia6_flags & IN6_IFF_TENTATIVE) {