Lines Matching refs:mrt
35 void (*table_set)(struct mr_table *mrt, in mr_table_alloc() argument
38 struct mr_table *mrt; in mr_table_alloc() local
41 mrt = kzalloc(sizeof(*mrt), GFP_KERNEL); in mr_table_alloc()
42 if (!mrt) in mr_table_alloc()
44 mrt->id = id; in mr_table_alloc()
45 write_pnet(&mrt->net, net); in mr_table_alloc()
47 mrt->ops = *ops; in mr_table_alloc()
48 err = rhltable_init(&mrt->mfc_hash, mrt->ops.rht_params); in mr_table_alloc()
50 kfree(mrt); in mr_table_alloc()
53 INIT_LIST_HEAD(&mrt->mfc_cache_list); in mr_table_alloc()
54 INIT_LIST_HEAD(&mrt->mfc_unres_queue); in mr_table_alloc()
56 timer_setup(&mrt->ipmr_expire_timer, expire_func, 0); in mr_table_alloc()
58 mrt->mroute_reg_vif_num = -1; in mr_table_alloc()
59 table_set(mrt, net); in mr_table_alloc()
60 return mrt; in mr_table_alloc()
64 void *mr_mfc_find_parent(struct mr_table *mrt, void *hasharg, int parent) in mr_mfc_find_parent() argument
69 list = rhltable_lookup(&mrt->mfc_hash, hasharg, *mrt->ops.rht_params); in mr_mfc_find_parent()
78 void *mr_mfc_find_any_parent(struct mr_table *mrt, int vifi) in mr_mfc_find_any_parent() argument
83 list = rhltable_lookup(&mrt->mfc_hash, mrt->ops.cmparg_any, in mr_mfc_find_any_parent()
84 *mrt->ops.rht_params); in mr_mfc_find_any_parent()
93 void *mr_mfc_find_any(struct mr_table *mrt, int vifi, void *hasharg) in mr_mfc_find_any() argument
98 list = rhltable_lookup(&mrt->mfc_hash, hasharg, *mrt->ops.rht_params); in mr_mfc_find_any()
104 proxy = mr_mfc_find_any_parent(mrt, c->mfc_parent); in mr_mfc_find_any()
109 return mr_mfc_find_any_parent(mrt, vifi); in mr_mfc_find_any()
116 struct mr_table *mrt = iter->mrt; in mr_vif_seq_idx() local
118 for (iter->ct = 0; iter->ct < mrt->maxvif; ++iter->ct) { in mr_vif_seq_idx()
119 if (!VIF_EXISTS(mrt, iter->ct)) in mr_vif_seq_idx()
122 return &mrt->vif_table[iter->ct]; in mr_vif_seq_idx()
132 struct mr_table *mrt = iter->mrt; in mr_vif_seq_next() local
138 while (++iter->ct < mrt->maxvif) { in mr_vif_seq_next()
139 if (!VIF_EXISTS(mrt, iter->ct)) in mr_vif_seq_next()
141 return &mrt->vif_table[iter->ct]; in mr_vif_seq_next()
150 struct mr_table *mrt = it->mrt; in mr_mfc_seq_idx() local
154 it->cache = &mrt->mfc_cache_list; in mr_mfc_seq_idx()
155 list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) in mr_mfc_seq_idx()
161 it->cache = &mrt->mfc_unres_queue; in mr_mfc_seq_idx()
177 struct mr_table *mrt = it->mrt; in mr_mfc_seq_next() local
188 if (it->cache == &mrt->mfc_unres_queue) in mr_mfc_seq_next()
193 it->cache = &mrt->mfc_unres_queue; in mr_mfc_seq_next()
208 int mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in mr_fill_mroute() argument
223 if (VIF_EXISTS(mrt, c->mfc_parent) && in mr_fill_mroute()
225 mrt->vif_table[c->mfc_parent].dev->ifindex) < 0) in mr_fill_mroute()
236 if (VIF_EXISTS(mrt, ct) && c->mfc_un.res.ttls[ct] < 255) { in mr_fill_mroute()
247 vif = &mrt->vif_table[ct]; in mr_fill_mroute()
271 static bool mr_mfc_uses_dev(const struct mr_table *mrt, in mr_mfc_uses_dev() argument
278 if (VIF_EXISTS(mrt, ct) && c->mfc_un.res.ttls[ct] < 255) { in mr_mfc_uses_dev()
281 vif = &mrt->vif_table[ct]; in mr_mfc_uses_dev()
289 int mr_table_dump(struct mr_table *mrt, struct sk_buff *skb, in mr_table_dump() argument
291 int (*fill)(struct mr_table *mrt, struct sk_buff *skb, in mr_table_dump() argument
304 list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) { in mr_table_dump()
308 !mr_mfc_uses_dev(mrt, mfc, filter->dev)) in mr_table_dump()
311 err = fill(mrt, skb, NETLINK_CB(cb->skb).portid, in mr_table_dump()
320 list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) { in mr_table_dump()
324 !mr_mfc_uses_dev(mrt, mfc, filter->dev)) in mr_table_dump()
327 err = fill(mrt, skb, NETLINK_CB(cb->skb).portid, in mr_table_dump()
346 struct mr_table *mrt), in mr_rtm_dumproute() argument
347 int (*fill)(struct mr_table *mrt, in mr_rtm_dumproute() argument
355 struct mr_table *mrt; in mr_rtm_dumproute() local
368 for (mrt = iter(net, NULL); mrt; mrt = iter(net, mrt)) { in mr_rtm_dumproute()
372 err = mr_table_dump(mrt, skb, cb, fill, lock, filter); in mr_rtm_dumproute()
392 struct mr_table *mrt), in mr_dump() argument
396 struct mr_table *mrt; in mr_dump() local
403 for (mrt = mr_iter(net, NULL); mrt; mrt = mr_iter(net, mrt)) { in mr_dump()
404 struct vif_device *v = &mrt->vif_table[0]; in mr_dump()
410 for (vifi = 0; vifi < mrt->maxvif; vifi++, v++) { in mr_dump()
416 v, vifi, mrt->id, extack); in mr_dump()
426 list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) { in mr_dump()
429 mfc, mrt->id, extack); in mr_dump()