Lines Matching refs:mrt

80 	struct mr6_table	*mrt;  member
109 static void ip6mr_free_table(struct mr6_table *mrt);
111 static void ip6_mr_forward(struct net *net, struct mr6_table *mrt,
113 static int ip6mr_cache_report(struct mr6_table *mrt, struct sk_buff *pkt,
115 static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
117 static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,
121 static void mroute_clean_tables(struct mr6_table *mrt, bool all);
125 #define ip6mr_for_each_table(mrt, net) \ argument
126 list_for_each_entry_rcu(mrt, &net->ipv6.mr6_tables, list)
130 struct mr6_table *mrt; in ip6mr_get_table() local
132 ip6mr_for_each_table(mrt, net) { in ip6mr_get_table()
133 if (mrt->id == id) in ip6mr_get_table()
134 return mrt; in ip6mr_get_table()
140 struct mr6_table **mrt) in ip6mr_fib_lookup() argument
153 *mrt = res.mrt; in ip6mr_fib_lookup()
161 struct mr6_table *mrt; in ip6mr_rule_action() local
175 mrt = ip6mr_get_table(rule->fr_net, rule->table); in ip6mr_rule_action()
176 if (!mrt) in ip6mr_rule_action()
178 res->mrt = mrt; in ip6mr_rule_action()
230 struct mr6_table *mrt; in ip6mr_rules_init() local
239 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT); in ip6mr_rules_init()
240 if (!mrt) { in ip6mr_rules_init()
253 ip6mr_free_table(mrt); in ip6mr_rules_init()
261 struct mr6_table *mrt, *next; in ip6mr_rules_exit() local
264 list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) { in ip6mr_rules_exit()
265 list_del(&mrt->list); in ip6mr_rules_exit()
266 ip6mr_free_table(mrt); in ip6mr_rules_exit()
272 #define ip6mr_for_each_table(mrt, net) \ argument
273 for (mrt = net->ipv6.mrt6; mrt; mrt = NULL)
281 struct mr6_table **mrt) in ip6mr_fib_lookup() argument
283 *mrt = net->ipv6.mrt6; in ip6mr_fib_lookup()
304 struct mr6_table *mrt; in ip6mr_new_table() local
307 mrt = ip6mr_get_table(net, id); in ip6mr_new_table()
308 if (mrt) in ip6mr_new_table()
309 return mrt; in ip6mr_new_table()
311 mrt = kzalloc(sizeof(*mrt), GFP_KERNEL); in ip6mr_new_table()
312 if (!mrt) in ip6mr_new_table()
314 mrt->id = id; in ip6mr_new_table()
315 write_pnet(&mrt->net, net); in ip6mr_new_table()
319 INIT_LIST_HEAD(&mrt->mfc6_cache_array[i]); in ip6mr_new_table()
321 INIT_LIST_HEAD(&mrt->mfc6_unres_queue); in ip6mr_new_table()
323 setup_timer(&mrt->ipmr_expire_timer, ipmr_expire_process, in ip6mr_new_table()
324 (unsigned long)mrt); in ip6mr_new_table()
327 mrt->mroute_reg_vif_num = -1; in ip6mr_new_table()
330 list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables); in ip6mr_new_table()
332 return mrt; in ip6mr_new_table()
335 static void ip6mr_free_table(struct mr6_table *mrt) in ip6mr_free_table() argument
337 del_timer_sync(&mrt->ipmr_expire_timer); in ip6mr_free_table()
338 mroute_clean_tables(mrt, true); in ip6mr_free_table()
339 kfree(mrt); in ip6mr_free_table()
346 struct mr6_table *mrt; member
355 struct mr6_table *mrt = it->mrt; in ipmr_mfc_seq_idx() local
360 it->cache = &mrt->mfc6_cache_array[it->ct]; in ipmr_mfc_seq_idx()
368 it->cache = &mrt->mfc6_unres_queue; in ipmr_mfc_seq_idx()
384 struct mr6_table *mrt; member
392 struct mr6_table *mrt = iter->mrt; in ip6mr_vif_seq_idx() local
394 for (iter->ct = 0; iter->ct < mrt->maxvif; ++iter->ct) { in ip6mr_vif_seq_idx()
395 if (!MIF_EXISTS(mrt, iter->ct)) in ip6mr_vif_seq_idx()
398 return &mrt->vif6_table[iter->ct]; in ip6mr_vif_seq_idx()
408 struct mr6_table *mrt; in ip6mr_vif_seq_start() local
410 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ip6mr_vif_seq_start()
411 if (!mrt) in ip6mr_vif_seq_start()
414 iter->mrt = mrt; in ip6mr_vif_seq_start()
425 struct mr6_table *mrt = iter->mrt; in ip6mr_vif_seq_next() local
431 while (++iter->ct < mrt->maxvif) { in ip6mr_vif_seq_next()
432 if (!MIF_EXISTS(mrt, iter->ct)) in ip6mr_vif_seq_next()
434 return &mrt->vif6_table[iter->ct]; in ip6mr_vif_seq_next()
448 struct mr6_table *mrt = iter->mrt; in ip6mr_vif_seq_show() local
459 vif - mrt->vif6_table, in ip6mr_vif_seq_show()
492 struct mr6_table *mrt; in ipmr_mfc_seq_start() local
494 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ipmr_mfc_seq_start()
495 if (!mrt) in ipmr_mfc_seq_start()
498 it->mrt = mrt; in ipmr_mfc_seq_start()
508 struct mr6_table *mrt = it->mrt; in ipmr_mfc_seq_next() local
518 if (it->cache == &mrt->mfc6_unres_queue) in ipmr_mfc_seq_next()
521 BUG_ON(it->cache != &mrt->mfc6_cache_array[it->ct]); in ipmr_mfc_seq_next()
524 it->cache = &mrt->mfc6_cache_array[it->ct]; in ipmr_mfc_seq_next()
532 it->cache = &mrt->mfc6_unres_queue; in ipmr_mfc_seq_next()
549 struct mr6_table *mrt = it->mrt; in ipmr_mfc_seq_stop() local
551 if (it->cache == &mrt->mfc6_unres_queue) in ipmr_mfc_seq_stop()
553 else if (it->cache == &mrt->mfc6_cache_array[it->ct]) in ipmr_mfc_seq_stop()
569 struct mr6_table *mrt = it->mrt; in ipmr_mfc_seq_show() local
575 if (it->cache != &mrt->mfc6_unres_queue) { in ipmr_mfc_seq_show()
582 if (MIF_EXISTS(mrt, n) && in ipmr_mfc_seq_show()
629 struct mr6_table *mrt; in pim6_rcv() local
657 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in pim6_rcv()
659 reg_vif_num = mrt->mroute_reg_vif_num; in pim6_rcv()
663 reg_dev = mrt->vif6_table[reg_vif_num].dev; in pim6_rcv()
698 struct mr6_table *mrt; in reg_vif_xmit() local
706 err = ip6mr_fib_lookup(net, &fl6, &mrt); in reg_vif_xmit()
715 ip6mr_cache_report(mrt, skb, mrt->mroute_reg_vif_num, MRT6MSG_WHOLEPKT); in reg_vif_xmit()
741 static struct net_device *ip6mr_reg_vif(struct net *net, struct mr6_table *mrt) in ip6mr_reg_vif() argument
746 if (mrt->id == RT6_TABLE_DFLT) in ip6mr_reg_vif()
749 sprintf(name, "pim6reg%u", mrt->id); in ip6mr_reg_vif()
782 static int mif6_delete(struct mr6_table *mrt, int vifi, struct list_head *head) in mif6_delete() argument
788 if (vifi < 0 || vifi >= mrt->maxvif) in mif6_delete()
791 v = &mrt->vif6_table[vifi]; in mif6_delete()
803 if (vifi == mrt->mroute_reg_vif_num) in mif6_delete()
804 mrt->mroute_reg_vif_num = -1; in mif6_delete()
807 if (vifi + 1 == mrt->maxvif) { in mif6_delete()
810 if (MIF_EXISTS(mrt, tmp)) in mif6_delete()
813 mrt->maxvif = tmp + 1; in mif6_delete()
844 static void ip6mr_destroy_unres(struct mr6_table *mrt, struct mfc6_cache *c) in ip6mr_destroy_unres() argument
846 struct net *net = read_pnet(&mrt->net); in ip6mr_destroy_unres()
849 atomic_dec(&mrt->cache_resolve_queue_len); in ip6mr_destroy_unres()
869 static void ipmr_do_expire_process(struct mr6_table *mrt) in ipmr_do_expire_process() argument
875 list_for_each_entry_safe(c, next, &mrt->mfc6_unres_queue, list) { in ipmr_do_expire_process()
885 mr6_netlink_event(mrt, c, RTM_DELROUTE); in ipmr_do_expire_process()
886 ip6mr_destroy_unres(mrt, c); in ipmr_do_expire_process()
889 if (!list_empty(&mrt->mfc6_unres_queue)) in ipmr_do_expire_process()
890 mod_timer(&mrt->ipmr_expire_timer, jiffies + expires); in ipmr_do_expire_process()
895 struct mr6_table *mrt = (struct mr6_table *)arg; in ipmr_expire_process() local
898 mod_timer(&mrt->ipmr_expire_timer, jiffies + 1); in ipmr_expire_process()
902 if (!list_empty(&mrt->mfc6_unres_queue)) in ipmr_expire_process()
903 ipmr_do_expire_process(mrt); in ipmr_expire_process()
910 static void ip6mr_update_thresholds(struct mr6_table *mrt, struct mfc6_cache *cache, in ip6mr_update_thresholds() argument
919 for (vifi = 0; vifi < mrt->maxvif; vifi++) { in ip6mr_update_thresholds()
920 if (MIF_EXISTS(mrt, vifi) && in ip6mr_update_thresholds()
931 static int mif6_add(struct net *net, struct mr6_table *mrt, in mif6_add() argument
935 struct mif_device *v = &mrt->vif6_table[vifi]; in mif6_add()
941 if (MIF_EXISTS(mrt, vifi)) in mif6_add()
951 if (mrt->mroute_reg_vif_num >= 0) in mif6_add()
953 dev = ip6mr_reg_vif(net, mrt); in mif6_add()
1007 mrt->mroute_reg_vif_num = vifi; in mif6_add()
1009 if (vifi + 1 > mrt->maxvif) in mif6_add()
1010 mrt->maxvif = vifi + 1; in mif6_add()
1015 static struct mfc6_cache *ip6mr_cache_find(struct mr6_table *mrt, in ip6mr_cache_find() argument
1022 list_for_each_entry(c, &mrt->mfc6_cache_array[line], list) { in ip6mr_cache_find()
1031 static struct mfc6_cache *ip6mr_cache_find_any_parent(struct mr6_table *mrt, in ip6mr_cache_find_any_parent() argument
1037 list_for_each_entry(c, &mrt->mfc6_cache_array[line], list) in ip6mr_cache_find_any_parent()
1047 static struct mfc6_cache *ip6mr_cache_find_any(struct mr6_table *mrt, in ip6mr_cache_find_any() argument
1057 list_for_each_entry(c, &mrt->mfc6_cache_array[line], list) in ip6mr_cache_find_any()
1064 proxy = ip6mr_cache_find_any_parent(mrt, in ip6mr_cache_find_any()
1071 return ip6mr_cache_find_any_parent(mrt, mifi); in ip6mr_cache_find_any()
1100 static void ip6mr_cache_resolve(struct net *net, struct mr6_table *mrt, in ip6mr_cache_resolve() argument
1113 if (__ip6mr_fill_mroute(mrt, skb, c, nlmsg_data(nlh)) > 0) { in ip6mr_cache_resolve()
1123 ip6_mr_forward(net, mrt, skb, c); in ip6mr_cache_resolve()
1134 static int ip6mr_cache_report(struct mr6_table *mrt, struct sk_buff *pkt, in ip6mr_cache_report() argument
1171 msg->im6_mif = mrt->mroute_reg_vif_num; in ip6mr_cache_report()
1206 if (!mrt->mroute6_sk) { in ip6mr_cache_report()
1214 ret = sock_queue_rcv_skb(mrt->mroute6_sk, skb); in ip6mr_cache_report()
1228 ip6mr_cache_unresolved(struct mr6_table *mrt, mifi_t mifi, struct sk_buff *skb) in ip6mr_cache_unresolved() argument
1235 list_for_each_entry(c, &mrt->mfc6_unres_queue, list) { in ip6mr_cache_unresolved()
1248 if (atomic_read(&mrt->cache_resolve_queue_len) >= 10 || in ip6mr_cache_unresolved()
1266 err = ip6mr_cache_report(mrt, skb, mifi, MRT6MSG_NOCACHE); in ip6mr_cache_unresolved()
1278 atomic_inc(&mrt->cache_resolve_queue_len); in ip6mr_cache_unresolved()
1279 list_add(&c->list, &mrt->mfc6_unres_queue); in ip6mr_cache_unresolved()
1280 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_cache_unresolved()
1282 ipmr_do_expire_process(mrt); in ip6mr_cache_unresolved()
1304 static int ip6mr_mfc_delete(struct mr6_table *mrt, struct mf6cctl *mfc, in ip6mr_mfc_delete() argument
1312 list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[line], list) { in ip6mr_mfc_delete()
1321 mr6_netlink_event(mrt, c, RTM_DELROUTE); in ip6mr_mfc_delete()
1334 struct mr6_table *mrt; in ip6mr_device_event() local
1342 ip6mr_for_each_table(mrt, net) { in ip6mr_device_event()
1343 v = &mrt->vif6_table[0]; in ip6mr_device_event()
1344 for (ct = 0; ct < mrt->maxvif; ct++, v++) { in ip6mr_device_event()
1346 mif6_delete(mrt, ct, &list); in ip6mr_device_event()
1454 static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt, in ip6mr_mfc_add() argument
1475 list_for_each_entry(c, &mrt->mfc6_cache_array[line], list) { in ip6mr_mfc_add()
1488 ip6mr_update_thresholds(mrt, c, ttls); in ip6mr_mfc_add()
1492 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_mfc_add()
1507 ip6mr_update_thresholds(mrt, c, ttls); in ip6mr_mfc_add()
1512 list_add(&c->list, &mrt->mfc6_cache_array[line]); in ip6mr_mfc_add()
1521 list_for_each_entry(uc, &mrt->mfc6_unres_queue, list) { in ip6mr_mfc_add()
1525 atomic_dec(&mrt->cache_resolve_queue_len); in ip6mr_mfc_add()
1530 if (list_empty(&mrt->mfc6_unres_queue)) in ip6mr_mfc_add()
1531 del_timer(&mrt->ipmr_expire_timer); in ip6mr_mfc_add()
1535 ip6mr_cache_resolve(net, mrt, uc, c); in ip6mr_mfc_add()
1538 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_mfc_add()
1546 static void mroute_clean_tables(struct mr6_table *mrt, bool all) in mroute_clean_tables() argument
1555 for (i = 0; i < mrt->maxvif; i++) { in mroute_clean_tables()
1556 if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC)) in mroute_clean_tables()
1558 mif6_delete(mrt, i, &list); in mroute_clean_tables()
1566 list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) { in mroute_clean_tables()
1573 mr6_netlink_event(mrt, c, RTM_DELROUTE); in mroute_clean_tables()
1578 if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { in mroute_clean_tables()
1580 list_for_each_entry_safe(c, next, &mrt->mfc6_unres_queue, list) { in mroute_clean_tables()
1582 mr6_netlink_event(mrt, c, RTM_DELROUTE); in mroute_clean_tables()
1583 ip6mr_destroy_unres(mrt, c); in mroute_clean_tables()
1589 static int ip6mr_sk_init(struct mr6_table *mrt, struct sock *sk) in ip6mr_sk_init() argument
1596 if (likely(mrt->mroute6_sk == NULL)) { in ip6mr_sk_init()
1597 mrt->mroute6_sk = sk; in ip6mr_sk_init()
1616 struct mr6_table *mrt; in ip6mr_sk_done() local
1619 ip6mr_for_each_table(mrt, net) { in ip6mr_sk_done()
1620 if (sk == mrt->mroute6_sk) { in ip6mr_sk_done()
1622 mrt->mroute6_sk = NULL; in ip6mr_sk_done()
1630 mroute_clean_tables(mrt, false); in ip6mr_sk_done()
1642 struct mr6_table *mrt; in mroute6_socket() local
1649 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in mroute6_socket()
1652 return mrt->mroute6_sk; in mroute6_socket()
1669 struct mr6_table *mrt; in ip6_mroute_setsockopt() local
1671 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_setsockopt()
1672 if (!mrt) in ip6_mroute_setsockopt()
1676 if (sk != mrt->mroute6_sk && !ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip6_mroute_setsockopt()
1688 return ip6mr_sk_init(mrt, sk); in ip6_mroute_setsockopt()
1701 ret = mif6_add(net, mrt, &vif, sk == mrt->mroute6_sk); in ip6_mroute_setsockopt()
1711 ret = mif6_delete(mrt, mifi, NULL); in ip6_mroute_setsockopt()
1732 ret = ip6mr_mfc_delete(mrt, &mfc, parent); in ip6_mroute_setsockopt()
1734 ret = ip6mr_mfc_add(net, mrt, &mfc, in ip6_mroute_setsockopt()
1735 sk == mrt->mroute6_sk, parent); in ip6_mroute_setsockopt()
1750 mrt->mroute_do_assert = v; in ip6_mroute_setsockopt()
1766 if (v != mrt->mroute_do_pim) { in ip6_mroute_setsockopt()
1767 mrt->mroute_do_pim = v; in ip6_mroute_setsockopt()
1768 mrt->mroute_do_assert = v; in ip6_mroute_setsockopt()
1787 if (sk == mrt->mroute6_sk) in ip6_mroute_setsockopt()
1818 struct mr6_table *mrt; in ip6_mroute_getsockopt() local
1820 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_getsockopt()
1821 if (!mrt) in ip6_mroute_getsockopt()
1830 val = mrt->mroute_do_pim; in ip6_mroute_getsockopt()
1834 val = mrt->mroute_do_assert; in ip6_mroute_getsockopt()
1865 struct mr6_table *mrt; in ip6mr_ioctl() local
1867 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_ioctl()
1868 if (!mrt) in ip6mr_ioctl()
1875 if (vr.mifi >= mrt->maxvif) in ip6mr_ioctl()
1878 vif = &mrt->vif6_table[vr.mifi]; in ip6mr_ioctl()
1879 if (MIF_EXISTS(mrt, vr.mifi)) { in ip6mr_ioctl()
1897 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr); in ip6mr_ioctl()
1939 struct mr6_table *mrt; in ip6mr_compat_ioctl() local
1941 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_compat_ioctl()
1942 if (!mrt) in ip6mr_compat_ioctl()
1949 if (vr.mifi >= mrt->maxvif) in ip6mr_compat_ioctl()
1952 vif = &mrt->vif6_table[vr.mifi]; in ip6mr_compat_ioctl()
1953 if (MIF_EXISTS(mrt, vr.mifi)) { in ip6mr_compat_ioctl()
1971 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr); in ip6mr_compat_ioctl()
2003 static int ip6mr_forward2(struct net *net, struct mr6_table *mrt, in ip6mr_forward2() argument
2007 struct mif_device *vif = &mrt->vif6_table[vifi]; in ip6mr_forward2()
2021 ip6mr_cache_report(mrt, skb, vifi, MRT6MSG_WHOLEPKT); in ip6mr_forward2()
2077 static int ip6mr_find_vif(struct mr6_table *mrt, struct net_device *dev) in ip6mr_find_vif() argument
2081 for (ct = mrt->maxvif - 1; ct >= 0; ct--) { in ip6mr_find_vif()
2082 if (mrt->vif6_table[ct].dev == dev) in ip6mr_find_vif()
2088 static void ip6_mr_forward(struct net *net, struct mr6_table *mrt, in ip6_mr_forward() argument
2093 int true_vifi = ip6mr_find_vif(mrt, skb->dev); in ip6_mr_forward()
2105 cache_proxy = ip6mr_cache_find_any_parent(mrt, vif); in ip6_mr_forward()
2114 if (mrt->vif6_table[vif].dev != skb->dev) { in ip6_mr_forward()
2117 if (true_vifi >= 0 && mrt->mroute_do_assert && in ip6_mr_forward()
2123 (mrt->mroute_do_pim || in ip6_mr_forward()
2128 ip6mr_cache_report(mrt, skb, true_vifi, MRT6MSG_WRONGMIF); in ip6_mr_forward()
2134 mrt->vif6_table[vif].pkt_in++; in ip6_mr_forward()
2135 mrt->vif6_table[vif].bytes_in += skb->len; in ip6_mr_forward()
2162 ip6mr_forward2(net, mrt, skb2, cache, psend); in ip6_mr_forward()
2169 ip6mr_forward2(net, mrt, skb, cache, psend); in ip6_mr_forward()
2186 struct mr6_table *mrt; in ip6_mr_input() local
2193 err = ip6mr_fib_lookup(net, &fl6, &mrt); in ip6_mr_input()
2200 cache = ip6mr_cache_find(mrt, in ip6_mr_input()
2203 int vif = ip6mr_find_vif(mrt, skb->dev); in ip6_mr_input()
2206 cache = ip6mr_cache_find_any(mrt, in ip6_mr_input()
2217 vif = ip6mr_find_vif(mrt, skb->dev); in ip6_mr_input()
2219 int err = ip6mr_cache_unresolved(mrt, vif, skb); in ip6_mr_input()
2229 ip6_mr_forward(net, mrt, skb, cache); in ip6_mr_input()
2237 static int __ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb, in __ip6mr_fill_mroute() argument
2249 if (MIF_EXISTS(mrt, c->mf6c_parent) && in __ip6mr_fill_mroute()
2250 nla_put_u32(skb, RTA_IIF, mrt->vif6_table[c->mf6c_parent].dev->ifindex) < 0) in __ip6mr_fill_mroute()
2257 if (MIF_EXISTS(mrt, ct) && c->mfc_un.res.ttls[ct] < 255) { in __ip6mr_fill_mroute()
2266 nhp->rtnh_ifindex = mrt->vif6_table[ct].dev->ifindex; in __ip6mr_fill_mroute()
2287 struct mr6_table *mrt; in ip6mr_get_route() local
2291 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ip6mr_get_route()
2292 if (!mrt) in ip6mr_get_route()
2296 cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr); in ip6mr_get_route()
2298 int vif = ip6mr_find_vif(mrt, skb->dev); in ip6mr_get_route()
2301 cache = ip6mr_cache_find_any(mrt, &rt->rt6i_dst.addr, in ip6mr_get_route()
2317 if (!dev || (vif = ip6mr_find_vif(mrt, dev)) < 0) { in ip6mr_get_route()
2346 err = ip6mr_cache_unresolved(mrt, vif, skb2); in ip6mr_get_route()
2355 err = __ip6mr_fill_mroute(mrt, skb, cache, rtm); in ip6mr_get_route()
2360 static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb, in ip6mr_fill_mroute() argument
2377 rtm->rtm_table = mrt->id; in ip6mr_fill_mroute()
2378 if (nla_put_u32(skb, RTA_TABLE, mrt->id)) in ip6mr_fill_mroute()
2391 err = __ip6mr_fill_mroute(mrt, skb, c, rtm); in ip6mr_fill_mroute()
2425 static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc, in mr6_netlink_event() argument
2428 struct net *net = read_pnet(&mrt->net); in mr6_netlink_event()
2432 skb = nlmsg_new(mr6_msgsize(mfc->mf6c_parent >= MAXMIFS, mrt->maxvif), in mr6_netlink_event()
2437 err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); in mr6_netlink_event()
2453 struct mr6_table *mrt; in ip6mr_rtm_dumproute() local
2464 ip6mr_for_each_table(mrt, net) { in ip6mr_rtm_dumproute()
2470 list_for_each_entry(mfc, &mrt->mfc6_cache_array[h], list) { in ip6mr_rtm_dumproute()
2473 if (ip6mr_fill_mroute(mrt, skb, in ip6mr_rtm_dumproute()
2485 list_for_each_entry(mfc, &mrt->mfc6_unres_queue, list) { in ip6mr_rtm_dumproute()
2488 if (ip6mr_fill_mroute(mrt, skb, in ip6mr_rtm_dumproute()