@@ -1208,6 +1208,83 @@ static void parse_vkb_list(const XLU_Config *config,
if (rc) exit(EXIT_FAILURE);
}
+static int parse_virtio_config(libxl_device_virtio *virtio, char *token)
+{
+ char *oparg;
+ int rc;
+
+ if (MATCH_OPTION("backend", token, oparg)) {
+ virtio->backend_domname = strdup(oparg);
+ } else if (MATCH_OPTION("type", token, oparg)) {
+ virtio->type = strdup(oparg);
+ } else if (MATCH_OPTION("transport", token, oparg)) {
+ rc = libxl_virtio_transport_from_string(oparg, &virtio->transport);
+ if (rc) return rc;
+ } else {
+ fprintf(stderr, "Unknown string \"%s\" in virtio spec\n", token);
+ return -1;
+ }
+
+ return 0;
+}
+
+static void parse_virtio_list(const XLU_Config *config,
+ libxl_domain_config *d_config)
+{
+ XLU_ConfigList *virtios;
+ const char *item;
+ char *buf = NULL, *oparg, *str = NULL;
+ int rc;
+
+ if (!xlu_cfg_get_list (config, "virtio", &virtios, 0, 0)) {
+ int entry = 0;
+ while ((item = xlu_cfg_get_listitem(virtios, entry)) != NULL) {
+ libxl_device_virtio *virtio;
+ char *p;
+
+ virtio = ARRAY_EXTEND_INIT(d_config->virtios, d_config->num_virtios,
+ libxl_device_virtio_init);
+
+ buf = strdup(item);
+
+ p = strtok(buf, ",");
+ while (p != NULL)
+ {
+ while (*p == ' ') p++;
+
+ // Type may contain a comma, do special handling.
+ if (MATCH_OPTION("type", p, oparg)) {
+ if (!strncmp(oparg, "virtio", strlen("virtio"))) {
+ char *p2 = strtok(NULL, ",");
+ str = malloc(strlen(p) + strlen(p2) + 2);
+
+ strcpy(str, p);
+ strcat(str, ",");
+ strcat(str, p2);
+ p = str;
+ }
+ }
+
+ rc = parse_virtio_config(virtio, p);
+ if (rc) goto out;
+
+ free(str);
+ str = NULL;
+ p = strtok(NULL, ",");
+ }
+
+ entry++;
+ free(buf);
+ }
+ }
+
+ return;
+
+out:
+ free(buf);
+ if (rc) exit(EXIT_FAILURE);
+}
+
void parse_config_data(const char *config_source,
const char *config_data,
int config_len,
@@ -2753,6 +2830,10 @@ void parse_config_data(const char *config_source,
parse_vkb_list(config, d_config);
+ d_config->virtios = NULL;
+ d_config->num_virtios = 0;
+ parse_virtio_list(config, d_config);
+
xlu_cfg_get_defbool(config, "xend_suspend_evtchn_compat",
&c_info->xend_suspend_evtchn_compat, 0);