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