Lines Matching refs:rt
660 static void mctp_route_release(struct mctp_route *rt) in mctp_route_release() argument
662 if (refcount_dec_and_test(&rt->refs)) { in mctp_route_release()
663 if (rt->dst_type == MCTP_ROUTE_DIRECT) in mctp_route_release()
664 mctp_dev_put(rt->dev); in mctp_route_release()
665 kfree_rcu(rt, rcu); in mctp_route_release()
672 struct mctp_route *rt; in mctp_route_alloc() local
674 rt = kzalloc(sizeof(*rt), GFP_KERNEL); in mctp_route_alloc()
675 if (!rt) in mctp_route_alloc()
678 INIT_LIST_HEAD(&rt->list); in mctp_route_alloc()
679 refcount_set(&rt->refs, 1); in mctp_route_alloc()
680 rt->output = mctp_dst_discard; in mctp_route_alloc()
682 return rt; in mctp_route_alloc()
853 static unsigned int mctp_route_netid(struct mctp_route *rt) in mctp_route_netid() argument
855 return rt->dst_type == MCTP_ROUTE_DIRECT ? in mctp_route_netid()
856 READ_ONCE(rt->dev->net) : rt->gateway.net; in mctp_route_netid()
859 static bool mctp_rt_match_eid(struct mctp_route *rt, in mctp_rt_match_eid() argument
862 return mctp_route_netid(rt) == net && in mctp_rt_match_eid()
863 rt->min <= eid && rt->max >= eid; in mctp_rt_match_eid()
938 struct mctp_route *rt; in mctp_route_lookup_single() local
940 list_for_each_entry_rcu(rt, &net->mctp.routes, list) { in mctp_route_lookup_single()
941 if (mctp_rt_match_eid(rt, dnet, daddr)) in mctp_route_lookup_single()
942 return rt; in mctp_route_lookup_single()
959 struct mctp_route *rt; in mctp_route_lookup() local
961 rt = mctp_route_lookup_single(net, dnet, daddr); in mctp_route_lookup()
962 if (!rt) in mctp_route_lookup()
968 if (mtu && rt->mtu) in mctp_route_lookup()
969 mtu = min(mtu, rt->mtu); in mctp_route_lookup()
971 mtu = mtu ?: rt->mtu; in mctp_route_lookup()
973 if (rt->dst_type == MCTP_ROUTE_DIRECT) { in mctp_route_lookup()
975 mctp_dst_from_route(dst, daddr, mtu, rt); in mctp_route_lookup()
979 } else if (rt->dst_type == MCTP_ROUTE_GATEWAY) { in mctp_route_lookup()
980 daddr = rt->gateway.eid; in mctp_route_lookup()
993 struct mctp_route *rt; in mctp_route_lookup_null() local
997 list_for_each_entry_rcu(rt, &net->mctp.routes, list) { in mctp_route_lookup_null()
998 if (rt->dst_type != MCTP_ROUTE_DIRECT || rt->type != RTN_LOCAL) in mctp_route_lookup_null()
1001 if (rt->dev->dev != dev) in mctp_route_lookup_null()
1004 mctp_dst_from_route(dst, 0, 0, rt); in mctp_route_lookup_null()
1195 static int mctp_route_add(struct net *net, struct mctp_route *rt) in mctp_route_add() argument
1199 if (!mctp_address_unicast(rt->min) || !mctp_address_unicast(rt->max)) in mctp_route_add()
1202 if (rt->dst_type == MCTP_ROUTE_DIRECT && !rt->dev) in mctp_route_add()
1205 if (rt->dst_type == MCTP_ROUTE_GATEWAY && !rt->gateway.eid) in mctp_route_add()
1208 switch (rt->type) { in mctp_route_add()
1210 rt->output = mctp_dst_input; in mctp_route_add()
1213 rt->output = mctp_dst_output; in mctp_route_add()
1223 if (mctp_rt_compare_exact(rt, ert)) { in mctp_route_add()
1228 list_add_rcu(&rt->list, &net->mctp.routes); in mctp_route_add()
1237 struct mctp_route *rt, *tmp; in mctp_route_remove() local
1249 list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) { in mctp_route_remove()
1250 if (mctp_route_netid(rt) == netid && in mctp_route_remove()
1251 rt->min == daddr_start && rt->max == daddr_end && in mctp_route_remove()
1252 rt->type == type) { in mctp_route_remove()
1253 list_del_rcu(&rt->list); in mctp_route_remove()
1255 mctp_route_release(rt); in mctp_route_remove()
1265 struct mctp_route *rt; in mctp_route_add_local() local
1268 rt = mctp_route_alloc(); in mctp_route_add_local()
1269 if (!rt) in mctp_route_add_local()
1272 rt->min = addr; in mctp_route_add_local()
1273 rt->max = addr; in mctp_route_add_local()
1274 rt->dst_type = MCTP_ROUTE_DIRECT; in mctp_route_add_local()
1275 rt->dev = mdev; in mctp_route_add_local()
1276 rt->type = RTN_LOCAL; in mctp_route_add_local()
1278 mctp_dev_hold(rt->dev); in mctp_route_add_local()
1280 rc = mctp_route_add(dev_net(mdev->dev), rt); in mctp_route_add_local()
1282 mctp_route_release(rt); in mctp_route_add_local()
1297 struct mctp_route *rt, *tmp; in mctp_route_remove_dev() local
1300 list_for_each_entry_safe(rt, tmp, &net->mctp.routes, list) { in mctp_route_remove_dev()
1301 if (rt->dst_type == MCTP_ROUTE_DIRECT && rt->dev == mdev) { in mctp_route_remove_dev()
1302 list_del_rcu(&rt->list); in mctp_route_remove_dev()
1304 mctp_route_release(rt); in mctp_route_remove_dev()
1525 struct mctp_route *rt) in mctp_route_nlparse_populate() argument
1560 rt->type = rtm->rtm_type; in mctp_route_nlparse_populate()
1561 rt->min = daddr_start; in mctp_route_nlparse_populate()
1562 rt->max = daddr_start + daddr_extent; in mctp_route_nlparse_populate()
1563 rt->mtu = mtu; in mctp_route_nlparse_populate()
1565 rt->dst_type = MCTP_ROUTE_GATEWAY; in mctp_route_nlparse_populate()
1566 rt->gateway.eid = gw.eid; in mctp_route_nlparse_populate()
1567 rt->gateway.net = gw.net; in mctp_route_nlparse_populate()
1569 rt->dst_type = MCTP_ROUTE_DIRECT; in mctp_route_nlparse_populate()
1570 rt->dev = dev; in mctp_route_nlparse_populate()
1571 mctp_dev_hold(rt->dev); in mctp_route_nlparse_populate()
1581 struct mctp_route *rt; in mctp_newroute() local
1584 rt = mctp_route_alloc(); in mctp_newroute()
1585 if (!rt) in mctp_newroute()
1588 rc = mctp_route_nlparse_populate(net, nlh, extack, rt); in mctp_newroute()
1592 if (rt->dst_type == MCTP_ROUTE_DIRECT && in mctp_newroute()
1593 rt->dev->dev->flags & IFF_LOOPBACK) { in mctp_newroute()
1599 rc = mctp_route_add(net, rt); in mctp_newroute()
1604 mctp_route_release(rt); in mctp_newroute()
1630 static int mctp_fill_rtinfo(struct sk_buff *skb, struct mctp_route *rt, in mctp_fill_rtinfo() argument
1647 hdr->rtm_dst_len = rt->max - rt->min; in mctp_fill_rtinfo()
1652 hdr->rtm_type = rt->type; in mctp_fill_rtinfo()
1654 if (nla_put_u8(skb, RTA_DST, rt->min)) in mctp_fill_rtinfo()
1661 if (rt->mtu) { in mctp_fill_rtinfo()
1662 if (nla_put_u32(skb, RTAX_MTU, rt->mtu)) in mctp_fill_rtinfo()
1668 if (rt->dst_type == MCTP_ROUTE_DIRECT) { in mctp_fill_rtinfo()
1670 if (nla_put_u32(skb, RTA_OIF, rt->dev->dev->ifindex)) in mctp_fill_rtinfo()
1672 } else if (rt->dst_type == MCTP_ROUTE_GATEWAY) { in mctp_fill_rtinfo()
1675 sizeof(rt->gateway), &rt->gateway)) in mctp_fill_rtinfo()
1691 struct mctp_route *rt; in mctp_dump_rtinfo() local
1703 list_for_each_entry_rcu(rt, &net->mctp.routes, list) { in mctp_dump_rtinfo()
1706 if (mctp_fill_rtinfo(skb, rt, in mctp_dump_rtinfo()
1735 struct mctp_route *rt; in mctp_routes_net_exit() local
1738 list_for_each_entry_rcu(rt, &net->mctp.routes, list) in mctp_routes_net_exit()
1739 mctp_route_release(rt); in mctp_routes_net_exit()