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