Lines Matching refs:ifa
358 struct ifaddr *ifa;
360 ifa = rt->rt_ifa;
361 if (ifa->ifa_getifa == NULL)
362 return ifa;
364 else if (ifa->ifa_seqno != NULL && *ifa->ifa_seqno == rt->rt_ifa_seqno)
365 return ifa;
368 ifa = (*ifa->ifa_getifa)(ifa, rt_getkey(rt));
369 if (ifa == NULL)
371 rt_replace_ifa(rt, ifa);
372 return ifa;
377 rt_set_ifa1(struct rtentry *rt, struct ifaddr *ifa)
379 rt->rt_ifa = ifa;
380 if (ifa->ifa_seqno != NULL)
381 rt->rt_ifa_seqno = *ifa->ifa_seqno;
385 * Is this route the connected route for the ifa?
388 rt_ifa_connected(const struct rtentry *rt, const struct ifaddr *ifa)
394 dst = rt->rt_flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr;
399 if ((rt->rt_flags & RTF_HOST) == 0 && ifa->ifa_netmask) {
403 ifa->ifa_netmask);
409 rt_replace_ifa(struct rtentry *rt, struct ifaddr *ifa)
413 if (rt->rt_ifa == ifa)
416 if (rt->rt_ifa != ifa &&
420 RT_DPRINTF("rt->_rt_key = %p, ifa = %p, "
424 if (rt_ifa_connected(rt, ifa)) {
425 RT_DPRINTF("rt->_rt_key = %p, ifa = %p, "
427 (void *)rt->_rt_key, (void *)ifa);
428 ifa->ifa_flags |= IFA_ROUTE;
432 ifaref(ifa);
434 rt_set_ifa1(rt, ifa);
439 rt_set_ifa(struct rtentry *rt, struct ifaddr *ifa)
441 ifaref(ifa);
442 rt_set_ifa1(rt, ifa);
685 struct ifaddr *ifa;
704 ifa = rt->rt_ifa;
706 ifafree(ifa);
837 struct ifaddr *ifa;
841 if ((ifa = ifa_ifwithnet_psref(gateway, &psref)) == NULL) {
853 (sockaddr_cmp(src, rt->rt_gateway) != 0 || rt->rt_ifa != ifa))
892 info.rti_ifa = ifa;
951 ifa_release(ifa, &psref);
986 struct ifaddr *ifa = NULL;
997 ifa = ifa_ifwithdstaddr_psref(dst, psref);
998 if (ifa == NULL)
999 ifa = ifa_ifwithaddr_psref(gateway, psref);
1006 ifa = ifa_ifwithdstaddr_psref(gateway, psref);
1008 if (ifa == NULL)
1009 ifa = ifa_ifwithnet_psref(gateway, psref);
1010 if (ifa == NULL) {
1026 IFADDR_READER_FOREACH(ifa, rt->rt_ifp) {
1027 if (ifa == rt->rt_ifa)
1030 if (ifa != NULL)
1031 ifa_acquire(ifa, psref);
1034 if (ifa == NULL)
1037 if (ifa->ifa_addr->sa_family != dst->sa_family) {
1042 nifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp);
1044 ifa_release(ifa, psref);
1046 ifa = nifa;
1050 return ifa;
1083 struct ifaddr *ifa;
1086 ifa = ifa_ifwithnet(ifpaddr);
1087 if (ifa != NULL)
1088 info->rti_ifp = if_get_byindex(ifa->ifa_ifp->if_index,
1099 struct ifaddr *ifa = NULL;
1107 ifa = ifa_ifwithaddr_psref(ifaaddr, psref);
1108 if (ifa != NULL)
1115 ifa = ifaof_ifpforaddr_psref(sa, info->rti_ifp, psref);
1117 ifa = ifa_ifwithroute_psref(flags, dst, gateway, psref);
1119 ifa = ifa_ifwithroute_psref(flags, sa, sa, psref);
1120 if (ifa == NULL)
1123 if (ifa->ifa_getifa != NULL) {
1125 ifa = (*ifa->ifa_getifa)(ifa, dst);
1126 if (ifa == NULL)
1128 ifa_acquire(ifa, psref);
1130 info->rti_ifa = ifa;
1132 info->rti_ifp = ifa->ifa_ifp;
1133 return ifa;
1147 struct ifaddr *ifa = NULL;
1179 ifa = rt->rt_ifa;
1180 if (ifa->ifa_flags & IFA_ROUTE &&
1181 rt_ifa_connected(rt, ifa)) {
1182 RT_DPRINTF("rt->_rt_key = %p, ifa = %p, "
1184 (void *)rt->_rt_key, (void *)ifa);
1185 ifa->ifa_flags &= ~IFA_ROUTE;
1187 if (ifa->ifa_rtrequest)
1188 ifa->ifa_rtrequest(RTM_DELETE, rt, info);
1189 ifa = NULL;
1215 ifa = rt_getifa(info, &psref_ifa);
1216 if (ifa == NULL)
1219 /* Caller should have a reference of ifa */
1220 ifa = info->rti_ifa;
1245 rt_set_ifa(rt, ifa);
1261 rt->rt_ifp = ifa->ifa_ifp;
1263 rt->rt_ifp = ifa->ifa_ifp;
1267 if (ifa->ifa_rtrequest)
1268 ifa->ifa_rtrequest(req, rt, info);
1274 ifafree(ifa); /* for rt_set_ifa above */
1282 ifa_release(ifa, &psref_ifa);
1283 ifa = NULL;
1313 ifa_release(ifa, &psref_ifa);
1374 struct ifaddr *ifa = NULL;
1378 ifa = ifa_ifwithnet_psref(info->rti_info[RTAX_IFP], psref);
1379 if (ifa == NULL)
1381 if (ifa->ifa_ifp->if_flags & IFF_UNNUMBERED) {
1382 ifa_release(ifa, psref);
1383 ifa = NULL;
1386 *ifp = ifa->ifa_ifp;
1391 ifa_release(ifa, psref);
1394 ifa = ifaof_ifpforaddr_psref(
1397 /* route change <dst> -ifp <if> -ifa <addr> */
1398 ifa = ifa_ifwithaddr_psref(info->rti_info[RTAX_IFA],
1400 if (ifa != NULL)
1402 ifa = ifaof_ifpforaddr_psref(info->rti_info[RTAX_IFA],
1409 /* route change <dst> <gw> -ifa <addr> */
1410 ifa = ifa_ifwithaddr_psref(info->rti_info[RTAX_IFA], psref);
1411 if (ifa != NULL)
1416 ifa = ifa_ifwithroute_psref(rt->rt_flags, rt_getkey(rt),
1420 if (ifa != NULL && *ifp == NULL) {
1421 *ifp = ifa->ifa_ifp;
1424 if (ifa == NULL && *ifp != NULL) {
1428 return ifa;
1436 struct ifaddr *ifa = NULL, *new_ifa;
1453 ifa = rt_getifa(info, &psref_ifa);
1454 if (ifa == NULL) {
1480 ifa_release(ifa, &psref_ifa);
1481 ifa = new_ifa;
1483 if (ifa) {
1485 if (oifa != ifa && !ifa_is_destroying(ifa) &&
1489 rt_replace_ifa(rt, ifa);
1494 ifa_release(ifa, &psref_ifa);
1496 ifa = NULL;
1518 ifa_release(ifa, &psref_ifa);
1616 rtinit(struct ifaddr *ifa, int cmd, int flags)
1625 dst = flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr;
1627 if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) {
1631 rt_maskedcopy(odst, dst, ifa->ifa_netmask);
1634 if (rt->rt_ifa != ifa) {
1643 info.rti_ifa = ifa;
1644 info.rti_flags = flags | ifa->ifa_flags | RTF_DONTCHANGEIFA;
1646 info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
1655 info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
1669 if (cmd == RTM_LLINFO_UPD && ifa->ifa_rtrequest != NULL)
1670 ifa->ifa_rtrequest(RTM_LLINFO_UPD, rt, &info);
1675 KASSERT(rt->rt_ifa == ifa);
1689 rt_ifa_addlocal(struct ifaddr *ifa)
1695 rt = rtalloc1(ifa->ifa_addr, 0);
1708 info.rti_info[RTAX_DST] = ifa->ifa_addr;
1710 (const struct sockaddr *)ifa->ifa_ifp->if_sadl;
1711 info.rti_ifa = ifa;
1714 rt_addrmsg_rt(RTM_ADD, ifa, e, nrt);
1716 KASSERT(nrt->rt_ifa == ifa);
1725 rt_addrmsg(RTM_NEWADDR, ifa);
1737 rt_ifa_remlocal(struct ifaddr *ifa, struct ifaddr *alt_ifa)
1742 rt = rtalloc1(ifa->ifa_addr, 0);
1767 rt_addrmsg(RTM_DELADDR, ifa);
1787 rt_addrmsg(RTM_DELADDR, ifa);
2364 int (*f)(struct rtentry *, void *), void *v, struct ifaddr *ifa)
2390 rt_replace_ifa(rt, ifa);
2401 rt_replace_ifa(rt, ifa);
2463 db_print_ifa(struct ifaddr *ifa)
2465 if (ifa == NULL)
2468 db_print_sa(ifa->ifa_addr);
2470 db_print_sa(ifa->ifa_dstaddr);
2472 db_print_sa(ifa->ifa_netmask);
2474 ifa->ifa_flags,
2475 ifa->ifa_refcnt,
2476 ifa->ifa_metric);
2502 db_printf(" ifa=%p\n", rt->rt_ifa);