Lines Matching defs:ia

114 #define	IA_HASH_INIT(ia) {					\
115 (ia)->ia_hash.tqe_next = (void *)(uintptr_t)-1; \
116 (ia)->ia_hash.tqe_prev = (void *)(uintptr_t)-1; \
119 #define IA_IS_HASHED(ia) \
120 (!((ia)->ia_hash.tqe_next == (void *)(uintptr_t)-1 || \
121 (ia)->ia_hash.tqe_prev == (void *)(uintptr_t)-1))
229 struct in_ifaddr *ia;
233 for (ia = in_ifaddrhead.tqh_first; ia;
234 ia = ia->ia_link.tqe_next) {
235 IFA_LOCK(&ia->ia_ifa);
236 if ((i & ia->ia_netmask) == ia->ia_net) {
237 IFA_UNLOCK(&ia->ia_ifa);
241 IFA_UNLOCK(&ia->ia_ifa);
246 for (ia = in_ifaddrhead.tqh_first; ia;
247 ia = ia->ia_link.tqe_next) {
248 IFA_LOCK(&ia->ia_ifa);
249 if ((i & ia->ia_subnetmask) == ia->ia_subnet) {
250 IFA_UNLOCK(&ia->ia_ifa);
254 IFA_UNLOCK(&ia->ia_ifa);
373 struct in_ifaddr *ia = NULL;
425 ia = iap;
428 } else if (ia == NULL) {
429 ia = iap;
437 /* take a reference on ia before releasing lock */
438 if (ia != NULL)
439 IFA_ADDREF(&ia->ia_ifa);
481 for (oia = ia; ia; ia = ia->ia_link.tqe_next) {
482 IFA_LOCK(&ia->ia_ifa);
483 if (ia->ia_ifp == ifp &&
484 ia->ia_addr.sin_addr.s_addr ==
486 IFA_ADDREF_LOCKED(&ia->ia_ifa);
487 IFA_UNLOCK(&ia->ia_ifa);
490 IFA_UNLOCK(&ia->ia_ifa);
505 if (cmd == SIOCDIFADDR && ia == NULL) {
545 if (ia == NULL) {
546 ia = in_ifaddr_alloc(M_WAITOK);
547 if (ia == NULL) {
552 ifa = &ia->ia_ifa;
556 IA_HASH_INIT(ia);
557 ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
558 ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
559 ifa->ifa_netmask = (struct sockaddr *)&ia->ia_sockmask;
560 ia->ia_sockmask.sin_len = 8;
562 ia->ia_broadaddr.sin_len = sizeof (ia->ia_addr);
563 ia->ia_broadaddr.sin_family = AF_INET;
565 ia->ia_ifp = ifp;
583 TAILQ_INSERT_TAIL(&in_ifaddrhead, ia, ia_link);
613 if (ia == NULL) {
679 VERIFY(ia != NULL);
680 IFA_LOCK(&ia->ia_ifa);
681 bcopy(&ia->ia_addr, &((struct ifreq *)(void *)data)->ifr_addr,
683 IFA_UNLOCK(&ia->ia_ifa);
687 VERIFY(ia != NULL);
692 IFA_LOCK(&ia->ia_ifa);
693 bcopy(&ia->ia_broadaddr,
696 IFA_UNLOCK(&ia->ia_ifa);
700 VERIFY(ia != NULL);
705 IFA_LOCK(&ia->ia_ifa);
706 bcopy(&ia->ia_dstaddr,
709 IFA_UNLOCK(&ia->ia_ifa);
713 VERIFY(ia != NULL);
714 IFA_LOCK(&ia->ia_ifa);
715 bcopy(&ia->ia_sockmask,
718 IFA_UNLOCK(&ia->ia_ifa);
722 VERIFY(ifp != NULL && ia != NULL);
727 IFA_LOCK(&ia->ia_ifa);
728 oldaddr = ia->ia_dstaddr;
730 &ia->ia_dstaddr, sizeof (struct sockaddr_in));
731 if (ia->ia_dstaddr.sin_family == AF_INET)
732 ia->ia_dstaddr.sin_len = sizeof (struct sockaddr_in);
733 IFA_UNLOCK(&ia->ia_ifa);
740 error = ifnet_ioctl(ifp, PF_INET, SIOCSIFDSTADDR, ia);
741 IFA_LOCK(&ia->ia_ifa);
746 ia->ia_dstaddr = oldaddr;
747 IFA_UNLOCK(&ia->ia_ifa);
750 IFA_LOCK_ASSERT_HELD(&ia->ia_ifa);
758 if (ia->ia_ifa.ifa_dstaddr) {
760 (void *)ia->ia_ifa.ifa_dstaddr)->sin_addr;
765 in_event_data.ia_addr = ia->ia_addr.sin_addr;
766 in_event_data.ia_net = ia->ia_net;
767 in_event_data.ia_netmask = ia->ia_netmask;
768 in_event_data.ia_subnet = ia->ia_subnet;
769 in_event_data.ia_subnetmask = ia->ia_subnetmask;
770 in_event_data.ia_netbroadcast = ia->ia_netbroadcast;
771 IFA_UNLOCK(&ia->ia_ifa);
784 IFA_LOCK(&ia->ia_ifa);
785 if (ia->ia_flags & IFA_ROUTE) {
786 ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr;
787 IFA_UNLOCK(&ia->ia_ifa);
788 rtinit_locked(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
789 IFA_LOCK(&ia->ia_ifa);
790 ia->ia_ifa.ifa_dstaddr =
791 (struct sockaddr *)&ia->ia_dstaddr;
792 IFA_UNLOCK(&ia->ia_ifa);
793 rtinit_locked(&(ia->ia_ifa), (int)RTM_ADD,
796 IFA_UNLOCK(&ia->ia_ifa);
802 VERIFY(ia != NULL);
807 IFA_LOCK(&ia->ia_ifa);
809 &ia->ia_broadaddr, sizeof (struct sockaddr_in));
817 if (ia->ia_ifa.ifa_dstaddr) {
819 (void *)ia->ia_ifa.ifa_dstaddr)->sin_addr;
823 in_event_data.ia_addr = ia->ia_addr.sin_addr;
824 in_event_data.ia_net = ia->ia_net;
825 in_event_data.ia_netmask = ia->ia_netmask;
826 in_event_data.ia_subnet = ia->ia_subnet;
827 in_event_data.ia_subnetmask = ia->ia_subnetmask;
828 in_event_data.ia_netbroadcast = ia->ia_netbroadcast;
829 IFA_UNLOCK(&ia->ia_ifa);
845 VERIFY(ifp != NULL && ia != NULL);
852 error = in_ifinit(ifp, ia, &addr, 1);
903 VERIFY(ifp != NULL && ia != NULL);
908 IFA_LOCK(&ia->ia_ifa);
909 ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i);
916 if (ia->ia_ifa.ifa_dstaddr) {
918 (void *)ia->ia_ifa.ifa_dstaddr)->sin_addr;
922 in_event_data.ia_addr = ia->ia_addr.sin_addr;
923 in_event_data.ia_net = ia->ia_net;
924 in_event_data.ia_netmask = ia->ia_netmask;
925 in_event_data.ia_subnet = ia->ia_subnet;
926 in_event_data.ia_subnetmask = ia->ia_subnetmask;
927 in_event_data.ia_netbroadcast = ia->ia_netbroadcast;
928 IFA_UNLOCK(&ia->ia_ifa);
945 VERIFY(ifp != NULL && ia != NULL);
957 IFA_LOCK(&ia->ia_ifa);
958 if (ia->ia_addr.sin_family == AF_INET) {
960 addr = ia->ia_addr;
963 ia->ia_addr.sin_addr.s_addr) {
968 IFA_UNLOCK(&ia->ia_ifa);
969 in_ifscrub(ifp, ia, 0);
970 IFA_LOCK(&ia->ia_ifa);
971 ia->ia_sockmask = mask;
972 ia->ia_subnetmask =
973 ntohl(ia->ia_sockmask.sin_addr.s_addr);
978 IFA_UNLOCK(&ia->ia_ifa);
979 in_ifscrub(ifp, ia, 0);
980 IFA_LOCK(&ia->ia_ifa);
981 ia->ia_dstaddr = broadaddr;
982 ia->ia_dstaddr.sin_len = sizeof (struct sockaddr_in);
986 IFA_UNLOCK(&ia->ia_ifa);
987 error = in_ifinit(ifp, ia, &addr, 0);
989 IFA_UNLOCK(&ia->ia_ifa);
995 IFA_LOCK(&ia->ia_ifa);
998 ia->ia_broadaddr = broadaddr;
1013 if (ia->ia_ifa.ifa_dstaddr) {
1015 ((struct sockaddr_in *)(void *)ia->
1020 in_event_data.ia_addr = ia->ia_addr.sin_addr;
1021 in_event_data.ia_net = ia->ia_net;
1022 in_event_data.ia_netmask = ia->ia_netmask;
1023 in_event_data.ia_subnet = ia->ia_subnet;
1024 in_event_data.ia_subnetmask = ia->ia_subnetmask;
1025 in_event_data.ia_netbroadcast = ia->ia_netbroadcast;
1026 IFA_UNLOCK(&ia->ia_ifa);
1038 IFA_UNLOCK(&ia->ia_ifa);
1044 VERIFY(ifp != NULL && ia != NULL);
1045 error = ifnet_ioctl(ifp, PF_INET, SIOCDIFADDR, ia);
1059 IFA_LOCK(&ia->ia_ifa);
1060 if (ia->ia_ifa.ifa_dstaddr) {
1062 (void *)ia->ia_ifa.ifa_dstaddr)->sin_addr;
1066 in_event_data.ia_addr = ia->ia_addr.sin_addr;
1067 in_event_data.ia_net = ia->ia_net;
1068 in_event_data.ia_netmask = ia->ia_netmask;
1069 in_event_data.ia_subnet = ia->ia_subnet;
1070 in_event_data.ia_subnetmask = ia->ia_subnetmask;
1071 in_event_data.ia_netbroadcast = ia->ia_netbroadcast;
1072 IFA_UNLOCK(&ia->ia_ifa);
1082 ifa = &ia->ia_ifa;
1086 TAILQ_REMOVE(&in_ifaddrhead, ia, ia_link);
1088 if (IA_IS_HASHED(ia))
1089 in_iahash_remove(ia);
1096 in_ifscrub(ifp, ia, 0);
1222 if (ia != NULL) {
1223 IFA_REMREF(&ia->ia_ifa);
1308 struct in_ifaddr *ia;
1364 ia = (struct in_ifaddr *)ifa;
1369 bcopy(&ia->ia_addr, &iflr->addr, ia->ia_addr.sin_len);
1372 bcopy(&ia->ia_dstaddr, &iflr->dstaddr,
1373 ia->ia_dstaddr.sin_len);
1378 in_mask2len(&ia->ia_sockmask.sin_addr);
1394 bcopy(&ia->ia_addr, &ifra.ifra_addr,
1395 ia->ia_addr.sin_len);
1397 bcopy(&ia->ia_dstaddr, &ifra.ifra_dstaddr,
1398 ia->ia_dstaddr.sin_len);
1400 bcopy(&ia->ia_sockmask, &ifra.ifra_dstaddr,
1401 ia->ia_sockmask.sin_len);
1446 in_ifscrub(struct ifnet *ifp, struct in_ifaddr *ia, int locked)
1448 IFA_LOCK(&ia->ia_ifa);
1449 if ((ia->ia_flags & IFA_ROUTE) == 0) {
1450 IFA_UNLOCK(&ia->ia_ifa);
1453 IFA_UNLOCK(&ia->ia_ifa);
1457 rtinit_locked(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
1459 rtinit_locked(&(ia->ia_ifa), (int)RTM_DELETE, 0);
1460 IFA_LOCK(&ia->ia_ifa);
1461 ia->ia_flags &= ~IFA_ROUTE;
1462 IFA_UNLOCK(&ia->ia_ifa);
1471 in_iahash_remove(struct in_ifaddr *ia)
1474 IFA_LOCK_ASSERT_HELD(&ia->ia_ifa);
1476 if (!IA_IS_HASHED(ia)) {
1477 panic("attempt to remove wrong ia %p from hash table\n", ia);
1480 TAILQ_REMOVE(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), ia, ia_hash);
1481 IA_HASH_INIT(ia);
1482 if (IFA_REMREF_LOCKED(&ia->ia_ifa) == NULL) {
1484 &ia->ia_ifa);
1493 in_iahash_insert(struct in_ifaddr *ia)
1496 IFA_LOCK_ASSERT_HELD(&ia->ia_ifa);
1498 if (ia->ia_addr.sin_family != AF_INET) {
1499 panic("attempt to insert wrong ia %p into hash table\n", ia);
1501 } else if (IA_IS_HASHED(ia)) {
1502 panic("attempt to double-insert ia %p into hash table\n", ia);
1505 TAILQ_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), ia, ia_hash);
1506 IFA_ADDREF_LOCKED(&ia->ia_ifa);
1520 in_iahash_insert_ptp(struct in_ifaddr *ia)
1526 IFA_LOCK_ASSERT_HELD(&ia->ia_ifa);
1528 if (ia->ia_addr.sin_family != AF_INET) {
1529 panic("attempt to insert wrong ia %p into hash table\n", ia);
1531 } else if (IA_IS_HASHED(ia)) {
1532 panic("attempt to double-insert ia %p into hash table\n", ia);
1535 IFA_UNLOCK(&ia->ia_ifa);
1536 TAILQ_FOREACH(tmp_ifa, INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
1539 /* ia->ia_addr won't change, so check without lock */
1541 ia->ia_addr.sin_addr.s_addr) {
1549 IFA_LOCK(&ia->ia_ifa);
1551 TAILQ_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
1552 ia, ia_hash);
1554 TAILQ_INSERT_TAIL(INADDR_HASH(ia->ia_addr.sin_addr.s_addr),
1555 ia, ia_hash);
1557 IFA_ADDREF_LOCKED(&ia->ia_ifa);
1567 struct in_ifaddr *ia,
1579 IFA_ADDREF(&ia->ia_ifa);
1582 IFA_LOCK(&ia->ia_ifa);
1583 oldaddr = ia->ia_addr;
1584 if (IA_IS_HASHED(ia)) {
1586 in_iahash_remove(ia);
1588 ia->ia_addr = *sin;
1589 ia->ia_addr.sin_len = sizeof (*sin);
1591 in_iahash_insert_ptp(ia);
1593 in_iahash_insert(ia);
1594 IFA_UNLOCK(&ia->ia_ifa);
1605 cmd = (&ia->ia_ifa == ifa0) ? SIOCSIFADDR : SIOCAIFADDR;
1606 error = ifnet_ioctl(ifp, PF_INET, cmd, ia);
1633 IFA_LOCK(&ia->ia_ifa);
1634 if (IA_IS_HASHED(ia))
1635 in_iahash_remove(ia);
1636 ia->ia_addr = oldaddr;
1639 in_iahash_insert_ptp(ia);
1641 in_iahash_insert(ia);
1643 IFA_UNLOCK(&ia->ia_ifa);
1646 IFA_REMREF(&ia->ia_ifa);
1650 IFA_LOCK(&ia->ia_ifa);
1655 ia->ia_ifa.ifa_debug &= ~IFD_NOTREADY;
1657 ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
1658 IFA_UNLOCK(&ia->ia_ifa);
1659 in_ifscrub(ifp, ia, 1);
1660 IFA_LOCK(&ia->ia_ifa);
1661 ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
1663 IFA_LOCK_ASSERT_HELD(&ia->ia_ifa);
1665 ia->ia_netmask = IN_CLASSA_NET;
1667 ia->ia_netmask = IN_CLASSB_NET;
1669 ia->ia_netmask = IN_CLASSC_NET;
1675 if (ia->ia_subnetmask == 0) {
1676 ia->ia_subnetmask = ia->ia_netmask;
1677 ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);
1679 ia->ia_netmask &= ia->ia_subnetmask;
1680 ia->ia_net = i & ia->ia_netmask;
1681 ia->ia_subnet = i & ia->ia_subnetmask;
1682 in_socktrim(&ia->ia_sockmask);
1686 ia->ia_ifa.ifa_metric = ifp->if_metric;
1688 ia->ia_broadaddr.sin_addr.s_addr =
1689 htonl(ia->ia_subnet | ~ia->ia_subnetmask);
1690 ia->ia_netbroadcast.s_addr =
1691 htonl(ia->ia_net | ~ ia->ia_netmask);
1693 ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr;
1696 if (ia->ia_dstaddr.sin_family != AF_INET) {
1697 IFA_UNLOCK(&ia->ia_ifa);
1700 IFA_REMREF(&ia->ia_ifa);
1703 ia->ia_dstaddr.sin_len = sizeof (*sin);
1706 IFA_UNLOCK(&ia->ia_ifa);
1707 if ((error = rtinit_locked(&(ia->ia_ifa), (int)RTM_ADD, flags)) == 0) {
1708 IFA_LOCK(&ia->ia_ifa);
1709 ia->ia_flags |= IFA_ROUTE;
1710 IFA_UNLOCK(&ia->ia_ifa);
1745 IFA_REMREF(&ia->ia_ifa);
1768 #define ia ((struct in_ifaddr *)ifa)
1773 (in.s_addr == ia->ia_broadaddr.sin_addr.s_addr ||
1774 in.s_addr == ia->ia_netbroadcast.s_addr ||
1778 t == ia->ia_subnet || t == ia->ia_net) &&
1784 ia->ia_subnetmask != (u_int32_t)0xffffffff) {
1793 #undef ia