Lines Matching refs:mrt
77 struct mr_table *mrt; member
102 static void ipmr_free_table(struct mr_table *mrt);
104 static void ip_mr_forward(struct net *net, struct mr_table *mrt,
107 static int ipmr_cache_report(struct mr_table *mrt,
109 static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
111 static void igmpmsg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt);
112 static void mroute_clean_tables(struct mr_table *mrt, bool all);
116 #define ipmr_for_each_table(mrt, net) \ argument
117 list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list)
120 struct mr_table *mrt) in ipmr_mr_table_iter() argument
124 if (!mrt) in ipmr_mr_table_iter()
128 ret = list_entry_rcu(mrt->list.next, in ipmr_mr_table_iter()
138 struct mr_table *mrt; in ipmr_get_table() local
140 ipmr_for_each_table(mrt, net) { in ipmr_get_table()
141 if (mrt->id == id) in ipmr_get_table()
142 return mrt; in ipmr_get_table()
148 struct mr_table **mrt) in ipmr_fib_lookup() argument
164 *mrt = res.mrt; in ipmr_fib_lookup()
172 struct mr_table *mrt; in ipmr_rule_action() local
188 mrt = ipmr_get_table(rule->fr_net, arg->table); in ipmr_rule_action()
189 if (!mrt) in ipmr_rule_action()
191 res->mrt = mrt; in ipmr_rule_action()
243 struct mr_table *mrt; in ipmr_rules_init() local
252 mrt = ipmr_new_table(net, RT_TABLE_DEFAULT); in ipmr_rules_init()
253 if (IS_ERR(mrt)) { in ipmr_rules_init()
254 err = PTR_ERR(mrt); in ipmr_rules_init()
266 ipmr_free_table(mrt); in ipmr_rules_init()
274 struct mr_table *mrt, *next; in ipmr_rules_exit() local
277 list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { in ipmr_rules_exit()
278 list_del(&mrt->list); in ipmr_rules_exit()
279 ipmr_free_table(mrt); in ipmr_rules_exit()
301 #define ipmr_for_each_table(mrt, net) \ argument
302 for (mrt = net->ipv4.mrt; mrt; mrt = NULL)
305 struct mr_table *mrt) in ipmr_mr_table_iter() argument
307 if (!mrt) in ipmr_mr_table_iter()
308 return net->ipv4.mrt; in ipmr_mr_table_iter()
314 return net->ipv4.mrt; in ipmr_get_table()
318 struct mr_table **mrt) in ipmr_fib_lookup() argument
320 *mrt = net->ipv4.mrt; in ipmr_fib_lookup()
326 struct mr_table *mrt; in ipmr_rules_init() local
328 mrt = ipmr_new_table(net, RT_TABLE_DEFAULT); in ipmr_rules_init()
329 if (IS_ERR(mrt)) in ipmr_rules_init()
330 return PTR_ERR(mrt); in ipmr_rules_init()
331 net->ipv4.mrt = mrt; in ipmr_rules_init()
338 ipmr_free_table(net->ipv4.mrt); in ipmr_rules_exit()
339 net->ipv4.mrt = NULL; in ipmr_rules_exit()
380 static void ipmr_new_table_set(struct mr_table *mrt, in ipmr_new_table_set() argument
384 list_add_tail_rcu(&mrt->list, &net->ipv4.mr_tables); in ipmr_new_table_set()
400 struct mr_table *mrt; in ipmr_new_table() local
406 mrt = ipmr_get_table(net, id); in ipmr_new_table()
407 if (mrt) in ipmr_new_table()
408 return mrt; in ipmr_new_table()
414 static void ipmr_free_table(struct mr_table *mrt) in ipmr_free_table() argument
416 del_timer_sync(&mrt->ipmr_expire_timer); in ipmr_free_table()
417 mroute_clean_tables(mrt, true); in ipmr_free_table()
418 rhltable_destroy(&mrt->mfc_hash); in ipmr_free_table()
419 kfree(mrt); in ipmr_free_table()
525 struct mr_table *mrt; in reg_vif_xmit() local
533 err = ipmr_fib_lookup(net, &fl4, &mrt); in reg_vif_xmit()
542 ipmr_cache_report(mrt, skb, mrt->mroute_reg_vif_num, IGMPMSG_WHOLEPKT); in reg_vif_xmit()
568 static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt) in ipmr_reg_vif() argument
573 if (mrt->id == RT_TABLE_DEFAULT) in ipmr_reg_vif()
576 sprintf(name, "pimreg%u", mrt->id); in ipmr_reg_vif()
605 static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, in __pim_rcv() argument
623 if (mrt->mroute_reg_vif_num >= 0) in __pim_rcv()
624 reg_dev = mrt->vif_table[mrt->mroute_reg_vif_num].dev; in __pim_rcv()
643 static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt) in ipmr_reg_vif() argument
671 static int vif_delete(struct mr_table *mrt, int vifi, int notify, in vif_delete() argument
674 struct net *net = read_pnet(&mrt->net); in vif_delete()
679 if (vifi < 0 || vifi >= mrt->maxvif) in vif_delete()
682 v = &mrt->vif_table[vifi]; in vif_delete()
684 if (VIF_EXISTS(mrt, vifi)) in vif_delete()
686 mrt->id); in vif_delete()
697 if (vifi == mrt->mroute_reg_vif_num) in vif_delete()
698 mrt->mroute_reg_vif_num = -1; in vif_delete()
700 if (vifi + 1 == mrt->maxvif) { in vif_delete()
704 if (VIF_EXISTS(mrt, tmp)) in vif_delete()
707 mrt->maxvif = tmp+1; in vif_delete()
745 static void ipmr_destroy_unres(struct mr_table *mrt, struct mfc_cache *c) in ipmr_destroy_unres() argument
747 struct net *net = read_pnet(&mrt->net); in ipmr_destroy_unres()
751 atomic_dec(&mrt->cache_resolve_queue_len); in ipmr_destroy_unres()
776 struct mr_table *mrt = from_timer(mrt, t, ipmr_expire_timer); in ipmr_expire_process() local
782 mod_timer(&mrt->ipmr_expire_timer, jiffies+HZ/10); in ipmr_expire_process()
786 if (list_empty(&mrt->mfc_unres_queue)) in ipmr_expire_process()
792 list_for_each_entry_safe(c, next, &mrt->mfc_unres_queue, list) { in ipmr_expire_process()
801 mroute_netlink_event(mrt, (struct mfc_cache *)c, RTM_DELROUTE); in ipmr_expire_process()
802 ipmr_destroy_unres(mrt, (struct mfc_cache *)c); in ipmr_expire_process()
805 if (!list_empty(&mrt->mfc_unres_queue)) in ipmr_expire_process()
806 mod_timer(&mrt->ipmr_expire_timer, jiffies + expires); in ipmr_expire_process()
813 static void ipmr_update_thresholds(struct mr_table *mrt, struct mr_mfc *cache, in ipmr_update_thresholds() argument
822 for (vifi = 0; vifi < mrt->maxvif; vifi++) { in ipmr_update_thresholds()
823 if (VIF_EXISTS(mrt, vifi) && in ipmr_update_thresholds()
835 static int vif_add(struct net *net, struct mr_table *mrt, in vif_add() argument
842 struct vif_device *v = &mrt->vif_table[vifi]; in vif_add()
848 if (VIF_EXISTS(mrt, vifi)) in vif_add()
858 if (mrt->mroute_reg_vif_num >= 0) in vif_add()
860 dev = ipmr_reg_vif(net, mrt); in vif_add()
935 mrt->mroute_reg_vif_num = vifi; in vif_add()
936 if (vifi+1 > mrt->maxvif) in vif_add()
937 mrt->maxvif = vifi+1; in vif_add()
939 call_ipmr_vif_entry_notifiers(net, FIB_EVENT_VIF_ADD, v, vifi, mrt->id); in vif_add()
944 static struct mfc_cache *ipmr_cache_find(struct mr_table *mrt, in ipmr_cache_find() argument
953 return mr_mfc_find(mrt, &arg); in ipmr_cache_find()
957 static struct mfc_cache *ipmr_cache_find_any(struct mr_table *mrt, in ipmr_cache_find_any() argument
966 return mr_mfc_find_any_parent(mrt, vifi); in ipmr_cache_find_any()
967 return mr_mfc_find_any(mrt, vifi, &arg); in ipmr_cache_find_any()
971 static struct mfc_cache *ipmr_cache_find_parent(struct mr_table *mrt, in ipmr_cache_find_parent() argument
980 return mr_mfc_find_parent(mrt, &arg, parent); in ipmr_cache_find_parent()
1009 static void ipmr_cache_resolve(struct net *net, struct mr_table *mrt, in ipmr_cache_resolve() argument
1021 if (mr_fill_mroute(mrt, skb, &c->_c, in ipmr_cache_resolve()
1036 ip_mr_forward(net, mrt, skb->dev, skb, c, 0); in ipmr_cache_resolve()
1045 static int ipmr_cache_report(struct mr_table *mrt, in ipmr_cache_report() argument
1079 msg->im_vif = mrt->mroute_reg_vif_num; in ipmr_cache_report()
1103 mroute_sk = rcu_dereference(mrt->mroute_sk); in ipmr_cache_report()
1110 igmpmsg_netlink_event(mrt, skb); in ipmr_cache_report()
1124 static int ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, in ipmr_cache_unresolved() argument
1133 list_for_each_entry(c, &mrt->mfc_unres_queue, _c.list) { in ipmr_cache_unresolved()
1143 if (atomic_read(&mrt->cache_resolve_queue_len) >= 10 || in ipmr_cache_unresolved()
1157 err = ipmr_cache_report(mrt, skb, vifi, IGMPMSG_NOCACHE); in ipmr_cache_unresolved()
1170 atomic_inc(&mrt->cache_resolve_queue_len); in ipmr_cache_unresolved()
1171 list_add(&c->_c.list, &mrt->mfc_unres_queue); in ipmr_cache_unresolved()
1172 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_cache_unresolved()
1174 if (atomic_read(&mrt->cache_resolve_queue_len) == 1) in ipmr_cache_unresolved()
1175 mod_timer(&mrt->ipmr_expire_timer, in ipmr_cache_unresolved()
1198 static int ipmr_mfc_delete(struct mr_table *mrt, struct mfcctl *mfc, int parent) in ipmr_mfc_delete() argument
1200 struct net *net = read_pnet(&mrt->net); in ipmr_mfc_delete()
1205 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_delete()
1210 rhltable_remove(&mrt->mfc_hash, &c->_c.mnode, ipmr_rht_params); in ipmr_mfc_delete()
1212 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, c, mrt->id); in ipmr_mfc_delete()
1213 mroute_netlink_event(mrt, c, RTM_DELROUTE); in ipmr_mfc_delete()
1219 static int ipmr_mfc_add(struct net *net, struct mr_table *mrt, in ipmr_mfc_add() argument
1232 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_add()
1238 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1243 mrt->id); in ipmr_mfc_add()
1244 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1259 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1263 ret = rhltable_insert_key(&mrt->mfc_hash, &c->cmparg, &c->_c.mnode, in ipmr_mfc_add()
1270 list_add_tail_rcu(&c->_c.list, &mrt->mfc_cache_list); in ipmr_mfc_add()
1276 list_for_each_entry(_uc, &mrt->mfc_unres_queue, list) { in ipmr_mfc_add()
1281 atomic_dec(&mrt->cache_resolve_queue_len); in ipmr_mfc_add()
1286 if (list_empty(&mrt->mfc_unres_queue)) in ipmr_mfc_add()
1287 del_timer(&mrt->ipmr_expire_timer); in ipmr_mfc_add()
1291 ipmr_cache_resolve(net, mrt, uc, c); in ipmr_mfc_add()
1294 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_ADD, c, mrt->id); in ipmr_mfc_add()
1295 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1300 static void mroute_clean_tables(struct mr_table *mrt, bool all) in mroute_clean_tables() argument
1302 struct net *net = read_pnet(&mrt->net); in mroute_clean_tables()
1309 for (i = 0; i < mrt->maxvif; i++) { in mroute_clean_tables()
1310 if (!all && (mrt->vif_table[i].flags & VIFF_STATIC)) in mroute_clean_tables()
1312 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()
1320 rhltable_remove(&mrt->mfc_hash, &c->mnode, ipmr_rht_params); in mroute_clean_tables()
1324 mrt->id); in mroute_clean_tables()
1325 mroute_netlink_event(mrt, cache, RTM_DELROUTE); in mroute_clean_tables()
1329 if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { in mroute_clean_tables()
1331 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) { in mroute_clean_tables()
1334 mroute_netlink_event(mrt, cache, RTM_DELROUTE); in mroute_clean_tables()
1335 ipmr_destroy_unres(mrt, cache); in mroute_clean_tables()
1347 struct mr_table *mrt; in mrtsock_destruct() local
1350 ipmr_for_each_table(mrt, net) { in mrtsock_destruct()
1351 if (sk == rtnl_dereference(mrt->mroute_sk)) { in mrtsock_destruct()
1357 RCU_INIT_POINTER(mrt->mroute_sk, NULL); in mrtsock_destruct()
1358 mroute_clean_tables(mrt, false); in mrtsock_destruct()
1375 struct mr_table *mrt; in ip_mroute_setsockopt() local
1389 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ip_mroute_setsockopt()
1390 if (!mrt) { in ip_mroute_setsockopt()
1395 if (sk != rcu_access_pointer(mrt->mroute_sk) && in ip_mroute_setsockopt()
1408 if (rtnl_dereference(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1415 rcu_assign_pointer(mrt->mroute_sk, sk); in ip_mroute_setsockopt()
1424 if (sk != rcu_access_pointer(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1451 ret = vif_add(net, mrt, &vif, in ip_mroute_setsockopt()
1452 sk == rtnl_dereference(mrt->mroute_sk)); in ip_mroute_setsockopt()
1454 ret = vif_delete(mrt, vif.vifc_vifi, 0, NULL); in ip_mroute_setsockopt()
1477 ret = ipmr_mfc_delete(mrt, &mfc, parent); in ip_mroute_setsockopt()
1479 ret = ipmr_mfc_add(net, mrt, &mfc, in ip_mroute_setsockopt()
1480 sk == rtnl_dereference(mrt->mroute_sk), in ip_mroute_setsockopt()
1493 mrt->mroute_do_assert = val; in ip_mroute_setsockopt()
1511 if (val != mrt->mroute_do_pim) { in ip_mroute_setsockopt()
1512 mrt->mroute_do_pim = val; in ip_mroute_setsockopt()
1513 mrt->mroute_do_assert = val; in ip_mroute_setsockopt()
1514 mrt->mroute_do_wrvifwhole = do_wrvifwhole; in ip_mroute_setsockopt()
1531 if (sk == rtnl_dereference(mrt->mroute_sk)) { in ip_mroute_setsockopt()
1534 mrt = ipmr_new_table(net, uval); in ip_mroute_setsockopt()
1535 if (IS_ERR(mrt)) in ip_mroute_setsockopt()
1536 ret = PTR_ERR(mrt); in ip_mroute_setsockopt()
1557 struct mr_table *mrt; in ip_mroute_getsockopt() local
1563 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ip_mroute_getsockopt()
1564 if (!mrt) in ip_mroute_getsockopt()
1574 val = mrt->mroute_do_pim; in ip_mroute_getsockopt()
1577 val = mrt->mroute_do_assert; in ip_mroute_getsockopt()
1603 struct mr_table *mrt; in ipmr_ioctl() local
1605 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ipmr_ioctl()
1606 if (!mrt) in ipmr_ioctl()
1613 if (vr.vifi >= mrt->maxvif) in ipmr_ioctl()
1616 vif = &mrt->vif_table[vr.vifi]; in ipmr_ioctl()
1617 if (VIF_EXISTS(mrt, vr.vifi)) { in ipmr_ioctl()
1635 c = ipmr_cache_find(mrt, sr.src.s_addr, sr.grp.s_addr); in ipmr_ioctl()
1677 struct mr_table *mrt; in ipmr_compat_ioctl() local
1679 mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT); in ipmr_compat_ioctl()
1680 if (!mrt) in ipmr_compat_ioctl()
1687 if (vr.vifi >= mrt->maxvif) in ipmr_compat_ioctl()
1690 vif = &mrt->vif_table[vr.vifi]; in ipmr_compat_ioctl()
1691 if (VIF_EXISTS(mrt, vr.vifi)) { in ipmr_compat_ioctl()
1709 c = ipmr_cache_find(mrt, sr.src.s_addr, sr.grp.s_addr); in ipmr_compat_ioctl()
1732 struct mr_table *mrt; in ipmr_device_event() local
1739 ipmr_for_each_table(mrt, net) { in ipmr_device_event()
1740 v = &mrt->vif_table[0]; in ipmr_device_event()
1741 for (ct = 0; ct < mrt->maxvif; ct++, v++) { in ipmr_device_event()
1743 vif_delete(mrt, ct, 1, NULL); in ipmr_device_event()
1799 static bool ipmr_forward_offloaded(struct sk_buff *skb, struct mr_table *mrt, in ipmr_forward_offloaded() argument
1802 struct vif_device *out_vif = &mrt->vif_table[out_vifi]; in ipmr_forward_offloaded()
1803 struct vif_device *in_vif = &mrt->vif_table[in_vifi]; in ipmr_forward_offloaded()
1813 static bool ipmr_forward_offloaded(struct sk_buff *skb, struct mr_table *mrt, in ipmr_forward_offloaded() argument
1822 static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, in ipmr_queue_xmit() argument
1827 struct vif_device *vif = &mrt->vif_table[vifi]; in ipmr_queue_xmit()
1841 ipmr_cache_report(mrt, skb, vifi, IGMPMSG_WHOLEPKT); in ipmr_queue_xmit()
1845 if (ipmr_forward_offloaded(skb, mrt, in_vifi, vifi)) in ipmr_queue_xmit()
1923 static int ipmr_find_vif(struct mr_table *mrt, struct net_device *dev) in ipmr_find_vif() argument
1927 for (ct = mrt->maxvif-1; ct >= 0; ct--) { in ipmr_find_vif()
1928 if (mrt->vif_table[ct].dev == dev) in ipmr_find_vif()
1935 static void ip_mr_forward(struct net *net, struct mr_table *mrt, in ip_mr_forward() argument
1939 int true_vifi = ipmr_find_vif(mrt, dev); in ip_mr_forward()
1954 cache_proxy = mr_mfc_find_any_parent(mrt, vif); in ip_mr_forward()
1961 if (mrt->vif_table[vif].dev != dev) { in ip_mr_forward()
1979 if (true_vifi >= 0 && mrt->mroute_do_assert && in ip_mr_forward()
1985 (mrt->mroute_do_pim || in ip_mr_forward()
1991 ipmr_cache_report(mrt, skb, true_vifi, IGMPMSG_WRONGVIF); in ip_mr_forward()
1992 if (mrt->mroute_do_wrvifwhole) in ip_mr_forward()
1993 ipmr_cache_report(mrt, skb, true_vifi, in ip_mr_forward()
2000 mrt->vif_table[vif].pkt_in++; in ip_mr_forward()
2001 mrt->vif_table[vif].bytes_in += skb->len; in ip_mr_forward()
2029 ipmr_queue_xmit(net, mrt, true_vifi, in ip_mr_forward()
2041 ipmr_queue_xmit(net, mrt, true_vifi, skb2, in ip_mr_forward()
2044 ipmr_queue_xmit(net, mrt, true_vifi, skb, c, psend); in ip_mr_forward()
2069 struct mr_table *mrt; in ipmr_rt_fib_lookup() local
2072 err = ipmr_fib_lookup(net, &fl4, &mrt); in ipmr_rt_fib_lookup()
2075 return mrt; in ipmr_rt_fib_lookup()
2086 struct mr_table *mrt; in ip_mr_input() local
2108 mrt = ipmr_rt_fib_lookup(net, skb); in ip_mr_input()
2109 if (IS_ERR(mrt)) { in ip_mr_input()
2111 return PTR_ERR(mrt); in ip_mr_input()
2126 mroute_sk = rcu_dereference(mrt->mroute_sk); in ip_mr_input()
2136 cache = ipmr_cache_find(mrt, ip_hdr(skb)->saddr, ip_hdr(skb)->daddr); in ip_mr_input()
2138 int vif = ipmr_find_vif(mrt, dev); in ip_mr_input()
2141 cache = ipmr_cache_find_any(mrt, ip_hdr(skb)->daddr, in ip_mr_input()
2158 vif = ipmr_find_vif(mrt, dev); in ip_mr_input()
2160 int err2 = ipmr_cache_unresolved(mrt, vif, skb, dev); in ip_mr_input()
2171 ip_mr_forward(net, mrt, dev, skb, cache, local); in ip_mr_input()
2192 struct mr_table *mrt; in pim_rcv_v1() local
2199 mrt = ipmr_rt_fib_lookup(net, skb); in pim_rcv_v1()
2200 if (IS_ERR(mrt)) in pim_rcv_v1()
2202 if (!mrt->mroute_do_pim || in pim_rcv_v1()
2206 if (__pim_rcv(mrt, skb, sizeof(*pim))) { in pim_rcv_v1()
2219 struct mr_table *mrt; in pim_rcv() local
2231 mrt = ipmr_rt_fib_lookup(net, skb); in pim_rcv()
2232 if (IS_ERR(mrt)) in pim_rcv()
2234 if (__pim_rcv(mrt, skb, sizeof(*pim))) { in pim_rcv()
2247 struct mr_table *mrt; in ipmr_get_route() local
2250 mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_get_route()
2251 if (!mrt) in ipmr_get_route()
2255 cache = ipmr_cache_find(mrt, saddr, daddr); in ipmr_get_route()
2257 int vif = ipmr_find_vif(mrt, skb->dev); in ipmr_get_route()
2260 cache = ipmr_cache_find_any(mrt, daddr, vif); in ipmr_get_route()
2271 vif = ipmr_find_vif(mrt, dev); in ipmr_get_route()
2292 err = ipmr_cache_unresolved(mrt, vif, skb2, dev); in ipmr_get_route()
2299 err = mr_fill_mroute(mrt, skb, &cache->_c, rtm); in ipmr_get_route()
2305 static int ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in ipmr_fill_mroute() argument
2322 rtm->rtm_table = mrt->id; in ipmr_fill_mroute()
2323 if (nla_put_u32(skb, RTA_TABLE, mrt->id)) in ipmr_fill_mroute()
2336 err = mr_fill_mroute(mrt, skb, &c->_c, rtm); in ipmr_fill_mroute()
2349 static int _ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, in _ipmr_fill_mroute() argument
2353 return ipmr_fill_mroute(mrt, skb, portid, seq, (struct mfc_cache *)c, in _ipmr_fill_mroute()
2378 static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc, in mroute_netlink_event() argument
2381 struct net *net = read_pnet(&mrt->net); in mroute_netlink_event()
2386 mrt->maxvif), in mroute_netlink_event()
2391 err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); in mroute_netlink_event()
2419 static void igmpmsg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt) in igmpmsg_netlink_event() argument
2421 struct net *net = read_pnet(&mrt->net); in igmpmsg_netlink_event()
2474 struct mr_table *mrt; in ipmr_rtm_getroute() local
2491 mrt = ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT); in ipmr_rtm_getroute()
2492 if (!mrt) { in ipmr_rtm_getroute()
2499 cache = ipmr_cache_find(mrt, src, grp); in ipmr_rtm_getroute()
2506 skb = nlmsg_new(mroute_msgsize(false, mrt->maxvif), GFP_KERNEL); in ipmr_rtm_getroute()
2512 err = ipmr_fill_mroute(mrt, skb, NETLINK_CB(in_skb).portid, in ipmr_rtm_getroute()
2575 struct mr_table *mrt; in rtm_to_ipmr_mfcc() local
2625 mrt = ipmr_get_table(net, tblid); in rtm_to_ipmr_mfcc()
2626 if (!mrt) { in rtm_to_ipmr_mfcc()
2630 *mrtret = mrt; in rtm_to_ipmr_mfcc()
2633 mfcc->mfcc_parent = ipmr_find_vif(mrt, dev); in rtm_to_ipmr_mfcc()
2661 static bool ipmr_fill_table(struct mr_table *mrt, struct sk_buff *skb) in ipmr_fill_table() argument
2663 u32 queue_len = atomic_read(&mrt->cache_resolve_queue_len); in ipmr_fill_table()
2665 if (nla_put_u32(skb, IPMRA_TABLE_ID, mrt->id) || in ipmr_fill_table()
2668 mrt->mroute_reg_vif_num) || in ipmr_fill_table()
2670 mrt->mroute_do_assert) || in ipmr_fill_table()
2671 nla_put_u8(skb, IPMRA_TABLE_MROUTE_DO_PIM, mrt->mroute_do_pim) || in ipmr_fill_table()
2673 mrt->mroute_do_wrvifwhole)) in ipmr_fill_table()
2679 static bool ipmr_fill_vif(struct mr_table *mrt, u32 vifid, struct sk_buff *skb) in ipmr_fill_vif() argument
2685 if (!VIF_EXISTS(mrt, vifid)) in ipmr_fill_vif()
2688 vif = &mrt->vif_table[vifid]; in ipmr_fill_vif()
2719 struct mr_table *mrt; in ipmr_rtm_dumplink() local
2724 ipmr_for_each_table(mrt, net) { in ipmr_rtm_dumplink()
2747 if (!ipmr_fill_table(mrt, skb)) { in ipmr_rtm_dumplink()
2758 for (i = 0; i < mrt->maxvif; i++) { in ipmr_rtm_dumplink()
2761 if (!ipmr_fill_vif(mrt, i, skb)) { in ipmr_rtm_dumplink()
2796 struct mr_table *mrt; in ipmr_vif_seq_start() local
2798 mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_vif_seq_start()
2799 if (!mrt) in ipmr_vif_seq_start()
2802 iter->mrt = mrt; in ipmr_vif_seq_start()
2817 struct mr_table *mrt = iter->mrt; in ipmr_vif_seq_show() local
2829 vif - mrt->vif_table, in ipmr_vif_seq_show()
2847 struct mr_table *mrt; in ipmr_mfc_seq_start() local
2849 mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); in ipmr_mfc_seq_start()
2850 if (!mrt) in ipmr_mfc_seq_start()
2853 return mr_mfc_seq_start(seq, pos, mrt, &mfc_unres_lock); in ipmr_mfc_seq_start()
2866 const struct mr_table *mrt = it->mrt; in ipmr_mfc_seq_show() local
2873 if (it->cache != &mrt->mfc_unres_queue) { in ipmr_mfc_seq_show()
2880 if (VIF_EXISTS(mrt, n) && in ipmr_mfc_seq_show()