Lines Matching full:rt
482 static unsigned int mctp_route_mtu(struct mctp_route *rt) in mctp_route_mtu() argument
484 return rt->mtu ?: READ_ONCE(rt->dev->dev->mtu); in mctp_route_mtu()
535 static void mctp_route_release(struct mctp_route *rt) in mctp_route_release() argument
537 if (refcount_dec_and_test(&rt->refs)) { in mctp_route_release()
538 mctp_dev_put(rt->dev); in mctp_route_release()
539 kfree_rcu(rt, rcu); in mctp_route_release()
546 struct mctp_route *rt; in mctp_route_alloc() local
548 rt = kzalloc(sizeof(*rt), GFP_KERNEL); in mctp_route_alloc()
549 if (!rt) in mctp_route_alloc()
552 INIT_LIST_HEAD(&rt->list); in mctp_route_alloc()
553 refcount_set(&rt->refs, 1); in mctp_route_alloc()
554 rt->output = mctp_route_discard; in mctp_route_alloc()
556 return rt; in mctp_route_alloc()
710 static bool mctp_rt_match_eid(struct mctp_route *rt, in mctp_rt_match_eid() argument
713 return READ_ONCE(rt->dev->net) == net && in mctp_rt_match_eid()
714 rt->min <= eid && rt->max >= eid; in mctp_rt_match_eid()
730 struct mctp_route *tmp, *rt = NULL; in mctp_route_lookup() local
736 rt = tmp; in mctp_route_lookup()
742 return rt; in mctp_route_lookup()
748 struct mctp_route *rt; in mctp_route_lookup_null() local
750 list_for_each_entry_rcu(rt, &net->mctp.routes, list) { in mctp_route_lookup_null()
751 if (rt->dev->dev == dev && rt->type == RTN_LOCAL && in mctp_route_lookup_null()
752 refcount_inc_not_zero(&rt->refs)) in mctp_route_lookup_null()
753 return rt; in mctp_route_lookup_null()
759 static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb, in mctp_do_fragment_route() argument
829 rc = rt->output(rt, skb2); in mctp_do_fragment_route()
841 int mctp_local_output(struct sock *sk, struct mctp_route *rt, in mctp_local_output() argument
858 if (rt) { in mctp_local_output()
860 if (WARN_ON(!rt->dev)) in mctp_local_output()
867 rt = &tmp_rt; in mctp_local_output()
875 rt->dev = __mctp_dev_get(dev); in mctp_local_output()
878 if (!rt->dev) in mctp_local_output()
884 rt->output = mctp_route_output; in mctp_local_output()
885 rt->mtu = 0; in mctp_local_output()
891 spin_lock_irqsave(&rt->dev->addrs_lock, flags); in mctp_local_output()
892 if (rt->dev->num_addrs == 0) { in mctp_local_output()
896 saddr = rt->dev->addrs[0]; in mctp_local_output()
899 spin_unlock_irqrestore(&rt->dev->addrs_lock, flags); in mctp_local_output()
930 skb->dev = rt->dev->dev; in mctp_local_output()
941 mtu = mctp_route_mtu(rt); in mctp_local_output()
946 rc = rt->output(rt, skb); in mctp_local_output()
948 rc = mctp_do_fragment_route(rt, skb, mtu, tag); in mctp_local_output()
953 mctp_route_release(rt); in mctp_local_output()
965 int (*rtfn)(struct mctp_route *rt, struct sk_buff *skb); in mctp_route_add()
967 struct mctp_route *rt, *ert; in mctp_route_add() local
986 rt = mctp_route_alloc(); in mctp_route_add()
987 if (!rt) in mctp_route_add()
990 rt->min = daddr_start; in mctp_route_add()
991 rt->max = daddr_start + daddr_extent; in mctp_route_add()
992 rt->mtu = mtu; in mctp_route_add()
993 rt->dev = mdev; in mctp_route_add()
994 mctp_dev_hold(rt->dev); in mctp_route_add()
995 rt->type = type; in mctp_route_add()
996 rt->output = rtfn; in mctp_route_add()
1001 if (mctp_rt_compare_exact(rt, ert)) { in mctp_route_add()
1002 mctp_route_release(rt); in mctp_route_add()
1007 list_add_rcu(&rt->list, &net->mctp.routes); in mctp_route_add()
1016 struct mctp_route *rt, *tmp; in mctp_route_remove() local
1028 list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) { in mctp_route_remove()
1029 if (rt->dev == mdev && in mctp_route_remove()
1030 rt->min == daddr_start && rt->max == daddr_end && in mctp_route_remove()
1031 rt->type == type) { in mctp_route_remove()
1032 list_del_rcu(&rt->list); in mctp_route_remove()
1034 mctp_route_release(rt); in mctp_route_remove()
1056 struct mctp_route *rt, *tmp; in mctp_route_remove_dev() local
1059 list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) { in mctp_route_remove_dev()
1060 if (rt->dev == mdev) { in mctp_route_remove_dev()
1061 list_del_rcu(&rt->list); in mctp_route_remove_dev()
1063 mctp_route_release(rt); in mctp_route_remove_dev()
1077 struct mctp_route *rt; in mctp_pkttype_receive() local
1120 rt = mctp_route_lookup(net, cb->net, mh->dest); in mctp_pkttype_receive()
1123 if (!rt && mh->dest == MCTP_ADDR_NULL && skb->pkt_type == PACKET_HOST) in mctp_pkttype_receive()
1124 rt = mctp_route_lookup_null(net, dev); in mctp_pkttype_receive()
1126 if (!rt) in mctp_pkttype_receive()
1129 rt->output(rt, skb); in mctp_pkttype_receive()
1130 mctp_route_release(rt); in mctp_pkttype_receive()
1274 static int mctp_fill_rtinfo(struct sk_buff *skb, struct mctp_route *rt, in mctp_fill_rtinfo() argument
1291 hdr->rtm_dst_len = rt->max - rt->min; in mctp_fill_rtinfo()
1297 hdr->rtm_type = rt->type; in mctp_fill_rtinfo()
1299 if (nla_put_u8(skb, RTA_DST, rt->min)) in mctp_fill_rtinfo()
1306 if (rt->mtu) { in mctp_fill_rtinfo()
1307 if (nla_put_u32(skb, RTAX_MTU, rt->mtu)) in mctp_fill_rtinfo()
1313 if (rt->dev) { in mctp_fill_rtinfo()
1314 if (nla_put_u32(skb, RTA_OIF, rt->dev->dev->ifindex)) in mctp_fill_rtinfo()
1332 struct mctp_route *rt; in mctp_dump_rtinfo() local
1344 list_for_each_entry_rcu(rt, &net->mctp.routes, list) { in mctp_dump_rtinfo()
1347 if (mctp_fill_rtinfo(skb, rt, in mctp_dump_rtinfo()
1376 struct mctp_route *rt; in mctp_routes_net_exit() local
1379 list_for_each_entry_rcu(rt, &net->mctp.routes, list) in mctp_routes_net_exit()
1380 mctp_route_release(rt); in mctp_routes_net_exit()