#include <linux/list.h>
#include <linux/spinlock.h>
-#define _VX_INFO_DEF_
+#define _VX_INFO_DEF_
#include "cvirt.h"
#include "limit.h"
#include "sched.h"
extern struct list_head vx_infos;
-#define VX_ADMIN 0x0001
-#define VX_WATCH 0x0002
+#define VX_ADMIN 0x0001
+#define VX_WATCH 0x0002
#define VX_DUMMY 0x0008
-#define VX_IDENT 0x0010
-#define VX_EQUIV 0x0020
-#define VX_PARENT 0x0040
-#define VX_CHILD 0x0080
+#define VX_IDENT 0x0010
+#define VX_EQUIV 0x0020
+#define VX_PARENT 0x0040
+#define VX_CHILD 0x0080
-#define VX_ARG_MASK 0x00F0
+#define VX_ARG_MASK 0x00F0
-#define VX_DYNAMIC 0x0100
-#define VX_STATIC 0x0200
+#define VX_DYNAMIC 0x0100
+#define VX_STATIC 0x0200
-#define VX_ATR_MASK 0x0F00
+#define VX_ATR_MASK 0x0F00
void free_vx_info(struct vx_info *);
/* vinfo commands */
-#define VCMD_task_xid VC_CMD(VINFO, 1, 0)
-#define VCMD_task_nid VC_CMD(VINFO, 2, 0)
+#define VCMD_task_xid VC_CMD(VINFO, 1, 0)
+#define VCMD_task_nid VC_CMD(VINFO, 2, 0)
#ifdef __KERNEL__
extern int vc_task_xid(uint32_t, void __user *);
#endif /* __KERNEL__ */
-#define VCMD_vx_info VC_CMD(VINFO, 5, 0)
-#define VCMD_nx_info VC_CMD(VINFO, 6, 0)
+#define VCMD_vx_info VC_CMD(VINFO, 5, 0)
+#define VCMD_nx_info VC_CMD(VINFO, 6, 0)
struct vcmd_vx_info_v0 {
uint32_t xid;
#endif /* __KERNEL__ */
-#define VCMD_create_context VC_CMD(VSETUP, 1, 0)
-#define VCMD_migrate_context VC_CMD(PROCMIG, 1, 0)
+#define VCMD_ctx_create VC_CMD(VPROC, 1, 0)
+#define VCMD_ctx_migrate VC_CMD(PROCMIG, 1, 0)
#ifdef __KERNEL__
-extern int vc_create_context(uint32_t, void __user *);
-extern int vc_migrate_context(uint32_t, void __user *);
+extern int vc_ctx_create(uint32_t, void __user *);
+extern int vc_ctx_migrate(uint32_t, void __user *);
#endif /* __KERNEL__ */
-#define VCMD_get_flags VC_CMD(FLAGS, 1, 0)
-#define VCMD_set_flags VC_CMD(FLAGS, 2, 0)
+#define VCMD_get_cflags VC_CMD(FLAGS, 1, 0)
+#define VCMD_set_cflags VC_CMD(FLAGS, 2, 0)
struct vcmd_ctx_flags_v0 {
uint64_t flagword;
};
#ifdef __KERNEL__
-extern int vc_get_flags(uint32_t, void __user *);
-extern int vc_set_flags(uint32_t, void __user *);
+extern int vc_get_cflags(uint32_t, void __user *);
+extern int vc_set_cflags(uint32_t, void __user *);
#endif /* __KERNEL__ */
#define VXF_INFO_ULIMIT 0x00000040
#define VXF_INFO_NSPACE 0x00000080
-#define VXF_SCHED_HARD 0x00000100
-#define VXF_SCHED_PRIO 0x00000200
-#define VXF_SCHED_PAUSE 0x00000400
+#define VXF_SCHED_HARD 0x00000100
+#define VXF_SCHED_PRIO 0x00000200
+#define VXF_SCHED_PAUSE 0x00000400
#define VXF_VIRT_MEM 0x00010000
#define VXF_VIRT_UPTIME 0x00020000
#define VXF_HIDE_MOUNT 0x01000000
#define VXF_HIDE_NETIF 0x02000000
-#define VXF_STATE_SETUP (1ULL<<32)
-#define VXF_STATE_INIT (1ULL<<33)
+#define VXF_STATE_SETUP (1ULL<<32)
+#define VXF_STATE_INIT (1ULL<<33)
-#define VXF_ONE_TIME (0x0003ULL<<32)
+#define VXF_ONE_TIME (0x0003ULL<<32)
#define VCMD_get_ccaps VC_CMD(FLAGS, 3, 0)
#define VCMD_set_ccaps VC_CMD(FLAGS, 4, 0)
unsigned long total_forks;
unsigned int bias_cswtch;
- long bias_jiffies;
- long bias_idle;
+ struct timespec bias_idle;
struct timespec bias_tp;
+ uint64_t bias_jiffies;
struct new_utsname utsname;
}
+extern uint64_t vx_idle_jiffies(void);
+
static inline void vx_info_init_cvirt(struct _vx_cvirt *cvirt)
{
int i,j;
+ uint64_t idle_jiffies = vx_idle_jiffies();
cvirt->nr_threads = 1;
// new->virt.bias_cswtch = kstat.context_swtch;
- cvirt->bias_jiffies = jiffies;
- /* new->virt.bias_idle = init_tasks[0]->times.tms_utime +
- init_tasks[0]->times.tms_stime;
- */
+ cvirt->bias_jiffies = get_jiffies_64();
+
+ jiffies_to_timespec(idle_jiffies, &cvirt->bias_idle);
do_posix_clock_monotonic_gettime(&cvirt->bias_tp);
down_read(&uts_sem);
struct timespec;
-void vx_vsi_uptime(struct timespec *uptime);
+void vx_vsi_uptime(struct timespec *uptime, struct timespec *idle);
#endif /* __KERNEL__ */
#define IATTR_FLAGS 0x00000007
#define IATTR_BARRIER 0x00010000
-#define IATTR_IUNLINK 0x00020000
-#define IATTR_IMMUTABLE 0x00040000
+#define IATTR_IUNLINK 0x00020000
+#define IATTR_IMMUTABLE 0x00040000
#ifdef CONFIG_PROC_SECURE
-#define IATTR_PROC_DEFAULT ( IATTR_ADMIN | IATTR_HIDE )
-#define IATTR_PROC_SYMLINK ( IATTR_ADMIN )
+#define IATTR_PROC_DEFAULT ( IATTR_ADMIN | IATTR_HIDE )
+#define IATTR_PROC_SYMLINK ( IATTR_ADMIN )
#else
-#define IATTR_PROC_DEFAULT ( IATTR_ADMIN )
-#define IATTR_PROC_SYMLINK ( IATTR_ADMIN )
+#define IATTR_PROC_DEFAULT ( IATTR_ADMIN )
+#define IATTR_PROC_SYMLINK ( IATTR_ADMIN )
#endif
#ifdef __KERNEL__
/* inode ioctls */
-#define FIOC_GETXFLG _IOR('x', 5, long)
-#define FIOC_SETXFLG _IOW('x', 6, long)
+#define FIOC_GETXFLG _IOR('x', 5, long)
+#define FIOC_SETXFLG _IOW('x', 6, long)
-#endif /* _VX_LEGACY_H */
+#endif /* _VX_INODE_H */
#define VCMD_new_s_context VC_CMD(COMPAT, 1, 1)
#define VCMD_set_ipv4root VC_CMD(COMPAT, 2, 3)
+#define VCMD_create_context VC_CMD(VSETUP, 1, 0)
+
/* compatibiliy vserver arguments */
struct vcmd_new_s_context_v1 {
struct {
uint32_t ip;
uint32_t mask;
- } ip_mask_pair[NB_IPV4ROOT];
+ } nx_mask_pair[NB_IPV4ROOT];
};
/* context sub struct */
-#define NUM_RLIMITS 20
+#define NUM_RLIMITS 16
-#define VLIMIT_SOCK 16
+#define VLIMIT_SOCK 16
struct _vx_limit {
#ifndef _VX_LIMIT_H
#define _VX_LIMIT_H
-#include <linux/compiler.h>
#include "switch.h"
/* rlimit vserver commands */
#define CRLIM_KEEP (~1ULL)
#ifdef __KERNEL__
+
+#include <linux/compiler.h>
+
extern int vc_get_rlimit(uint32_t, void __user *);
extern int vc_set_rlimit(uint32_t, void __user *);
extern int vc_get_rlimit_mask(uint32_t, void __user *);
#define _VX_NAMESPACE_H
#include <linux/types.h>
-#include <linux/compiler.h>
/* virtual host info names */
-#define VCMD_vx_set_vhi_name VC_CMD(VHOST, 1, 0)
-#define VCMD_vx_get_vhi_name VC_CMD(VHOST, 2, 0)
+#define VCMD_vx_set_vhi_name VC_CMD(VHOST, 1, 0)
+#define VCMD_vx_get_vhi_name VC_CMD(VHOST, 2, 0)
struct vcmd_vx_vhi_name_v0 {
uint32_t field;
#ifdef __KERNEL__
+
+#include <linux/compiler.h>
+
extern int vc_set_vhi_name(uint32_t, void __user *);
extern int vc_get_vhi_name(uint32_t, void __user *);
#endif /* __KERNEL__ */
-#define VCMD_enter_namespace VC_CMD(PROCALT, 1, 0)
-#define VCMD_cleanup_namespace VC_CMD(PROCALT, 2, 0)
-#define VCMD_set_namespace VC_CMD(PROCALT, 3, 0)
+#define VCMD_enter_namespace VC_CMD(PROCALT, 1, 0)
+#define VCMD_cleanup_namespace VC_CMD(PROCALT, 2, 0)
+#define VCMD_set_namespace VC_CMD(PROCALT, 3, 0)
#ifdef __KERNEL__
#ifndef _VX_NETWORK_H
#define _VX_NETWORK_H
+#define MAX_N_CONTEXT 65535 /* Arbitrary limit */
+
+#define IP_DYNAMIC_ID ((uint32_t)-1) /* id for dynamic context */
#define NB_IPV4ROOT 16
#include <asm/atomic.h>
-struct ip_info {
- struct list_head ip_list; /* linked list of ipinfos */
- nid_t ip_id; /* vnet id */
- atomic_t ip_refcount;
+struct nx_info {
+ struct list_head nx_list; /* linked list of nxinfos */
+ nid_t nx_id; /* vnet id */
+ atomic_t nx_refcount;
+
+ uint64_t nx_flags; /* network flag word */
+ uint64_t nx_ncaps; /* network capabilities */
+
int nbipv4;
__u32 ipv4[NB_IPV4ROOT]; /* Process can only bind to these IPs */
/* The first one is used to connect */
/* Used to select the proper source */
/* address for sockets */
__u32 v4_bcast; /* Broadcast address to receive UDP */
+
+ char nx_name[65]; /* network context name */
};
extern spinlock_t iplist_lock;
-extern struct list_head ip_infos;
+extern struct list_head nx_infos;
+
+
+void free_nx_info(struct nx_info *);
+struct nx_info *create_nx_info(void);
+
+extern struct nx_info *find_nx_info(int);
+extern int nx_info_id_valid(int);
+
+#endif /* __KERNEL__ */
+
+#include "switch.h"
+
+/* vinfo commands */
+
+#define VCMD_task_nid VC_CMD(VINFO, 2, 0)
+#ifdef __KERNEL__
+extern int vc_task_nid(uint32_t, void __user *);
+
+#endif /* __KERNEL__ */
-void free_ip_info(struct ip_info *);
-struct ip_info *create_ip_info(void);
+#define VCMD_nx_info VC_CMD(VINFO, 6, 0)
-extern struct ip_info *find_ip_info(int);
-extern int ip_info_id_valid(int);
+struct vcmd_nx_info_v0 {
+ uint32_t nid;
+ /* more to come */
+};
+#ifdef __KERNEL__
+extern int vc_nx_info(uint32_t, void __user *);
#endif /* __KERNEL__ */
+
+#define VCMD_net_create VC_CMD(VNET, 1, 0)
+#define VCMD_net_migrate VC_CMD(NETMIG, 1, 0)
+
+#define VCMD_net_add VC_CMD(NETALT, 1, 0)
+#define VCMD_net_remove VC_CMD(NETALT, 2, 0)
+
+struct vcmd_net_nx_v0 {
+ uint16_t type;
+ uint16_t count;
+ uint32_t ip[4];
+ uint32_t mask[4];
+ /* more to come */
+};
+
+// IPN_TYPE_IPV4
+
+
+#ifdef __KERNEL__
+extern int vc_net_create(uint32_t, void __user *);
+extern int vc_net_migrate(uint32_t, void __user *);
+
+#endif /* __KERNEL__ */
+
+#define VCMD_get_nflags VC_CMD(FLAGS, 5, 0)
+#define VCMD_set_nflags VC_CMD(FLAGS, 6, 0)
+
+struct vcmd_net_flags_v0 {
+ uint64_t flagword;
+ uint64_t mask;
+};
+
+#ifdef __KERNEL__
+extern int vc_get_nflags(uint32_t, void __user *);
+extern int vc_set_nflags(uint32_t, void __user *);
+
+#endif /* __KERNEL__ */
+
+#define IPF_STATE_SETUP (1ULL<<32)
+
+
+#define IPF_ONE_TIME (0x0001ULL<<32)
+
+#define VCMD_get_ncaps VC_CMD(FLAGS, 7, 0)
+#define VCMD_set_ncaps VC_CMD(FLAGS, 8, 0)
+
+struct vcmd_net_caps_v0 {
+ uint64_t ncaps;
+ uint64_t cmask;
+};
+
+#ifdef __KERNEL__
+extern int vc_get_ncaps(uint32_t, void __user *);
+extern int vc_set_ncaps(uint32_t, void __user *);
+
+#endif /* __KERNEL__ */
+
+#define IPC_WOSSNAME 0x00000001
+
+
#endif /* _VX_NETWORK_H */
/* sched vserver commands */
-#define VCMD_set_sched_v1 VC_CMD(SYSTEST, 1, 1)
-
-struct vcmd_set_sched_v1 {
- int32_t fill_rate;
- int32_t period;
- int32_t fill_level;
- int32_t bucket_size;
-};
-
#define VCMD_set_sched VC_CMD(SCHED, 1, 2)
struct vcmd_set_sched_v2 {
/*
- Syscall Matrix V2.5
+ Syscall Matrix V2.6
|VERSION|CREATE |MODIFY |MIGRATE|CONTROL|EXPERIM| |SPECIAL|SPECIAL|
|STATS |DESTROY|ALTER |CHANGE |LIMIT |TEST | | | |
|INFO |SETUP | |MOVE | | | | | |
-------+-------+-------+-------+-------+-------+-------+ +-------+-------+
- SYSTEM |VERSION| | | | | | |DEVICES| |
+ SYSTEM |VERSION|VSETUP |VHOST | | | | |DEVICES| |
HOST | 00| 01| 02| 03| 04| 05| | 06| 07|
-------+-------+-------+-------+-------+-------+-------+ +-------+-------+
- CPU | | |PROCALT|PROCMIG|PROCTRL| | |SCHED. | |
+ CPU | |VPROC |PROCALT|PROCMIG|PROCTRL| | |SCHED. | |
PROCESS| 08| 09| 10| 11| 12| 13| | 14| 15|
-------+-------+-------+-------+-------+-------+-------+ +-------+-------+
MEMORY | | | | | | | |SWAP | |
| 16| 17| 18| 19| 20| 21| | 22| 23|
-------+-------+-------+-------+-------+-------+-------+ +-------+-------+
- NETWORK| | | | | | | |SERIAL | |
+ NETWORK| |VNET |NETALT |NETMIG |NETCTL | | |SERIAL | |
| 24| 25| 26| 27| 28| 29| | 30| 31|
-------+-------+-------+-------+-------+-------+-------+ +-------+-------+
DISK | | | | | | | |INODE | |
#define VC_CAT_VERSION 0
#define VC_CAT_VSETUP 1
-#define VC_CAT_VHOST 2
+#define VC_CAT_VHOST 2
-#define VC_CAT_PROCALT 10
-#define VC_CAT_PROCMIG 11
+#define VC_CAT_VPROC 9
+#define VC_CAT_PROCALT 10
+#define VC_CAT_PROCMIG 11
#define VC_CAT_PROCTRL 12
#define VC_CAT_SCHED 14
+
+#define VC_CAT_VNET 25
+#define VC_CAT_NETALT 26
+#define VC_CAT_NETMIG 27
+#define VC_CAT_NETCTRL 28
+
#define VC_CAT_INODE 38
-#define VC_CAT_VINFO 46
+#define VC_CAT_VINFO 46
#define VC_CAT_FLAGS 52
#define VC_CAT_RLIMIT 60
/* interface version */
-#define VCI_VERSION 0x00010014
+#define VCI_VERSION 0x00010016
/* query version */
#include <linux/errno.h>
-#define ENOTSUP -EOPNOTSUPP
+#define ENOTSUP -EOPNOTSUPP
#else /* __KERNEL__ */
-#define __user
+#define __user
#endif /* __KERNEL__ */
#endif /* _VX_SWITCH_H */
-#ifndef _LINUX_VXID_H_
-#define _LINUX_VXID_H_
+#ifndef _LINUX_XID_H_
+#define _LINUX_XID_H_
#ifdef CONFIG_INOXID_NONE
-#define INOXID_UID(uid, gid) (uid)
-#define INOXID_GID(uid, gid) (gid)
-#define INOXID_XID(uid, gid, xid) (0)
+#define MAX_UID 0xFFFFFFFF
+#define MAX_GID 0xFFFFFFFF
-#define XIDINO_UID(uid, xid) (uid)
-#define XIDINO_GID(gid, xid) (gid)
+#define INOXID_XID(uid, gid, xid) (0)
-#define MAX_UID 0xFFFFFFFF
-#define MAX_GID 0xFFFFFFFF
+#define XIDINO_UID(uid, xid) (uid)
+#define XIDINO_GID(gid, xid) (gid)
#endif
+
#ifdef CONFIG_INOXID_GID16
-#define INOXID_UID(uid, gid) (uid)
-#define INOXID_GID(uid, gid) ((gid) & 0xFFFF)
-#define INOXID_XID(uid, gid, xid) (((gid) >> 16) & 0xFFFF)
+#define MAX_UID 0xFFFFFFFF
+#define MAX_GID 0x0000FFFF
+
+#define INOXID_XID(uid, gid, xid) (((gid) >> 16) & 0xFFFF)
-#define XIDINO_UID(uid, xid) (uid)
-#define XIDINO_GID(gid, xid) (((gid) & 0xFFFF) | ((xid) << 16))
+#define XIDINO_UID(uid, xid) (uid)
+#define XIDINO_GID(gid, xid) (((gid) & 0xFFFF) | ((xid) << 16))
-#define MAX_UID 0xFFFFFFFF
-#define MAX_GID 0x0000FFFF
#endif
+
#ifdef CONFIG_INOXID_GID24
-#define INOXID_UID(uid, gid) ((uid) & 0xFFFFFF)
-#define INOXID_GID(uid, gid) ((gid) & 0xFFFFFF)
-#define INOXID_XID(uid, gid, xid) ((((uid) >> 16) & 0xFF00) | (((gid) >> 24) & 0xFF))
+#define MAX_UID 0x00FFFFFF
+#define MAX_GID 0x00FFFFFF
-#define XIDINO_UID(uid, xid) (((uid) & 0xFFFFFF) | (((xid) & 0xFF00) << 16))
-#define XIDINO_GID(gid, xid) (((gid) & 0xFFFFFF) | (((xid) & 0x00FF) << 24))
+#define INOXID_XID(uid, gid, xid) ((((uid) >> 16) & 0xFF00) | (((gid) >> 24) & 0xFF))
-#define MAX_UID 0x00FFFFFF
-#define MAX_GID 0x00FFFFFF
+#define XIDINO_UID(uid, xid) (((uid) & 0xFFFFFF) | (((xid) & 0xFF00) << 16))
+#define XIDINO_GID(gid, xid) (((gid) & 0xFFFFFF) | (((xid) & 0x00FF) << 24))
#endif
+
#ifdef CONFIG_INOXID_GID32
-#define INOXID_UID(uid, gid) (uid)
-#define INOXID_GID(uid, gid) (gid)
-#define INOXID_XID(uid, gid, xid) (xid)
+#define MAX_UID 0xFFFFFFFF
+#define MAX_GID 0xFFFFFFFF
+
+#define INOXID_XID(uid, gid, xid) (xid)
+
+#define XIDINO_UID(uid, xid) (uid)
+#define XIDINO_GID(gid, xid) (gid)
+
+#endif
+
+
+#ifdef CONFIG_INOXID_RUNTIME
-#define XIDINO_UID(uid, xid) (uid)
-#define XIDINO_GID(gid, xid) (gid)
+#define MAX_UID 0xFFFFFFFF
+#define MAX_GID 0xFFFFFFFF
-#define MAX_UID 0xFFFFFFFF
-#define MAX_GID 0xFFFFFFFF
+#define INOXID_XID(uid, gid, xid) (0)
+
+#define XIDINO_UID(uid, xid) (uid)
+#define XIDINO_GID(gid, xid) (gid)
#endif
-#define FIOC_GETXID _IOR('x', 1, long)
-#define FIOC_SETXID _IOW('x', 2, long)
-#define FIOC_SETXIDJ _IOW('x', 3, long)
+#define INOXID_UID(uid, gid) ((uid) & MAX_UID)
+#define INOXID_GID(uid, gid) ((gid) & MAX_GID)
+
+static inline uid_t vx_map_uid(uid_t uid)
+{
+ if ((uid > MAX_UID) && (uid != -1))
+ uid = -2;
+ return (uid & MAX_UID);
+}
+
+static inline gid_t vx_map_gid(gid_t gid)
+{
+ if ((gid > MAX_GID) && (gid != -1))
+ gid = -2;
+ return (gid & MAX_GID);
+}
+
+
+#ifdef CONFIG_VSERVER_LEGACY
+#define FIOC_GETXID _IOR('x', 1, long)
+#define FIOC_SETXID _IOW('x', 2, long)
+#define FIOC_SETXIDJ _IOW('x', 3, long)
#endif
+
+#endif /* _LINUX_XID_H_ */