Lines Matching refs:rrt

554 	struct	riprt *rrt;
557 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
558 if (rrt->rrt_rflags & RRTF_AGGREGATE) {
559 delroute(&rrt->rrt_info, &rrt->rrt_gw);
582 struct riprt *rrt, *rrt_tmp;
588 TAILQ_FOREACH_SAFE(rrt, &riprt_head, rrt_next, rrt_tmp) {
589 if (rrt->rrt_t == 0)
591 else if (rrt->rrt_t < t_holddown) {
592 TAILQ_REMOVE(&riprt_head, rrt, rrt_next);
593 delroute(&rrt->rrt_info, &rrt->rrt_gw);
594 free(rrt);
595 } else if (rrt->rrt_t < t_lifetime)
596 rrt->rrt_info.rip6_metric = HOPCNT_INFINITY6;
805 struct riprt *rrt;
826 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
827 if (rrt->rrt_rflags & RRTF_NOADVERTISE)
830 *np = rrt->rrt_info;
874 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
875 if (rrt->rrt_rflags & RRTF_NOADVERTISE)
879 if (out_filter(rrt, ifcp) == 0)
883 if (tobeadv(rrt, ifcp) == 0)
888 (rrt->rrt_rflags & RRTF_CHANGED) == 0)
892 if (rrt->rrt_index == ifcp->ifc_index &&
893 !IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_gw) &&
894 (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR) == 0) {
895 if (nh == NULL || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw)) {
903 np->rip6_dest = rrt->rrt_gw;
907 nh = &rrt->rrt_gw;
910 } else if (nh && (rrt->rrt_index != ifcp->ifc_index ||
911 !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw) ||
912 rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)) {
927 *np = rrt->rrt_info;
944 out_filter(struct riprt *rrt, struct ifc *ifcp)
957 if (rrt->rrt_info.rip6_plen <= iffp->iff_plen)
959 ia = rrt->rrt_info.rip6_dest;
969 if ((rrt->rrt_rflags & RRTF_AGGREGATE) != 0) {
974 if (rrt->rrt_info.rip6_plen == iffp->iff_plen &&
975 IN6_ARE_ADDR_EQUAL(&rrt->rrt_info.rip6_dest,
993 if (rrt->rrt_info.rip6_plen < iffp->iff_plen)
995 ia = rrt->rrt_info.rip6_dest;
1015 tobeadv(struct riprt *rrt, struct ifc *ifcp)
1019 if (rrt->rrt_flags & RTF_STATIC) {
1021 if (rrt->rrt_flags & (RTF_REJECT | RTF_BLACKHOLE))
1026 if (sflag && rrt->rrt_index != ifcp->ifc_index)
1031 if (hflag == 0 && rrt->rrt_index == ifcp->ifc_index)
1104 struct riprt *rrt;
1344 if ((rrt = rtsearch(np)) != NULL) {
1345 if (rrt->rrt_t == 0)
1347 nq = &rrt->rrt_info;
1349 if (rrt->rrt_index == ifcp->ifc_index &&
1350 IN6_ARE_ADDR_EQUAL(&nh, &rrt->rrt_gw)) {
1355 rrt->rrt_index = ifcp->ifc_index;
1357 delroute(nq, &rrt->rrt_gw);
1358 rrt->rrt_gw = nh;
1360 addroute(rrt, &nh, ifcp);
1362 rrt->rrt_rflags |= RRTF_CHANGED;
1363 rrt->rrt_t = t;
1366 rrt->rrt_index == ifcp->ifc_index &&
1367 IN6_ARE_ADDR_EQUAL(&nh, &rrt->rrt_gw)) {
1370 rrt->rrt_t = t;
1371 rrt->rrt_rflags |= RRTF_CHANGED;
1375 if (rrt->rrt_index == ifcp->ifc_index &&
1376 IN6_ARE_ADDR_EQUAL(&nh, &rrt->rrt_gw)) {
1378 rrt->rrt_t = t;
1379 } else if (rrt->rrt_t < t_half_lifetime) {
1381 rrt->rrt_index = ifcp->ifc_index;
1383 delroute(nq, &rrt->rrt_gw);
1384 rrt->rrt_gw = nh;
1386 addroute(rrt, &nh, ifcp);
1387 rrt->rrt_rflags |= RRTF_CHANGED;
1388 rrt->rrt_t = t;
1397 if ((rrt = MALLOC(struct riprt)) == NULL) {
1401 memset(rrt, 0, sizeof(*rrt));
1402 nq = &rrt->rrt_info;
1404 rrt->rrt_same = NULL;
1405 rrt->rrt_index = ifcp->ifc_index;
1406 rrt->rrt_flags = RTF_UP|RTF_GATEWAY;
1407 rrt->rrt_gw = nh;
1411 rrt->rrt_flags |= RTF_HOST;
1414 addroute(rrt, &nh, ifcp);
1415 rrt->rrt_rflags |= RRTF_CHANGED;
1417 rrt->rrt_t = t;
1420 TAILQ_INSERT_HEAD(&riprt_head, rrt, rrt_next);
1435 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
1436 rrt->rrt_rflags &= ~RRTF_CHANGED;
1479 struct riprt *rrt;
1486 rrt = rtsearch(np);
1487 if (rrt)
1488 np->rip6_metric = rrt->rrt_info.rip6_metric;
1662 struct riprt *rrt;
1674 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
1675 if (rrt->rrt_index == ifcp->ifc_index &&
1676 rrt->rrt_rflags & RRTF_AGGREGATE)
1677 delroute(&rrt->rrt_info, &rrt->rrt_gw);
1701 struct riprt *rrt;
1918 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
1919 rrt->rrt_rflags &= ~RRTF_CHANGED;
1944 struct riprt *rrt = NULL;
1974 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
1975 if (IN6_ARE_ADDR_EQUAL(&rrt->rrt_info.rip6_dest,
1977 && IN6_IS_ADDR_LOOPBACK(&rrt->rrt_gw)) {
1980 rrt->rrt_info.rip6_plen) {
1981 longest = rrt;
1985 rrt = longest;
1986 if (!rrt) {
1991 prefix = rrt->rrt_info.rip6_plen;
2007 if (!rrt && (rrt = rtsearch(&ni6)) == NULL) {
2012 if ((rrt->rrt_flags & RTF_STATIC) == 0) {
2016 if (!IN6_ARE_ADDR_EQUAL(&rrt->rrt_gw, gw)) {
2018 inet6_n2p(&rrt->rrt_gw));
2022 if (rrt->rrt_t == 0 || rrt->rrt_t > t_lifetime) {
2023 rrt->rrt_t = t_lifetime;
2024 rrt->rrt_info.rip6_metric = HOPCNT_INFINITY6;
2042 struct riprt *rrt = NULL;
2076 if ((rrt = rtsearch(&ni6)) != NULL) {
2079 if (rrt->rrt_index == ifcp->ifc_index &&
2080 (IN6_ARE_ADDR_EQUAL(&rrt->rrt_gw, &none) ||
2081 IN6_IS_ADDR_LOOPBACK(&rrt->rrt_gw))) {
2083 if (rrt->rrt_t == 0 || rrt->rrt_t > t_lifetime) {
2084 rrt->rrt_t = t_lifetime;
2085 rrt->rrt_info.rip6_metric = HOPCNT_INFINITY6;
2090 inet6_n2p(&rrt->rrt_info.rip6_dest),
2091 rrt->rrt_info.rip6_plen,
2092 rrt->rrt_index);
2105 if ((rrt = rtsearch(&ni6)) != NULL) {
2106 if (rrt->rrt_index == ifcp->ifc_index &&
2107 IN6_ARE_ADDR_EQUAL(&rrt->rrt_gw,
2110 if (rrt->rrt_t == 0 || rrt->rrt_t > t_lifetime) {
2111 rrt->rrt_t = t_lifetime;
2112 rrt->rrt_info.rip6_metric =
2118 inet6_n2p(&rrt->rrt_info.rip6_dest),
2119 rrt->rrt_info.rip6_plen,
2120 rrt->rrt_index);
2138 struct riprt *rrt = NULL, *search_rrt, *loop_rrt;
2177 if ((rrt = MALLOC(struct riprt)) == NULL)
2179 memset(rrt, 0, sizeof(*rrt));
2180 rrt->rrt_same = NULL;
2181 rrt->rrt_index = ifcp->ifc_index;
2182 rrt->rrt_t = 0; /* don't age */
2183 rrt->rrt_info.rip6_dest = ifac->ifac_addr;
2184 rrt->rrt_info.rip6_tag = htons(routetag & 0xffff);
2185 rrt->rrt_info.rip6_metric = 1 + ifcp->ifc_metric;
2186 rrt->rrt_info.rip6_plen = ifac->ifac_plen;
2187 rrt->rrt_flags = RTF_HOST;
2188 rrt->rrt_rflags |= RRTF_CHANGED;
2189 applyplen(&rrt->rrt_info.rip6_dest, ifac->ifac_plen);
2190 memset(&rrt->rrt_gw, 0, sizeof(struct in6_addr));
2191 rrt->rrt_gw = ifac->ifac_addr;
2192 np = &rrt->rrt_info;
2196 rrt->rrt_info.rip6_metric) {
2207 TAILQ_REMOVE(&riprt_head, rrt, rrt_next);
2208 delroute(&rrt->rrt_info, &rrt->rrt_gw);
2214 TAILQ_INSERT_HEAD(&riprt_head, rrt, rrt_next);
2215 addroute(rrt, &rrt->rrt_gw, ifcp);
2216 rrt = NULL;
2234 if (rrt)
2235 free(rrt);
2249 struct riprt *rrt, *orrt;
2326 if ((rrt = MALLOC(struct riprt)) == NULL) {
2330 memset(rrt, 0, sizeof(*rrt));
2331 rrt->rrt_same = NULL;
2332 rrt->rrt_index = ifcp->ifc_index;
2333 rrt->rrt_t = 0; /* don't age */
2336 rrt->rrt_info.rip6_dest = ifac->ifac_addr;
2337 rrt->rrt_info.rip6_plen = ifac->ifac_plen;
2338 applyplen(&rrt->rrt_info.rip6_dest,
2343 rrt->rrt_info.rip6_dest = ifac->ifac_addr;
2344 rrt->rrt_info.rip6_plen = 128;
2345 rrt->rrt_gw = in6addr_loopback;
2349 rrt->rrt_info.rip6_dest = ifac->ifac_raddr;
2350 rrt->rrt_info.rip6_plen = 128;
2351 rrt->rrt_gw = ifac->ifac_addr;
2355 if (IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_info.rip6_dest) ||
2356 IN6_IS_ADDR_LINKLOCAL(&rrt->rrt_info.rip6_dest)) {
2361 free(rrt);
2365 rrt->rrt_rflags |= RRTF_NOADVERTISE;
2369 rrt->rrt_info.rip6_tag = htons(routetag & 0xffff);
2370 rrt->rrt_info.rip6_metric = 1 + ifcp->ifc_metric;
2371 np = &rrt->rrt_info;
2379 TAILQ_INSERT_HEAD(&riprt_head, rrt, rrt_next);
2380 } else if (rrt->rrt_index != orrt->rrt_index ||
2381 rrt->rrt_info.rip6_metric != orrt->rrt_info.rip6_metric) {
2383 TAILQ_INSERT_BEFORE(orrt, rrt, rrt_next);
2399 free(rrt);
2641 struct riprt *rrt, *orrt;
2701 if ((rrt = MALLOC(struct riprt)) == NULL) {
2705 memset(rrt, 0, sizeof(*rrt));
2706 np = &rrt->rrt_info;
2707 rrt->rrt_same = NULL;
2708 rrt->rrt_t = time(NULL);
2710 rrt->rrt_t = 0; /* Don't age static routes */
2712 rrt->rrt_t = 0; /* Don't age PROTO[123] routes */
2714 rrt->rrt_t = 0; /* Don't age non-gateway host routes */
2719 rrt->rrt_flags = rtm->rtm_flags;
2738 free(rrt);
2743 memset(&rrt->rrt_gw, 0, sizeof(struct in6_addr));
2746 rrt->rrt_gw = sin6_gw->sin6_addr;
2749 rrt->rrt_gw = in6addr_loopback;
2751 memset(&rrt->rrt_gw, 0, sizeof(struct in6_addr));
2755 trace(1, " gw %s", inet6_n2p(&rrt->rrt_gw));
2763 free(rrt);
2767 rrt->rrt_index = ifindex;
2772 if (!IN6_IS_ADDR_LINKLOCAL(&rrt->rrt_gw) &&
2773 !IN6_IS_ADDR_LOOPBACK(&rrt->rrt_gw) &&
2774 (rrt->rrt_flags & RTF_LOCAL) == 0) {
2776 inet6_n2p(&rrt->rrt_gw));
2778 inet6_n2p(&rrt->rrt_info.rip6_dest), ifname);
2779 rrt->rrt_rflags |= RRTF_NH_NOT_LLADDR;
2785 TAILQ_INSERT_BEFORE(orrt, rrt, rrt_next);
2793 TAILQ_INSERT_HEAD(&riprt_head, rrt, rrt_next);
2797 addroute(struct riprt *rrt,
2807 np = &rrt->rrt_info;
2826 rtm->rtm_flags = rrt->rrt_flags;
3098 struct riprt *rrt;
3111 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
3112 if (rrt->rrt_t == 0)
3115 age = t - rrt->rrt_t;
3116 inet_ntop(AF_INET6, (void *)&rrt->rrt_info.rip6_dest,
3119 buf, rrt->rrt_info.rip6_plen, rrt->rrt_index,
3120 index2ifc[rrt->rrt_index]->ifc_name,
3121 inet6_n2p(&rrt->rrt_gw),
3122 rrt->rrt_info.rip6_metric, (long)age);
3123 if (rrt->rrt_info.rip6_tag) {
3125 ntohs(rrt->rrt_info.rip6_tag) & 0xffff);
3127 if (rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)
3129 if (rrt->rrt_rflags & RRTF_NOADVERTISE)
3151 struct riprt *rrt;
3223 rrt = (struct riprt *)malloc(sizeof(struct riprt));
3224 if (rrt == NULL) {
3225 fatal("malloc: rrt");
3228 memset(rrt, 0, sizeof(struct riprt));
3229 rrt->rrt_info.rip6_dest = iff.iff_addr;
3230 rrt->rrt_info.rip6_plen = iff.iff_plen;
3231 rrt->rrt_info.rip6_metric = 1;
3232 rrt->rrt_info.rip6_tag = htons(routetag & 0xffff);
3233 rrt->rrt_gw = in6addr_loopback;
3234 rrt->rrt_flags = RTF_UP | RTF_REJECT;
3235 rrt->rrt_rflags = RRTF_AGGREGATE;
3236 rrt->rrt_t = 0;
3237 rrt->rrt_index = loopifcp->ifc_index;
3239 if (getroute(&rrt->rrt_info, &gw)) {
3245 delroute(&rrt->rrt_info, &gw);
3251 inet6_n2p(&rrt->rrt_info.rip6_dest),
3252 rrt->rrt_info.rip6_plen);
3258 TAILQ_INSERT_HEAD(&riprt_head, rrt, rrt_next);
3265 addroute(rrt, &in6addr_loopback, loopifcp);
3299 struct riprt *rrt;
3301 TAILQ_FOREACH(rrt, &riprt_head, rrt_next) {
3302 if (rrt->rrt_info.rip6_plen == np->rip6_plen &&
3303 IN6_ARE_ADDR_EQUAL(&rrt->rrt_info.rip6_dest,
3308 return (rrt);