X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fplanetlab.c;h=b931e812d13ab2e66d1c08fb6a7aef61353e0821;hb=361e96e42610e4f7600ae1175617f110874f563e;hp=15cc7e52a42a2973f41a1de4c567e90c44c9e0b5;hpb=569c62a4ed4d2ab13516bbf1f68e1a71205aa2c6;p=util-vserver-pl.git diff --git a/src/planetlab.c b/src/planetlab.c index 15cc7e5..b931e81 100644 --- a/src/planetlab.c +++ b/src/planetlab.c @@ -44,6 +44,8 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include +#define _GNU_SOURCE +#include #include "vserver.h" #include "planetlab.h" @@ -59,7 +61,7 @@ POSSIBILITY OF SUCH DAMAGE. #endif static int -create_context(xid_t ctx, uint64_t bcaps) +create_context(xid_t ctx, uint64_t bcaps, uint32_t unshare_flags) { struct vc_ctx_caps vc_caps; struct vc_net_flags vc_nf; @@ -88,12 +90,20 @@ tag: return -1; process: + /* * Create context info - this sets the STATE_SETUP and STATE_INIT flags. */ if (vc_ctx_create(ctx, 0) == VC_NOCTX) return -1; + if (unshare_flags != 0) { + unshare(unshare_flags); + unshare_flags |= vc_get_space_mask(); + //printf("vc_set_namespace(%d, %X)\n", ctx, unshare_flags); + //vc_set_namespace(ctx, unshare_flags); + } + /* Set capabilities - these don't take effect until SETUP flag is unset */ vc_caps.bcaps = bcaps; vc_caps.bmask = ~0ULL; /* currently unused */ @@ -129,11 +139,12 @@ pl_setup_done(xid_t ctx) #define RETRY_LIMIT 10 int -pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr) +pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr, + int unshare_netns) { int retry_count = 0; int net_migrated = 0; - + if (pl_set_ulimits(slr) != 0) return -1; @@ -143,11 +154,15 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr) if (vc_get_cflags(ctx, &vc_flags)) { + uint32_t unshare_flags; if (errno != ESRCH) return -1; + /* Always unshare the net namespace for a new context */ + unshare_flags = CLONE_NEWNET; + /* context doesn't exist - create it */ - if (create_context(ctx, bcaps)) + if (create_context(ctx, bcaps, unshare_flags)) { if (errno == EEXIST) /* another process beat us in a race */ @@ -179,6 +194,17 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr) migrate: if (net_migrated || !vc_net_migrate(ctx)) { + uint32_t unshare_flags; + + /* Unshare the net namespace if requested in the slice config */ + unshare_flags = unshare_netns ? CLONE_NEWNET : 0; + + if (unshare_flags != 0) { + unshare_flags |=vc_get_space_mask(); + //printf("vc_enter_namespace(%d, %X)\n", ctx, unshare_flags); + //vc_enter_namespace(ctx, unshare_flags); + } + if (!vc_tag_migrate(ctx) && !vc_ctx_migrate(ctx, 0)) break; /* done */ net_migrated = 1; @@ -251,6 +277,7 @@ struct pl_resources { if (index < len) index++; else goto out; #define VSERVERCONF "/etc/vservers/" + void pl_get_limits(const char *context, struct sliver_resources *slr) {