Lines Matching full:net
25 #include <net/aligned_data.h>
26 #include <net/sock.h>
27 #include <net/netlink.h>
28 #include <net/net_namespace.h>
29 #include <net/netns/generic.h>
49 struct net init_net;
56 * This is internal net namespace object. Please, don't use it
83 static int net_assign_generic(struct net *net, unsigned int id, void *data) in net_assign_generic() argument
89 old_ng = rcu_dereference_protected(net->gen, in net_assign_generic()
103 * The net_generic explores the net->gen array inside rcu in net_assign_generic()
104 * read section. Besides once set the net->gen->ptr[x] in net_assign_generic()
115 rcu_assign_pointer(net->gen, ng); in net_assign_generic()
120 static int ops_init(const struct pernet_operations *ops, struct net *net) in ops_init() argument
131 err = net_assign_generic(net, *ops->id, data); in ops_init()
137 err = ops->init(net); in ops_init()
142 ng = rcu_dereference_protected(net->gen, in ops_init()
157 struct net *net; in ops_pre_exit_list() local
160 list_for_each_entry(net, net_exit_list, exit_list) in ops_pre_exit_list()
161 ops->pre_exit(net); in ops_pre_exit_list()
171 struct net *net; in ops_exit_rtnl_list() local
175 list_for_each_entry(net, net_exit_list, exit_list) { in ops_exit_rtnl_list()
176 __rtnl_net_lock(net); in ops_exit_rtnl_list()
181 ops->exit_rtnl(net, &dev_kill_list); in ops_exit_rtnl_list()
184 __rtnl_net_unlock(net); in ops_exit_rtnl_list()
196 struct net *net; in ops_exit_list() local
198 list_for_each_entry(net, net_exit_list, exit_list) { in ops_exit_list()
199 ops->exit(net); in ops_exit_list()
211 struct net *net; in ops_free_list() local
214 list_for_each_entry(net, net_exit_list, exit_list) in ops_free_list()
215 kfree(net_generic(net, *ops->id)); in ops_free_list()
270 static int alloc_netid(struct net *net, struct net *peer, int reqid) in alloc_netid() argument
279 return idr_alloc(&net->netns_ids, peer, min, max, GFP_ATOMIC); in alloc_netid()
282 /* This function is used by idr_for_each(). If net is equal to peer, the
288 static int net_eq_idr(int id, void *net, void *peer) in net_eq_idr() argument
290 if (net_eq(net, peer)) in net_eq_idr()
296 static int __peernet2id(const struct net *net, struct net *peer) in __peernet2id() argument
298 int id = idr_for_each(&net->netns_ids, net_eq_idr, peer); in __peernet2id()
309 static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid,
314 int peernet2id_alloc(struct net *net, struct net *peer, gfp_t gfp) in peernet2id_alloc() argument
318 if (!check_net(net)) in peernet2id_alloc()
321 spin_lock(&net->nsid_lock); in peernet2id_alloc()
322 id = __peernet2id(net, peer); in peernet2id_alloc()
324 spin_unlock(&net->nsid_lock); in peernet2id_alloc()
330 * we never hash a peer back to net->netns_ids, after it has in peernet2id_alloc()
334 spin_unlock(&net->nsid_lock); in peernet2id_alloc()
338 id = alloc_netid(net, peer, -1); in peernet2id_alloc()
339 spin_unlock(&net->nsid_lock); in peernet2id_alloc()
345 rtnl_net_notifyid(net, RTM_NEWNSID, id, 0, NULL, gfp); in peernet2id_alloc()
352 int peernet2id(const struct net *net, struct net *peer) in peernet2id() argument
357 id = __peernet2id(net, peer); in peernet2id()
367 bool peernet_has_id(const struct net *net, struct net *peer) in peernet_has_id() argument
369 return peernet2id(net, peer) >= 0; in peernet_has_id()
372 struct net *get_net_ns_by_id(const struct net *net, int id) in get_net_ns_by_id() argument
374 struct net *peer; in get_net_ns_by_id()
380 peer = idr_find(&net->netns_ids, id); in get_net_ns_by_id()
389 static __net_init void preinit_net_sysctl(struct net *net) in preinit_net_sysctl() argument
391 net->core.sysctl_somaxconn = SOMAXCONN; in preinit_net_sysctl()
395 net->core.sysctl_optmem_max = 128 * 1024; in preinit_net_sysctl()
396 net->core.sysctl_txrehash = SOCK_TXREHASH_ENABLED; in preinit_net_sysctl()
397 net->core.sysctl_tstamp_allow_data = 1; in preinit_net_sysctl()
401 static __net_init int preinit_net(struct net *net, struct user_namespace *user_ns) in preinit_net() argument
405 ret = ns_common_init(net); in preinit_net()
409 refcount_set(&net->passive, 1); in preinit_net()
410 ref_tracker_dir_init(&net->refcnt_tracker, 128, "net_refcnt"); in preinit_net()
411 ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net_notrefcnt"); in preinit_net()
413 get_random_bytes(&net->hash_mix, sizeof(u32)); in preinit_net()
414 net->dev_base_seq = 1; in preinit_net()
415 net->user_ns = user_ns; in preinit_net()
417 idr_init(&net->netns_ids); in preinit_net()
418 spin_lock_init(&net->nsid_lock); in preinit_net()
419 mutex_init(&net->ipv4.ra_mutex); in preinit_net()
422 mutex_init(&net->rtnl_mutex); in preinit_net()
423 lock_set_cmp_fn(&net->rtnl_mutex, rtnl_net_lock_cmp_fn, NULL); in preinit_net()
426 INIT_LIST_HEAD(&net->ptype_all); in preinit_net()
427 INIT_LIST_HEAD(&net->ptype_specific); in preinit_net()
428 preinit_net_sysctl(net); in preinit_net()
435 static __net_init int setup_net(struct net *net) in setup_net() argument
442 net->net_cookie = ns_tree_gen_id(&net->ns); in setup_net()
445 error = ops_init(ops, net); in setup_net()
450 list_add_tail_rcu(&net->list, &net_namespace_list); in setup_net()
452 ns_tree_add_raw(net); in setup_net()
460 list_add(&net->exit_list, &net_exit_list); in setup_net()
480 static struct net *net_alloc(void) in net_alloc()
482 struct net *net = NULL; in net_alloc() local
489 net = kmem_cache_zalloc(net_cachep, GFP_KERNEL); in net_alloc()
490 if (!net) in net_alloc()
494 net->key_domain = kzalloc(sizeof(struct key_tag), GFP_KERNEL); in net_alloc()
495 if (!net->key_domain) in net_alloc()
497 refcount_set(&net->key_domain->usage, 1); in net_alloc()
500 rcu_assign_pointer(net->gen, ng); in net_alloc()
502 return net; in net_alloc()
506 kmem_cache_free(net_cachep, net); in net_alloc()
507 net = NULL; in net_alloc()
519 struct net *net, *next; in net_complete_free() local
524 llist_for_each_entry_safe(net, next, kill_list, defer_free_list) in net_complete_free()
525 kmem_cache_free(net_cachep, net); in net_complete_free()
529 void net_passive_dec(struct net *net) in net_passive_dec() argument
531 if (refcount_dec_and_test(&net->passive)) { in net_passive_dec()
532 kfree(rcu_access_pointer(net->gen)); in net_passive_dec()
535 ref_tracker_dir_exit(&net->notrefcnt_tracker); in net_passive_dec()
538 llist_add(&net->defer_free_list, &defer_free_list); in net_passive_dec()
544 struct net *net = (struct net *)p; in net_drop_ns() local
546 if (net) in net_drop_ns()
547 net_passive_dec(net); in net_drop_ns()
550 struct net *copy_net_ns(u64 flags, in copy_net_ns()
551 struct user_namespace *user_ns, struct net *old_net) in copy_net_ns()
554 struct net *net; in copy_net_ns() local
564 net = net_alloc(); in copy_net_ns()
565 if (!net) { in copy_net_ns()
570 rv = preinit_net(net, user_ns); in copy_net_ns()
573 net->ucounts = ucounts; in copy_net_ns()
580 rv = setup_net(net); in copy_net_ns()
586 ns_common_free(net); in copy_net_ns()
588 key_remove_domain(net->key_domain); in copy_net_ns()
591 net_passive_dec(net); in copy_net_ns()
596 return net; in copy_net_ns()
600 * net_ns_get_ownership - get sysfs ownership data for @net
601 * @net: network namespace in question (can be NULL)
608 void net_ns_get_ownership(const struct net *net, kuid_t *uid, kgid_t *gid) in net_ns_get_ownership() argument
610 if (net) { in net_ns_get_ownership()
611 kuid_t ns_root_uid = make_kuid(net->user_ns, 0); in net_ns_get_ownership()
612 kgid_t ns_root_gid = make_kgid(net->user_ns, 0); in net_ns_get_ownership()
626 static void unhash_nsid(struct net *net, struct net *last) in unhash_nsid() argument
628 struct net *tmp; in unhash_nsid()
631 * a net from net_namespace_list. So, when the below in unhash_nsid()
639 id = __peernet2id(tmp, net); in unhash_nsid()
649 spin_lock(&net->nsid_lock); in unhash_nsid()
650 idr_destroy(&net->netns_ids); in unhash_nsid()
651 spin_unlock(&net->nsid_lock); in unhash_nsid()
661 struct net *net, *tmp, *last; in cleanup_net() local
673 llist_for_each_entry(net, net_kill_list, cleanup_list) { in cleanup_net()
674 ns_tree_remove(net); in cleanup_net()
675 list_del_rcu(&net->list); in cleanup_net()
677 /* Cache last net. After we unlock rtnl, no one new net in cleanup_net()
679 * to a net from net_kill_list (see peernet2id_alloc()). in cleanup_net()
687 last = list_last_entry(&net_namespace_list, struct net, list); in cleanup_net()
690 llist_for_each_entry(net, net_kill_list, cleanup_list) { in cleanup_net()
691 unhash_nsid(net, last); in cleanup_net()
692 list_add_tail(&net->exit_list, &net_exit_list); in cleanup_net()
707 list_for_each_entry_safe(net, tmp, &net_exit_list, exit_list) { in cleanup_net()
708 list_del_init(&net->exit_list); in cleanup_net()
709 ns_common_free(net); in cleanup_net()
710 dec_net_namespaces(net->ucounts); in cleanup_net()
712 key_remove_domain(net->key_domain); in cleanup_net()
714 put_user_ns(net->user_ns); in cleanup_net()
715 net_passive_dec(net); in cleanup_net()
724 * from the global list, then run net exit functions.
738 void __put_net(struct net *net) in __put_net() argument
740 ref_tracker_dir_exit(&net->refcnt_tracker); in __put_net()
742 if (llist_add(&net->cleanup_list, &cleanup_list)) in __put_net()
749 * @ns: common namespace (net)
751 * Returns the net's common namespace or ERR_PTR() if ref is zero.
755 struct net *net; in get_net_ns() local
757 net = maybe_get_net(container_of(ns, struct net, ns)); in get_net_ns()
758 if (net) in get_net_ns()
759 return &net->ns; in get_net_ns()
764 struct net *get_net_ns_by_fd(int fd) in get_net_ns_by_fd()
774 return get_net(container_of(ns, struct net, ns)); in get_net_ns_by_fd()
782 struct net *get_net_ns_by_pid(pid_t pid) in get_net_ns_by_pid()
785 struct net *net; in get_net_ns_by_pid() local
788 net = ERR_PTR(-ESRCH); in get_net_ns_by_pid()
796 net = get_net(nsproxy->net_ns); in get_net_ns_by_pid()
800 return net; in get_net_ns_by_pid()
805 static void net_ns_net_debugfs(struct net *net) in net_ns_net_debugfs() argument
807 ref_tracker_dir_symlink(&net->refcnt_tracker, "netns-%llx-%u-refcnt", in net_ns_net_debugfs()
808 net->net_cookie, net->ns.inum); in net_ns_net_debugfs()
809 ref_tracker_dir_symlink(&net->notrefcnt_tracker, "netns-%llx-%u-notrefcnt", in net_ns_net_debugfs()
810 net->net_cookie, net->ns.inum); in net_ns_net_debugfs()
822 static void net_ns_net_debugfs(struct net *net) in net_ns_net_debugfs() argument
827 static __net_init int net_ns_net_init(struct net *net) in net_ns_net_init() argument
829 net_ns_net_debugfs(net); in net_ns_net_init()
848 struct net *net = sock_net(skb->sk); in rtnl_net_newid() local
851 struct net *peer; in rtnl_net_newid()
880 spin_lock(&net->nsid_lock); in rtnl_net_newid()
881 if (__peernet2id(net, peer) >= 0) { in rtnl_net_newid()
882 spin_unlock(&net->nsid_lock); in rtnl_net_newid()
890 err = alloc_netid(net, peer, nsid); in rtnl_net_newid()
891 spin_unlock(&net->nsid_lock); in rtnl_net_newid()
893 rtnl_net_notifyid(net, RTM_NEWNSID, err, NETLINK_CB(skb).portid, in rtnl_net_newid()
992 struct net *net = sock_net(skb->sk); in rtnl_net_getid() local
999 struct net *peer, *target = net; in rtnl_net_getid()
1014 peer = get_net_ns_by_id(net, nla_get_s32(tb[NETNSA_NSID])); in rtnl_net_getid()
1041 fillargs.ref_nsid = peernet2id(net, peer); in rtnl_net_getid()
1055 err = rtnl_unicast(msg, net, NETLINK_CB(skb).portid); in rtnl_net_getid()
1068 struct net *tgt_net;
1069 struct net *ref_net;
1116 struct net *net; in rtnl_valid_dump_net_req() local
1118 net = rtnl_get_net_ns_capable(sk, nla_get_s32(tb[i])); in rtnl_valid_dump_net_req()
1119 if (IS_ERR(net)) { in rtnl_valid_dump_net_req()
1123 return PTR_ERR(net); in rtnl_valid_dump_net_req()
1127 net_cb->tgt_net = net; in rtnl_valid_dump_net_req()
1172 static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid, in rtnl_net_notifyid() argument
1192 rtnl_notify(msg, net, portid, RTNLGRP_NSID, nlh, gfp); in rtnl_net_notifyid()
1198 rtnl_set_sk_err(net, RTNLGRP_NSID, err); in rtnl_net_notifyid()
1261 net_cachep = kmem_cache_create("net_namespace", sizeof(struct net), in net_ns_init()
1305 struct net *net; in __register_pernet_operations() local
1313 for_each_net(net) { in __register_pernet_operations()
1314 error = ops_init(ops, net); in __register_pernet_operations()
1317 list_add_tail(&net->exit_list, &net_exit_list); in __register_pernet_operations()
1332 struct net *net; in __unregister_pernet_operations() local
1335 for_each_net(net) in __unregister_pernet_operations()
1336 list_add_tail(&net->exit_list, &net_exit_list); in __unregister_pernet_operations()
1508 struct net *net = NULL; in netns_get() local
1514 net = get_net(nsproxy->net_ns); in netns_get()
1517 return net ? &net->ns : NULL; in netns_get()
1528 struct net *net = to_net_ns(ns); in netns_install() local
1530 if (!ns_capable(net->user_ns, CAP_SYS_ADMIN) || in netns_install()
1535 nsproxy->net_ns = get_net(net); in netns_install()
1545 .name = "net",