• Home
  • Raw
  • Download

Lines Matching refs:rt

611 static inline void rt_free(struct rtable *rt)  in rt_free()  argument
613 call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); in rt_free()
616 static inline void rt_drop(struct rtable *rt) in rt_drop() argument
618 ip_rt_put(rt); in rt_drop()
619 call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); in rt_drop()
663 static inline u32 rt_score(struct rtable *rt) in rt_score() argument
665 u32 score = jiffies - rt->u.dst.lastuse; in rt_score()
669 if (rt_valuable(rt)) in rt_score()
672 if (!rt->fl.iif || in rt_score()
673 !(rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST|RTCF_LOCAL))) in rt_score()
1068 static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable **rp) in rt_intern_hash() argument
1085 if (!rt_caching(dev_net(rt->u.dst.dev))) { in rt_intern_hash()
1086 rt_drop(rt); in rt_intern_hash()
1100 if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) { in rt_intern_hash()
1119 rt_drop(rt); in rt_intern_hash()
1146 if (*rthp && compare_hash_inputs(&(*rthp)->fl, &rt->fl)) in rt_intern_hash()
1163 struct net *net = dev_net(rt->u.dst.dev); in rt_intern_hash()
1165 if (!rt_caching(dev_net(rt->u.dst.dev))) { in rt_intern_hash()
1167 rt->u.dst.dev->name, num); in rt_intern_hash()
1169 rt_emergency_hash_rebuild(dev_net(rt->u.dst.dev)); in rt_intern_hash()
1176 if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { in rt_intern_hash()
1177 int err = arp_bind_neighbour(&rt->u.dst); in rt_intern_hash()
1182 rt_drop(rt); in rt_intern_hash()
1203 rt_drop(rt); in rt_intern_hash()
1209 rt->u.dst.rt_next = rthi->u.dst.rt_next; in rt_intern_hash()
1211 rt->u.dst.rt_next = rt_hash_table[hash].chain; in rt_intern_hash()
1214 if (rt->u.dst.rt_next) { in rt_intern_hash()
1216 printk(KERN_DEBUG "rt_cache @%02x: %pI4", hash, &rt->rt_dst); in rt_intern_hash()
1217 for (trt = rt->u.dst.rt_next; trt; trt = trt->u.dst.rt_next) in rt_intern_hash()
1228 rcu_assign_pointer(rthi->u.dst.rt_next, rt); in rt_intern_hash()
1230 rcu_assign_pointer(rt_hash_table[hash].chain, rt); in rt_intern_hash()
1233 *rp = rt; in rt_intern_hash()
1237 void rt_bind_peer(struct rtable *rt, int create) in rt_bind_peer() argument
1242 peer = inet_getpeer(rt->rt_dst, create); in rt_bind_peer()
1245 if (rt->peer == NULL) { in rt_bind_peer()
1246 rt->peer = peer; in rt_bind_peer()
1276 struct rtable *rt = (struct rtable *) dst; in __ip_select_ident() local
1278 if (rt) { in __ip_select_ident()
1279 if (rt->peer == NULL) in __ip_select_ident()
1280 rt_bind_peer(rt, 1); in __ip_select_ident()
1285 if (rt->peer) { in __ip_select_ident()
1286 iph->id = htons(inet_getid(rt->peer, more)); in __ip_select_ident()
1296 static void rt_del(unsigned hash, struct rtable *rt) in rt_del() argument
1302 ip_rt_put(rt); in rt_del()
1304 if (aux == rt || rt_is_expired(aux)) { in rt_del()
1356 struct rtable *rt; in ip_rt_redirect() local
1378 rt = dst_alloc(&ipv4_dst_ops); in ip_rt_redirect()
1379 if (rt == NULL) { in ip_rt_redirect()
1386 *rt = *rth; in ip_rt_redirect()
1387 rt->u.dst.__use = 1; in ip_rt_redirect()
1388 atomic_set(&rt->u.dst.__refcnt, 1); in ip_rt_redirect()
1389 rt->u.dst.child = NULL; in ip_rt_redirect()
1390 if (rt->u.dst.dev) in ip_rt_redirect()
1391 dev_hold(rt->u.dst.dev); in ip_rt_redirect()
1392 if (rt->idev) in ip_rt_redirect()
1393 in_dev_hold(rt->idev); in ip_rt_redirect()
1394 rt->u.dst.obsolete = 0; in ip_rt_redirect()
1395 rt->u.dst.lastuse = jiffies; in ip_rt_redirect()
1396 rt->u.dst.path = &rt->u.dst; in ip_rt_redirect()
1397 rt->u.dst.neighbour = NULL; in ip_rt_redirect()
1398 rt->u.dst.hh = NULL; in ip_rt_redirect()
1400 rt->u.dst.xfrm = NULL; in ip_rt_redirect()
1402 rt->rt_genid = rt_genid(net); in ip_rt_redirect()
1403 rt->rt_flags |= RTCF_REDIRECTED; in ip_rt_redirect()
1406 rt->rt_gateway = new_gw; in ip_rt_redirect()
1411 if (rt->peer) in ip_rt_redirect()
1412 atomic_inc(&rt->peer->refcnt); in ip_rt_redirect()
1414 if (arp_bind_neighbour(&rt->u.dst) || in ip_rt_redirect()
1415 !(rt->u.dst.neighbour->nud_state & in ip_rt_redirect()
1417 if (rt->u.dst.neighbour) in ip_rt_redirect()
1418 neigh_event_send(rt->u.dst.neighbour, NULL); in ip_rt_redirect()
1420 rt_drop(rt); in ip_rt_redirect()
1425 netevent.new = &rt->u.dst; in ip_rt_redirect()
1430 if (!rt_intern_hash(hash, rt, &rt)) in ip_rt_redirect()
1431 ip_rt_put(rt); in ip_rt_redirect()
1455 struct rtable *rt = (struct rtable *)dst; in ipv4_negative_advice() local
1458 if (rt) { in ipv4_negative_advice()
1460 ip_rt_put(rt); in ipv4_negative_advice()
1462 } else if ((rt->rt_flags & RTCF_REDIRECTED) || in ipv4_negative_advice()
1463 rt->u.dst.expires) { in ipv4_negative_advice()
1464 unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, in ipv4_negative_advice()
1465 rt->fl.oif, in ipv4_negative_advice()
1469 &rt->rt_dst, rt->fl.fl4_tos); in ipv4_negative_advice()
1471 rt_del(hash, rt); in ipv4_negative_advice()
1496 struct rtable *rt = skb->rtable; in ip_rt_send_redirect() local
1497 struct in_device *in_dev = in_dev_get(rt->u.dst.dev); in ip_rt_send_redirect()
1508 if (time_after(jiffies, rt->u.dst.rate_last + ip_rt_redirect_silence)) in ip_rt_send_redirect()
1509 rt->u.dst.rate_tokens = 0; in ip_rt_send_redirect()
1514 if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) { in ip_rt_send_redirect()
1515 rt->u.dst.rate_last = jiffies; in ip_rt_send_redirect()
1522 if (rt->u.dst.rate_tokens == 0 || in ip_rt_send_redirect()
1524 (rt->u.dst.rate_last + in ip_rt_send_redirect()
1525 (ip_rt_redirect_load << rt->u.dst.rate_tokens)))) { in ip_rt_send_redirect()
1526 icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway); in ip_rt_send_redirect()
1527 rt->u.dst.rate_last = jiffies; in ip_rt_send_redirect()
1528 ++rt->u.dst.rate_tokens; in ip_rt_send_redirect()
1531 rt->u.dst.rate_tokens == ip_rt_redirect_number && in ip_rt_send_redirect()
1534 &rt->rt_src, rt->rt_iif, in ip_rt_send_redirect()
1535 &rt->rt_dst, &rt->rt_gateway); in ip_rt_send_redirect()
1544 struct rtable *rt = skb->rtable; in ip_error() local
1548 switch (rt->u.dst.error) { in ip_error()
1557 IP_INC_STATS_BH(dev_net(rt->u.dst.dev), in ip_error()
1566 rt->u.dst.rate_tokens += now - rt->u.dst.rate_last; in ip_error()
1567 if (rt->u.dst.rate_tokens > ip_rt_error_burst) in ip_error()
1568 rt->u.dst.rate_tokens = ip_rt_error_burst; in ip_error()
1569 rt->u.dst.rate_last = now; in ip_error()
1570 if (rt->u.dst.rate_tokens >= ip_rt_error_cost) { in ip_error()
1571 rt->u.dst.rate_tokens -= ip_rt_error_cost; in ip_error()
1685 struct rtable *rt = (struct rtable *) dst; in ipv4_dst_destroy() local
1686 struct inet_peer *peer = rt->peer; in ipv4_dst_destroy()
1687 struct in_device *idev = rt->idev; in ipv4_dst_destroy()
1690 rt->peer = NULL; in ipv4_dst_destroy()
1695 rt->idev = NULL; in ipv4_dst_destroy()
1703 struct rtable *rt = (struct rtable *) dst; in ipv4_dst_ifdown() local
1704 struct in_device *idev = rt->idev; in ipv4_dst_ifdown()
1709 rt->idev = loopback_idev; in ipv4_dst_ifdown()
1717 struct rtable *rt; in ipv4_link_failure() local
1721 rt = skb->rtable; in ipv4_link_failure()
1722 if (rt) in ipv4_link_failure()
1723 dst_set_expires(&rt->u.dst, 0); in ipv4_link_failure()
1744 void ip_rt_get_source(u8 *addr, struct rtable *rt) in ip_rt_get_source() argument
1749 if (rt->fl.iif == 0) in ip_rt_get_source()
1750 src = rt->rt_src; in ip_rt_get_source()
1751 else if (fib_lookup(dev_net(rt->u.dst.dev), &rt->fl, &res) == 0) { in ip_rt_get_source()
1755 src = inet_select_addr(rt->u.dst.dev, rt->rt_gateway, in ip_rt_get_source()
1761 static void set_class_tag(struct rtable *rt, u32 tag) in set_class_tag() argument
1763 if (!(rt->u.dst.tclassid & 0xFFFF)) in set_class_tag()
1764 rt->u.dst.tclassid |= tag & 0xFFFF; in set_class_tag()
1765 if (!(rt->u.dst.tclassid & 0xFFFF0000)) in set_class_tag()
1766 rt->u.dst.tclassid |= tag & 0xFFFF0000; in set_class_tag()
1770 static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag) in rt_set_nexthop() argument
1777 rt->rt_gateway = FIB_RES_GW(*res); in rt_set_nexthop()
1778 memcpy(rt->u.dst.metrics, fi->fib_metrics, in rt_set_nexthop()
1779 sizeof(rt->u.dst.metrics)); in rt_set_nexthop()
1781 rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu; in rt_set_nexthop()
1782 if (dst_metric_locked(&rt->u.dst, RTAX_MTU) && in rt_set_nexthop()
1783 rt->rt_gateway != rt->rt_dst && in rt_set_nexthop()
1784 rt->u.dst.dev->mtu > 576) in rt_set_nexthop()
1785 rt->u.dst.metrics[RTAX_MTU-1] = 576; in rt_set_nexthop()
1788 rt->u.dst.tclassid = FIB_RES_NH(*res).nh_tclassid; in rt_set_nexthop()
1791 rt->u.dst.metrics[RTAX_MTU-1]= rt->u.dst.dev->mtu; in rt_set_nexthop()
1793 if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0) in rt_set_nexthop()
1794 rt->u.dst.metrics[RTAX_HOPLIMIT-1] = sysctl_ip_default_ttl; in rt_set_nexthop()
1795 if (dst_mtu(&rt->u.dst) > IP_MAX_MTU) in rt_set_nexthop()
1796 rt->u.dst.metrics[RTAX_MTU-1] = IP_MAX_MTU; in rt_set_nexthop()
1797 if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0) in rt_set_nexthop()
1798 rt->u.dst.metrics[RTAX_ADVMSS-1] = max_t(unsigned int, rt->u.dst.dev->mtu - 40, in rt_set_nexthop()
1800 if (dst_metric(&rt->u.dst, RTAX_ADVMSS) > 65535 - 40) in rt_set_nexthop()
1801 rt->u.dst.metrics[RTAX_ADVMSS-1] = 65535 - 40; in rt_set_nexthop()
1805 set_class_tag(rt, fib_rules_tclass(res)); in rt_set_nexthop()
1807 set_class_tag(rt, itag); in rt_set_nexthop()
1809 rt->rt_type = res->type; in rt_set_nexthop()
2710 struct rtable *rt = (struct rtable *) in ipv4_dst_blackhole() local
2713 if (rt) { in ipv4_dst_blackhole()
2714 struct dst_entry *new = &rt->u.dst; in ipv4_dst_blackhole()
2726 rt->fl = ort->fl; in ipv4_dst_blackhole()
2728 rt->idev = ort->idev; in ipv4_dst_blackhole()
2729 if (rt->idev) in ipv4_dst_blackhole()
2730 in_dev_hold(rt->idev); in ipv4_dst_blackhole()
2731 rt->rt_genid = rt_genid(net); in ipv4_dst_blackhole()
2732 rt->rt_flags = ort->rt_flags; in ipv4_dst_blackhole()
2733 rt->rt_type = ort->rt_type; in ipv4_dst_blackhole()
2734 rt->rt_dst = ort->rt_dst; in ipv4_dst_blackhole()
2735 rt->rt_src = ort->rt_src; in ipv4_dst_blackhole()
2736 rt->rt_iif = ort->rt_iif; in ipv4_dst_blackhole()
2737 rt->rt_gateway = ort->rt_gateway; in ipv4_dst_blackhole()
2738 rt->rt_spec_dst = ort->rt_spec_dst; in ipv4_dst_blackhole()
2739 rt->peer = ort->peer; in ipv4_dst_blackhole()
2740 if (rt->peer) in ipv4_dst_blackhole()
2741 atomic_inc(&rt->peer->refcnt); in ipv4_dst_blackhole()
2747 *rp = rt; in ipv4_dst_blackhole()
2748 return (rt ? 0 : -ENOMEM); in ipv4_dst_blackhole()
2785 struct rtable *rt = skb->rtable; in rt_fill_info() local
2799 r->rtm_tos = rt->fl.fl4_tos; in rt_fill_info()
2802 r->rtm_type = rt->rt_type; in rt_fill_info()
2805 r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; in rt_fill_info()
2806 if (rt->rt_flags & RTCF_NOTIFY) in rt_fill_info()
2809 NLA_PUT_BE32(skb, RTA_DST, rt->rt_dst); in rt_fill_info()
2811 if (rt->fl.fl4_src) { in rt_fill_info()
2813 NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); in rt_fill_info()
2815 if (rt->u.dst.dev) in rt_fill_info()
2816 NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); in rt_fill_info()
2818 if (rt->u.dst.tclassid) in rt_fill_info()
2819 NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); in rt_fill_info()
2821 if (rt->fl.iif) in rt_fill_info()
2822 NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_spec_dst); in rt_fill_info()
2823 else if (rt->rt_src != rt->fl.fl4_src) in rt_fill_info()
2824 NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_src); in rt_fill_info()
2826 if (rt->rt_dst != rt->rt_gateway) in rt_fill_info()
2827 NLA_PUT_BE32(skb, RTA_GATEWAY, rt->rt_gateway); in rt_fill_info()
2829 if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) in rt_fill_info()
2832 error = rt->u.dst.error; in rt_fill_info()
2833 expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0; in rt_fill_info()
2834 if (rt->peer) { in rt_fill_info()
2835 id = rt->peer->ip_id_count; in rt_fill_info()
2836 if (rt->peer->tcp_ts_stamp) { in rt_fill_info()
2837 ts = rt->peer->tcp_ts; in rt_fill_info()
2838 tsage = get_seconds() - rt->peer->tcp_ts_stamp; in rt_fill_info()
2842 if (rt->fl.iif) { in rt_fill_info()
2844 __be32 dst = rt->rt_dst; in rt_fill_info()
2862 NLA_PUT_U32(skb, RTA_IIF, rt->fl.iif); in rt_fill_info()
2865 if (rtnl_put_cacheinfo(skb, &rt->u.dst, id, ts, tsage, in rt_fill_info()
2881 struct rtable *rt = NULL; in inet_rtm_getroute() local
2929 rt = skb->rtable; in inet_rtm_getroute()
2930 if (err == 0 && rt->u.dst.error) in inet_rtm_getroute()
2931 err = -rt->u.dst.error; in inet_rtm_getroute()
2943 err = ip_route_output_key(net, &rt, &fl); in inet_rtm_getroute()
2949 skb->rtable = rt; in inet_rtm_getroute()
2951 rt->rt_flags |= RTCF_NOTIFY; in inet_rtm_getroute()
2969 struct rtable *rt; in ip_rt_dump() local
2984 for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; in ip_rt_dump()
2985 rt = rcu_dereference(rt->u.dst.rt_next), idx++) { in ip_rt_dump()
2986 if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx) in ip_rt_dump()
2988 if (rt_is_expired(rt)) in ip_rt_dump()
2990 skb->dst = dst_clone(&rt->u.dst); in ip_rt_dump()