Lines Matching refs:dr

382 	struct nd_defrouter *dr = NULL;
491 dr = defrtrlist_update(&dr0);
583 (void)prelist_update(&pr, dr, m, mcast);
707 if (dr)
708 NDDR_REMREF(dr);
820 struct nd_defrouter *dr;
824 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
825 dr = TAILQ_NEXT(dr, dr_entry)) {
826 NDDR_LOCK(dr);
827 if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr)) {
828 NDDR_ADDREF_LOCKED(dr);
829 NDDR_UNLOCK(dr);
830 return(dr);
832 NDDR_UNLOCK(dr);
844 defrouter_delreq(struct nd_defrouter *dr)
854 if (dr->ifp != NULL && !(dr->stateflags & NDDRF_INSTALLED))
857 NDDR_LOCK_ASSERT_HELD(dr);
860 "static=%d\n", dr->ifp != NULL ? if_name(dr->ifp) : "ANY",
861 ip6_sprintf(&dr->rtaddr), (dr->stateflags & NDDRF_IFSCOPE) ? 1 : 0,
862 (dr->stateflags & NDDRF_STATIC) ? 1 : 0));
871 gate.sin6_addr = dr->rtaddr;
873 if (dr->ifp != NULL) {
874 ifscope = (dr->stateflags & NDDRF_IFSCOPE) ?
875 dr->ifp->if_index : IFSCOPE_NONE;
891 ip6_sprintf(&gate.sin6_addr), dr->ifp != NULL ?
892 if_name(dr->ifp) : "ANY", (ifscope != IFSCOPE_NONE), err));
896 dr->stateflags &= ~NDDRF_INSTALLED;
898 dr->stateflags &= ~NDDRF_IFSCOPE;
900 dr->err = 0;
910 struct nd_defrouter *dr, drany;
914 dr = TAILQ_FIRST(&nd_defrouter);
915 while (dr) {
916 NDDR_LOCK(dr);
917 if (dr->stateflags & NDDRF_INSTALLED) {
918 NDDR_ADDREF_LOCKED(dr);
919 NDDR_UNLOCK(dr);
921 NDDR_LOCK(dr);
922 defrouter_delreq(dr);
923 NDDR_UNLOCK(dr);
925 NDDR_REMREF(dr);
926 dr = TAILQ_FIRST(&nd_defrouter);
928 NDDR_UNLOCK(dr);
929 dr = TAILQ_NEXT(dr, dr_entry);
1024 defrtrlist_del(struct nd_defrouter *dr)
1028 struct ifnet *ifp = dr->ifp;
1038 NDDR_ADDREF(dr);
1040 rt6_flush(&dr->rtaddr, ifp);
1042 NDDR_REMREF(dr);
1045 if (!ip6_doscopedroute && dr == TAILQ_FIRST(&nd_defrouter))
1046 deldr = dr; /* The router is primary. */
1048 TAILQ_REMOVE(&nd_defrouter, dr, dr_entry);
1051 nd6log2((LOG_INFO, "%s: freeing defrouter %s\n", if_name(dr->ifp),
1052 ip6_sprintf(&dr->rtaddr)));
1057 NDDR_ADDREF(dr);
1059 NDDR_LOCK(dr);
1060 defrouter_delreq(dr);
1061 NDDR_UNLOCK(dr);
1063 NDDR_REMREF(dr);
1072 if ((pfxrtr = pfxrtr_lookup(pr, dr)) != NULL)
1098 NDDR_REMREF(dr); /* remove list reference */
1104 struct nd_defrouter *dr;
1114 dr = defrouter_lookup(&new->rtaddr, new->ifp);
1115 if (dr != NULL && !(dr->stateflags & NDDRF_STATIC)) {
1118 if (dr != NULL)
1119 NDDR_REMREF(dr);
1120 dr = defrtrlist_update(new);
1121 if (dr != NULL)
1122 err = dr->err;
1126 if (dr != NULL)
1127 NDDR_REMREF(dr);
1136 struct nd_defrouter *dr;
1139 dr = defrouter_lookup(&new->rtaddr, new->ifp);
1140 if (dr == NULL || !(dr->stateflags & NDDRF_STATIC)) {
1141 if (dr != NULL)
1142 NDDR_REMREF(dr);
1143 dr = NULL;
1145 defrtrlist_del(dr);
1146 NDDR_REMREF(dr);
1150 return (dr != NULL ? 0 : EINVAL);
1158 rtpref(struct nd_defrouter *dr)
1160 switch (dr->flags & ND_RA_FLAG_RTPREF_MASK) {
1174 log(LOG_ERR, "rtpref: impossible RA flag %x\n", dr->flags);
1214 struct nd_defrouter *dr, *selected_dr = NULL, *installed_dr = NULL;
1266 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
1267 dr = TAILQ_NEXT(dr, dr_entry)) {
1275 NDDR_LOCK(dr);
1276 rtaddr = *(&dr->rtaddr);
1277 drifp = dr->ifp;
1280 NDDR_ADDREF_LOCKED(dr); /* for this for loop */
1281 NDDR_UNLOCK(dr);
1293 selected_dr = dr;
1304 NDDR_LOCK(dr);
1306 (selected_dr == NULL || rtpref(dr) > rtpref(selected_dr) ||
1307 (rtpref(dr) == rtpref(selected_dr) &&
1308 (dr->stateflags & NDDRF_STATIC) &&
1315 selected_dr = dr;
1319 if (!(dr->stateflags & NDDRF_INSTALLED)) {
1326 (dr->stateflags & NDDRF_STATIC))) {
1327 dr->genid = -1;
1332 (dr->stateflags & NDDRF_IFSCOPE) ? 1 : 0,
1333 (dr->stateflags & NDDRF_STATIC) ? 1 : 0));
1335 NDDR_UNLOCK(dr);
1336 NDDR_REMREF(dr); /* for this for loop */
1343 if (!ip6_doscopedroute || !(dr->stateflags & NDDRF_IFSCOPE)) {
1345 installed_dr = dr;
1354 NDDR_UNLOCK(dr);
1355 NDDR_REMREF(dr); /* for this for loop */
1369 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
1370 dr = TAILQ_NEXT(dr, dr_entry)) {
1376 NDDR_LOCK(dr);
1379 if ((dr->stateflags & NDDRF_INSTALLED) || dr->genid == -1) {
1380 NDDR_UNLOCK(dr);
1387 if (_dr != dr)
1389 if (_dr == dr || _dr->ifp != dr->ifp) {
1390 if (_dr != dr)
1397 if (_dr != dr)
1401 if (_dr != dr)
1406 if (_dr == NULL && dr->ifp != NULL &&
1407 !(dr->ifp->if_eflags & IFEF_IPV6_ROUTER)) {
1408 dr->genid = -1;
1411 "static=%d (unreachable)\n", if_name(dr->ifp),
1412 ip6_sprintf(&dr->rtaddr),
1413 (dr->stateflags & NDDRF_STATIC) ? 1 : 0));
1415 NDDR_UNLOCK(dr);
1418 dr = selected_dr;
1419 if (dr != NULL) {
1421 "static=%d [round 1]\n", if_name(dr->ifp),
1422 ip6_sprintf(&dr->rtaddr),
1423 (dr->stateflags & NDDRF_STATIC) ? 1 : 0));
1512 dr = selected_dr;
1513 VERIFY(dr != NULL || ip6_doscopedroute);
1515 if (dr == NULL)
1518 if (dr != installed_dr) {
1520 "installed router %s\n", if_name(dr->ifp),
1521 ip6_sprintf(&dr->rtaddr), installed_dr != NULL ?
1525 if_name(dr->ifp), ip6_sprintf(&dr->rtaddr)));
1527 if (!ip6_doscopedroute && installed_dr != dr) {
1529 * No need to ADDREF dr because at this point
1530 * dr points to selected_dr, which already holds
1539 NDDR_LOCK(dr);
1540 defrouter_addreq(dr, FALSE);
1541 NDDR_UNLOCK(dr);
1553 if (dr != NULL) {
1555 "static=%d [round 2]\n", if_name(dr->ifp),
1556 ip6_sprintf(&dr->rtaddr),
1557 (dr->stateflags & NDDRF_STATIC) ? 1 : 0));
1562 * dr->genid
1571 TAILQ_FOREACH(dr, &nd_defrouter, dr_entry) {
1572 NDDR_LOCK(dr);
1573 VERIFY((dr->stateflags & NDDRF_PROCESSED) == 0);
1574 NDDR_UNLOCK(dr);
1577 dr = TAILQ_FIRST(&nd_defrouter);
1578 while (dr) {
1579 NDDR_LOCK(dr);
1580 if (!(dr->stateflags & NDDRF_INSTALLED) ||
1581 dr->stateflags & NDDRF_PROCESSED) {
1582 NDDR_UNLOCK(dr);
1583 dr = TAILQ_NEXT(dr, dr_entry);
1586 dr->stateflags |= NDDRF_PROCESSED;
1589 if ((dr == selected_dr && (dr->stateflags & NDDRF_IFSCOPE)) ||
1590 (dr != selected_dr && !(dr->stateflags & NDDRF_IFSCOPE))) {
1591 NDDR_ADDREF_LOCKED(dr);
1592 NDDR_UNLOCK(dr);
1594 NDDR_LOCK(dr);
1595 defrouter_delreq(dr);
1596 NDDR_UNLOCK(dr);
1598 NDDR_LOCK(dr);
1599 if (dr && dr != installed_dr0)
1600 dr->genid = -1;
1601 NDDR_UNLOCK(dr);
1602 NDDR_REMREF(dr);
1606 dr = TAILQ_FIRST(&nd_defrouter);
1609 NDDR_UNLOCK(dr);
1610 dr = TAILQ_NEXT(dr, dr_entry);
1617 TAILQ_FOREACH(dr, &nd_defrouter, dr_entry) {
1618 NDDR_LOCK(dr);
1619 dr->stateflags &= ~NDDRF_PROCESSED;
1620 NDDR_UNLOCK(dr);
1623 dr = TAILQ_FIRST(&nd_defrouter);
1624 while (dr) {
1627 NDDR_LOCK(dr);
1628 if (dr->stateflags & NDDRF_PROCESSED ||
1629 dr->genid != -1) {
1630 NDDR_UNLOCK(dr);
1631 dr = TAILQ_NEXT(dr, dr_entry);
1634 dr->stateflags |= NDDRF_PROCESSED;
1639 if (_dr == dr)
1643 * _dr == dr.
1646 if (_dr->ifp == dr->ifp && rtpref(_dr) >= rtpref(dr) &&
1656 if (_dr != NULL && rtpref(_dr) == rtpref(dr) &&
1658 (dr->stateflags & NDDRF_STATIC)) {
1668 if (_dr == NULL && !(dr->stateflags & NDDRF_INSTALLED)) {
1669 NDDR_ADDREF_LOCKED(dr);
1670 NDDR_UNLOCK(dr);
1672 NDDR_LOCK(dr);
1673 defrouter_addreq(dr, (selected_dr == NULL ||
1674 dr->ifp != selected_dr->ifp));
1675 dr->genid = nd6_defrouter_genid;
1676 NDDR_UNLOCK(dr);
1678 NDDR_REMREF(dr);
1682 dr = TAILQ_FIRST(&nd_defrouter);
1685 NDDR_UNLOCK(dr);
1686 dr = TAILQ_NEXT(dr, dr_entry);
1689 TAILQ_FOREACH(dr, &nd_defrouter, dr_entry) {
1690 NDDR_LOCK(dr);
1691 dr->stateflags &= ~NDDRF_PROCESSED;
1692 NDDR_UNLOCK(dr);
1712 struct nd_defrouter *dr, *n;
1718 if ((dr = defrouter_lookup(&new->rtaddr, ifp)) != NULL) {
1721 defrtrlist_del(dr);
1722 NDDR_REMREF(dr);
1723 dr = NULL;
1725 int oldpref = rtpref(dr);
1728 dr->flags = new->flags; /* xxx flag check */
1729 dr->rtlifetime = new->rtlifetime;
1730 dr->expire = new->expire;
1744 return (dr);
1753 if (n != dr && rtpref(n) == oldpref &&
1763 !(dr->stateflags & NDDRF_IFSCOPE)))
1764 return (dr);
1766 return (dr);
1778 TAILQ_REMOVE(&nd_defrouter, dr, dr_entry);
1779 new->stateflags = dr->stateflags;
1782 n = dr;
1785 return (dr);
1788 VERIFY(dr == NULL);
1851 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
1852 dr = TAILQ_NEXT(dr, dr_entry)) {
1853 if (rtpref(n) > rtpref(dr) ||
1854 (ip6_doscopedroute && !scoped && rtpref(n) == rtpref(dr)))
1857 if (dr)
1858 TAILQ_INSERT_BEFORE(dr, n, dr_entry);
1870 struct nd_defrouter *dr;
1873 dr = defrtrlist_update_common(new,
1876 return (dr);
1882 struct nd_defrouter *dr, new;
1891 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
1892 dr = TAILQ_NEXT(dr, dr_entry)) {
1893 NDDR_LOCK(dr);
1894 if (dr->ifp == ifp && (dr->stateflags & NDDRF_INSTALLED))
1896 NDDR_UNLOCK(dr);
1899 if (dr == NULL) {
1902 memcpy(&new.rtaddr, &dr->rtaddr, sizeof(new.rtaddr));
1903 new.flags = dr->flags;
1904 new.stateflags = dr->stateflags;
1906 new.rtlifetime = dr->rtlifetime;
1907 new.expire = dr->expire;
1908 new.ifp = dr->ifp;
1909 new.genid = dr->genid;
1910 new.err = dr->err;
1911 NDDR_UNLOCK(dr);
1912 dr = defrtrlist_update_common(&new, FALSE);
1913 if (dr)
1914 NDDR_REMREF(dr);
1919 pfxrtr_lookup(struct nd_prefix *pr, struct nd_defrouter *dr)
1928 if (search->router == dr)
1936 pfxrtr_add(struct nd_prefix *pr, struct nd_defrouter *dr)
1947 new->router = dr;
2056 nd6_prelist_add(struct nd_prefix *pr, struct nd_defrouter *dr,
2154 if (dr) {
2155 pfxrtr_add(new, dr);
2253 struct nd_defrouter *dr, /* may be NULL */
2324 if (dr && pfxrtr_lookup(pr, dr) == NULL) {
2326 pfxrtr_add(pr, dr);
2343 error = nd6_prelist_add(new, dr, &newpr, FALSE);
2646 struct nd_defrouter *dr;
2648 dr = (how == M_WAITOK) ? zalloc(nddr_zone) : zalloc_noblock(nddr_zone);
2649 if (dr != NULL) {
2650 bzero(dr, nddr_size);
2651 lck_mtx_init(&dr->nddr_lock, ifa_mtx_grp, ifa_mtx_attr);
2652 dr->nddr_debug |= IFD_ALLOC;
2654 dr->nddr_debug |= IFD_DEBUG;
2655 dr->nddr_trace = nddr_trace;
2658 return (dr);
2662 nddr_free(struct nd_defrouter *dr)
2664 NDDR_LOCK(dr);
2665 if (dr->nddr_debug & IFD_ATTACHED) {
2666 panic("%s: attached nddr %p is being freed", __func__, dr);
2668 } else if (!(dr->nddr_debug & IFD_ALLOC)) {
2669 panic("%s: nddr %p cannot be freed", __func__, dr);
2672 dr->nddr_debug &= ~IFD_ALLOC;
2673 NDDR_UNLOCK(dr);
2675 lck_mtx_destroy(&dr->nddr_lock, ifa_mtx_grp);
2676 zfree(nddr_zone, dr);
2680 nddr_trace(struct nd_defrouter *dr, int refhold)
2682 struct nd_defrouter_dbg *dr_dbg = (struct nd_defrouter_dbg *)dr;
2687 if (!(dr->nddr_debug & IFD_DEBUG)) {
2688 panic("%s: nddr %p has no debug structure", __func__, dr);
2939 struct nd_defrouter *dr;
2995 for (dr = TAILQ_FIRST(&nd_defrouter); dr;
2996 dr = TAILQ_NEXT(dr, dr_entry)) {
3002 if ((pfxrtr = pfxrtr_lookup(pr0, dr)) != NULL) {