• Home
  • Raw
  • Download

Lines Matching refs:rt

146 static inline void dnrt_free(struct dn_route *rt)  in dnrt_free()  argument
148 call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); in dnrt_free()
151 static inline void dnrt_drop(struct dn_route *rt) in dnrt_drop() argument
153 dst_release(&rt->u.dst); in dnrt_drop()
154 call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); in dnrt_drop()
160 struct dn_route *rt, **rtp; in dn_dst_check_expire() local
168 while((rt=*rtp) != NULL) { in dn_dst_check_expire()
169 if (atomic_read(&rt->u.dst.__refcnt) || in dn_dst_check_expire()
170 (now - rt->u.dst.lastuse) < expire) { in dn_dst_check_expire()
171 rtp = &rt->u.dst.dn_next; in dn_dst_check_expire()
174 *rtp = rt->u.dst.dn_next; in dn_dst_check_expire()
175 rt->u.dst.dn_next = NULL; in dn_dst_check_expire()
176 dnrt_free(rt); in dn_dst_check_expire()
189 struct dn_route *rt, **rtp; in dn_dst_gc() local
199 while((rt=*rtp) != NULL) { in dn_dst_gc()
200 if (atomic_read(&rt->u.dst.__refcnt) || in dn_dst_gc()
201 (now - rt->u.dst.lastuse) < expire) { in dn_dst_gc()
202 rtp = &rt->u.dst.dn_next; in dn_dst_gc()
205 *rtp = rt->u.dst.dn_next; in dn_dst_gc()
206 rt->u.dst.dn_next = NULL; in dn_dst_gc()
207 dnrt_drop(rt); in dn_dst_gc()
279 static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route **rp) in dn_insert_route() argument
288 if (compare_keys(&rth->fl, &rt->fl)) { in dn_insert_route()
298 dnrt_drop(rt); in dn_insert_route()
305 rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain); in dn_insert_route()
306 rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); in dn_insert_route()
308 dst_use(&rt->u.dst, now); in dn_insert_route()
310 *rp = rt; in dn_insert_route()
317 struct dn_route *rt, *next; in dn_run_flush() local
322 if ((rt = xchg(&dn_rt_hash_table[i].chain, NULL)) == NULL) in dn_run_flush()
325 for(; rt; rt=next) { in dn_run_flush()
326 next = rt->u.dst.dn_next; in dn_run_flush()
327 rt->u.dst.dn_next = NULL; in dn_run_flush()
328 dst_free((struct dst_entry *)rt); in dn_run_flush()
686 struct dn_route *rt = (struct dn_route *)dst; in dn_output() local
698 cb->src = rt->rt_saddr; in dn_output()
699 cb->dst = rt->rt_daddr; in dn_output()
726 struct dn_route *rt; in dn_forward() local
737 rt = (struct dn_route *)skb->dst; in dn_forward()
739 if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) in dn_forward()
748 skb->dev = rt->u.dst.dev; in dn_forward()
756 if (rt->rt_flags & RTCF_DOREDIRECT) in dn_forward()
784 static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) in dn_rt_set_next_hop() argument
787 struct net_device *dev = rt->u.dst.dev; in dn_rt_set_next_hop()
794 rt->rt_gateway = DN_FIB_RES_GW(*res); in dn_rt_set_next_hop()
795 memcpy(rt->u.dst.metrics, fi->fib_metrics, in dn_rt_set_next_hop()
796 sizeof(rt->u.dst.metrics)); in dn_rt_set_next_hop()
798 rt->rt_type = res->type; in dn_rt_set_next_hop()
800 if (dev != NULL && rt->u.dst.neighbour == NULL) { in dn_rt_set_next_hop()
801 n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev); in dn_rt_set_next_hop()
804 rt->u.dst.neighbour = n; in dn_rt_set_next_hop()
807 if (dst_metric(&rt->u.dst, RTAX_MTU) == 0 || in dn_rt_set_next_hop()
808 dst_metric(&rt->u.dst, RTAX_MTU) > rt->u.dst.dev->mtu) in dn_rt_set_next_hop()
809 rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu; in dn_rt_set_next_hop()
810 mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->u.dst)); in dn_rt_set_next_hop()
811 if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0 || in dn_rt_set_next_hop()
812 dst_metric(&rt->u.dst, RTAX_ADVMSS) > mss) in dn_rt_set_next_hop()
813 rt->u.dst.metrics[RTAX_ADVMSS-1] = mss; in dn_rt_set_next_hop()
876 struct dn_route *rt = NULL; in dn_route_output_slow() local
1087 rt = dst_alloc(&dn_dst_ops); in dn_route_output_slow()
1088 if (rt == NULL) in dn_route_output_slow()
1091 atomic_set(&rt->u.dst.__refcnt, 1); in dn_route_output_slow()
1092 rt->u.dst.flags = DST_HOST; in dn_route_output_slow()
1094 rt->fl.fld_src = oldflp->fld_src; in dn_route_output_slow()
1095 rt->fl.fld_dst = oldflp->fld_dst; in dn_route_output_slow()
1096 rt->fl.oif = oldflp->oif; in dn_route_output_slow()
1097 rt->fl.iif = 0; in dn_route_output_slow()
1098 rt->fl.mark = oldflp->mark; in dn_route_output_slow()
1100 rt->rt_saddr = fl.fld_src; in dn_route_output_slow()
1101 rt->rt_daddr = fl.fld_dst; in dn_route_output_slow()
1102 rt->rt_gateway = gateway ? gateway : fl.fld_dst; in dn_route_output_slow()
1103 rt->rt_local_src = fl.fld_src; in dn_route_output_slow()
1105 rt->rt_dst_map = fl.fld_dst; in dn_route_output_slow()
1106 rt->rt_src_map = fl.fld_src; in dn_route_output_slow()
1108 rt->u.dst.dev = dev_out; in dn_route_output_slow()
1110 rt->u.dst.neighbour = neigh; in dn_route_output_slow()
1113 rt->u.dst.lastuse = jiffies; in dn_route_output_slow()
1114 rt->u.dst.output = dn_output; in dn_route_output_slow()
1115 rt->u.dst.input = dn_rt_bug; in dn_route_output_slow()
1116 rt->rt_flags = flags; in dn_route_output_slow()
1118 rt->u.dst.input = dn_nsp_rx; in dn_route_output_slow()
1120 err = dn_rt_set_next_hop(rt, &res); in dn_route_output_slow()
1124 hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); in dn_route_output_slow()
1125 dn_insert_route(rt, hash, (struct dn_route **)pprt); in dn_route_output_slow()
1147 dst_free(&rt->u.dst); in dn_route_output_slow()
1158 struct dn_route *rt = NULL; in __dn_route_output_key() local
1162 for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt; in __dn_route_output_key()
1163 rt = rcu_dereference(rt->u.dst.dn_next)) { in __dn_route_output_key()
1164 if ((flp->fld_dst == rt->fl.fld_dst) && in __dn_route_output_key()
1165 (flp->fld_src == rt->fl.fld_src) && in __dn_route_output_key()
1166 (flp->mark == rt->fl.mark) && in __dn_route_output_key()
1167 (rt->fl.iif == 0) && in __dn_route_output_key()
1168 (rt->fl.oif == flp->oif)) { in __dn_route_output_key()
1169 dst_use(&rt->u.dst, jiffies); in __dn_route_output_key()
1171 *pprt = &rt->u.dst; in __dn_route_output_key()
1206 struct dn_route *rt = NULL; in dn_route_input_slow() local
1350 rt = dst_alloc(&dn_dst_ops); in dn_route_input_slow()
1351 if (rt == NULL) in dn_route_input_slow()
1354 rt->rt_saddr = fl.fld_src; in dn_route_input_slow()
1355 rt->rt_daddr = fl.fld_dst; in dn_route_input_slow()
1356 rt->rt_gateway = fl.fld_dst; in dn_route_input_slow()
1358 rt->rt_gateway = gateway; in dn_route_input_slow()
1359 rt->rt_local_src = local_src ? local_src : rt->rt_saddr; in dn_route_input_slow()
1361 rt->rt_dst_map = fl.fld_dst; in dn_route_input_slow()
1362 rt->rt_src_map = fl.fld_src; in dn_route_input_slow()
1364 rt->fl.fld_src = cb->src; in dn_route_input_slow()
1365 rt->fl.fld_dst = cb->dst; in dn_route_input_slow()
1366 rt->fl.oif = 0; in dn_route_input_slow()
1367 rt->fl.iif = in_dev->ifindex; in dn_route_input_slow()
1368 rt->fl.mark = fl.mark; in dn_route_input_slow()
1370 rt->u.dst.flags = DST_HOST; in dn_route_input_slow()
1371 rt->u.dst.neighbour = neigh; in dn_route_input_slow()
1372 rt->u.dst.dev = out_dev; in dn_route_input_slow()
1373 rt->u.dst.lastuse = jiffies; in dn_route_input_slow()
1374 rt->u.dst.output = dn_rt_bug; in dn_route_input_slow()
1377 rt->u.dst.input = dn_forward; in dn_route_input_slow()
1380 rt->u.dst.output = dn_output; in dn_route_input_slow()
1381 rt->u.dst.input = dn_nsp_rx; in dn_route_input_slow()
1382 rt->u.dst.dev = in_dev; in dn_route_input_slow()
1388 rt->u.dst.input = dst_discard; in dn_route_input_slow()
1390 rt->rt_flags = flags; in dn_route_input_slow()
1391 if (rt->u.dst.dev) in dn_route_input_slow()
1392 dev_hold(rt->u.dst.dev); in dn_route_input_slow()
1394 err = dn_rt_set_next_hop(rt, &res); in dn_route_input_slow()
1398 hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); in dn_route_input_slow()
1399 dn_insert_route(rt, hash, (struct dn_route **)&skb->dst); in dn_route_input_slow()
1421 dst_free(&rt->u.dst); in dn_route_input_slow()
1427 struct dn_route *rt; in dn_route_input() local
1435 for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL; in dn_route_input()
1436 rt = rcu_dereference(rt->u.dst.dn_next)) { in dn_route_input()
1437 if ((rt->fl.fld_src == cb->src) && in dn_route_input()
1438 (rt->fl.fld_dst == cb->dst) && in dn_route_input()
1439 (rt->fl.oif == 0) && in dn_route_input()
1440 (rt->fl.mark == skb->mark) && in dn_route_input()
1441 (rt->fl.iif == cb->iif)) { in dn_route_input()
1442 dst_use(&rt->u.dst, jiffies); in dn_route_input()
1444 skb->dst = (struct dst_entry *)rt; in dn_route_input()
1456 struct dn_route *rt = (struct dn_route *)skb->dst; in dn_rt_fill_info() local
1470 r->rtm_type = rt->rt_type; in dn_rt_fill_info()
1471 r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; in dn_rt_fill_info()
1474 if (rt->rt_flags & RTCF_NOTIFY) in dn_rt_fill_info()
1476 RTA_PUT(skb, RTA_DST, 2, &rt->rt_daddr); in dn_rt_fill_info()
1477 if (rt->fl.fld_src) { in dn_rt_fill_info()
1479 RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src); in dn_rt_fill_info()
1481 if (rt->u.dst.dev) in dn_rt_fill_info()
1482 RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->u.dst.dev->ifindex); in dn_rt_fill_info()
1488 RTA_PUT(skb, RTA_PREFSRC, 2, &rt->rt_local_src); in dn_rt_fill_info()
1489 if (rt->rt_daddr != rt->rt_gateway) in dn_rt_fill_info()
1490 RTA_PUT(skb, RTA_GATEWAY, 2, &rt->rt_gateway); in dn_rt_fill_info()
1491 if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) in dn_rt_fill_info()
1493 expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0; in dn_rt_fill_info()
1494 if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, expires, in dn_rt_fill_info()
1495 rt->u.dst.error) < 0) in dn_rt_fill_info()
1497 if (rt->fl.iif) in dn_rt_fill_info()
1498 RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif); in dn_rt_fill_info()
1517 struct dn_route *rt = NULL; in dn_cache_getroute() local
1561 rt = (struct dn_route *)skb->dst; in dn_cache_getroute()
1562 if (!err && -rt->u.dst.error) in dn_cache_getroute()
1563 err = rt->u.dst.error; in dn_cache_getroute()
1569 err = dn_route_output_key((struct dst_entry **)&rt, &fl, 0); in dn_cache_getroute()
1577 skb->dst = &rt->u.dst; in dn_cache_getroute()
1579 rt->rt_flags |= RTCF_NOTIFY; in dn_cache_getroute()
1604 struct dn_route *rt; in dn_cache_dump() local
1624 for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0; in dn_cache_dump()
1625 rt; in dn_cache_dump()
1626 rt = rcu_dereference(rt->u.dst.dn_next), idx++) { in dn_cache_dump()
1629 skb->dst = dst_clone(&rt->u.dst); in dn_cache_dump()
1655 struct dn_route *rt = NULL; in dn_rt_cache_get_first() local
1660 rt = dn_rt_hash_table[s->bucket].chain; in dn_rt_cache_get_first()
1661 if (rt) in dn_rt_cache_get_first()
1665 return rcu_dereference(rt); in dn_rt_cache_get_first()
1668 static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) in dn_rt_cache_get_next() argument
1672 rt = rt->u.dst.dn_next; in dn_rt_cache_get_next()
1673 while(!rt) { in dn_rt_cache_get_next()
1678 rt = dn_rt_hash_table[s->bucket].chain; in dn_rt_cache_get_next()
1680 return rcu_dereference(rt); in dn_rt_cache_get_next()
1685 struct dn_route *rt = dn_rt_cache_get_first(seq); in dn_rt_cache_seq_start() local
1687 if (rt) { in dn_rt_cache_seq_start()
1688 while(*pos && (rt = dn_rt_cache_get_next(seq, rt))) in dn_rt_cache_seq_start()
1691 return *pos ? NULL : rt; in dn_rt_cache_seq_start()
1696 struct dn_route *rt = dn_rt_cache_get_next(seq, v); in dn_rt_cache_seq_next() local
1698 return rt; in dn_rt_cache_seq_next()
1709 struct dn_route *rt = v; in dn_rt_cache_seq_show() local
1713 rt->u.dst.dev ? rt->u.dst.dev->name : "*", in dn_rt_cache_seq_show()
1714 dn_addr2asc(le16_to_cpu(rt->rt_daddr), buf1), in dn_rt_cache_seq_show()
1715 dn_addr2asc(le16_to_cpu(rt->rt_saddr), buf2), in dn_rt_cache_seq_show()
1716 atomic_read(&rt->u.dst.__refcnt), in dn_rt_cache_seq_show()
1717 rt->u.dst.__use, in dn_rt_cache_seq_show()
1718 (int) dst_metric(&rt->u.dst, RTAX_RTT)); in dn_rt_cache_seq_show()