netns
void nfs_netns_sysfs_setup(struct nfs_net *netns, struct net *net)
netns->nfs_client = clp;
void nfs_netns_sysfs_destroy(struct nfs_net *netns)
struct nfs_netns_client *clp = netns->nfs_client;
netns->nfs_client = NULL;
void nfs_netns_sysfs_setup(struct nfs_net *netns, struct net *net);
void nfs_netns_sysfs_destroy(struct nfs_net *netns);
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
trace_nfsd_ctl_recoverydir(netns(file), recdir);
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
trace_nfsd_end_grace(netns(file));
struct net *net = netns(file);
trace_nfsd_ctl_unlock_fs(netns(file), fo_path);
nfsd4_cancel_copy_by_sb(netns(file), path.dentry->d_sb);
nn = net_generic(netns(file), nfsd_net_id);
trace_nfsd_ctl_filehandle(netns(file), dname, path, maxsize);
len = exp_rootfh(netns(file), dom, path, &fh, maxsize);
struct net *net = netns(file);
struct net *net = netns(file);
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
trace_nfsd_ctl_version(netns(file), buf);
rv = __write_ports(file, buf, size, netns(file));
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
trace_nfsd_ctl_maxblksize(netns(file), bsize);
trace_nfsd_ctl_time(netns(file), dentry->d_name.name,
struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
struct net *netns;
kfc->ns_tag = netns = kobj_ns_grab_current(KOBJ_NS_TYPE_NET);
if (netns) {
fc->user_ns = get_user_ns(netns->user_ns);
BPF_LINK_TYPE(BPF_LINK_TYPE_NETNS, netns)
} netns;
info->netns.netns_ino = inum;
info->netns.attach_type = link->attach_type;
info.netns.netns_ino,
struct net *netns = dev_net(dev_curr);
return dev_get_by_index_rcu(netns, ifindex);
netdev = __dev_get_by_index(netns, ifindex);
if (netns != wpan_phy_net(&rdev->wpan_phy))
cfg802154_get_dev_from_info(struct net *netns, struct genl_info *info)
return __cfg802154_rdev_from_attrs(netns, info->attrs);
__cfg802154_wpan_dev_from_attrs(struct net *netns, struct nlattr **attrs)
if (wpan_phy_net(&rdev->wpan_phy) != netns)
__cfg802154_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
if (wiphy_net(&rdev->wiphy) != netns)
__cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
netdev = __dev_get_by_index(netns, ifindex);
if (netns != wiphy_net(&rdev->wiphy))
cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
return __cfg80211_rdev_from_attrs(netns, info->attrs);
struct net *netns, struct nlattr **attrs)
info->netns.netns_ino);
show_link_attach_type_json(info->netns.attach_type, json_wtr);
printf("\n\tnetns_ino %u ", info->netns.netns_ino);
show_link_attach_type_plain(info->netns.attach_type);
} netns;
struct tmonitor_ctx *traffic_monitor_start(const char *netns, const char *test_name,
if (netns) {
nstoken = open_netns(netns);
test_name_buf, netns ? netns : "unknown");
struct tmonitor_ctx *traffic_monitor_start(const char *netns, const char *test_name,
static inline struct tmonitor_ctx *traffic_monitor_start(const char *netns, const char *test_name,
struct netns_obj *netns = NULL;
netns = netns_new("bpf_qdisc_ns", true);
if (!ASSERT_OK_PTR(netns, "netns_new"))
netns_free(netns);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog2));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog2));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_create_link_create(int netns, int prog1, int prog2)
link1 = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
link2 = bpf_link_create(prog2, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_prog_attach_link_create(int netns, int prog1, int prog2)
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
link = bpf_link_create(prog2, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_create_prog_attach(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_create_prog_detach(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
static __u32 query_attached_prog_id(int netns)
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_prog_attach_detach_query(int netns, int prog1, int prog2)
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_create_close_query(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_no_old_prog(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
err = bpf_prog_query(netns, BPF_FLOW_DISSECTOR, 0, NULL,
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog2));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_replace_old_prog(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog2));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_same_prog(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_invalid_opts(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
static bool prog_is_attached(int netns)
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
return query_attached_prog_id(netns) > 0;
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_invalid_prog(int netns, int prog1, int prog2)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
CHECK_FAIL(prog_is_attached(netns));
static void test_link_update_netns_gone(int netns, int prog1, int prog2)
old_net = netns;
netns = unshare_net(old_net);
if (netns < 0)
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
close(netns);
static void test_link_get_info(int netns, int prog1, int prog2)
old_net = netns;
netns = unshare_net(old_net);
if (netns < 0)
err = fstat(netns, &netns_stat);
link = bpf_link_create(prog1, netns, BPF_FLOW_DISSECTOR, &create_opts);
CHECK_FAIL(info.netns.netns_ino != netns_stat.st_ino);
CHECK_FAIL(info.netns.attach_type != BPF_FLOW_DISSECTOR);
CHECK_FAIL(info.netns.netns_ino != netns_stat.st_ino);
CHECK_FAIL(info.netns.attach_type != BPF_FLOW_DISSECTOR);
close(netns);
netns = -1;
CHECK_FAIL(info.netns.netns_ino != 0);
CHECK_FAIL(info.netns.attach_type != BPF_FLOW_DISSECTOR);
if (netns != -1)
close(netns);
static void run_tests(int netns)
void (*test_func)(int netns, int prog1, int prog2);
netns == init_net ? " (init_net)" : "");
tests[i].test_func(netns, progs[0], progs[1]);
static void test_prog_attach_prog_attach(int netns, int prog1, int prog2)
CHECK_FAIL(query_attached_prog_id(netns) != query_prog_id(prog1));
struct netns_obj *netns = NULL;
netns = netns_new(NS_TEST, true);
if (!ASSERT_OK_PTR(netns, "netns_new"))
netns_free(netns);
struct netns_obj *netns = NULL;
netns = netns_new(NS_TEST, true);
if (!ASSERT_OK_PTR(netns, "netns_new"))
netns_free(netns);
struct netns_obj *netns;
netns = netns_new(NS_TEST, true);
if (!ASSERT_OK_PTR(netns, "netns_new: mptcp_subflow"))
netns_free(netns);
struct netns_obj *netns;
netns = netns_new(NS_TEST, true);
if (!ASSERT_OK_PTR(netns, "netns_new: mptcp_sockmap"))
netns_free(netns);
struct netns_obj *netns;
netns = netns_new("select_reuseport", true);
if (!ASSERT_OK_PTR(netns, "netns_new"))
netns_free(netns);
CHECK(info.netns.netns_ino == 0, "netns_ino",
"unexpected netns_ino: %u\n", info.netns.netns_ino);
CHECK(info.netns.netns_ino == 0, "netns_ino",
"unexpected netns_ino: %u\n", info.netns.netns_ino);
CHECK(info.netns.netns_ino == 0, "netns_ino",
"unexpected netns_ino: %u\n", info.netns.netns_ino);
CHECK(info.netns.netns_ino != 0, "netns_ino",
"unexpected netns_ino: %u\n", info.netns.netns_ino);
void netns_free(struct netns_obj *netns);