Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 0 of 7] xl: network2 commands, hap parameter and block commands fixes
This patch serie adds network2-{attach,list,detach} commands to xl and
libxenlight, adds hap parameter parsing from configuration file and fixes some
issues with block-{attach,list,detach} commands (argv/argc offset mismatch).
--
Eric Chanudet
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 1 of 7] xl: network2-attach command
This patch adds network2-attach command to xl.
Usage: xl network2-attach <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]
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1582,6 +1582,109 @@ libxl_nicinfo *libxl_list_nics(struct li
return res;
}
+/******************************************************************************/
+int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_net2 *net2)
+{
+ flexarray_t *front, *back;
+ unsigned int boffset = 0, foffset = 0;
+ libxl_device device;
+ char *dompath, *dom, **l;
+ unsigned int nb;
+
+ front = flexarray_make(16, 1);
+ if (!front)
+ return ERROR_NOMEM;
+ back = flexarray_make(16, 1);
+ if (!back)
+ return ERROR_NOMEM;
+
+ if (!(dompath = libxl_xs_get_dompath(ctx, domid))) {
+ return ERROR_FAIL;
+ }
+ dom = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/name",
dompath));
+
+ if (net2->devid == -1) {
+ if (!(l = libxl_xs_directory(ctx, XBT_NULL,
+ libxl_sprintf(ctx,
"%s/device/vif2", dompath), &nb))) {
+ net2->devid = 0;
+ } else {
+ net2->devid = strtoul(l[nb - 1], NULL, 10) + 1;
+ libxl_free(ctx, l);
+ }
+ }
+
+ 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_set(back, boffset++, "domain");
+ flexarray_set(back, boffset++, dom);
+ flexarray_set(back, boffset++, "frontend-id");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
net2->domid));
+
+ flexarray_set(back, boffset++, "local-trusted");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
net2->back_trusted));
+ flexarray_set(back, boffset++, "mac");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx,
"%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_set(back, boffset++, "remote-trusted");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
net2->trusted));
+ flexarray_set(back, boffset++, "remote-mac");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx,
"%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_set(back, boffset++, "max-bypasses");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
net2->max_bypasses));
+ flexarray_set(back, boffset++, "filter-mac");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
!!(net2->filter_mac)));
+ flexarray_set(back, boffset++, "handle");
+ flexarray_set(back, boffset++, libxl_sprintf(ctx, "%d",
net2->devid));
+ flexarray_set(back, boffset++, "online");
+ flexarray_set(back, boffset++, "1");
+ flexarray_set(back, boffset++, "state");
+ flexarray_set(back, boffset++, "1");
+
+ flexarray_set(front, foffset++, "backend-id");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d",
net2->backend_domid));
+
+ flexarray_set(front, foffset++, "local-trusted");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d",
net2->trusted));
+ flexarray_set(front, foffset++, "mac");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx,
"%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_set(front, foffset++, "remote-trusted");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d",
net2->back_trusted));
+ flexarray_set(front, foffset++, "remote-mac");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx,
"%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_set(front, foffset++, "filter-mac");
+ flexarray_set(front, foffset++, libxl_sprintf(ctx, "%d",
!!(net2->filter_mac)));
+ flexarray_set(front, foffset++, "state");
+ flexarray_set(front, foffset++, "1");
+
+ libxl_device_generic_add(ctx, &device,
+ libxl_xs_kvs_of_flexarray(ctx, back, boffset),
+ libxl_xs_kvs_of_flexarray(ctx, front, foffset));
+
+ /* FIXME: wait for plug */
+ flexarray_free(back);
+ flexarray_free(front);
+ return 0;
+}
/******************************************************************************/
int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_console *console)
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -240,6 +240,21 @@ typedef struct {
libxl_nic_type nictype;
} libxl_device_nic;
+typedef struct {
+ int devid;
+ uint8_t front_mac[6];
+ uint8_t back_mac[6];
+ uint32_t backend_domid;
+ uint32_t domid;
+ uint32_t trusted:1;
+ uint32_t back_trusted:1;
+ uint32_t filter_mac:1;
+ uint32_t front_filter_mac:1;
+ uint32_t pdev;
+ uint32_t max_bypasses;
+ char *bridge;
+} libxl_device_net2;
+
typedef struct {
union {
unsigned int value;
@@ -536,5 +551,8 @@ int libxl_tmem_set(struct libxl_ctx *ctx
uint32_t set);
int libxl_tmem_shared_auth(struct libxl_ctx *ctx, uint32_t domid, char* uuid,
int auth);
+
+int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_net2 *net2);
+
#endif /* LIBXL_H */
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -28,6 +28,7 @@
static const char *string_of_kinds[] = {
[DEVICE_VIF] = "vif",
+ [DEVICE_VIF2] = "vif2",
[DEVICE_VBD] = "vbd",
[DEVICE_TAP] = "tap",
[DEVICE_PCI] = "pci",
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -68,6 +68,7 @@ void xl_log(struct libxl_ctx *ctx, xento
typedef enum {
DEVICE_VIF = 1,
+ DEVICE_VIF2,
DEVICE_VBD,
DEVICE_TAP,
DEVICE_PCI,
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -467,3 +467,18 @@ int libxl_devid_to_device_disk(struct li
return 0;
}
+
+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;
+}
diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h
+++ b/tools/libxl/libxl_utils.h
@@ -63,6 +63,7 @@ int libxl_devid_to_device_nic(struct lib
int libxl_devid_to_device_disk(struct libxl_ctx *ctx, uint32_t domid,
const char *devid, libxl_device_disk *disk);
+int libxl_strtomac(const char *mac_s, uint8_t *mac);
#endif
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -72,6 +72,7 @@ int main_tmem_destroy(int argc, char **a
int main_tmem_thaw(int argc, char **argv);
int main_tmem_set(int argc, char **argv);
int main_tmem_shared_auth(int argc, char **argv);
+int main_network2attach(int argc, char **argv);
void help(char *command);
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -241,6 +241,29 @@ static void init_nic_info(libxl_device_n
nic_info->nictype = NICTYPE_IOEMU;
}
+static void init_net2_info(libxl_device_net2 *net2_info, int devnum)
+{
+ 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] = 1 + (int) (0x7f * (rand() / (RAND_MAX +
1.0)));
+ net2_info->front_mac[4] = 1 + (int) (0xff * (rand() / (RAND_MAX +
1.0)));
+ net2_info->front_mac[5] = 1 + (int) (0xff * (rand() / (RAND_MAX +
1.0)));
+ net2_info->back_mac[0] = 0x00;
+ net2_info->back_mac[1] = 0x16;
+ net2_info->back_mac[2] = 0x3e;
+ net2_info->back_mac[3] = 1 + (int) (0x7f * (rand() / (RAND_MAX + 1.0)));
+ net2_info->back_mac[4] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+ net2_info->back_mac[5] = 1 + (int) (0xff * (rand() / (RAND_MAX + 1.0)));
+ net2_info->back_trusted = 1;
+ net2_info->filter_mac = 1;
+ net2_info->max_bypasses = 5;
+ net2_info->bridge = "xenbr0";
+}
+
static void init_vfb_info(libxl_device_vfb *vfb, int dev_num)
{
memset(vfb, 0x00, sizeof(libxl_device_vfb));
@@ -406,6 +429,8 @@ static void parse_config_data(const char
int *num_disks,
libxl_device_nic **vifs,
int *num_vifs,
+ libxl_device_net2 **vif2s,
+ int *num_vif2s,
libxl_device_pci **pcidevs,
int *num_pcidevs,
libxl_device_vfb **vfbs,
@@ -417,7 +442,7 @@ static void parse_config_data(const char
const char *buf;
long l;
XLU_Config *config;
- XLU_ConfigList *vbds, *nics, *pcis, *cvfbs;
+ XLU_ConfigList *vbds, *nics, *pcis, *cvfbs, *net2s;
int pci_power_mgmt = 0;
int pci_msitranslate = 1;
int i, e;
@@ -648,6 +673,46 @@ skip:
}
}
+ if (!xlu_cfg_get_list(config, "vif2", &net2s, 0)) {
+ *num_vif2s = 0;
+ *vif2s = NULL;
+ while ((buf = xlu_cfg_get_listitem(net2s, *num_vif2s))) {
+ char *buf2 = strdup(buf);
+ char *p;
+
+ *vif2s = realloc(*vif2s, sizeof (libxl_device_net2) * (*num_vif2s +
1));
+ init_net2_info(*vif2s + *num_vif2s, *num_vif2s);
+
+ for (p = strtok(buf2, ","); p; p = strtok(buf2,
",")) {
+ while (isblank(*p))
+ p++;
+ if (!strncmp("front_mac=", p, 10)) {
+ libxl_strtomac(p + 10, (*vif2s)[*num_vif2s].front_mac);
+ } else if (!strncmp("back_mac=", p, 9)) {
+ libxl_strtomac(p + 9, (*vif2s)[*num_vif2s].back_mac);
+ } else if (!strncmp("backend=", p, 8)) {
+ domain_qualifier_to_domid(p + 8,
&((*vif2s)[*num_vif2s].backend_domid), 0);
+ } else if (!strncmp("trusted=", p, 8)) {
+ (*vif2s)[*num_vif2s].trusted = (*(p + 8) ==
''1'');
+ } else if (!strncmp("back_trusted=", p, 13)) {
+ (*vif2s)[*num_vif2s].back_trusted = (*(p + 13) ==
''1'');
+ } else if (!strncmp("bridge=", p, 7)) {
+ (*vif2s)[*num_vif2s].bridge = strdup(p + 13);
+ } else if (!strncmp("filter_mac=", p, 11)) {
+ (*vif2s)[*num_vif2s].filter_mac = (*(p + 11) ==
''1'');
+ } else if (!strncmp("front_filter_mac=", p, 17)) {
+ (*vif2s)[*num_vif2s].front_filter_mac = (*(p + 17) ==
''1'');
+ } else if (!strncmp("pdev=", p, 5)) {
+ (*vif2s)[*num_vif2s].pdev = strtoul(p + 5, NULL, 10);
+ } else if (!strncmp("max_bypasses=", p, 13)) {
+ (*vif2s)[*num_vif2s].max_bypasses = strtoul(p + 13, NULL,
10);
+ }
+ }
+ free(buf2);
+ ++(*num_vif2s);
+ }
+ }
+
if (!xlu_cfg_get_list (config, "vfb", &cvfbs, 0)) {
*num_vfbs = 0;
*num_vkbs = 0;
@@ -841,6 +906,7 @@ static int create_domain(struct domain_c
libxl_device_model_info dm_info;
libxl_device_disk *disks = NULL;
libxl_device_nic *vifs = NULL;
+ libxl_device_net2 *vif2s = NULL;
libxl_device_pci *pcidevs = NULL;
libxl_device_vfb *vfbs = NULL;
libxl_device_vkb *vkbs = NULL;
@@ -855,7 +921,7 @@ static int create_domain(struct domain_c
int migrate_fd = dom_info->migrate_fd;
char **migration_domname_r = dom_info->migration_domname_r;
- int num_disks = 0, num_vifs = 0, num_pcidevs = 0, num_vfbs = 0, num_vkbs =
0;
+ int num_disks = 0, num_vifs = 0, num_vif2s = 0, num_pcidevs = 0, num_vfbs =
0, num_vkbs = 0;
int i, fd;
int need_daemon = 1;
int ret, rc;
@@ -967,7 +1033,7 @@ static int create_domain(struct domain_c
printf("Parsing config file %s\n", config_file);
- parse_config_data(config_file, config_data, config_len, &info1,
&info2, &disks, &num_disks, &vifs, &num_vifs, &pcidevs,
&num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs,
&dm_info);
+ parse_config_data(config_file, config_data, config_len, &info1,
&info2, &disks, &num_disks, &vifs, &num_vifs, &vif2s,
&num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs,
&vkbs, &num_vkbs, &dm_info);
if (migrate_fd >= 0) {
if (info1.name) {
@@ -1038,6 +1104,17 @@ start:
goto error_out;
}
}
+ if (!info1.hvm) {
+ for (i = 0; i < num_vif2s; i++) {
+ vif2s[i].domid = domid;
+ ret = libxl_device_net2_add(&ctx, domid, &(vif2s[i]));
+ if (ret) {
+ fprintf(stderr, "cannot add net2 %d to domain: %d\n",
i, ret);
+ ret = ERROR_FAIL;
+ goto error_out;
+ }
+ }
+ }
if (info1.hvm) {
dm_info.domid = domid;
MUST( libxl_create_device_model(&ctx, &dm_info, disks,
num_disks,
@@ -3696,6 +3773,102 @@ int main_blockdetach(int argc, char **ar
exit(0);
}
+int main_network2attach(int argc, char **argv)
+{
+ int opt;
+ char *tok, *endptr;
+ char *back_dom = NULL;
+ uint32_t domid, back_domid;
+ unsigned int val, i;
+ libxl_device_net2 net2;
+
+ if ((argc < 3) || (argc > 12)) {
+ help("network2-attach");
+ exit(0);
+ }
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("network2-attach");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ if (domain_qualifier_to_domid(argv[2], &domid, 0) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n",
argv[1]);
+ exit(1);
+ }
+ init_net2_info(&net2, -1);
+ for (argv += 3, argc -= 3; 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");
+ exit(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);
+ exit(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);
+ exit(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);
+ exit(1);
+ }
+ net2.max_bypasses = val;
+ } else {
+ fprintf(stderr, "unrecognized argument `%s''\n",
*argv);
+ exit(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);
+ exit(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");
+ }
+ exit(0);
+}
+
static char *uptime_to_string(unsigned long time, int short_mode)
{
int sec, min, hour, day;
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -287,6 +287,14 @@ struct cmd_spec cmd_table[] = {
"
(abcdef01-2345-6789-1234-567890abcdef)\n"
" -A AUTH 0=auth,1=deauth",
},
+ { "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]",
+ },
};
int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
This patch adds network2-list command to xl.
Usage: xl network2-list <Domains>
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1686,6 +1686,69 @@ int libxl_device_net2_add(struct libxl_c
return 0;
}
+libxl_net2info *libxl_device_net2_list(struct libxl_ctx *ctx, uint32_t domid,
unsigned int *nb)
+{
+ char *dompath, *net2_path_fe;
+ char **l;
+ char *val, *tok;
+ unsigned int nb_net2s, i;
+ libxl_net2info *res, *net2s;
+
+ dompath = libxl_xs_get_dompath(ctx, domid);
+ if (!dompath) {
+ return NULL;
+ }
+ l = libxl_xs_directory(ctx, XBT_NULL,
+ libxl_sprintf(ctx, "%s/device/vif2",
dompath), &nb_net2s);
+ if (!l) {
+ return NULL;
+ }
+ res = libxl_calloc(ctx, nb_net2s, sizeof (libxl_net2info));
+ if (!res) {
+ libxl_free(ctx, l);
+ return NULL;
+ }
+ net2s = res;
+ for (*nb = nb_net2s; nb_net2s > 0; --nb_net2s, ++l, ++net2s) {
+ net2_path_fe = libxl_sprintf(ctx, "%s/device/vif2/%s",
dompath, *l);
+
+ net2s->backend = libxl_xs_read(ctx, XBT_NULL,
+ libxl_sprintf(ctx,
"%s/backend", net2_path_fe));
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%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(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/state", net2_path_fe));
+ net2s->state = val ? strtoul(val, NULL, 10) : -1;
+
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%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(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/remote-trusted", net2_path_fe));
+ net2s->trusted = val ? strtoul(val, NULL, 10) : -1;
+
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%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(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/filter-mac", net2_path_fe));
+ net2s->filter_mac = val ? strtoul(val, NULL, 10) : -1;
+
+ net2s->frontend = libxl_xs_read(ctx, XBT_NULL,
+ libxl_sprintf(ctx,
"%s/frontend", net2s->backend));
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/frontend-id", net2s->backend));
+ net2s->frontend_id = val ? strtoul(val, NULL, 10) : -1;
+ libxl_free(ctx, net2_path_fe);
+ }
+
+ libxl_free(ctx, l);
+ return res;
+}
+
+
/******************************************************************************/
int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_console *console)
{
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -552,7 +552,21 @@ int libxl_tmem_set(struct libxl_ctx *ctx
int libxl_tmem_shared_auth(struct libxl_ctx *ctx, uint32_t domid, char* uuid,
int auth);
+typedef struct {
+ char *backend;
+ uint32_t backend_id;
+ char *frontend;
+ uint32_t frontend_id;
+ int devid;
+ int state;
+ uint8_t mac[6];
+ int trusted;
+ uint8_t back_mac[6];
+ int filter_mac;
+} libxl_net2info;
+
int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_net2 *net2);
+libxl_net2info *libxl_device_net2_list(struct libxl_ctx *ctx, uint32_t domid,
unsigned int *nb);
#endif /* LIBXL_H */
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -73,6 +73,7 @@ int main_tmem_thaw(int argc, char **argv
int main_tmem_set(int argc, char **argv);
int main_tmem_shared_auth(int argc, char **argv);
int main_network2attach(int argc, char **argv);
+int main_network2list(int argc, char **argv);
void help(char *command);
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3869,6 +3869,51 @@ int main_network2attach(int argc, char *
exit(0);
}
+int main_network2list(int argc, char **argv)
+{
+ int opt;
+ unsigned int nb;
+ libxl_net2info *net2s;
+
+ if (argc < 3) {
+ help("network2-list");
+ exit(0);
+ }
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("network2-list");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ printf("%-3s %-2s %-5s %-17s %-17s %-7s %-6s %-30s\n",
+ "Idx", "BE", "state", "Mac
Addr.", "Remote Mac Addr.",
+ "trusted", "filter", "backend");
+ for (argv += 2, argc -=2; 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);
+ }
+ }
+ }
+ exit(0);
+}
+
static char *uptime_to_string(unsigned long time, int short_mode)
{
int sec, min, hour, day;
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -295,6 +295,11 @@ struct cmd_spec cmd_table[] = {
" [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)>",
+ },
};
int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 3 of 7] xl: network2-detach command
This patch adds netowkr2-detach command to xl.
Usage: xl network2-detach <Domain> <DevId>
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1748,6 +1748,20 @@ libxl_net2info *libxl_device_net2_list(s
return res;
}
+int libxl_device_net2_del(struct libxl_ctx *ctx, libxl_device_net2 *net2, int
wait)
+{
+ libxl_device device;
+
+ 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;
+
+ return libxl_device_del(ctx, &device, wait);
+}
+
/******************************************************************************/
int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_console *console)
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -567,6 +567,7 @@ typedef struct {
int libxl_device_net2_add(struct libxl_ctx *ctx, uint32_t domid,
libxl_device_net2 *net2);
libxl_net2info *libxl_device_net2_list(struct libxl_ctx *ctx, uint32_t domid,
unsigned int *nb);
+int libxl_device_net2_del(struct libxl_ctx *ctx, libxl_device_net2 *net2, int
wait);
#endif /* LIBXL_H */
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -468,6 +468,54 @@ int libxl_devid_to_device_disk(struct li
return 0;
}
+int libxl_devid_to_device_net2(struct libxl_ctx *ctx, uint32_t domid,
+ const char *devid, libxl_device_net2 *net2)
+{
+ char *tok, *endptr, *val;
+ char *dompath, *net2path, *be_path;
+ unsigned int devid_n, i;
+
+ devid_n = strtoul(devid, &endptr, 10);
+ if (devid == endptr) {
+ return ERROR_INVAL;
+ }
+ dompath = libxl_xs_get_dompath(ctx, domid);
+ net2path = libxl_sprintf(ctx, "%s/device/vif2/%s", dompath,
devid);
+ if (!net2path) {
+ return ERROR_FAIL;
+ }
+ memset(net2, 0, sizeof (libxl_device_net2));
+ be_path = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/backend", net2path));
+
+ net2->devid = devid_n;
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%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(ctx, XBT_NULL, libxl_sprintf(ctx,
"%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(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/backend-id", net2path));
+ net2->backend_domid = strtoul(val, NULL, 10);
+
+ net2->domid = domid;
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/remote-trusted", be_path));
+ net2->trusted = strtoul(val, NULL, 10);
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/local-trusted", be_path));
+ net2->back_trusted = strtoul(val, NULL, 10);
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/filter-mac", be_path));
+ net2->filter_mac = strtoul(val, NULL, 10);
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/filter-mac", net2path));
+ net2->front_filter_mac = strtoul(val, NULL, 10);
+ val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx,
"%s/max-bypasses", be_path));
+ net2->max_bypasses = strtoul(val, NULL, 10);
+
+ return 0;
+}
+
int libxl_strtomac(const char *mac_s, uint8_t *mac)
{
const char *end = mac_s + 17;
diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h
+++ b/tools/libxl/libxl_utils.h
@@ -65,5 +65,8 @@ int libxl_devid_to_device_disk(struct li
int libxl_strtomac(const char *mac_s, uint8_t *mac);
+int libxl_devid_to_device_net2(struct libxl_ctx *ctx, uint32_t domid,
+ const char *devid, libxl_device_net2 *net2);
+
#endif
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -74,6 +74,7 @@ int main_tmem_set(int argc, char **argv)
int main_tmem_shared_auth(int argc, char **argv);
int main_network2attach(int argc, char **argv);
int main_network2list(int argc, char **argv);
+int main_network2detach(int argc, char **argv);
void help(char *command);
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3914,6 +3914,41 @@ int main_network2list(int argc, char **a
exit(0);
}
+int main_network2detach(int argc, char **argv)
+{
+ int opt;
+ libxl_device_net2 net2;
+
+ if (argc != 4) {
+ help("network2-detach");
+ exit(0);
+ }
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("network2-detach");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ if (domain_qualifier_to_domid(argv[2], &domid, 0) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n",
argv[2]);
+ exit(1);
+ }
+ if (libxl_devid_to_device_net2(&ctx, domid, argv[3], &net2)) {
+ fprintf(stderr, "Error: Device %s not connected.\n", argv[3]);
+ exit(1);
+ }
+ if (libxl_device_net2_del(&ctx, &net2, 1)) {
+ fprintf(stderr, "libxl_device_net2_del failed.\n");
+ exit(1);
+ }
+ exit(0);
+}
+
static char *uptime_to_string(unsigned long time, int short_mode)
{
int sec, min, hour, day;
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -300,6 +300,11 @@ struct cmd_spec cmd_table[] = {
"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>",
+ },
};
int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 4 of 7] xl: block-attach command line parsing
Command line arguments start at argv[2].
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3629,7 +3629,7 @@ int main_blockattach(int argc, char **ar
uint32_t fe_domid, be_domid = 0;
libxl_device_disk disk = { 0 };
- if ((argc < 4) || (argc > 6)) {
+ if ((argc < 5) || (argc > 7)) {
help("block-attach");
exit(0);
}
@@ -3644,7 +3644,7 @@ int main_blockattach(int argc, char **ar
}
}
- tok = strtok(argv[2], ":");
+ tok = strtok(argv[3], ":");
if (!strcmp(tok, "phy")) {
disk.phystype = PHYSTYPE_PHY;
} else if (!strcmp(tok, "file")) {
@@ -3672,17 +3672,17 @@ int main_blockattach(int argc, char **ar
fprintf(stderr, "Error: missing path to disk image.\n");
exit(1);
}
- disk.virtpath = argv[3];
+ disk.virtpath = argv[4];
disk.unpluggable = 1;
- disk.readwrite = (argc <= 4 || argv[4][0] == ''w'') ? 1
: 0;
-
- if (domain_qualifier_to_domid(argv[1], &fe_domid, 0) < 0) {
- fprintf(stderr, "%s is an invalid domain identifier\n",
argv[1]);
+ disk.readwrite = ((argc <= 4) || (argv[5][0] == ''w''));
+
+ if (domain_qualifier_to_domid(argv[2], &fe_domid, 0) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n",
argv[2]);
exit(1);
}
- if (argc == 6) {
- if (domain_qualifier_to_domid(argv[5], &be_domid, 0) < 0) {
- fprintf(stderr, "%s is an invalid domain identifier\n",
argv[5]);
+ if (argc == 7) {
+ if (domain_qualifier_to_domid(argv[6], &be_domid, 0) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n",
argv[6]);
exit(1);
}
}
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 5 of 7] xl: block-list command line parsing
Command line arguments start at argv[2].
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3701,7 +3701,7 @@ int main_blocklist(int argc, char **argv
libxl_device_disk *disks;
libxl_diskinfo diskinfo;
- if (argc < 2) {
+ if (argc < 3) {
help("block-list");
exit(0);
}
@@ -3718,7 +3718,7 @@ int main_blocklist(int argc, char **argv
printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n",
"Vdev", "BE", "handle",
"state", "evt-ch", "ring-ref",
"BE-path");
- for (++argv, --argc; argc > 0; --argc, ++argv) {
+ for (argv += 2, argc -= 2; argc > 0; --argc, ++argv) {
if (domain_qualifier_to_domid(*argv, &domid, 0) < 0) {
fprintf(stderr, "%s is an invalid domain identifier\n",
*argv);
continue;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 6 of 7] xl: block-detach command line parsing
Command line arguments start at argv[2].
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3744,7 +3744,7 @@ int main_blockdetach(int argc, char **ar
int opt;
libxl_device_disk disk;
- if (argc != 3) {
+ if (argc != 4) {
help("block-detach");
exit(0);
}
@@ -3759,12 +3759,12 @@ int main_blockdetach(int argc, char **ar
}
}
- if (domain_qualifier_to_domid(argv[1], &domid, 0) < 0) {
- fprintf(stderr, "%s is an invalid domain identifier\n",
argv[1]);
+ if (domain_qualifier_to_domid(argv[2], &domid, 0) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n",
argv[2]);
exit(1);
}
- if (libxl_devid_to_device_disk(&ctx, domid, argv[2], &disk)) {
- fprintf(stderr, "Error: Device %s not connected.\n",
argv[2]);
+ if (libxl_devid_to_device_disk(&ctx, domid, argv[3], &disk)) {
+ fprintf(stderr, "Error: Device %s not connected.\n",
argv[3]);
exit(1);
}
if (libxl_device_disk_del(&ctx, &disk, 1)) {
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Jun-04 14:30 UTC
[Xen-devel] [PATCH 7 of 7] xl: hap parameter handling in configuration file
Get hap parameter from configuration file.
hap parameter can be set to 1 or 0 (default).
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -466,7 +466,10 @@ static void parse_config_data(const char
!strncmp(buf, "hvm", strlen(buf)))
c_info->hvm = 1;
- /* hap is missing */
+ c_info->hap = 0;
+ if (!xlu_cfg_get_string (config, "hap", &buf))
+ c_info->hap = (buf[0] == ''1'');
+
if (!xlu_cfg_get_string (config, "name", &buf))
c_info->name = strdup(buf);
else
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel