mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
libxl/xl: drop support for netchannel2
netchannel2 was never widely deployed and no supported kernel includes either the front- or back-ends. The last known kernel with this support was the xen.git 2.6.31 branch which has been unsupported for ages. xl will warn the user if it spots a "vif2" configration item but otherwise support is completely removed. Work is ongoing to add the interesting features of netchannel2 as protocol extensions to netchannel1. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
e5407d0985
commit
bc57ea8ce5
10 files changed
+4
-593
No files matched your search
@@ -1378,227 +1378,6 @@ err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void libxl_device_net2_init(libxl_device_net2 *net2_info, int devnum)
|
||||
{
|
||||
const uint8_t *r;
|
||||
libxl_uuid uuid;
|
||||
|
||||
libxl_uuid_generate(&uuid);
|
||||
r = libxl_uuid_bytearray(&uuid);
|
||||
memset(net2_info, '\0', sizeof(*net2_info));
|
||||
|
||||
net2_info->devid = devnum;
|
||||
net2_info->front_mac[0] = 0x00;
|
||||
net2_info->front_mac[1] = 0x16;
|
||||
net2_info->front_mac[2] = 0x3e;;
|
||||
net2_info->front_mac[3] = 0x7f & r[0];
|
||||
net2_info->front_mac[4] = r[1];
|
||||
net2_info->front_mac[5] = r[2];
|
||||
net2_info->back_mac[0] = 0x00;
|
||||
net2_info->back_mac[1] = 0x16;
|
||||
net2_info->back_mac[2] = 0x3e;
|
||||
net2_info->back_mac[3] = 0x7f & r[3];
|
||||
net2_info->back_mac[4] = r[4];
|
||||
net2_info->back_mac[5] = r[5];
|
||||
net2_info->back_trusted = 1;
|
||||
net2_info->filter_mac = 1;
|
||||
net2_info->max_bypasses = 5;
|
||||
net2_info->bridge = strdup("xenbr0");
|
||||
}
|
||||
|
||||
int libxl_device_net2_add(libxl_ctx *ctx, uint32_t domid, libxl_device_net2 *net2)
|
||||
{
|
||||
libxl__gc gc = LIBXL_INIT_GC(ctx);
|
||||
flexarray_t *front, *back;
|
||||
libxl__device device;
|
||||
char *dompath, *dom, **l;
|
||||
unsigned int nb;
|
||||
int rc;
|
||||
|
||||
front = flexarray_make(16, 1);
|
||||
if (!front) {
|
||||
rc = ERROR_NOMEM;
|
||||
goto err;
|
||||
}
|
||||
back = flexarray_make(16, 1);
|
||||
if (!back) {
|
||||
rc = ERROR_NOMEM;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
if (!(dompath = libxl__xs_get_dompath(&gc, domid))) {
|
||||
rc = ERROR_FAIL;
|
||||
goto err_free;
|
||||
}
|
||||
dom = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/name", dompath));
|
||||
|
||||
if (net2->devid == -1) {
|
||||
if (!(l = libxl__xs_directory(&gc, XBT_NULL,
|
||||
libxl__sprintf(&gc, "%s/device/vif2", dompath), &nb))) {
|
||||
net2->devid = 0;
|
||||
} else {
|
||||
net2->devid = strtoul(l[nb - 1], NULL, 10) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
device.backend_devid = net2->devid;
|
||||
device.backend_domid = net2->backend_domid;
|
||||
device.backend_kind = DEVICE_VIF2;
|
||||
device.devid = net2->devid;
|
||||
device.domid = net2->domid;
|
||||
device.kind = DEVICE_VIF2;
|
||||
|
||||
flexarray_append(back, "domain");
|
||||
flexarray_append(back, dom);
|
||||
flexarray_append(back, "frontend-id");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", net2->domid));
|
||||
|
||||
flexarray_append(back, "local-trusted");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", net2->back_trusted));
|
||||
flexarray_append(back, "mac");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
net2->back_mac[0], net2->back_mac[1],
|
||||
net2->back_mac[2], net2->back_mac[3],
|
||||
net2->back_mac[4], net2->back_mac[5]));
|
||||
|
||||
flexarray_append(back, "remote-trusted");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", net2->trusted));
|
||||
flexarray_append(back, "remote-mac");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
net2->front_mac[0], net2->front_mac[1],
|
||||
net2->front_mac[2], net2->front_mac[3],
|
||||
net2->front_mac[4], net2->front_mac[5]));
|
||||
|
||||
flexarray_append(back, "max-bypasses");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", net2->max_bypasses));
|
||||
flexarray_append(back, "filter-mac");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", !!(net2->filter_mac)));
|
||||
flexarray_append(back, "handle");
|
||||
flexarray_append(back, libxl__sprintf(&gc, "%d", net2->devid));
|
||||
flexarray_append(back, "online");
|
||||
flexarray_append(back, "1");
|
||||
flexarray_append(back, "state");
|
||||
flexarray_append(back, "1");
|
||||
|
||||
flexarray_append(front, "backend-id");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%d", net2->backend_domid));
|
||||
|
||||
flexarray_append(front, "local-trusted");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%d", net2->trusted));
|
||||
flexarray_append(front, "mac");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
net2->front_mac[0], net2->front_mac[1],
|
||||
net2->front_mac[2], net2->front_mac[3],
|
||||
net2->front_mac[4], net2->front_mac[5]));
|
||||
|
||||
flexarray_append(front, "remote-trusted");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%d", net2->back_trusted));
|
||||
flexarray_append(front, "remote-mac");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
net2->back_mac[0], net2->back_mac[1],
|
||||
net2->back_mac[2], net2->back_mac[3],
|
||||
net2->back_mac[4], net2->back_mac[5]));
|
||||
|
||||
flexarray_append(front, "filter-mac");
|
||||
flexarray_append(front, libxl__sprintf(&gc, "%d", !!(net2->filter_mac)));
|
||||
flexarray_append(front, "state");
|
||||
flexarray_append(front, "1");
|
||||
|
||||
libxl__device_generic_add(&gc, &device,
|
||||
libxl__xs_kvs_of_flexarray(&gc, back, back->count),
|
||||
libxl__xs_kvs_of_flexarray(&gc, front, front->count));
|
||||
|
||||
/* FIXME: wait for plug */
|
||||
rc = 0;
|
||||
err_free:
|
||||
flexarray_free(back);
|
||||
flexarray_free(front);
|
||||
err:
|
||||
libxl__free_all(&gc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
libxl_net2info *libxl_device_net2_list(libxl_ctx *ctx, uint32_t domid, unsigned int *nb)
|
||||
{
|
||||
libxl__gc gc = LIBXL_INIT_GC(ctx);
|
||||
char *dompath, *net2_path_fe;
|
||||
char **l;
|
||||
char *val, *tok;
|
||||
unsigned int nb_net2s, i;
|
||||
libxl_net2info *res, *net2s;
|
||||
|
||||
dompath = libxl__xs_get_dompath(&gc, domid);
|
||||
if (!dompath)
|
||||
goto err;
|
||||
l = libxl__xs_directory(&gc, XBT_NULL,
|
||||
libxl__sprintf(&gc, "%s/device/vif2", dompath), &nb_net2s);
|
||||
if (!l)
|
||||
goto err;
|
||||
res = calloc(nb_net2s, sizeof (libxl_net2info));
|
||||
if (!res)
|
||||
goto err;
|
||||
net2s = res;
|
||||
for (*nb = nb_net2s; nb_net2s > 0; --nb_net2s, ++l, ++net2s) {
|
||||
net2_path_fe = libxl__sprintf(&gc, "%s/device/vif2/%s", dompath, *l);
|
||||
|
||||
net2s->backend = libxl__xs_read(&gc, XBT_NULL,
|
||||
libxl__sprintf(&gc, "%s/backend", net2_path_fe));
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", net2_path_fe));
|
||||
net2s->backend_id = val ? strtoul(val, NULL, 10) : -1;
|
||||
|
||||
net2s->devid = strtoul(*l, NULL, 10);
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", net2_path_fe));
|
||||
net2s->state = val ? strtoul(val, NULL, 10) : -1;
|
||||
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", net2_path_fe));
|
||||
for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
|
||||
++i, tok = strtok(NULL, ":")) {
|
||||
net2s->mac[i] = strtoul(tok, NULL, 16);
|
||||
}
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/remote-trusted", net2_path_fe));
|
||||
net2s->trusted = val ? strtoul(val, NULL, 10) : -1;
|
||||
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/remote-mac", net2_path_fe));
|
||||
for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
|
||||
++i, tok = strtok(NULL, ":")) {
|
||||
net2s->back_mac[i] = strtoul(tok, NULL, 16);
|
||||
}
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/filter-mac", net2_path_fe));
|
||||
net2s->filter_mac = val ? strtoul(val, NULL, 10) : -1;
|
||||
|
||||
net2s->frontend = libxl__xs_read(&gc, XBT_NULL,
|
||||
libxl__sprintf(&gc, "%s/frontend", net2s->backend));
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", net2s->backend));
|
||||
net2s->frontend_id = val ? strtoul(val, NULL, 10) : -1;
|
||||
}
|
||||
|
||||
libxl__free_all(&gc);
|
||||
return res;
|
||||
err:
|
||||
libxl__free_all(&gc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2, int wait)
|
||||
{
|
||||
libxl__gc gc = LIBXL_INIT_GC(ctx);
|
||||
libxl__device device;
|
||||
int rc;
|
||||
|
||||
device.backend_devid = net2->devid;
|
||||
device.backend_domid = net2->backend_domid;
|
||||
device.backend_kind = DEVICE_VIF2;
|
||||
device.devid = net2->devid;
|
||||
device.domid = net2->domid;
|
||||
device.kind = DEVICE_VIF2;
|
||||
|
||||
rc = libxl__device_del(&gc, &device, wait);
|
||||
libxl__free_all(&gc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console)
|
||||
{
|
||||
|
||||
+1
-10
@@ -262,11 +262,10 @@ typedef struct {
|
||||
libxl_domain_build_info b_info;
|
||||
libxl_device_model_info dm_info;
|
||||
|
||||
int num_disks, num_vifs, num_vif2s, num_pcidevs, num_vfbs, num_vkbs;
|
||||
int num_disks, num_vifs, num_pcidevs, num_vfbs, num_vkbs;
|
||||
|
||||
libxl_device_disk *disks;
|
||||
libxl_device_nic *vifs;
|
||||
libxl_device_net2 *vif2s;
|
||||
libxl_device_pci *pcidevs;
|
||||
libxl_device_vfb *vfbs;
|
||||
libxl_device_vkb *vkbs;
|
||||
@@ -535,14 +534,6 @@ int libxl_tmem_shared_auth(libxl_ctx *ctx, uint32_t domid, char* uuid,
|
||||
int auth);
|
||||
int libxl_tmem_freeable(libxl_ctx *ctx);
|
||||
|
||||
void libxl_device_net2_init(libxl_device_net2 *net2, int dev_num);
|
||||
int libxl_device_net2_add(libxl_ctx *ctx, uint32_t domid,
|
||||
libxl_device_net2 *net2);
|
||||
libxl_net2info *libxl_device_net2_list(libxl_ctx *ctx, uint32_t domid,
|
||||
unsigned int *nb);
|
||||
int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2,
|
||||
int wait);
|
||||
|
||||
int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap);
|
||||
int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
|
||||
libxl_cpumap cpumap, libxl_uuid *uuid,
|
||||
|
||||
@@ -228,21 +228,6 @@ libxl_device_nic = Struct("device_nic", [
|
||||
("nictype", libxl_nic_type),
|
||||
])
|
||||
|
||||
libxl_device_net2 = Struct("device_net2", [
|
||||
("devid", integer),
|
||||
("front_mac", libxl_mac),
|
||||
("back_mac", libxl_mac),
|
||||
("backend_domid", uint32),
|
||||
("domid", domid),
|
||||
("trusted", BitField(uint32, 1)),
|
||||
("back_trusted", BitField(uint32, 1)),
|
||||
("filter_mac", BitField(uint32, 1)),
|
||||
("front_filter_mac", BitField(uint32, 1)),
|
||||
("pdev", uint32),
|
||||
("max_bypasses", uint32),
|
||||
("bridge", string),
|
||||
])
|
||||
|
||||
libxl_device_pci = Struct("device_pci", [
|
||||
("func", uint8),
|
||||
("dev", uint8),
|
||||
@@ -316,16 +301,3 @@ libxl_sched_credit = Struct("sched_credit", [
|
||||
("weight", integer),
|
||||
("cap", integer),
|
||||
], destructor_fn=None)
|
||||
|
||||
libxl_net2info = Struct("net2info", [
|
||||
("backend", string),
|
||||
("backend_id", uint32),
|
||||
("frontend", string),
|
||||
("frontend_id", uint32),
|
||||
("devid", integer),
|
||||
("state", integer),
|
||||
("mac", libxl_mac),
|
||||
("trusted", integer),
|
||||
("back_mac", libxl_mac),
|
||||
("filter_mac", integer),
|
||||
])
|
||||
@@ -43,10 +43,6 @@ void libxl_domain_config_destroy(libxl_domain_config *d_config)
|
||||
libxl_device_nic_destroy(&d_config->vifs[i]);
|
||||
free(d_config->vifs);
|
||||
|
||||
for (i=0; i<d_config->num_vif2s; i++)
|
||||
libxl_device_net2_destroy(&d_config->vif2s[i]);
|
||||
free(d_config->vif2s);
|
||||
|
||||
for (i=0; i<d_config->num_pcidevs; i++)
|
||||
libxl_device_pci_destroy(&d_config->pcidevs[i]);
|
||||
free(d_config->pcidevs);
|
||||
@@ -464,17 +460,6 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
|
||||
goto error_out;
|
||||
}
|
||||
}
|
||||
if (!d_config->c_info.hvm) {
|
||||
for (i = 0; i < d_config->num_vif2s; i++) {
|
||||
d_config->vif2s[i].domid = domid;
|
||||
ret = libxl_device_net2_add(ctx, domid, &d_config->vif2s[i]);
|
||||
if (ret) {
|
||||
fprintf(stderr, "cannot add net2 %d to domain: %d\n", i, ret);
|
||||
ret = ERROR_FAIL;
|
||||
goto error_out;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (d_config->c_info.hvm) {
|
||||
libxl_device_console console;
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
|
||||
static const char *string_of_kinds[] = {
|
||||
[DEVICE_VIF] = "vif",
|
||||
[DEVICE_VIF2] = "vif2",
|
||||
[DEVICE_VBD] = "vbd",
|
||||
[DEVICE_TAP] = "tap",
|
||||
[DEVICE_QDISK] = "qdisk",
|
||||
|
||||
@@ -96,7 +96,6 @@ struct libxl__ctx {
|
||||
|
||||
typedef enum {
|
||||
DEVICE_VIF = 1,
|
||||
DEVICE_VIF2,
|
||||
DEVICE_VBD,
|
||||
DEVICE_TAP,
|
||||
DEVICE_QDISK,
|
||||
|
||||
@@ -570,75 +570,6 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int libxl_devid_to_device_net2(libxl_ctx *ctx, uint32_t domid,
|
||||
const char *devid, libxl_device_net2 *net2)
|
||||
{
|
||||
libxl__gc gc = LIBXL_INIT_GC(ctx);
|
||||
char *tok, *endptr, *val;
|
||||
char *dompath, *net2path, *be_path;
|
||||
unsigned int devid_n, i;
|
||||
int rc = ERROR_INVAL;
|
||||
|
||||
devid_n = strtoul(devid, &endptr, 10);
|
||||
if (devid == endptr) {
|
||||
goto out;
|
||||
}
|
||||
rc = ERROR_FAIL;
|
||||
dompath = libxl__xs_get_dompath(&gc, domid);
|
||||
net2path = libxl__sprintf(&gc, "%s/device/vif2/%s", dompath, devid);
|
||||
if (!net2path) {
|
||||
goto out;
|
||||
}
|
||||
memset(net2, 0, sizeof (libxl_device_net2));
|
||||
be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", net2path));
|
||||
|
||||
net2->devid = devid_n;
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", net2path));
|
||||
for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
|
||||
++i, tok = strtok(NULL, ":")) {
|
||||
net2->front_mac[i] = strtoul(tok, NULL, 16);
|
||||
}
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/remote-mac", net2path));
|
||||
for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
|
||||
++i, tok = strtok(NULL, ":")) {
|
||||
net2->back_mac[i] = strtoul(tok, NULL, 16);
|
||||
}
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", net2path));
|
||||
net2->backend_domid = strtoul(val, NULL, 10);
|
||||
|
||||
net2->domid = domid;
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/remote-trusted", be_path));
|
||||
net2->trusted = strtoul(val, NULL, 10);
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/local-trusted", be_path));
|
||||
net2->back_trusted = strtoul(val, NULL, 10);
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/filter-mac", be_path));
|
||||
net2->filter_mac = strtoul(val, NULL, 10);
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/filter-mac", net2path));
|
||||
net2->front_filter_mac = strtoul(val, NULL, 10);
|
||||
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/max-bypasses", be_path));
|
||||
net2->max_bypasses = strtoul(val, NULL, 10);
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
libxl__free_all(&gc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int libxl_strtomac(const char *mac_s, uint8_t *mac)
|
||||
{
|
||||
const char *end = mac_s + 17;
|
||||
char val, *endptr;
|
||||
|
||||
for (; mac_s < end; mac_s += 3, ++mac) {
|
||||
val = strtoul(mac_s, &endptr, 16);
|
||||
if (endptr != (mac_s + 2)) {
|
||||
return ERROR_INVAL;
|
||||
}
|
||||
*mac = val;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define QEMU_VERSION_STR "QEMU emulator version "
|
||||
|
||||
|
||||
|
||||
@@ -66,11 +66,6 @@ int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
|
||||
int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
|
||||
const char *devid, libxl_device_disk *disk);
|
||||
|
||||
int libxl_strtomac(const char *mac_s, uint8_t *mac);
|
||||
|
||||
int libxl_devid_to_device_net2(libxl_ctx *ctx, uint32_t domid,
|
||||
const char *devid, libxl_device_net2 *net2);
|
||||
|
||||
/* check the version of qemu
|
||||
* return 1 if is the new one
|
||||
* return 0 if is the old one
|
||||
|
||||
+3
-225
@@ -620,7 +620,7 @@ static void parse_config_data(const char *configfile_filename_report,
|
||||
const char *buf;
|
||||
long l;
|
||||
XLU_Config *config;
|
||||
XLU_ConfigList *vbds, *nics, *pcis, *cvfbs, *net2s, *cpuids;
|
||||
XLU_ConfigList *vbds, *nics, *pcis, *cvfbs, *cpuids;
|
||||
int pci_power_mgmt = 0;
|
||||
int pci_msitranslate = 1;
|
||||
int e;
|
||||
@@ -895,53 +895,8 @@ skip:
|
||||
}
|
||||
}
|
||||
|
||||
if (!xlu_cfg_get_list(config, "vif2", &net2s, 0, 0)) {
|
||||
d_config->num_vif2s = 0;
|
||||
d_config->vif2s = NULL;
|
||||
while ((buf = xlu_cfg_get_listitem(net2s, d_config->num_vif2s))) {
|
||||
libxl_device_net2 *net2;
|
||||
char *buf2 = strdup(buf);
|
||||
char *p;
|
||||
|
||||
d_config->vif2s = realloc(d_config->vif2s, sizeof (libxl_device_net2) * (d_config->num_vif2s + 1));
|
||||
net2 = d_config->vif2s + d_config->num_vif2s;
|
||||
|
||||
libxl_device_net2_init(net2, d_config->num_vif2s);
|
||||
|
||||
for (p = strtok(buf2, ","); p; p = strtok(NULL, ",")) {
|
||||
char* val;
|
||||
while (isblank(*p))
|
||||
p++;
|
||||
val = strchr(p, '=');
|
||||
if (val == NULL)
|
||||
continue;
|
||||
*val++ = 0;
|
||||
if (!strcmp("front_mac", p)) {
|
||||
libxl_strtomac(val, net2->front_mac);
|
||||
} else if (!strcmp("back_mac", p)) {
|
||||
libxl_strtomac(val, net2->back_mac);
|
||||
} else if (!strcmp("backend", p)) {
|
||||
domain_qualifier_to_domid(val, &net2->backend_domid, 0);
|
||||
} else if (!strcmp("trusted", p)) {
|
||||
net2->trusted = (*val == '1');
|
||||
} else if (!strcmp("back_trusted", p)) {
|
||||
net2->back_trusted = (*val == '1');
|
||||
} else if (!strcmp("bridge", p)) {
|
||||
free(net2->bridge);
|
||||
net2->bridge = strdup(val);
|
||||
} else if (!strcmp("filter_mac", p)) {
|
||||
net2->filter_mac = (*val == '1');
|
||||
} else if (!strcmp("front_filter_mac", p)) {
|
||||
net2->front_filter_mac = (*val == '1');
|
||||
} else if (!strcmp("pdev", p)) {
|
||||
net2->pdev = strtoul(val, NULL, 10);
|
||||
} else if (!strcmp("max_bypasses", p)) {
|
||||
net2->max_bypasses = strtoul(val, NULL, 10);
|
||||
}
|
||||
}
|
||||
free(buf2);
|
||||
d_config->num_vif2s++;
|
||||
}
|
||||
if (!xlu_cfg_get_list(config, "vif2", NULL, 0, 0)) {
|
||||
fprintf(stderr, "WARNING: vif2: netchannel2 is deprecated and not supported by xl\n");
|
||||
}
|
||||
|
||||
if (!xlu_cfg_get_list (config, "vfb", &cvfbs, 0, 0)) {
|
||||
@@ -4569,183 +4524,6 @@ int main_blockdetach(int argc, char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_network2attach(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
const char *tok;
|
||||
char *endptr;
|
||||
const char *back_dom = NULL;
|
||||
uint32_t domid, back_domid;
|
||||
unsigned int val, i;
|
||||
libxl_device_net2 net2;
|
||||
|
||||
while ((opt = getopt(argc, argv, "h")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
help("network2-attach");
|
||||
return 0;
|
||||
default:
|
||||
fprintf(stderr, "option `%c' not supported.\n", optopt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((argc-optind < 1) || (argc-optind > 10)) {
|
||||
help("network2-attach");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) {
|
||||
fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
|
||||
return 1;
|
||||
}
|
||||
libxl_device_net2_init(&net2, -1);
|
||||
for (argv += optind+1, argc -= optind+1; argc > 0; --argc, ++argv) {
|
||||
if (!strncmp("front_mac=", *argv, 10)) {
|
||||
tok = strtok((*argv) + 10, ":");
|
||||
for (i = 0; tok && i < 6; tok = strtok(NULL, ":"), ++i) {
|
||||
val = strtoul(tok, &endptr, 16);
|
||||
if ((tok == endptr) || (val > 255)) {
|
||||
fprintf(stderr, "Invalid parameter `front_mac'.\n");
|
||||
return 1;
|
||||
}
|
||||
net2.front_mac[i] = val;
|
||||
}
|
||||
} else if (!strncmp("back_mac=", *argv, 9)) {
|
||||
tok = strtok((*argv) + 10, ":");
|
||||
for (i = 0; tok && i < 6; tok = strtok(NULL, ":"), ++i) {
|
||||
val = strtoul(tok, &endptr, 16);
|
||||
if ((tok == endptr) || (val > 255)) {
|
||||
fprintf(stderr, "Invalid parameter back_mac=%s.\n", *argv + 9);
|
||||
return 1;
|
||||
}
|
||||
net2.back_mac[i] = val;
|
||||
}
|
||||
} else if (!strncmp("backend=", *argv, 8)) {
|
||||
back_dom = *argv;
|
||||
} else if (!strncmp("trusted=", *argv, 8)) {
|
||||
net2.trusted = (*((*argv) + 8) == '1');
|
||||
} else if (!strncmp("back_trusted=", *argv, 13)) {
|
||||
net2.back_trusted = (*((*argv) + 13) == '1');
|
||||
} else if (!strncmp("bridge=", *argv, 7)) {
|
||||
net2.bridge = *argv + 13;
|
||||
} else if (!strncmp("filter_mac=", *argv, 11)) {
|
||||
net2.filter_mac = (*((*argv) + 11) == '1');
|
||||
} else if (!strncmp("front_filter_mac=", *argv, 17)) {
|
||||
net2.front_filter_mac = (*((*argv) + 17) == '1');
|
||||
} else if (!strncmp("pdev=", *argv, 5)) {
|
||||
val = strtoul(*argv + 5, &endptr, 10);
|
||||
if (endptr == (*argv + 5)) {
|
||||
fprintf(stderr, "Invalid parameter pdev=%s.\n", *argv + 5);
|
||||
return 1;
|
||||
}
|
||||
net2.pdev = val;
|
||||
} else if (!strncmp("max_bypasses=", *argv, 13)) {
|
||||
val = strtoul(*argv + 13, &endptr, 10);
|
||||
if (endptr == (*argv + 13)) {
|
||||
fprintf(stderr, "Invalid parameter max_bypasses=%s.\n", *argv + 13);
|
||||
return 1;
|
||||
}
|
||||
net2.max_bypasses = val;
|
||||
} else {
|
||||
fprintf(stderr, "unrecognized argument `%s'\n", *argv);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (back_dom) {
|
||||
if (domain_qualifier_to_domid(back_dom, &back_domid, 0) < 0) {
|
||||
fprintf(stderr, "%s is an invalid domain identifier\n", back_dom);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
net2.domid = domid;
|
||||
net2.backend_domid = back_domid;
|
||||
if (libxl_device_net2_add(ctx, domid, &net2)) {
|
||||
fprintf(stderr, "libxl_device_net2_add failed.\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_network2list(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
unsigned int nb;
|
||||
libxl_net2info *net2s;
|
||||
|
||||
while ((opt = getopt(argc, argv, "h")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
help("network2-list");
|
||||
return 0;
|
||||
default:
|
||||
fprintf(stderr, "option `%c' not supported.\n", optopt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (argc - optind < 1) {
|
||||
help("network2-list");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("%-3s %-2s %-5s %-17s %-17s %-7s %-6s %-30s\n",
|
||||
"Idx", "BE", "state", "Mac Addr.", "Remote Mac Addr.",
|
||||
"trusted", "filter", "backend");
|
||||
for (argv += optind, argc -=optind; argc > 0; --argc, ++argv) {
|
||||
if (domain_qualifier_to_domid(*argv, &domid, 0) < 0) {
|
||||
fprintf(stderr, "%s is an invalid domain identifier\n", *argv);
|
||||
continue;
|
||||
}
|
||||
if ((net2s = libxl_device_net2_list(ctx, domid, &nb))) {
|
||||
for (; nb > 0; --nb, ++net2s) {
|
||||
printf("%3d %2d %5d ", net2s->devid, net2s->backend_id, net2s->state);
|
||||
printf("%02x:%02x:%02x:%02x:%02x:%02x ",
|
||||
net2s->mac[0], net2s->mac[1], net2s->mac[2],
|
||||
net2s->mac[3], net2s->mac[4], net2s->mac[5]);
|
||||
printf("%02x:%02x:%02x:%02x:%02x:%02x ",
|
||||
net2s->back_mac[0], net2s->back_mac[1], net2s->back_mac[2],
|
||||
net2s->back_mac[3], net2s->back_mac[4], net2s->back_mac[5]);
|
||||
printf("%-7d %-6d %-30s\n", net2s->trusted, net2s->filter_mac, net2s->backend);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_network2detach(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
libxl_device_net2 net2;
|
||||
|
||||
while ((opt = getopt(argc, argv, "h")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
help("network2-detach");
|
||||
return 0;
|
||||
default:
|
||||
fprintf(stderr, "option `%c' not supported.\n", optopt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (argc-optind != 2) {
|
||||
help("network2-detach");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) {
|
||||
fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
|
||||
return 1;
|
||||
}
|
||||
if (libxl_devid_to_device_net2(ctx, domid, argv[optind+1], &net2)) {
|
||||
fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
|
||||
return 1;
|
||||
}
|
||||
if (libxl_device_net2_del(ctx, &net2, 1)) {
|
||||
fprintf(stderr, "libxl_device_net2_del failed.\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *uptime_to_string(unsigned long time, int short_mode)
|
||||
{
|
||||
int sec, min, hour, day;
|
||||
|
||||
@@ -320,24 +320,6 @@ struct cmd_spec cmd_table[] = {
|
||||
"Get information about how much freeable memory (MB) is in-use by tmem",
|
||||
"",
|
||||
},
|
||||
{ "network2-attach",
|
||||
&main_network2attach,
|
||||
"Create a new version 2 virtual network device",
|
||||
"<Domain> [front_mac=<mac>] [back_mac=<mac>] [backend=<BackDomain>]"
|
||||
" [trusted=<0|1>] [back_trusted=<0|1>] [bridge=<bridge>]"
|
||||
" [filter_mac=<0|1>] [front_filter_mac=<0|1>] [pdev=<PDEV>]"
|
||||
" [max_bypasses=n]",
|
||||
},
|
||||
{ "network2-list",
|
||||
&main_network2list,
|
||||
"list version 2 virtual network interfaces for a domain",
|
||||
"<Domain(s)>",
|
||||
},
|
||||
{ "network2-detach",
|
||||
&main_network2detach,
|
||||
"destroy a domain's version 2 virtual network device",
|
||||
"<Domain> <DevId>",
|
||||
},
|
||||
{ "cpupool-create",
|
||||
&main_cpupoolcreate,
|
||||
"Create a CPU pool based an ConfigFile",
|
||||
|
||||