Lines Matching defs:ifa

263 if_attach_ifa(struct ifnet *ifp, struct ifaddr *ifa)
265 if_attach_ifa_common(ifp, ifa, 0);
269 if_attach_link_ifa(struct ifnet *ifp, struct ifaddr *ifa)
271 if_attach_ifa_common(ifp, ifa, 1);
275 if_attach_ifa_common(struct ifnet *ifp, struct ifaddr *ifa, int link)
278 IFA_LOCK_ASSERT_HELD(ifa);
280 if (ifa->ifa_ifp != ifp) {
282 ifa->ifa_ifp, ifp);
284 } else if (ifa->ifa_debug & IFD_ATTACHED) {
285 panic("%s: Attempt to attach an already attached ifa=%p",
286 __func__, ifa);
288 } else if (link && !(ifa->ifa_debug & IFD_LINK)) {
289 panic("%s: Unexpected non-link address ifa=%p", __func__, ifa);
291 } else if (!link && (ifa->ifa_debug & IFD_LINK)) {
292 panic("%s: Unexpected link address ifa=%p", __func__, ifa);
295 IFA_ADDREF_LOCKED(ifa);
296 ifa->ifa_debug |= IFD_ATTACHED;
298 TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
300 TAILQ_INSERT_TAIL(&ifp->if_addrhead, ifa, ifa_link);
302 if (ifa->ifa_attached != NULL)
303 (*ifa->ifa_attached)(ifa);
307 if_detach_ifa(struct ifnet *ifp, struct ifaddr *ifa)
309 if_detach_ifa_common(ifp, ifa, 0);
313 if_detach_link_ifa(struct ifnet *ifp, struct ifaddr *ifa)
315 if_detach_ifa_common(ifp, ifa, 1);
319 if_detach_ifa_common(struct ifnet *ifp, struct ifaddr *ifa, int link)
322 IFA_LOCK_ASSERT_HELD(ifa);
324 if (link && !(ifa->ifa_debug & IFD_LINK)) {
325 panic("%s: Unexpected non-link address ifa=%p", __func__, ifa);
327 } else if (link && ifa != TAILQ_FIRST(&ifp->if_addrhead)) {
328 panic("%s: Link address ifa=%p not first", __func__, ifa);
330 } else if (!link && (ifa->ifa_debug & IFD_LINK)) {
331 panic("%s: Unexpected link address ifa=%p", __func__, ifa);
333 } else if (!(ifa->ifa_debug & IFD_ATTACHED)) {
334 panic("%s: Attempt to detach an unattached address ifa=%p",
335 __func__, ifa);
337 } else if (ifa->ifa_ifp != ifp) {
339 ifa->ifa_ifp, ifp);
341 } else if (ifa->ifa_debug & IFD_DEBUG) {
344 if (ifa2 == ifa)
347 if (ifa2 != ifa) {
348 panic("%s: Attempt to detach a stray address ifa=%p",
349 __func__, ifa);
353 TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
355 if (IFA_REMREF_LOCKED(ifa) == NULL) {
356 panic("%s: unexpected (missing) refcnt ifa=%p", __func__, ifa);
359 ifa->ifa_debug &= ~IFD_ATTACHED;
361 if (ifa->ifa_detached != NULL)
362 (*ifa->ifa_detached)(ifa);
755 struct ifaddr *ifa;
758 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
759 IFA_LOCK_SPIN(ifa);
760 if (ifa->ifa_addr->sa_family == family) {
761 IFA_ADDREF_LOCKED(ifa); /* for caller */
762 IFA_UNLOCK(ifa);
765 IFA_UNLOCK(ifa);
769 return (ifa);
780 struct ifaddr *ifa;
791 for (ifa = ifp->if_addrhead.tqh_first; ifa;
792 ifa = ifa->ifa_link.tqe_next) {
793 IFA_LOCK_SPIN(ifa);
794 if (ifa->ifa_addr->sa_family != addr->sa_family) {
795 IFA_UNLOCK(ifa);
798 if (equal(addr, ifa->ifa_addr)) {
799 result = ifa;
800 IFA_ADDREF_LOCKED(ifa); /* for caller */
801 IFA_UNLOCK(ifa);
805 ifa->ifa_broadaddr != NULL &&
807 ifa->ifa_broadaddr->sa_len != 0 &&
808 equal(ifa->ifa_broadaddr, addr)) {
809 result = ifa;
810 IFA_ADDREF_LOCKED(ifa); /* for caller */
811 IFA_UNLOCK(ifa);
814 IFA_UNLOCK(ifa);
830 struct ifaddr *ifa;
838 for (ifa = ifp->if_addrhead.tqh_first; ifa;
839 ifa = ifa->ifa_link.tqe_next) {
840 IFA_LOCK_SPIN(ifa);
841 if (ifa->ifa_addr->sa_family !=
843 IFA_UNLOCK(ifa);
846 if (ifa->ifa_dstaddr &&
847 equal(addr, ifa->ifa_dstaddr)) {
848 result = ifa;
849 IFA_ADDREF_LOCKED(ifa); /* for caller */
850 IFA_UNLOCK(ifa);
853 IFA_UNLOCK(ifa);
882 struct ifaddr *ifa = NULL;
890 for (ifa = ifp->if_addrhead.tqh_first; ifa != NULL;
891 ifa = ifa->ifa_link.tqe_next) {
892 IFA_LOCK_SPIN(ifa);
893 if (ifa->ifa_addr->sa_family != addr->sa_family) {
894 IFA_UNLOCK(ifa);
897 if (equal(addr, ifa->ifa_addr)) {
898 result = ifa;
899 IFA_ADDREF_LOCKED(ifa); /* for caller */
900 IFA_UNLOCK(ifa);
904 ifa->ifa_broadaddr != NULL &&
906 ifa->ifa_broadaddr->sa_len != 0 &&
907 equal(ifa->ifa_broadaddr, addr)) {
908 result = ifa;
909 IFA_ADDREF_LOCKED(ifa); /* for caller */
910 IFA_UNLOCK(ifa);
913 IFA_UNLOCK(ifa);
942 struct ifaddr *ifa = NULL;
965 ifa = ifnet_addrs[sdl->sdl_index - 1];
966 if (ifa != NULL)
967 IFA_ADDREF(ifa);
970 return (ifa);
980 for (ifa = ifp->if_addrhead.tqh_first; ifa;
981 ifa = ifa->ifa_link.tqe_next) {
984 IFA_LOCK(ifa);
985 if (ifa->ifa_addr == NULL ||
986 ifa->ifa_addr->sa_family != af) {
988 IFA_UNLOCK(ifa);
1009 if (ifa->ifa_dstaddr != 0 &&
1010 equal(addr, ifa->ifa_dstaddr)) {
1011 IFA_ADDREF_LOCKED(ifa);
1012 IFA_UNLOCK(ifa);
1015 IFA_UNLOCK(ifa);
1025 IFA_UNLOCK(ifa);
1030 * Scan all the bits in the ifa's address.
1036 if (ifa->ifa_netmask == 0) {
1037 IFA_UNLOCK(ifa);
1041 cp2 = ifa->ifa_addr->sa_data;
1042 cp3 = ifa->ifa_netmask->sa_data;
1043 cplim = ifa->ifa_netmask->sa_len
1044 + (char *)ifa->ifa_netmask;
1056 rn_refines((caddr_t)ifa->ifa_netmask,
1058 IFA_ADDREF_LOCKED(ifa); /* ifa_maybe */
1059 IFA_UNLOCK(ifa);
1062 ifa_maybe = ifa;
1064 IFA_UNLOCK(ifa);
1067 IFA_LOCK_ASSERT_NOTHELD(ifa);
1071 if (ifa != NULL)
1076 if (ifa == NULL)
1077 ifa = ifa_maybe;
1081 return (ifa);
1091 struct ifaddr *ifa = NULL;
1102 for (ifa = ifp->if_addrhead.tqh_first; ifa;
1103 ifa = ifa->ifa_link.tqe_next) {
1104 IFA_LOCK(ifa);
1105 if (ifa->ifa_addr->sa_family != af) {
1106 IFA_UNLOCK(ifa);
1110 IFA_ADDREF_LOCKED(ifa); /* for ifa_maybe */
1111 ifa_maybe = ifa;
1113 if (ifa->ifa_netmask == 0) {
1114 if (equal(addr, ifa->ifa_addr) || (ifa->ifa_dstaddr &&
1115 equal(addr, ifa->ifa_dstaddr))) {
1116 IFA_ADDREF_LOCKED(ifa); /* for caller */
1117 IFA_UNLOCK(ifa);
1120 IFA_UNLOCK(ifa);
1124 if (ifa->ifa_dstaddr && equal(addr, ifa->ifa_dstaddr)) {
1125 IFA_ADDREF_LOCKED(ifa); /* for caller */
1126 IFA_UNLOCK(ifa);
1130 if (equal(addr, ifa->ifa_addr)) {
1132 IFA_ADDREF_LOCKED(ifa); /* for caller */
1133 IFA_UNLOCK(ifa);
1137 cp2 = ifa->ifa_addr->sa_data;
1138 cp3 = ifa->ifa_netmask->sa_data;
1139 cplim = ifa->ifa_netmask->sa_len +
1140 (char *)ifa->ifa_netmask;
1148 IFA_ADDREF_LOCKED(ifa);
1149 better_ifa_maybe = ifa;
1153 IFA_UNLOCK(ifa);
1156 if (ifa == NULL) {
1158 ifa = better_ifa_maybe;
1161 ifa = ifa_maybe;
1173 return (ifa);
1180 * Lookup an appropriate real ifa to point to.
1186 struct ifaddr *ifa;
1194 if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) ||
1195 ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
1201 ifa = ifaof_ifpforaddr(dst, ifp);
1202 if (ifa) {
1203 rtsetifa(rt, ifa);
1204 IFA_LOCK_SPIN(ifa);
1205 ifa_rtrequest = ifa->ifa_rtrequest;
1206 IFA_UNLOCK(ifa);
1209 IFA_REMREF(ifa);
1230 struct ifaddr **ifa;
1264 if (ifnet_get_address_list(ifp, &ifa) == 0) {
1265 for (i = 0; ifa[i] != 0; i++) {
1266 pfctlinput(up ? PRC_IFUP : PRC_IFDOWN, ifa[i]->ifa_addr);
1268 ifnet_free_address_list(ifa);
2370 struct ifaddr *ifa;
2400 ifa = ifp->if_addrhead.tqh_first;
2401 for ( ; space > sizeof (ifr) && ifa;
2402 ifa = ifa->ifa_link.tqe_next) {
2405 IFA_LOCK(ifa);
2406 sa = ifa->ifa_addr;
2409 IFA_UNLOCK(ifa);
2430 IFA_UNLOCK(ifa);
2444 IFA_UNLOCK(ifa);
3556 ifa_remref(struct ifaddr *ifa, int locked)
3559 IFA_LOCK_SPIN(ifa);
3561 IFA_LOCK_ASSERT_HELD(ifa);
3563 if (ifa->ifa_refcnt == 0)
3564 panic("%s: ifa %p negative refcnt\n", __func__, ifa);
3565 else if (ifa->ifa_trace != NULL)
3566 (*ifa->ifa_trace)(ifa, FALSE);
3567 if (--ifa->ifa_refcnt == 0) {
3568 if (ifa->ifa_debug & IFD_ATTACHED)
3569 panic("ifa %p attached to ifp is being freed\n", ifa);
3577 if (ifa->ifa_debug & IFD_ALLOC) {
3578 if (ifa->ifa_free == NULL) {
3579 IFA_UNLOCK(ifa);
3580 FREE(ifa, M_IFADDR);
3583 IFA_CONVERT_LOCK(ifa);
3585 (*ifa->ifa_free)(ifa);
3588 IFA_UNLOCK(ifa);
3590 ifa = NULL;
3593 if (!locked && ifa != NULL)
3594 IFA_UNLOCK(ifa);
3596 return (ifa);
3600 ifa_addref(struct ifaddr *ifa, int locked)
3603 IFA_LOCK_SPIN(ifa);
3605 IFA_LOCK_ASSERT_HELD(ifa);
3607 if (++ifa->ifa_refcnt == 0) {
3608 panic("%s: ifa %p wraparound refcnt\n", __func__, ifa);
3610 } else if (ifa->ifa_trace != NULL) {
3611 (*ifa->ifa_trace)(ifa, TRUE);
3614 IFA_UNLOCK(ifa);
3618 ifa_lock_init(struct ifaddr *ifa)
3620 lck_mtx_init(&ifa->ifa_lock, ifa_mtx_grp, ifa_mtx_attr);
3624 ifa_lock_destroy(struct ifaddr *ifa)
3626 IFA_LOCK_ASSERT_NOTHELD(ifa);
3627 lck_mtx_destroy(&ifa->ifa_lock, ifa_mtx_grp);