• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/net/ipv4/

Lines Matching defs:rth

620 static inline int rt_fast_clean(struct rtable *rth)
624 return (rth->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) &&
625 rth->fl.iif && rth->dst.rt_next;
628 static inline int rt_valuable(struct rtable *rth)
630 return (rth->rt_flags & (RTCF_REDIRECTED | RTCF_NOTIFY)) ||
631 rth->dst.expires;
634 static int rt_may_expire(struct rtable *rth, unsigned long tmo1, unsigned long tmo2)
639 if (atomic_read(&rth->dst.__refcnt))
643 if (rth->dst.expires &&
644 time_after_eq(jiffies, rth->dst.expires))
647 age = jiffies - rth->dst.lastuse;
649 if ((age <= tmo1 && !rt_fast_clean(rth)) ||
650 (age <= tmo2 && rt_valuable(rth)))
706 static inline int rt_is_expired(struct rtable *rth)
708 return rth->rt_genid != rt_genid(dev_net(rth->dst.dev));
719 struct rtable *rth, *next;
725 rth = rt_hash_table[i].chain;
726 if (!rth)
734 rth = rt_hash_table[i].chain;
737 for (tail = rth; tail; tail = tail->dst.rt_next)
740 if (rth != tail)
756 rth = rt_hash_table[i].chain;
762 for (; rth != tail; rth = next) {
763 next = rth->dst.rt_next;
764 rt_free(rth);
785 * Returns ONE if rth has no alias before itself.
787 static int has_noalias(const struct rtable *head, const struct rtable *rth)
791 while (aux != rth) {
792 if (compare_hash_inputs(&aux->fl, &rth->fl))
803 struct rtable *rth, **rthp;
833 while ((rth = *rthp) != NULL) {
834 prefetch(rth->dst.rt_next);
835 if (rt_is_expired(rth)) {
836 *rthp = rth->dst.rt_next;
837 rt_free(rth);
840 if (rth->dst.expires) {
842 if (time_before_eq(jiffies, rth->dst.expires)) {
845 rthp = &rth->dst.rt_next;
854 length += has_noalias(rt_hash_table[i].chain, rth);
857 } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout))
861 *rthp = rth->dst.rt_next;
862 rt_free(rth);
945 struct rtable *rth, **rthp;
998 while ((rth = *rthp) != NULL) {
999 if (!rt_is_expired(rth) &&
1000 !rt_may_expire(rth, tmo, expire)) {
1002 rthp = &rth->dst.rt_next;
1005 *rthp = rth->dst.rt_next;
1006 rt_free(rth);
1067 const struct rtable *rth = head;
1069 while (rth) {
1070 length += has_noalias(head, rth);
1071 rth = rth->dst.rt_next;
1079 struct rtable *rth, **rthp;
1128 while ((rth = *rthp) != NULL) {
1129 if (rt_is_expired(rth)) {
1130 *rthp = rth->dst.rt_next;
1131 rt_free(rth);
1134 if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) {
1136 *rthp = rth->dst.rt_next;
1142 rcu_assign_pointer(rth->dst.rt_next,
1148 rcu_assign_pointer(rt_hash_table[hash].chain, rth);
1150 dst_use(&rth->dst, now);
1155 *rp = rth;
1157 skb_dst_set(skb, &rth->dst);
1161 if (!atomic_read(&rth->dst.__refcnt)) {
1162 u32 score = rt_score(rth);
1165 cand = rth;
1173 rthp = &rth->dst.rt_next;
1353 struct rtable *rth, **rthp;
1388 while ((rth = rcu_dereference(*rthp)) != NULL) {
1391 if (rth->fl.fl4_dst != daddr ||
1392 rth->fl.fl4_src != skeys[i] ||
1393 rth->fl.oif != ikeys[k] ||
1394 rth->fl.iif != 0 ||
1395 rt_is_expired(rth) ||
1396 !net_eq(dev_net(rth->dst.dev), net)) {
1397 rthp = &rth->dst.rt_next;
1401 if (rth->rt_dst != daddr ||
1402 rth->rt_src != saddr ||
1403 rth->dst.error ||
1404 rth->rt_gateway != old_gw ||
1405 rth->dst.dev != dev)
1408 dst_hold(&rth->dst);
1412 ip_rt_put(rth);
1417 *rt = *rth;
1440 dst_confirm(&rth->dst);
1450 ip_rt_put(rth);
1455 netevent.old = &rth->dst;
1460 rt_del(hash, rth);
1635 struct rtable *rth;
1647 for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
1648 rth = rcu_dereference(rth->dst.rt_next)) {
1651 if (rth->fl.fl4_dst != daddr ||
1652 rth->fl.fl4_src != skeys[i] ||
1653 rth->rt_dst != daddr ||
1654 rth->rt_src != iph->saddr ||
1655 rth->fl.oif != ikeys[k] ||
1656 rth->fl.iif != 0 ||
1657 dst_metric_locked(&rth->dst, RTAX_MTU) ||
1658 !net_eq(dev_net(rth->dst.dev), net) ||
1659 rt_is_expired(rth))
1666 old_mtu >= dst_mtu(&rth->dst) &&
1672 if (mtu <= dst_mtu(&rth->dst)) {
1673 if (mtu < dst_mtu(&rth->dst)) {
1674 dst_confirm(&rth->dst);
1677 rth->dst.metrics[RTAX_LOCK-1] |=
1680 rth->dst.metrics[RTAX_MTU-1] = mtu;
1681 dst_set_expires(&rth->dst,
1848 struct rtable *rth;
1873 rth = dst_alloc(&ipv4_dst_ops);
1874 if (!rth)
1877 rth->dst.output = ip_rt_bug;
1878 rth->dst.obsolete = -1;
1880 atomic_set(&rth->dst.__refcnt, 1);
1881 rth->dst.flags= DST_HOST;
1883 rth->dst.flags |= DST_NOPOLICY;
1884 rth->fl.fl4_dst = daddr;
1885 rth->rt_dst = daddr;
1886 rth->fl.fl4_tos = tos;
1887 rth->fl.mark = skb->mark;
1888 rth->fl.fl4_src = saddr;
1889 rth->rt_src = saddr;
1891 rth->dst.tclassid = itag;
1893 rth->rt_iif =
1894 rth->fl.iif = dev->ifindex;
1895 rth->dst.dev = init_net.loopback_dev;
1896 dev_hold(rth->dst.dev);
1897 rth->idev = in_dev_get(rth->dst.dev);
1898 rth->fl.oif = 0;
1899 rth->rt_gateway = daddr;
1900 rth->rt_spec_dst= spec_dst;
1901 rth->rt_genid = rt_genid(dev_net(dev));
1902 rth->rt_flags = RTCF_MULTICAST;
1903 rth->rt_type = RTN_MULTICAST;
1905 rth->dst.input= ip_local_deliver;
1906 rth->rt_flags |= RTCF_LOCAL;
1911 rth->dst.input = ip_mr_input;
1916 return rt_intern_hash(hash, rth, NULL, skb, dev->ifindex);
1964 struct rtable *rth;
2014 rth = dst_alloc(&ipv4_dst_ops);
2015 if (!rth) {
2020 atomic_set(&rth->dst.__refcnt, 1);
2021 rth->dst.flags= DST_HOST;
2023 rth->dst.flags |= DST_NOPOLICY;
2025 rth->dst.flags |= DST_NOXFRM;
2026 rth->fl.fl4_dst = daddr;
2027 rth->rt_dst = daddr;
2028 rth->fl.fl4_tos = tos;
2029 rth->fl.mark = skb->mark;
2030 rth->fl.fl4_src = saddr;
2031 rth->rt_src = saddr;
2032 rth->rt_gateway = daddr;
2033 rth->rt_iif =
2034 rth->fl.iif = in_dev->dev->ifindex;
2035 rth->dst.dev = (out_dev)->dev;
2036 dev_hold(rth->dst.dev);
2037 rth->idev = in_dev_get(rth->dst.dev);
2038 rth->fl.oif = 0;
2039 rth->rt_spec_dst= spec_dst;
2041 rth->dst.obsolete = -1;
2042 rth->dst.input = ip_forward;
2043 rth->dst.output = ip_output;
2044 rth->rt_genid = rt_genid(dev_net(rth->dst.dev));
2046 rt_set_nexthop(rth, res, itag);
2048 rth->rt_flags = flags;
2050 *result = rth;
2062 struct rtable* rth = NULL;
2072 err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth);
2078 rt_genid(dev_net(rth->dst.dev)));
2079 return rt_intern_hash(hash, rth, NULL, skb, fl->iif);
2107 struct rtable * rth;
2197 rth = dst_alloc(&ipv4_dst_ops);
2198 if (!rth)
2201 rth->dst.output= ip_rt_bug;
2202 rth->dst.obsolete = -1;
2203 rth->rt_genid = rt_genid(net);
2205 atomic_set(&rth->dst.__refcnt, 1);
2206 rth->dst.flags= DST_HOST;
2208 rth->dst.flags |= DST_NOPOLICY;
2209 rth->fl.fl4_dst = daddr;
2210 rth->rt_dst = daddr;
2211 rth->fl.fl4_tos = tos;
2212 rth->fl.mark = skb->mark;
2213 rth->fl.fl4_src = saddr;
2214 rth->rt_src = saddr;
2216 rth->dst.tclassid = itag;
2218 rth->rt_iif =
2219 rth->fl.iif = dev->ifindex;
2220 rth->dst.dev = net->loopback_dev;
2221 dev_hold(rth->dst.dev);
2222 rth->idev = in_dev_get(rth->dst.dev);
2223 rth->rt_gateway = daddr;
2224 rth->rt_spec_dst= spec_dst;
2225 rth->dst.input= ip_local_deliver;
2226 rth->rt_flags = flags|RTCF_LOCAL;
2228 rth->dst.input= ip_error;
2229 rth->dst.error= -err;
2230 rth->rt_flags &= ~RTCF_LOCAL;
2232 rth->rt_type = res.type;
2234 err = rt_intern_hash(hash, rth, NULL, skb, fl.iif);
2278 struct rtable * rth;
2294 for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
2295 rth = rcu_dereference(rth->dst.rt_next)) {
2296 if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) |
2297 ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) |
2298 (rth->fl.iif ^ iif) |
2299 rth->fl.oif |
2300 (rth->fl.fl4_tos ^ tos)) == 0 &&
2301 rth->fl.mark == skb->mark &&
2302 net_eq(dev_net(rth->dst.dev), net) &&
2303 !rt_is_expired(rth)) {
2305 dst_use_noref(&rth->dst, jiffies);
2306 skb_dst_set_noref(skb, &rth->dst);
2308 dst_use(&rth->dst, jiffies);
2309 skb_dst_set(skb, &rth->dst);
2365 struct rtable *rth;
2410 rth = dst_alloc(&ipv4_dst_ops);
2411 if (!rth) {
2416 atomic_set(&rth->dst.__refcnt, 1);
2417 rth->dst.flags= DST_HOST;
2419 rth->dst.flags |= DST_NOXFRM;
2421 rth->dst.flags |= DST_NOPOLICY;
2423 rth->fl.fl4_dst = oldflp->fl4_dst;
2424 rth->fl.fl4_tos = tos;
2425 rth->fl.fl4_src = oldflp->fl4_src;
2426 rth->fl.oif = oldflp->oif;
2427 rth->fl.mark = oldflp->mark;
2428 rth->rt_dst = fl->fl4_dst;
2429 rth->rt_src = fl->fl4_src;
2430 rth->rt_iif = oldflp->oif ? : dev_out->ifindex;
2433 rth->dst.dev = dev_out;
2435 rth->idev = in_dev_get(dev_out);
2436 rth->rt_gateway = fl->fl4_dst;
2437 rth->rt_spec_dst= fl->fl4_src;
2439 rth->dst.output=ip_output;
2440 rth->dst.obsolete = -1;
2441 rth->rt_genid = rt_genid(dev_net(dev_out));
2446 rth->dst.input = ip_local_deliver;
2447 rth->rt_spec_dst = fl->fl4_dst;
2450 rth->rt_spec_dst = fl->fl4_src;
2453 rth->dst.output = ip_mc_output;
2460 rth->dst.input = ip_mr_input;
2461 rth->dst.output = ip_mc_output;
2467 rt_set_nexthop(rth, res, 0);
2469 rth->rt_flags = flags;
2471 *result = rth;
2486 struct rtable *rth = NULL;
2487 int err = __mkroute_output(&rth, res, fl, oldflp, dev_out, flags);
2492 err = rt_intern_hash(hash, rth, rp, NULL, oldflp->oif);
2693 struct rtable *rth;
2701 for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth;
2702 rth = rcu_dereference_bh(rth->dst.rt_next)) {
2703 if (rth->fl.fl4_dst == flp->fl4_dst &&
2704 rth->fl.fl4_src == flp->fl4_src &&
2705 rth->fl.iif == 0 &&
2706 rth->fl.oif == flp->oif &&
2707 rth->fl.mark == flp->mark &&
2708 !((rth->fl.fl4_tos ^ flp->fl4_tos) &
2710 net_eq(dev_net(rth->dst.dev), net) &&
2711 !rt_is_expired(rth)) {
2712 dst_use(&rth->dst, jiffies);
2715 *rp = rth;