static int domain_create_info_val (caml_gc *gc, libxl_domain_create_info *c_val, value v) { CAMLparam1(v); CAMLlocal1(a); uint8_t *uuid = libxl_uuid_bytearray(&c_val->uuid); int i; c_val->hvm = Bool_val(Field(v, 0)); c_val->hap = Bool_val(Field(v, 1)); c_val->oos = Bool_val(Field(v, 2)); c_val->ssidref = Int32_val(Field(v, 3)); c_val->name = dup_String_val(gc, Field(v, 4)); a = Field(v, 5); for (i = 0; i < 16; i++) uuid[i] = Int_val(Field(a, i)); string_string_tuple_array_val(gc, &(c_val->xsdata), Field(v, 6)); string_string_tuple_array_val(gc, &(c_val->platformdata), Field(v, 7)); c_val->poolid = Int32_val(Field(v, 8)); c_val->poolname = dup_String_val(gc, Field(v, 9)); CAMLreturn(0); }
int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, uint32_t domid, bool hotplug) { int rc; if (!nic->mtu) nic->mtu = 1492; if (!nic->model) { nic->model = strdup("rtl8139"); if (!nic->model) return ERROR_NOMEM; } if (libxl__mac_is_default(&nic->mac)) { const uint8_t *r; libxl_uuid uuid; libxl_uuid_generate(&uuid); r = libxl_uuid_bytearray(&uuid); nic->mac[0] = 0x00; nic->mac[1] = 0x16; nic->mac[2] = 0x3e; nic->mac[3] = r[0] & 0x7f; nic->mac[4] = r[1]; nic->mac[5] = r[2]; } if (!nic->bridge) { nic->bridge = strdup("xenbr0"); if (!nic->bridge) return ERROR_NOMEM; } if ( !nic->script && asprintf(&nic->script, "%s/vif-bridge", libxl__xen_script_dir_path()) < 0 ) return ERROR_FAIL; rc = libxl__resolve_domid(gc, nic->backend_domname, &nic->backend_domid); if (rc < 0) return rc; switch (libxl__domain_type(gc, domid)) { case LIBXL_DOMAIN_TYPE_HVM: if (!nic->nictype) { if (hotplug || (libxl__device_model_version_running(gc, domid) == LIBXL_DEVICE_MODEL_VERSION_NONE)) nic->nictype = LIBXL_NIC_TYPE_VIF; else nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; } break; case LIBXL_DOMAIN_TYPE_PV: if (nic->nictype == LIBXL_NIC_TYPE_VIF_IOEMU) { LOG(ERROR, "trying to create PV guest with an emulated interface"); return ERROR_INVAL; } nic->nictype = LIBXL_NIC_TYPE_VIF; break; case LIBXL_DOMAIN_TYPE_INVALID: return ERROR_FAIL; default: abort(); } return rc; }