00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <stdint.h>
00019 #include <errno.h>
00020
00021 #include "linux/vserver/switch.h"
00022 #include "linux/vserver/cacct_cmd.h"
00023 #include "linux/vserver/network_cmd.h"
00024
00025 #include "vserver.h"
00026
00027
00028 static inline
00029 int str_len(const char *str)
00030 {
00031 int i = 0;
00032
00033 while (*str++)
00034 i++;
00035
00036 return i;
00037 }
00038
00039 static inline
00040 void str_zero(void *str, int n)
00041 {
00042 char *p = str;
00043
00044 while (n--)
00045 *p++ = 0;
00046 }
00047
00048 static inline
00049 int str_cpyn(void *dst, const void *src, int n)
00050 {
00051 char *d = dst;
00052 const char *s = src;
00053
00054 while (n--)
00055 *d++ = *s++;
00056
00057 return d - (char *) dst;
00058 }
00059
00060 int nx_create(nid_t nid, nx_flags_t *data)
00061 {
00062 struct vcmd_net_create kdata = {
00063 .flagword = 0,
00064 };
00065
00066 if (data)
00067 kdata.flagword = data->flags;
00068
00069 return vserver(VCMD_net_create, nid, &kdata);
00070 }
00071
00072 int nx_migrate(nid_t nid)
00073 {
00074 return vserver(VCMD_net_migrate, nid, NULL);
00075 }
00076
00077 int nx_task_nid(pid_t pid)
00078 {
00079 return vserver(VCMD_task_nid, pid, NULL);
00080 }
00081
00082 int nx_info(nid_t nid, nx_info_t *data)
00083 {
00084 struct vcmd_nx_info_v0 kdata;
00085
00086 int rc = vserver(VCMD_nx_info, nid, &kdata);
00087
00088 if (rc == -1)
00089 return rc;
00090
00091 if (data)
00092 data->nid = kdata.nid;
00093
00094 return rc;
00095 }
00096
00097 int nx_addr_add(nid_t nid, nx_addr_t *data)
00098 {
00099 struct vcmd_net_addr_v0 kdata;
00100
00101 if (!data)
00102 return errno = EINVAL, -1;
00103
00104 kdata.type = data->type;
00105 kdata.count = data->count;
00106
00107 str_cpyn(kdata.ip, data->ip, sizeof(kdata.ip));
00108 str_cpyn(kdata.mask, data->mask, sizeof(kdata.mask));
00109
00110 return vserver(VCMD_net_add, nid, &kdata);
00111 }
00112
00113 int nx_addr_remove(nid_t nid, nx_addr_t *data)
00114 {
00115 struct vcmd_net_addr_v0 kdata;
00116
00117 if (!data)
00118 return errno = EINVAL, -1;
00119
00120 kdata.type = data->type;
00121 kdata.count = data->count;
00122
00123 str_cpyn(kdata.ip, data->ip, sizeof(kdata.ip));
00124 str_cpyn(kdata.mask, data->mask, sizeof(kdata.mask));
00125
00126 return vserver(VCMD_net_remove, nid, &kdata);
00127 }
00128
00129 int nx_flags_set(nid_t nid, nx_flags_t *data)
00130 {
00131 struct vcmd_net_flags_v0 kdata;
00132
00133 if (!data)
00134 return errno = EINVAL, -1;
00135
00136 kdata.flagword = data->flags;
00137 kdata.mask = data->mask;
00138
00139 return vserver(VCMD_set_nflags, nid, &kdata);
00140 }
00141
00142 int nx_flags_get(nid_t nid, nx_flags_t *data)
00143 {
00144 struct vcmd_net_flags_v0 kdata;
00145
00146 if (!data)
00147 return errno = EINVAL, -1;
00148
00149 int rc = vserver(VCMD_get_nflags, nid, &kdata);
00150
00151 if (rc == -1)
00152 return rc;
00153
00154 data->flags = kdata.flagword;
00155 data->mask = kdata.mask;
00156
00157 return rc;
00158 }
00159
00160 int nx_caps_set(nid_t nid, nx_flags_t *data)
00161 {
00162 struct vcmd_net_caps_v0 kdata;
00163
00164 if (!data)
00165 return errno = EINVAL, -1;
00166
00167 kdata.ncaps = data->flags;
00168 kdata.cmask = data->mask;
00169
00170 return vserver(VCMD_set_ncaps, nid, &kdata);
00171 }
00172
00173 int nx_caps_get(nid_t nid, nx_flags_t *data)
00174 {
00175 struct vcmd_net_caps_v0 kdata;
00176
00177 if (!data)
00178 return errno = EINVAL, -1;
00179
00180 int rc = vserver(VCMD_get_ncaps, nid, &kdata);
00181
00182 if (rc == -1)
00183 return rc;
00184
00185 data->flags = kdata.ncaps;
00186 data->mask = kdata.cmask;
00187
00188 return rc;
00189 }
00190
00191 int nx_sock_stat(nid_t nid, nx_sock_stat_t *data)
00192 {
00193 struct vcmd_sock_stat_v0 kdata;
00194
00195 if (!data)
00196 return errno = EINVAL, -1;
00197
00198 kdata.field = data->id;
00199
00200 int rc = vserver(VCMD_sock_stat, nid, &kdata);
00201
00202 if (rc == -1)
00203 return rc;
00204
00205 data->count[0] = kdata.count[0];
00206 data->count[1] = kdata.count[1];
00207 data->count[2] = kdata.count[2];
00208
00209 data->total[0] = kdata.total[0];
00210 data->total[1] = kdata.total[1];
00211 data->total[2] = kdata.total[2];
00212
00213 return rc;
00214 }