Lines Matching refs:net
87 static struct mr_table *ip6mr_new_table(struct net *net, u32 id);
90 static void ip6_mr_forward(struct net *net, struct mr_table *mrt,
106 #define ip6mr_for_each_table(mrt, net) \ argument
107 list_for_each_entry_rcu(mrt, &net->ipv6.mr6_tables, list, \
109 list_empty(&net->ipv6.mr6_tables))
111 static struct mr_table *ip6mr_mr_table_iter(struct net *net, in ip6mr_mr_table_iter() argument
117 ret = list_entry_rcu(net->ipv6.mr6_tables.next, in ip6mr_mr_table_iter()
123 if (&ret->list == &net->ipv6.mr6_tables) in ip6mr_mr_table_iter()
128 static struct mr_table *__ip6mr_get_table(struct net *net, u32 id) in __ip6mr_get_table() argument
132 ip6mr_for_each_table(mrt, net) { in __ip6mr_get_table()
139 static struct mr_table *ip6mr_get_table(struct net *net, u32 id) in ip6mr_get_table() argument
144 mrt = __ip6mr_get_table(net, id); in ip6mr_get_table()
149 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6, in ip6mr_fib_lookup() argument
160 l3mdev_update_flow(net, flowi6_to_flowi(flp6)); in ip6mr_fib_lookup()
162 err = fib_rules_lookup(net->ipv6.mr6_rules_ops, in ip6mr_fib_lookup()
237 static int __net_init ip6mr_rules_init(struct net *net) in ip6mr_rules_init() argument
243 ops = fib_rules_register(&ip6mr_rules_ops_template, net); in ip6mr_rules_init()
247 INIT_LIST_HEAD(&net->ipv6.mr6_tables); in ip6mr_rules_init()
249 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT); in ip6mr_rules_init()
259 net->ipv6.mr6_rules_ops = ops; in ip6mr_rules_init()
271 static void __net_exit ip6mr_rules_exit(struct net *net) in ip6mr_rules_exit() argument
276 list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) { in ip6mr_rules_exit()
280 fib_rules_unregister(net->ipv6.mr6_rules_ops); in ip6mr_rules_exit()
283 static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb, in ip6mr_rules_dump() argument
286 return fib_rules_dump(net, nb, RTNL_FAMILY_IP6MR, extack); in ip6mr_rules_dump()
289 static unsigned int ip6mr_rules_seq_read(const struct net *net) in ip6mr_rules_seq_read() argument
291 return fib_rules_seq_read(net, RTNL_FAMILY_IP6MR); in ip6mr_rules_seq_read()
301 #define ip6mr_for_each_table(mrt, net) \ argument
302 for (mrt = net->ipv6.mrt6; mrt; mrt = NULL)
304 static struct mr_table *ip6mr_mr_table_iter(struct net *net, in ip6mr_mr_table_iter() argument
308 return net->ipv6.mrt6; in ip6mr_mr_table_iter()
312 static struct mr_table *ip6mr_get_table(struct net *net, u32 id) in ip6mr_get_table() argument
314 return net->ipv6.mrt6; in ip6mr_get_table()
319 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6, in ip6mr_fib_lookup() argument
322 *mrt = net->ipv6.mrt6; in ip6mr_fib_lookup()
326 static int __net_init ip6mr_rules_init(struct net *net) in ip6mr_rules_init() argument
330 mrt = ip6mr_new_table(net, RT6_TABLE_DFLT); in ip6mr_rules_init()
333 net->ipv6.mrt6 = mrt; in ip6mr_rules_init()
337 static void __net_exit ip6mr_rules_exit(struct net *net) in ip6mr_rules_exit() argument
340 ip6mr_free_table(net->ipv6.mrt6); in ip6mr_rules_exit()
341 net->ipv6.mrt6 = NULL; in ip6mr_rules_exit()
344 static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb, in ip6mr_rules_dump() argument
350 static unsigned int ip6mr_rules_seq_read(const struct net *net) in ip6mr_rules_seq_read() argument
376 struct net *net) in ip6mr_new_table_set() argument
379 list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables); in ip6mr_new_table_set()
393 static struct mr_table *ip6mr_new_table(struct net *net, u32 id) in ip6mr_new_table() argument
397 mrt = __ip6mr_get_table(net, id); in ip6mr_new_table()
401 return mr_table_alloc(net, id, &ip6mr_mr_table_ops, in ip6mr_new_table()
407 struct net *net = read_pnet(&mrt->net); in ip6mr_free_table() local
409 WARN_ON_ONCE(!mr_can_free_table(net)); in ip6mr_free_table()
427 struct net *net = seq_file_net(seq); in ip6mr_vif_seq_start() local
431 mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT); in ip6mr_vif_seq_start()
483 struct net *net = seq_file_net(seq); in ipmr_mfc_seq_start() local
486 mrt = ip6mr_get_table(net, RT6_TABLE_DFLT); in ipmr_mfc_seq_start()
550 struct net *net = dev_net(skb->dev); in pim6_rcv() local
579 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in pim6_rcv()
615 struct net *net = dev_net(dev); in reg_vif_xmit() local
626 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in reg_vif_xmit()
664 static struct net_device *ip6mr_reg_vif(struct net *net, struct mr_table *mrt) in ip6mr_reg_vif() argument
678 dev_net_set(dev, net); in ip6mr_reg_vif()
697 static int call_ip6mr_vif_entry_notifiers(struct net *net, in call_ip6mr_vif_entry_notifiers() argument
703 return mr_call_vif_notifiers(net, RTNL_FAMILY_IP6MR, event_type, in call_ip6mr_vif_entry_notifiers()
705 &net->ipv6.ipmr_seq); in call_ip6mr_vif_entry_notifiers()
708 static int call_ip6mr_mfc_entry_notifiers(struct net *net, in call_ip6mr_mfc_entry_notifiers() argument
712 return mr_call_mfc_notifiers(net, RTNL_FAMILY_IP6MR, event_type, in call_ip6mr_mfc_entry_notifiers()
713 &mfc->_c, tb_id, &net->ipv6.ipmr_seq); in call_ip6mr_mfc_entry_notifiers()
733 call_ip6mr_vif_entry_notifiers(read_pnet(&mrt->net), in mif6_delete()
792 struct net *net = read_pnet(&mrt->net); in ip6mr_destroy_unres() local
805 rtnl_unicast(skb, net, NETLINK_CB(skb).portid); in ip6mr_destroy_unres()
880 static int mif6_add(struct net *net, struct mr_table *mrt, in mif6_add() argument
902 dev = ip6mr_reg_vif(net, mrt); in mif6_add()
914 dev = dev_get_by_index(net, vifc->mif6c_pifi); in mif6_add()
951 call_ip6mr_vif_entry_notifiers(net, FIB_EVENT_VIF_ADD, in mif6_add()
1025 static void ip6mr_cache_resolve(struct net *net, struct mr_table *mrt, in ip6mr_cache_resolve() argument
1048 rtnl_unicast(skb, net, NETLINK_CB(skb).portid); in ip6mr_cache_resolve()
1051 ip6_mr_forward(net, mrt, skb->dev, skb, c); in ip6mr_cache_resolve()
1251 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net), in ip6mr_mfc_delete()
1262 struct net *net = dev_net(dev); in ip6mr_device_event() local
1270 ip6mr_for_each_table(mrt, net) { in ip6mr_device_event()
1281 static unsigned int ip6mr_seq_read(const struct net *net) in ip6mr_seq_read() argument
1283 return READ_ONCE(net->ipv6.ipmr_seq) + ip6mr_rules_seq_read(net); in ip6mr_seq_read()
1286 static int ip6mr_dump(struct net *net, struct notifier_block *nb, in ip6mr_dump() argument
1289 return mr_dump(net, nb, RTNL_FAMILY_IP6MR, ip6mr_rules_dump, in ip6mr_dump()
1304 static int __net_init ip6mr_notifier_init(struct net *net) in ip6mr_notifier_init() argument
1308 net->ipv6.ipmr_seq = 0; in ip6mr_notifier_init()
1310 ops = fib_notifier_ops_register(&ip6mr_notifier_ops_template, net); in ip6mr_notifier_init()
1314 net->ipv6.ip6mr_notifier_ops = ops; in ip6mr_notifier_init()
1319 static void __net_exit ip6mr_notifier_exit(struct net *net) in ip6mr_notifier_exit() argument
1321 fib_notifier_ops_unregister(net->ipv6.ip6mr_notifier_ops); in ip6mr_notifier_exit()
1322 net->ipv6.ip6mr_notifier_ops = NULL; in ip6mr_notifier_exit()
1326 static int __net_init ip6mr_net_init(struct net *net) in ip6mr_net_init() argument
1330 err = ip6mr_notifier_init(net); in ip6mr_net_init()
1334 err = ip6mr_rules_init(net); in ip6mr_net_init()
1340 if (!proc_create_net("ip6_mr_vif", 0, net->proc_net, &ip6mr_vif_seq_ops, in ip6mr_net_init()
1343 if (!proc_create_net("ip6_mr_cache", 0, net->proc_net, &ipmr_mfc_seq_ops, in ip6mr_net_init()
1352 remove_proc_entry("ip6_mr_vif", net->proc_net); in ip6mr_net_init()
1355 ip6mr_rules_exit(net); in ip6mr_net_init()
1359 ip6mr_notifier_exit(net); in ip6mr_net_init()
1363 static void __net_exit ip6mr_net_exit(struct net *net) in ip6mr_net_exit() argument
1366 remove_proc_entry("ip6_mr_cache", net->proc_net); in ip6mr_net_exit()
1367 remove_proc_entry("ip6_mr_vif", net->proc_net); in ip6mr_net_exit()
1369 ip6mr_notifier_exit(net); in ip6mr_net_exit()
1374 struct net *net; in ip6mr_net_exit_batch() local
1377 list_for_each_entry(net, net_list, exit_list) in ip6mr_net_exit_batch()
1378 ip6mr_rules_exit(net); in ip6mr_net_exit_batch()
1443 static int ip6mr_mfc_add(struct net *net, struct mr_table *mrt, in ip6mr_mfc_add() argument
1473 call_ip6mr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE, in ip6mr_mfc_add()
1523 ip6mr_cache_resolve(net, mrt, uc, c); in ip6mr_mfc_add()
1526 call_ip6mr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_ADD, in ip6mr_mfc_add()
1562 call_ip6mr_mfc_entry_notifiers(read_pnet(&mrt->net), in mroute_clean_tables()
1587 struct net *net = sock_net(sk); in ip6mr_sk_init() local
1596 atomic_inc(&net->ipv6.devconf_all->mc_forwarding); in ip6mr_sk_init()
1601 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF, in ip6mr_sk_init()
1604 net->ipv6.devconf_all); in ip6mr_sk_init()
1612 struct net *net = sock_net(sk); in ip6mr_sk_done() local
1621 devconf = net->ipv6.devconf_all; in ip6mr_sk_done()
1626 ip6mr_for_each_table(mrt, net) { in ip6mr_sk_done()
1636 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF, in ip6mr_sk_done()
1639 net->ipv6.devconf_all); in ip6mr_sk_done()
1651 bool mroute6_is_socket(struct net *net, struct sk_buff *skb) in mroute6_is_socket() argument
1660 if (ip6mr_fib_lookup(net, &fl6, &mrt) < 0) in mroute6_is_socket()
1681 struct net *net = sock_net(sk); in ip6_mroute_setsockopt() local
1688 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_setsockopt()
1694 !ns_capable(net->user_ns, CAP_NET_ADMIN)) in ip6_mroute_setsockopt()
1716 ret = mif6_add(net, mrt, &vif, in ip6_mroute_setsockopt()
1751 ret = ip6mr_mfc_add(net, mrt, &mfc, in ip6_mroute_setsockopt()
1829 mrt = ip6mr_new_table(net, v); in ip6_mroute_setsockopt()
1856 struct net *net = sock_net(sk); in ip6_mroute_getsockopt() local
1863 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6_mroute_getsockopt()
1906 struct net *net = sock_net(sk); in ip6mr_ioctl() local
1909 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_ioctl()
1974 struct net *net = sock_net(sk); in ip6mr_compat_ioctl() local
1977 mrt = ip6mr_get_table(net, raw6_sk(sk)->ip6mr_table ? : RT6_TABLE_DFLT); in ip6mr_compat_ioctl()
2027 static inline int ip6mr_forward2_finish(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6mr_forward2_finish() argument
2029 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6mr_forward2_finish()
2031 return dst_output(net, sk, skb); in ip6mr_forward2_finish()
2038 static int ip6mr_prepare_xmit(struct net *net, struct mr_table *mrt, in ip6mr_prepare_xmit() argument
2069 dst = ip6_route_output(net, NULL, &fl6); in ip6mr_prepare_xmit()
2103 static void ip6mr_forward2(struct net *net, struct mr_table *mrt, in ip6mr_forward2() argument
2108 if (ip6mr_prepare_xmit(net, mrt, skb, vifi)) in ip6mr_forward2()
2114 net, NULL, skb, indev, skb->dev, in ip6mr_forward2()
2122 static void ip6mr_output2(struct net *net, struct mr_table *mrt, in ip6mr_output2() argument
2125 if (ip6mr_prepare_xmit(net, mrt, skb, vifi)) in ip6mr_output2()
2128 ip6_output(net, NULL, skb); in ip6mr_output2()
2149 static void ip6_mr_forward(struct net *net, struct mr_table *mrt, in ip6_mr_forward() argument
2232 ip6mr_forward2(net, mrt, skb2, psend); in ip6_mr_forward()
2239 ip6mr_forward2(net, mrt, skb, psend); in ip6_mr_forward()
2248 static void ip6_mr_output_finish(struct net *net, struct mr_table *mrt, in ip6_mr_output_finish() argument
2283 ip6mr_output2(net, mrt, skb2, psend); in ip6_mr_output_finish()
2290 ip6mr_output2(net, mrt, skb, psend); in ip6_mr_output_finish()
2305 struct net *net = dev_net_rcu(dev); in ip6_mr_input() local
2318 dev = dev_get_by_index_rcu(net, IPCB(skb)->iif); in ip6_mr_input()
2325 err = ip6mr_fib_lookup(net, &fl6, &mrt); in ip6_mr_input()
2358 ip6_mr_forward(net, mrt, dev, skb, cache); in ip6_mr_input()
2363 int ip6_mr_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6_mr_output() argument
2382 err = ip6mr_fib_lookup(net, &fl6, &mrt); in ip6_mr_output()
2411 ip6_mr_output_finish(net, mrt, dev, skb, cache); in ip6_mr_output()
2415 return ip6_output(net, sk, skb); in ip6_mr_output()
2418 int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm, in ip6mr_get_route() argument
2427 mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT); in ip6mr_get_route()
2566 struct net *net = read_pnet(&mrt->net); in mr6_netlink_event() local
2579 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_MROUTE, NULL, GFP_ATOMIC); in mr6_netlink_event()
2584 rtnl_set_sk_err(net, RTNLGRP_IPV6_MROUTE, err); in mr6_netlink_event()
2606 struct net *net = read_pnet(&mrt->net); in mrt6msg_netlink_event() local
2642 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_MROUTE_R, NULL, GFP_ATOMIC); in mrt6msg_netlink_event()
2649 rtnl_set_sk_err(net, RTNLGRP_IPV6_MROUTE_R, -ENOBUFS); in mrt6msg_netlink_event()
2693 struct net *net = sock_net(in_skb->sk); in ip6mr_rtm_getroute() local
2712 mrt = __ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT); in ip6mr_rtm_getroute()
2738 return rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid); in ip6mr_rtm_getroute()