Lines Matching refs:mrt

58 	struct mr_table	*mrt;  member
88 static void ip6mr_free_table(struct mr_table *mrt);
90 static void ip6_mr_forward(struct net *net, struct mr_table *mrt,
93 static int ip6mr_cache_report(const struct mr_table *mrt, struct sk_buff *pkt,
95 static void mr6_netlink_event(struct mr_table *mrt, struct mfc6_cache *mfc,
97 static void mrt6msg_netlink_event(const struct mr_table *mrt, struct sk_buff *pkt);
102 static void mroute_clean_tables(struct mr_table *mrt, int flags);
106 #define ip6mr_for_each_table(mrt, net) \ argument
107 list_for_each_entry_rcu(mrt, &net->ipv6.mr6_tables, list, \
112 struct mr_table *mrt) in ip6mr_mr_table_iter() argument
116 if (!mrt) in ip6mr_mr_table_iter()
120 ret = list_entry_rcu(mrt->list.next, in ip6mr_mr_table_iter()
130 struct mr_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 mr_table **mrt) in ip6mr_fib_lookup() argument
156 *mrt = res.mrt; in ip6mr_fib_lookup()
164 struct mr_table *mrt; in ip6mr_rule_action() local
180 mrt = ip6mr_get_table(rule->fr_net, arg->table); in ip6mr_rule_action()
181 if (!mrt) in ip6mr_rule_action()
183 res->mrt = mrt; in ip6mr_rule_action()
230 struct mr_table *mrt; in ip6mr_rules_init() local
239 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT); in ip6mr_rules_init()
240 if (IS_ERR(mrt)) { in ip6mr_rules_init()
241 err = PTR_ERR(mrt); in ip6mr_rules_init()
254 ip6mr_free_table(mrt); in ip6mr_rules_init()
263 struct mr_table *mrt, *next; in ip6mr_rules_exit() local
266 list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) { in ip6mr_rules_exit()
267 list_del(&mrt->list); in ip6mr_rules_exit()
268 ip6mr_free_table(mrt); in ip6mr_rules_exit()
291 #define ip6mr_for_each_table(mrt, net) \ argument
292 for (mrt = net->ipv6.mrt6; mrt; mrt = NULL)
295 struct mr_table *mrt) in ip6mr_mr_table_iter() argument
297 if (!mrt) in ip6mr_mr_table_iter()
308 struct mr_table **mrt) in ip6mr_fib_lookup() argument
310 *mrt = net->ipv6.mrt6; in ip6mr_fib_lookup()
316 struct mr_table *mrt; in ip6mr_rules_init() local
318 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT); in ip6mr_rules_init()
319 if (IS_ERR(mrt)) in ip6mr_rules_init()
320 return PTR_ERR(mrt); in ip6mr_rules_init()
321 net->ipv6.mrt6 = mrt; in ip6mr_rules_init()
363 static void ip6mr_new_table_set(struct mr_table *mrt, in ip6mr_new_table_set() argument
367 list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables); in ip6mr_new_table_set()
383 struct mr_table *mrt; in ip6mr_new_table() local
385 mrt = ip6mr_get_table(net, id); in ip6mr_new_table()
386 if (mrt) in ip6mr_new_table()
387 return mrt; in ip6mr_new_table()
393 static void ip6mr_free_table(struct mr_table *mrt) in ip6mr_free_table() argument
395 timer_shutdown_sync(&mrt->ipmr_expire_timer); in ip6mr_free_table()
396 mroute_clean_tables(mrt, MRT6_FLUSH_MIFS | MRT6_FLUSH_MIFS_STATIC | in ip6mr_free_table()
398 rhltable_destroy(&mrt->mfc_hash); in ip6mr_free_table()
399 kfree(mrt); in ip6mr_free_table()
412 struct mr_table *mrt; in ip6mr_vif_seq_start() local
414 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ip6mr_vif_seq_start()
415 if (!mrt) in ip6mr_vif_seq_start()
418 iter->mrt = mrt; in ip6mr_vif_seq_start()
433 struct mr_table *mrt = iter->mrt; in ip6mr_vif_seq_show() local
448 vif - mrt->vif_table, in ip6mr_vif_seq_show()
466 struct mr_table *mrt; in ipmr_mfc_seq_start() local
468 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ipmr_mfc_seq_start()
469 if (!mrt) in ipmr_mfc_seq_start()
472 return mr_mfc_seq_start(seq, pos, mrt, &mfc_unres_lock); in ipmr_mfc_seq_start()
487 struct mr_table *mrt = it->mrt; in ipmr_mfc_seq_show() local
493 if (it->cache != &mrt->mfc_unres_queue) { in ipmr_mfc_seq_show()
500 if (VIF_EXISTS(mrt, n) && in ipmr_mfc_seq_show()
533 struct mr_table *mrt; in pim6_rcv() local
561 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in pim6_rcv()
565 reg_vif_num = READ_ONCE(mrt->mroute_reg_vif_num); in pim6_rcv()
567 reg_dev = vif_dev_read(&mrt->vif_table[reg_vif_num]); in pim6_rcv()
598 struct mr_table *mrt; in reg_vif_xmit() local
608 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in reg_vif_xmit()
614 ip6mr_cache_report(mrt, skb, READ_ONCE(mrt->mroute_reg_vif_num), in reg_vif_xmit()
646 static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt) in ip6mr_reg_vif() argument
651 if (mrt->id == RT6_TABLE_DFLT) in ip6mr_reg_vif()
654 sprintf(name, "pim6reg%u", mrt->id); in ip6mr_reg_vif()
699 static int mif6_delete(struct mr_table *mrt, int vifi, int notify, in mif6_delete() argument
706 if (vifi < 0 || vifi >= mrt->maxvif) in mif6_delete()
709 v = &mrt->vif_table[vifi]; in mif6_delete()
715 call_ip6mr_vif_entry_notifiers(read_pnet(&mrt->net), in mif6_delete()
717 vifi, mrt->id); in mif6_delete()
722 if (vifi == mrt->mroute_reg_vif_num) { in mif6_delete()
724 WRITE_ONCE(mrt->mroute_reg_vif_num, -1); in mif6_delete()
728 if (vifi + 1 == mrt->maxvif) { in mif6_delete()
731 if (VIF_EXISTS(mrt, tmp)) in mif6_delete()
734 WRITE_ONCE(mrt->maxvif, tmp + 1); in mif6_delete()
772 static void ip6mr_destroy_unres(struct mr_table *mrt, struct mfc6_cache *c) in ip6mr_destroy_unres() argument
774 struct net *net = read_pnet(&mrt->net); in ip6mr_destroy_unres()
777 atomic_dec(&mrt->cache_resolve_queue_len); in ip6mr_destroy_unres()
798 static void ipmr_do_expire_process(struct mr_table *mrt) in ipmr_do_expire_process() argument
804 list_for_each_entry_safe(c, next, &mrt->mfc_unres_queue, list) { in ipmr_do_expire_process()
814 mr6_netlink_event(mrt, (struct mfc6_cache *)c, RTM_DELROUTE); in ipmr_do_expire_process()
815 ip6mr_destroy_unres(mrt, (struct mfc6_cache *)c); in ipmr_do_expire_process()
818 if (!list_empty(&mrt->mfc_unres_queue)) in ipmr_do_expire_process()
819 mod_timer(&mrt->ipmr_expire_timer, jiffies + expires); in ipmr_do_expire_process()
824 struct mr_table *mrt = from_timer(mrt, t, ipmr_expire_timer); in ipmr_expire_process() local
827 mod_timer(&mrt->ipmr_expire_timer, jiffies + 1); in ipmr_expire_process()
831 if (!list_empty(&mrt->mfc_unres_queue)) in ipmr_expire_process()
832 ipmr_do_expire_process(mrt); in ipmr_expire_process()
839 static void ip6mr_update_thresholds(struct mr_table *mrt, in ip6mr_update_thresholds() argument
849 for (vifi = 0; vifi < mrt->maxvif; vifi++) { in ip6mr_update_thresholds()
850 if (VIF_EXISTS(mrt, vifi) && in ip6mr_update_thresholds()
862 static int mif6_add(struct net *net, struct mr_table *mrt, in mif6_add() argument
866 struct vif_device *v = &mrt->vif_table[vifi]; in mif6_add()
872 if (VIF_EXISTS(mrt, vifi)) in mif6_add()
882 if (mrt->mroute_reg_vif_num >= 0) in mif6_add()
884 dev = ip6mr_reg_vif(net, mrt); in mif6_add()
928 WRITE_ONCE(mrt->mroute_reg_vif_num, vifi); in mif6_add()
930 if (vifi + 1 > mrt->maxvif) in mif6_add()
931 WRITE_ONCE(mrt->maxvif, vifi + 1); in mif6_add()
934 v, dev, vifi, mrt->id); in mif6_add()
938 static struct mfc6_cache *ip6mr_cache_find(struct mr_table *mrt, in ip6mr_cache_find() argument
947 return mr_mfc_find(mrt, &arg); in ip6mr_cache_find()
951 static struct mfc6_cache *ip6mr_cache_find_any(struct mr_table *mrt, in ip6mr_cache_find_any() argument
961 return mr_mfc_find_any_parent(mrt, mifi); in ip6mr_cache_find_any()
962 return mr_mfc_find_any(mrt, mifi, &arg); in ip6mr_cache_find_any()
967 ip6mr_cache_find_parent(struct mr_table *mrt, in ip6mr_cache_find_parent() argument
977 return mr_mfc_find_parent(mrt, &arg, parent); in ip6mr_cache_find_parent()
1007 static void ip6mr_cache_resolve(struct net *net, struct mr_table *mrt, in ip6mr_cache_resolve() argument
1021 if (mr_fill_mroute(mrt, skb, &c->_c, in ip6mr_cache_resolve()
1033 ip6_mr_forward(net, mrt, skb->dev, skb, c); in ip6mr_cache_resolve()
1045 static int ip6mr_cache_report(const struct mr_table *mrt, struct sk_buff *pkt, in ip6mr_cache_report() argument
1086 msg->im6_mif = READ_ONCE(mrt->mroute_reg_vif_num); in ip6mr_cache_report()
1121 mroute6_sk = rcu_dereference(mrt->mroute_sk); in ip6mr_cache_report()
1127 mrt6msg_netlink_event(mrt, skb); in ip6mr_cache_report()
1141 static int ip6mr_cache_unresolved(struct mr_table *mrt, mifi_t mifi, in ip6mr_cache_unresolved() argument
1149 list_for_each_entry(c, &mrt->mfc_unres_queue, _c.list) { in ip6mr_cache_unresolved()
1178 err = ip6mr_cache_report(mrt, skb, mifi, MRT6MSG_NOCACHE); in ip6mr_cache_unresolved()
1190 atomic_inc(&mrt->cache_resolve_queue_len); in ip6mr_cache_unresolved()
1191 list_add(&c->_c.list, &mrt->mfc_unres_queue); in ip6mr_cache_unresolved()
1192 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_cache_unresolved()
1194 ipmr_do_expire_process(mrt); in ip6mr_cache_unresolved()
1218 static int ip6mr_mfc_delete(struct mr_table *mrt, struct mf6cctl *mfc, in ip6mr_mfc_delete() argument
1225 c = ip6mr_cache_find_parent(mrt, &mfc->mf6cc_origin.sin6_addr, in ip6mr_mfc_delete()
1230 rhltable_remove(&mrt->mfc_hash, &c->_c.mnode, ip6mr_rht_params); in ip6mr_mfc_delete()
1233 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net), in ip6mr_mfc_delete()
1234 FIB_EVENT_ENTRY_DEL, c, mrt->id); in ip6mr_mfc_delete()
1235 mr6_netlink_event(mrt, c, RTM_DELROUTE); in ip6mr_mfc_delete()
1245 struct mr_table *mrt; in ip6mr_device_event() local
1252 ip6mr_for_each_table(mrt, net) { in ip6mr_device_event()
1253 v = &mrt->vif_table[0]; in ip6mr_device_event()
1254 for (ct = 0; ct < mrt->maxvif; ct++, v++) { in ip6mr_device_event()
1256 mif6_delete(mrt, ct, 1, NULL); in ip6mr_device_event()
1425 static int ip6mr_mfc_add(struct net *net, struct mr_table *mrt, in ip6mr_mfc_add() argument
1445 c = ip6mr_cache_find_parent(mrt, &mfc->mf6cc_origin.sin6_addr, in ip6mr_mfc_add()
1451 ip6mr_update_thresholds(mrt, &c->_c, ttls); in ip6mr_mfc_add()
1456 c, mrt->id); in ip6mr_mfc_add()
1457 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_mfc_add()
1472 ip6mr_update_thresholds(mrt, &c->_c, ttls); in ip6mr_mfc_add()
1476 err = rhltable_insert_key(&mrt->mfc_hash, &c->cmparg, &c->_c.mnode, in ip6mr_mfc_add()
1483 list_add_tail_rcu(&c->_c.list, &mrt->mfc_cache_list); in ip6mr_mfc_add()
1490 list_for_each_entry(_uc, &mrt->mfc_unres_queue, list) { in ip6mr_mfc_add()
1495 atomic_dec(&mrt->cache_resolve_queue_len); in ip6mr_mfc_add()
1500 if (list_empty(&mrt->mfc_unres_queue)) in ip6mr_mfc_add()
1501 del_timer(&mrt->ipmr_expire_timer); in ip6mr_mfc_add()
1505 ip6mr_cache_resolve(net, mrt, uc, c); in ip6mr_mfc_add()
1509 c, mrt->id); in ip6mr_mfc_add()
1510 mr6_netlink_event(mrt, c, RTM_NEWROUTE); in ip6mr_mfc_add()
1518 static void mroute_clean_tables(struct mr_table *mrt, int flags) in mroute_clean_tables() argument
1526 for (i = 0; i < mrt->maxvif; i++) { in mroute_clean_tables()
1527 if (((mrt->vif_table[i].flags & VIFF_STATIC) && in mroute_clean_tables()
1529 (!(mrt->vif_table[i].flags & VIFF_STATIC) && !(flags & MRT6_FLUSH_MIFS))) in mroute_clean_tables()
1531 mif6_delete(mrt, i, 0, &list); in mroute_clean_tables()
1538 list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) { in mroute_clean_tables()
1542 rhltable_remove(&mrt->mfc_hash, &c->mnode, ip6mr_rht_params); in mroute_clean_tables()
1544 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net), in mroute_clean_tables()
1546 (struct mfc6_cache *)c, mrt->id); in mroute_clean_tables()
1547 mr6_netlink_event(mrt, (struct mfc6_cache *)c, RTM_DELROUTE); in mroute_clean_tables()
1553 if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { in mroute_clean_tables()
1555 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) { in mroute_clean_tables()
1557 mr6_netlink_event(mrt, (struct mfc6_cache *)c, in mroute_clean_tables()
1559 ip6mr_destroy_unres(mrt, (struct mfc6_cache *)c); in mroute_clean_tables()
1566 static int ip6mr_sk_init(struct mr_table *mrt, struct sock *sk) in ip6mr_sk_init() argument
1573 if (rtnl_dereference(mrt->mroute_sk)) { in ip6mr_sk_init()
1576 rcu_assign_pointer(mrt->mroute_sk, sk); in ip6mr_sk_init()
1596 struct mr_table *mrt; in ip6mr_sk_done() local
1608 ip6mr_for_each_table(mrt, net) { in ip6mr_sk_done()
1609 if (sk == rtnl_dereference(mrt->mroute_sk)) { in ip6mr_sk_done()
1611 RCU_INIT_POINTER(mrt->mroute_sk, NULL); in ip6mr_sk_done()
1623 mroute_clean_tables(mrt, MRT6_FLUSH_MIFS | MRT6_FLUSH_MFC); in ip6mr_sk_done()
1635 struct mr_table *mrt; in mroute6_is_socket() local
1642 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in mroute6_is_socket()
1645 return rcu_access_pointer(mrt->mroute_sk); in mroute6_is_socket()
1664 struct mr_table *mrt; in ip6_mroute_setsockopt() local
1670 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_setsockopt()
1671 if (!mrt) in ip6_mroute_setsockopt()
1675 if (sk != rcu_access_pointer(mrt->mroute_sk) && in ip6_mroute_setsockopt()
1685 return ip6mr_sk_init(mrt, sk); in ip6_mroute_setsockopt()
1698 ret = mif6_add(net, mrt, &vif, in ip6_mroute_setsockopt()
1699 sk == rtnl_dereference(mrt->mroute_sk)); in ip6_mroute_setsockopt()
1709 ret = mif6_delete(mrt, mifi, 0, NULL); in ip6_mroute_setsockopt()
1731 ret = ip6mr_mfc_delete(mrt, &mfc, parent); in ip6_mroute_setsockopt()
1733 ret = ip6mr_mfc_add(net, mrt, &mfc, in ip6_mroute_setsockopt()
1735 rtnl_dereference(mrt->mroute_sk), in ip6_mroute_setsockopt()
1749 mroute_clean_tables(mrt, flags); in ip6_mroute_setsockopt()
1765 mrt->mroute_do_assert = v; in ip6_mroute_setsockopt()
1784 if (v != mrt->mroute_do_pim) { in ip6_mroute_setsockopt()
1785 mrt->mroute_do_pim = v; in ip6_mroute_setsockopt()
1786 mrt->mroute_do_assert = v; in ip6_mroute_setsockopt()
1787 mrt->mroute_do_wrvifwhole = do_wrmifwhole; in ip6_mroute_setsockopt()
1806 if (sk == rcu_access_pointer(mrt->mroute_sk)) in ip6_mroute_setsockopt()
1811 mrt = ip6mr_new_table(net, v); in ip6_mroute_setsockopt()
1812 if (IS_ERR(mrt)) in ip6_mroute_setsockopt()
1813 ret = PTR_ERR(mrt); in ip6_mroute_setsockopt()
1839 struct mr_table *mrt; in ip6_mroute_getsockopt() local
1845 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_getsockopt()
1846 if (!mrt) in ip6_mroute_getsockopt()
1855 val = mrt->mroute_do_pim; in ip6_mroute_getsockopt()
1859 val = mrt->mroute_do_assert; in ip6_mroute_getsockopt()
1890 struct mr_table *mrt; in ip6mr_ioctl() local
1892 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_ioctl()
1893 if (!mrt) in ip6mr_ioctl()
1900 if (vr.mifi >= mrt->maxvif) in ip6mr_ioctl()
1902 vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif); in ip6mr_ioctl()
1904 vif = &mrt->vif_table[vr.mifi]; in ip6mr_ioctl()
1905 if (VIF_EXISTS(mrt, vr.mifi)) { in ip6mr_ioctl()
1923 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr); in ip6mr_ioctl()
1965 struct mr_table *mrt; in ip6mr_compat_ioctl() local
1967 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_compat_ioctl()
1968 if (!mrt) in ip6mr_compat_ioctl()
1975 if (vr.mifi >= mrt->maxvif) in ip6mr_compat_ioctl()
1977 vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif); in ip6mr_compat_ioctl()
1979 vif = &mrt->vif_table[vr.mifi]; in ip6mr_compat_ioctl()
1980 if (VIF_EXISTS(mrt, vr.mifi)) { in ip6mr_compat_ioctl()
1998 c = ip6mr_cache_find(mrt, &sr.src.sin6_addr, &sr.grp.sin6_addr); in ip6mr_compat_ioctl()
2030 static int ip6mr_forward2(struct net *net, struct mr_table *mrt, in ip6mr_forward2() argument
2033 struct vif_device *vif = &mrt->vif_table[vifi]; in ip6mr_forward2()
2049 ip6mr_cache_report(mrt, skb, vifi, MRT6MSG_WHOLEPKT); in ip6mr_forward2()
2105 static int ip6mr_find_vif(struct mr_table *mrt, struct net_device *dev) in ip6mr_find_vif() argument
2110 for (ct = READ_ONCE(mrt->maxvif) - 1; ct >= 0; ct--) { in ip6mr_find_vif()
2111 if (rcu_access_pointer(mrt->vif_table[ct].dev) == dev) in ip6mr_find_vif()
2118 static void ip6_mr_forward(struct net *net, struct mr_table *mrt, in ip6_mr_forward() argument
2124 int true_vifi = ip6mr_find_vif(mrt, dev); in ip6_mr_forward()
2137 cache_proxy = mr_mfc_find_any_parent(mrt, vif); in ip6_mr_forward()
2146 if (rcu_access_pointer(mrt->vif_table[vif].dev) != dev) { in ip6_mr_forward()
2149 if (true_vifi >= 0 && mrt->mroute_do_assert && in ip6_mr_forward()
2155 (mrt->mroute_do_pim || in ip6_mr_forward()
2161 ip6mr_cache_report(mrt, skb, true_vifi, MRT6MSG_WRONGMIF); in ip6_mr_forward()
2162 if (mrt->mroute_do_wrvifwhole) in ip6_mr_forward()
2163 ip6mr_cache_report(mrt, skb, true_vifi, in ip6_mr_forward()
2170 WRITE_ONCE(mrt->vif_table[vif].pkt_in, in ip6_mr_forward()
2171 mrt->vif_table[vif].pkt_in + 1); in ip6_mr_forward()
2172 WRITE_ONCE(mrt->vif_table[vif].bytes_in, in ip6_mr_forward()
2173 mrt->vif_table[vif].bytes_in + skb->len); in ip6_mr_forward()
2201 ip6mr_forward2(net, mrt, skb2, psend); in ip6_mr_forward()
2208 ip6mr_forward2(net, mrt, skb, psend); in ip6_mr_forward()
2225 struct mr_table *mrt; in ip6_mr_input() local
2245 err = ip6mr_fib_lookup(net, &fl6, &mrt); in ip6_mr_input()
2251 cache = ip6mr_cache_find(mrt, in ip6_mr_input()
2254 int vif = ip6mr_find_vif(mrt, dev); in ip6_mr_input()
2257 cache = ip6mr_cache_find_any(mrt, in ip6_mr_input()
2268 vif = ip6mr_find_vif(mrt, dev); in ip6_mr_input()
2270 int err = ip6mr_cache_unresolved(mrt, vif, skb, dev); in ip6_mr_input()
2278 ip6_mr_forward(net, mrt, dev, skb, cache); in ip6_mr_input()
2287 struct mr_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()
2312 if (!dev || (vif = ip6mr_find_vif(mrt, dev)) < 0) { in ip6mr_get_route()
2342 err = ip6mr_cache_unresolved(mrt, vif, skb2, dev); in ip6mr_get_route()
2348 err = mr_fill_mroute(mrt, skb, &cache->_c, rtm); in ip6mr_get_route()
2353 static int ip6mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in ip6mr_fill_mroute() argument
2370 rtm->rtm_table = mrt->id; in ip6mr_fill_mroute()
2371 if (nla_put_u32(skb, RTA_TABLE, mrt->id)) in ip6mr_fill_mroute()
2384 err = mr_fill_mroute(mrt, skb, &c->_c, rtm); in ip6mr_fill_mroute()
2397 static int _ip6mr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in _ip6mr_fill_mroute() argument
2401 return ip6mr_fill_mroute(mrt, skb, portid, seq, (struct mfc6_cache *)c, in _ip6mr_fill_mroute()
2426 static void mr6_netlink_event(struct mr_table *mrt, struct mfc6_cache *mfc, in mr6_netlink_event() argument
2429 struct net *net = read_pnet(&mrt->net); in mr6_netlink_event()
2433 skb = nlmsg_new(mr6_msgsize(mfc->_c.mfc_parent >= MAXMIFS, mrt->maxvif), in mr6_netlink_event()
2438 err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); in mr6_netlink_event()
2468 static void mrt6msg_netlink_event(const struct mr_table *mrt, struct sk_buff *pkt) in mrt6msg_netlink_event() argument
2470 struct net *net = read_pnet(&mrt->net); in mrt6msg_netlink_event()
2561 struct mr_table *mrt; in ip6mr_rtm_getroute() local
2576 mrt = ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT); in ip6mr_rtm_getroute()
2577 if (!mrt) { in ip6mr_rtm_getroute()
2584 cache = ip6mr_cache_find(mrt, &src, &grp); in ip6mr_rtm_getroute()
2591 skb = nlmsg_new(mr6_msgsize(false, mrt->maxvif), GFP_KERNEL); in ip6mr_rtm_getroute()
2595 err = ip6mr_fill_mroute(mrt, skb, NETLINK_CB(in_skb).portid, in ip6mr_rtm_getroute()
2619 struct mr_table *mrt; in ip6mr_rtm_dumproute() local
2621 mrt = ip6mr_get_table(sock_net(skb->sk), filter.table_id); in ip6mr_rtm_dumproute()
2622 if (!mrt) { in ip6mr_rtm_dumproute()
2629 err = mr_table_dump(mrt, skb, cb, _ip6mr_fill_mroute, in ip6mr_rtm_dumproute()