Lines Matching refs:mrt
74 struct mr_table *mrt; member
104 static void ipmr_free_table(struct mr_table *mrt);
106 static void ip_mr_forward(struct net *net, struct mr_table *mrt,
109 static int ipmr_cache_report(const struct mr_table *mrt,
111 static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
113 static void igmpmsg_netlink_event(const struct mr_table *mrt, struct sk_buff *pkt);
114 static void mroute_clean_tables(struct mr_table *mrt, int flags);
118 #define ipmr_for_each_table(mrt, net) \ argument
119 list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \
124 struct mr_table *mrt) in ipmr_mr_table_iter() argument
128 if (!mrt) in ipmr_mr_table_iter()
132 ret = list_entry_rcu(mrt->list.next, in ipmr_mr_table_iter()
142 struct mr_table *mrt; in __ipmr_get_table() local
144 ipmr_for_each_table(mrt, net) { in __ipmr_get_table()
145 if (mrt->id == id) in __ipmr_get_table()
146 return mrt; in __ipmr_get_table()
153 struct mr_table *mrt; in ipmr_get_table() local
156 mrt = __ipmr_get_table(net, id); in ipmr_get_table()
158 return mrt; in ipmr_get_table()
162 struct mr_table **mrt) in ipmr_fib_lookup() argument
178 *mrt = res.mrt; in ipmr_fib_lookup()
186 struct mr_table *mrt; in ipmr_rule_action() local
202 mrt = __ipmr_get_table(rule->fr_net, arg->table); in ipmr_rule_action()
203 if (!mrt) in ipmr_rule_action()
205 res->mrt = mrt; in ipmr_rule_action()
252 struct mr_table *mrt; in ipmr_rules_init() local
261 mrt = ipmr_new_table(net, RT_TABLE_DEFAULT); in ipmr_rules_init()
262 if (IS_ERR(mrt)) { in ipmr_rules_init()
263 err = PTR_ERR(mrt); in ipmr_rules_init()
276 ipmr_free_table(mrt); in ipmr_rules_init()
285 struct mr_table *mrt, *next; in ipmr_rules_exit() local
288 list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { in ipmr_rules_exit()
289 list_del(&mrt->list); in ipmr_rules_exit()
290 ipmr_free_table(mrt); in ipmr_rules_exit()
312 #define ipmr_for_each_table(mrt, net) \ argument
313 for (mrt = net->ipv4.mrt; mrt; mrt = NULL)
316 struct mr_table *mrt) in ipmr_mr_table_iter() argument
318 if (!mrt) in ipmr_mr_table_iter()
319 return net->ipv4.mrt; in ipmr_mr_table_iter()
325 return net->ipv4.mrt; in ipmr_get_table()
331 struct mr_table **mrt) in ipmr_fib_lookup() argument
333 *mrt = net->ipv4.mrt; in ipmr_fib_lookup()
339 struct mr_table *mrt; in ipmr_rules_init() local
341 mrt = ipmr_new_table(net, RT_TABLE_DEFAULT); in ipmr_rules_init()
342 if (IS_ERR(mrt)) in ipmr_rules_init()
343 return PTR_ERR(mrt); in ipmr_rules_init()
344 net->ipv4.mrt = mrt; in ipmr_rules_init()
351 ipmr_free_table(net->ipv4.mrt); in ipmr_rules_exit()
352 net->ipv4.mrt = NULL; in ipmr_rules_exit()
392 static void ipmr_new_table_set(struct mr_table *mrt, in ipmr_new_table_set() argument
396 list_add_tail_rcu(&mrt->list, &net->ipv4.mr_tables); in ipmr_new_table_set()
412 struct mr_table *mrt; in ipmr_new_table() local
418 mrt = __ipmr_get_table(net, id); in ipmr_new_table()
419 if (mrt) in ipmr_new_table()
420 return mrt; in ipmr_new_table()
426 static void ipmr_free_table(struct mr_table *mrt) in ipmr_free_table() argument
428 struct net *net = read_pnet(&mrt->net); in ipmr_free_table()
432 timer_shutdown_sync(&mrt->ipmr_expire_timer); in ipmr_free_table()
433 mroute_clean_tables(mrt, MRT_FLUSH_VIFS | MRT_FLUSH_VIFS_STATIC | in ipmr_free_table()
435 rhltable_destroy(&mrt->mfc_hash); in ipmr_free_table()
436 kfree(mrt); in ipmr_free_table()
512 struct mr_table *mrt; in reg_vif_xmit() local
520 err = ipmr_fib_lookup(net, &fl4, &mrt); in reg_vif_xmit()
531 ipmr_cache_report(mrt, skb, READ_ONCE(mrt->mroute_reg_vif_num), in reg_vif_xmit()
559 static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt) in ipmr_reg_vif() argument
564 if (mrt->id == RT_TABLE_DEFAULT) in ipmr_reg_vif()
567 sprintf(name, "pimreg%u", mrt->id); in ipmr_reg_vif()
596 static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, in __pim_rcv() argument
615 vif_num = READ_ONCE(mrt->mroute_reg_vif_num); in __pim_rcv()
617 reg_dev = vif_dev_read(&mrt->vif_table[vif_num]); in __pim_rcv()
634 static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt) in ipmr_reg_vif() argument
666 static int vif_delete(struct mr_table *mrt, int vifi, int notify, in vif_delete() argument
669 struct net *net = read_pnet(&mrt->net); in vif_delete()
674 if (vifi < 0 || vifi >= mrt->maxvif) in vif_delete()
677 v = &mrt->vif_table[vifi]; in vif_delete()
685 vifi, mrt->id); in vif_delete()
688 if (vifi == mrt->mroute_reg_vif_num) { in vif_delete()
690 WRITE_ONCE(mrt->mroute_reg_vif_num, -1); in vif_delete()
692 if (vifi + 1 == mrt->maxvif) { in vif_delete()
696 if (VIF_EXISTS(mrt, tmp)) in vif_delete()
699 WRITE_ONCE(mrt->maxvif, tmp + 1); in vif_delete()
737 static void ipmr_destroy_unres(struct mr_table *mrt, struct mfc_cache *c) in ipmr_destroy_unres() argument
739 struct net *net = read_pnet(&mrt->net); in ipmr_destroy_unres()
743 atomic_dec(&mrt->cache_resolve_queue_len); in ipmr_destroy_unres()
768 struct mr_table *mrt = timer_container_of(mrt, t, ipmr_expire_timer); in ipmr_expire_process() local
774 mod_timer(&mrt->ipmr_expire_timer, jiffies+HZ/10); in ipmr_expire_process()
778 if (list_empty(&mrt->mfc_unres_queue)) in ipmr_expire_process()
784 list_for_each_entry_safe(c, next, &mrt->mfc_unres_queue, list) { in ipmr_expire_process()
793 mroute_netlink_event(mrt, (struct mfc_cache *)c, RTM_DELROUTE); in ipmr_expire_process()
794 ipmr_destroy_unres(mrt, (struct mfc_cache *)c); in ipmr_expire_process()
797 if (!list_empty(&mrt->mfc_unres_queue)) in ipmr_expire_process()
798 mod_timer(&mrt->ipmr_expire_timer, jiffies + expires); in ipmr_expire_process()
805 static void ipmr_update_thresholds(struct mr_table *mrt, struct mr_mfc *cache, in ipmr_update_thresholds() argument
814 for (vifi = 0; vifi < mrt->maxvif; vifi++) { in ipmr_update_thresholds()
815 if (VIF_EXISTS(mrt, vifi) && in ipmr_update_thresholds()
827 static int vif_add(struct net *net, struct mr_table *mrt, in vif_add() argument
832 struct vif_device *v = &mrt->vif_table[vifi]; in vif_add()
838 if (VIF_EXISTS(mrt, vifi)) in vif_add()
848 if (mrt->mroute_reg_vif_num >= 0) in vif_add()
850 dev = ipmr_reg_vif(net, mrt); in vif_add()
921 WRITE_ONCE(mrt->mroute_reg_vif_num, vifi); in vif_add()
923 if (vifi+1 > mrt->maxvif) in vif_add()
924 WRITE_ONCE(mrt->maxvif, vifi + 1); in vif_add()
927 vifi, mrt->id); in vif_add()
932 static struct mfc_cache *ipmr_cache_find(struct mr_table *mrt, in ipmr_cache_find() argument
941 return mr_mfc_find(mrt, &arg); in ipmr_cache_find()
945 static struct mfc_cache *ipmr_cache_find_any(struct mr_table *mrt, in ipmr_cache_find_any() argument
954 return mr_mfc_find_any_parent(mrt, vifi); in ipmr_cache_find_any()
955 return mr_mfc_find_any(mrt, vifi, &arg); in ipmr_cache_find_any()
959 static struct mfc_cache *ipmr_cache_find_parent(struct mr_table *mrt, in ipmr_cache_find_parent() argument
968 return mr_mfc_find_parent(mrt, &arg, parent); in ipmr_cache_find_parent()
997 static void ipmr_cache_resolve(struct net *net, struct mr_table *mrt, in ipmr_cache_resolve() argument
1009 if (mr_fill_mroute(mrt, skb, &c->_c, in ipmr_cache_resolve()
1025 ip_mr_forward(net, mrt, skb->dev, skb, c, 0); in ipmr_cache_resolve()
1035 static int ipmr_cache_report(const struct mr_table *mrt, in ipmr_cache_report() argument
1045 mroute_sk = rcu_dereference(mrt->mroute_sk); in ipmr_cache_report()
1075 int vif_num = READ_ONCE(mrt->mroute_reg_vif_num); in ipmr_cache_report()
1104 igmpmsg_netlink_event(mrt, skb); in ipmr_cache_report()
1119 static int ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, in ipmr_cache_unresolved() argument
1128 list_for_each_entry(c, &mrt->mfc_unres_queue, _c.list) { in ipmr_cache_unresolved()
1152 err = ipmr_cache_report(mrt, skb, vifi, IGMPMSG_NOCACHE); in ipmr_cache_unresolved()
1165 atomic_inc(&mrt->cache_resolve_queue_len); in ipmr_cache_unresolved()
1166 list_add(&c->_c.list, &mrt->mfc_unres_queue); in ipmr_cache_unresolved()
1167 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_cache_unresolved()
1169 if (atomic_read(&mrt->cache_resolve_queue_len) == 1) in ipmr_cache_unresolved()
1170 mod_timer(&mrt->ipmr_expire_timer, in ipmr_cache_unresolved()
1193 static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc, int parent) in ipmr_mfc_delete() argument
1195 struct net *net = read_pnet(&mrt->net); in ipmr_mfc_delete()
1200 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_delete()
1205 rhltable_remove(&mrt->mfc_hash, &c->_c.mnode, ipmr_rht_params); in ipmr_mfc_delete()
1207 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, c, mrt->id); in ipmr_mfc_delete()
1208 mroute_netlink_event(mrt, c, RTM_DELROUTE); in ipmr_mfc_delete()
1214 static int ipmr_mfc_add(struct net *net, struct mr_table *mrt, in ipmr_mfc_add() argument
1227 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_add()
1233 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1238 mrt->id); in ipmr_mfc_add()
1239 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1254 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1258 ret = rhltable_insert_key(&mrt->mfc_hash, &c->cmparg, &c->_c.mnode, in ipmr_mfc_add()
1265 list_add_tail_rcu(&c->_c.list, &mrt->mfc_cache_list); in ipmr_mfc_add()
1271 list_for_each_entry(_uc, &mrt->mfc_unres_queue, list) { in ipmr_mfc_add()
1276 atomic_dec(&mrt->cache_resolve_queue_len); in ipmr_mfc_add()
1281 if (list_empty(&mrt->mfc_unres_queue)) in ipmr_mfc_add()
1282 timer_delete(&mrt->ipmr_expire_timer); in ipmr_mfc_add()
1286 ipmr_cache_resolve(net, mrt, uc, c); in ipmr_mfc_add()
1289 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_ADD, c, mrt->id); in ipmr_mfc_add()
1290 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1295 static void mroute_clean_tables(struct mr_table *mrt, int flags) in mroute_clean_tables() argument
1297 struct net *net = read_pnet(&mrt->net); in mroute_clean_tables()
1305 for (i = 0; i < mrt->maxvif; i++) { in mroute_clean_tables()
1306 if (((mrt->vif_table[i].flags & VIFF_STATIC) && in mroute_clean_tables()
1308 (!(mrt->vif_table[i].flags & VIFF_STATIC) && !(flags & MRT_FLUSH_VIFS))) in mroute_clean_tables()
1310 vif_delete(mrt, i, 0, &list); in mroute_clean_tables()
1317 list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) { in mroute_clean_tables()
1321 rhltable_remove(&mrt->mfc_hash, &c->mnode, ipmr_rht_params); in mroute_clean_tables()
1325 mrt->id); in mroute_clean_tables()
1326 mroute_netlink_event(mrt, cache, RTM_DELROUTE); in mroute_clean_tables()
1332 if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { in mroute_clean_tables()
1334 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) { in mroute_clean_tables()
1337 mroute_netlink_event(mrt, cache, RTM_DELROUTE); in mroute_clean_tables()
1338 ipmr_destroy_unres(mrt, cache); in mroute_clean_tables()
1351 struct mr_table *mrt; in mrtsock_destruct() local
1354 ipmr_for_each_table(mrt, net) { in mrtsock_destruct()
1355 if (sk == rtnl_dereference(mrt->mroute_sk)) { in mrtsock_destruct()
1361 RCU_INIT_POINTER(mrt->mroute_sk, NULL); in mrtsock_destruct()
1362 mroute_clean_tables(mrt, MRT_FLUSH_VIFS | MRT_FLUSH_MFC); in mrtsock_destruct()
1379 struct mr_table *mrt; in ip_mroute_setsockopt() local
1393 mrt = __ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ip_mroute_setsockopt()
1394 if (!mrt) { in ip_mroute_setsockopt()
1399 if (sk != rcu_access_pointer(mrt->mroute_sk) && in ip_mroute_setsockopt()
1412 if (rtnl_dereference(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1419 rcu_assign_pointer(mrt->mroute_sk, sk); in ip_mroute_setsockopt()
1428 if (sk != rcu_access_pointer(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1455 ret = vif_add(net, mrt, &vif, in ip_mroute_setsockopt()
1456 sk == rtnl_dereference(mrt->mroute_sk)); in ip_mroute_setsockopt()
1458 ret = vif_delete(mrt, vif.vifc_vifi, 0, NULL); in ip_mroute_setsockopt()
1481 ret = ipmr_mfc_delete(mrt, &mfc, parent); in ip_mroute_setsockopt()
1483 ret = ipmr_mfc_add(net, mrt, &mfc, in ip_mroute_setsockopt()
1484 sk == rtnl_dereference(mrt->mroute_sk), in ip_mroute_setsockopt()
1496 mroute_clean_tables(mrt, val); in ip_mroute_setsockopt()
1508 mrt->mroute_do_assert = val; in ip_mroute_setsockopt()
1526 if (val != mrt->mroute_do_pim) { in ip_mroute_setsockopt()
1527 mrt->mroute_do_pim = val; in ip_mroute_setsockopt()
1528 mrt->mroute_do_assert = val; in ip_mroute_setsockopt()
1529 mrt->mroute_do_wrvifwhole = do_wrvifwhole; in ip_mroute_setsockopt()
1546 if (sk == rtnl_dereference(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1549 mrt = ipmr_new_table(net, uval); in ip_mroute_setsockopt()
1550 if (IS_ERR(mrt)) in ip_mroute_setsockopt()
1551 ret = PTR_ERR(mrt); in ip_mroute_setsockopt()
1595 struct mr_table *mrt; in ip_mroute_getsockopt() local
1601 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ip_mroute_getsockopt()
1602 if (!mrt) in ip_mroute_getsockopt()
1612 val = mrt->mroute_do_pim; in ip_mroute_getsockopt()
1615 val = mrt->mroute_do_assert; in ip_mroute_getsockopt()
1643 struct mr_table *mrt; in ipmr_ioctl() local
1645 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ipmr_ioctl()
1646 if (!mrt) in ipmr_ioctl()
1652 if (vr->vifi >= mrt->maxvif) in ipmr_ioctl()
1654 vr->vifi = array_index_nospec(vr->vifi, mrt->maxvif); in ipmr_ioctl()
1656 vif = &mrt->vif_table[vr->vifi]; in ipmr_ioctl()
1657 if (VIF_EXISTS(mrt, vr->vifi)) { in ipmr_ioctl()
1672 c = ipmr_cache_find(mrt, sr->src.s_addr, sr->grp.s_addr); in ipmr_ioctl()
1711 struct mr_table *mrt; in ipmr_compat_ioctl() local
1713 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ipmr_compat_ioctl()
1714 if (!mrt) in ipmr_compat_ioctl()
1721 if (vr.vifi >= mrt->maxvif) in ipmr_compat_ioctl()
1723 vr.vifi = array_index_nospec(vr.vifi, mrt->maxvif); in ipmr_compat_ioctl()
1725 vif = &mrt->vif_table[vr.vifi]; in ipmr_compat_ioctl()
1726 if (VIF_EXISTS(mrt, vr.vifi)) { in ipmr_compat_ioctl()
1744 c = ipmr_cache_find(mrt, sr.src.s_addr, sr.grp.s_addr); in ipmr_compat_ioctl()
1767 struct mr_table *mrt; in ipmr_device_event() local
1774 ipmr_for_each_table(mrt, net) { in ipmr_device_event()
1775 v = &mrt->vif_table[0]; in ipmr_device_event()
1776 for (ct = 0; ct < mrt->maxvif; ct++, v++) { in ipmr_device_event()
1778 vif_delete(mrt, ct, 1, NULL); in ipmr_device_event()
1833 static bool ipmr_forward_offloaded(struct sk_buff *skb, struct mr_table *mrt, in ipmr_forward_offloaded() argument
1836 struct vif_device *out_vif = &mrt->vif_table[out_vifi]; in ipmr_forward_offloaded()
1837 struct vif_device *in_vif = &mrt->vif_table[in_vifi]; in ipmr_forward_offloaded()
1847 static bool ipmr_forward_offloaded(struct sk_buff *skb, struct mr_table *mrt, in ipmr_forward_offloaded() argument
1856 static int ipmr_prepare_xmit(struct net *net, struct mr_table *mrt, in ipmr_prepare_xmit() argument
1860 struct vif_device *vif = &mrt->vif_table[vifi]; in ipmr_prepare_xmit()
1875 ipmr_cache_report(mrt, skb, vifi, IGMPMSG_WHOLEPKT); in ipmr_prepare_xmit()
1934 static void ipmr_queue_fwd_xmit(struct net *net, struct mr_table *mrt, in ipmr_queue_fwd_xmit() argument
1939 if (ipmr_forward_offloaded(skb, mrt, in_vifi, vifi)) in ipmr_queue_fwd_xmit()
1942 if (ipmr_prepare_xmit(net, mrt, skb, vifi)) in ipmr_queue_fwd_xmit()
1968 static void ipmr_queue_output_xmit(struct net *net, struct mr_table *mrt, in ipmr_queue_output_xmit() argument
1971 if (ipmr_prepare_xmit(net, mrt, skb, vifi)) in ipmr_queue_output_xmit()
1982 static int ipmr_find_vif(const struct mr_table *mrt, struct net_device *dev) in ipmr_find_vif() argument
1986 for (ct = READ_ONCE(mrt->maxvif) - 1; ct >= 0; ct--) { in ipmr_find_vif()
1987 if (rcu_access_pointer(mrt->vif_table[ct].dev) == dev) in ipmr_find_vif()
1995 static void ip_mr_forward(struct net *net, struct mr_table *mrt, in ip_mr_forward() argument
1999 int true_vifi = ipmr_find_vif(mrt, dev); in ip_mr_forward()
2014 cache_proxy = mr_mfc_find_any_parent(mrt, vif); in ip_mr_forward()
2021 if (rcu_access_pointer(mrt->vif_table[vif].dev) != dev) { in ip_mr_forward()
2039 if (true_vifi >= 0 && mrt->mroute_do_assert && in ip_mr_forward()
2045 (mrt->mroute_do_pim || in ip_mr_forward()
2051 ipmr_cache_report(mrt, skb, true_vifi, IGMPMSG_WRONGVIF); in ip_mr_forward()
2052 if (mrt->mroute_do_wrvifwhole) in ip_mr_forward()
2053 ipmr_cache_report(mrt, skb, true_vifi, in ip_mr_forward()
2060 WRITE_ONCE(mrt->vif_table[vif].pkt_in, in ip_mr_forward()
2061 mrt->vif_table[vif].pkt_in + 1); in ip_mr_forward()
2062 WRITE_ONCE(mrt->vif_table[vif].bytes_in, in ip_mr_forward()
2063 mrt->vif_table[vif].bytes_in + skb->len); in ip_mr_forward()
2091 ipmr_queue_fwd_xmit(net, mrt, true_vifi, in ip_mr_forward()
2103 ipmr_queue_fwd_xmit(net, mrt, true_vifi, skb2, in ip_mr_forward()
2106 ipmr_queue_fwd_xmit(net, mrt, true_vifi, skb, psend); in ip_mr_forward()
2131 struct mr_table *mrt; in ipmr_rt_fib_lookup() local
2134 err = ipmr_fib_lookup(net, &fl4, &mrt); in ipmr_rt_fib_lookup()
2137 return mrt; in ipmr_rt_fib_lookup()
2148 struct mr_table *mrt; in ip_mr_input() local
2170 mrt = ipmr_rt_fib_lookup(net, skb); in ip_mr_input()
2171 if (IS_ERR(mrt)) { in ip_mr_input()
2173 return PTR_ERR(mrt); in ip_mr_input()
2188 mroute_sk = rcu_dereference(mrt->mroute_sk); in ip_mr_input()
2198 cache = ipmr_cache_find(mrt, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr); in ip_mr_input()
2200 int vif = ipmr_find_vif(mrt, dev); in ip_mr_input()
2203 cache = ipmr_cache_find_any(mrt, ip_hdr(skb)->daddr, in ip_mr_input()
2219 vif = ipmr_find_vif(mrt, dev); in ip_mr_input()
2221 return ipmr_cache_unresolved(mrt, vif, skb, dev); in ip_mr_input()
2226 ip_mr_forward(net, mrt, dev, skb, cache, local); in ip_mr_input()
2240 static void ip_mr_output_finish(struct net *net, struct mr_table *mrt, in ip_mr_output_finish() argument
2274 ipmr_queue_output_xmit(net, mrt, in ip_mr_output_finish()
2283 ipmr_queue_output_xmit(net, mrt, skb, psend); in ip_mr_output_finish()
2299 struct mr_table *mrt; in ip_mr_output() local
2313 mrt = ipmr_rt_fib_lookup(net, skb); in ip_mr_output()
2314 if (IS_ERR(mrt)) in ip_mr_output()
2317 cache = ipmr_cache_find(mrt, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr); in ip_mr_output()
2319 vif = ipmr_find_vif(mrt, dev); in ip_mr_output()
2321 cache = ipmr_cache_find_any(mrt, ip_hdr(skb)->daddr, in ip_mr_output()
2327 vif = ipmr_find_vif(mrt, dev); in ip_mr_output()
2329 return ipmr_cache_unresolved(mrt, vif, skb, dev); in ip_mr_output()
2334 if (rcu_access_pointer(mrt->vif_table[vif].dev) != dev) in ip_mr_output()
2337 ip_mr_output_finish(net, mrt, dev, skb, cache); in ip_mr_output()
2350 struct mr_table *mrt; in pim_rcv_v1() local
2357 mrt = ipmr_rt_fib_lookup(net, skb); in pim_rcv_v1()
2358 if (IS_ERR(mrt)) in pim_rcv_v1()
2360 if (!mrt->mroute_do_pim || in pim_rcv_v1()
2364 if (__pim_rcv(mrt, skb, sizeof(*pim))) { in pim_rcv_v1()
2377 struct mr_table *mrt; in pim_rcv() local
2389 mrt = ipmr_rt_fib_lookup(net, skb); in pim_rcv()
2390 if (IS_ERR(mrt)) in pim_rcv()
2392 if (__pim_rcv(mrt, skb, sizeof(*pim))) { in pim_rcv()
2405 struct mr_table *mrt; in ipmr_get_route() local
2409 mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_get_route()
2410 if (!mrt) { in ipmr_get_route()
2415 cache = ipmr_cache_find(mrt, saddr, daddr); in ipmr_get_route()
2417 int vif = ipmr_find_vif(mrt, skb->dev); in ipmr_get_route()
2420 cache = ipmr_cache_find_any(mrt, daddr, vif); in ipmr_get_route()
2430 vif = ipmr_find_vif(mrt, dev); in ipmr_get_route()
2450 err = ipmr_cache_unresolved(mrt, vif, skb2, dev); in ipmr_get_route()
2455 err = mr_fill_mroute(mrt, skb, &cache->_c, rtm); in ipmr_get_route()
2460 static int ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in ipmr_fill_mroute() argument
2477 rtm->rtm_table = mrt->id; in ipmr_fill_mroute()
2478 if (nla_put_u32(skb, RTA_TABLE, mrt->id)) in ipmr_fill_mroute()
2491 err = mr_fill_mroute(mrt, skb, &c->_c, rtm); in ipmr_fill_mroute()
2504 static int _ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in _ipmr_fill_mroute() argument
2508 return ipmr_fill_mroute(mrt, skb, portid, seq, (struct mfc_cache *)c, in _ipmr_fill_mroute()
2533 static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc, in mroute_netlink_event() argument
2536 struct net *net = read_pnet(&mrt->net); in mroute_netlink_event()
2541 mrt->maxvif), in mroute_netlink_event()
2546 err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); in mroute_netlink_event()
2574 static void igmpmsg_netlink_event(const struct mr_table *mrt, struct sk_buff *pkt) in igmpmsg_netlink_event() argument
2576 struct net *net = read_pnet(&mrt->net); in igmpmsg_netlink_event()
2603 nla_put_u32(skb, IPMRA_CREPORT_TABLE, mrt->id)) in igmpmsg_netlink_event()
2685 struct mr_table *mrt; in ipmr_rtm_getroute() local
2698 mrt = __ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT); in ipmr_rtm_getroute()
2699 if (!mrt) { in ipmr_rtm_getroute()
2706 cache = ipmr_cache_find(mrt, src, grp); in ipmr_rtm_getroute()
2713 skb = nlmsg_new(mroute_msgsize(false, mrt->maxvif), GFP_KERNEL); in ipmr_rtm_getroute()
2719 err = ipmr_fill_mroute(mrt, skb, NETLINK_CB(in_skb).portid, in ipmr_rtm_getroute()
2750 struct mr_table *mrt; in ipmr_rtm_dumproute() local
2752 mrt = __ipmr_get_table(sock_net(skb->sk), filter.table_id); in ipmr_rtm_dumproute()
2753 if (!mrt) { in ipmr_rtm_dumproute()
2760 err = mr_table_dump(mrt, skb, cb, _ipmr_fill_mroute, in ipmr_rtm_dumproute()
2810 struct mr_table *mrt; in rtm_to_ipmr_mfcc() local
2860 mrt = __ipmr_get_table(net, tblid); in rtm_to_ipmr_mfcc()
2861 if (!mrt) { in rtm_to_ipmr_mfcc()
2865 *mrtret = mrt; in rtm_to_ipmr_mfcc()
2868 mfcc->mfcc_parent = ipmr_find_vif(mrt, dev); in rtm_to_ipmr_mfcc()
2896 static bool ipmr_fill_table(struct mr_table *mrt, struct sk_buff *skb) in ipmr_fill_table() argument
2898 u32 queue_len = atomic_read(&mrt->cache_resolve_queue_len); in ipmr_fill_table()
2900 if (nla_put_u32(skb, IPMRA_TABLE_ID, mrt->id) || in ipmr_fill_table()
2903 mrt->mroute_reg_vif_num) || in ipmr_fill_table()
2905 mrt->mroute_do_assert) || in ipmr_fill_table()
2906 nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_PIM, mrt->mroute_do_pim) || in ipmr_fill_table()
2908 mrt->mroute_do_wrvifwhole)) in ipmr_fill_table()
2914 static bool ipmr_fill_vif(struct mr_table *mrt, u32 vifid, struct sk_buff *skb) in ipmr_fill_vif() argument
2920 vif = &mrt->vif_table[vifid]; in ipmr_fill_vif()
2982 struct mr_table *mrt; in ipmr_rtm_dumplink() local
2994 ipmr_for_each_table(mrt, net) { in ipmr_rtm_dumplink()
3017 if (!ipmr_fill_table(mrt, skb)) { in ipmr_rtm_dumplink()
3028 for (i = 0; i < mrt->maxvif; i++) { in ipmr_rtm_dumplink()
3031 if (!ipmr_fill_vif(mrt, i, skb)) { in ipmr_rtm_dumplink()
3066 struct mr_table *mrt; in ipmr_vif_seq_start() local
3069 mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_vif_seq_start()
3070 if (!mrt) { in ipmr_vif_seq_start()
3075 iter->mrt = mrt; in ipmr_vif_seq_start()
3089 struct mr_table *mrt = iter->mrt; in ipmr_vif_seq_show() local
3103 vif - mrt->vif_table, in ipmr_vif_seq_show()
3121 struct mr_table *mrt; in ipmr_mfc_seq_start() local
3123 mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_mfc_seq_start()
3124 if (!mrt) in ipmr_mfc_seq_start()
3127 return mr_mfc_seq_start(seq, pos, mrt, &mfc_unres_lock); in ipmr_mfc_seq_start()
3140 const struct mr_table *mrt = it->mrt; in ipmr_mfc_seq_show() local
3147 if (it->cache != &mrt->mfc_unres_queue) { in ipmr_mfc_seq_show()
3154 if (VIF_EXISTS(mrt, n) && in ipmr_mfc_seq_show()