qemu_command.h 13.8 KB
Newer Older
1 2 3
/*
 * qemu_command.h: QEMU command generation
 *
4
 * Copyright (C) 2006-2013 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26 27
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __QEMU_COMMAND_H__
# define __QEMU_COMMAND_H__

# include "domain_conf.h"
28
# include "vircommand.h"
29 30
# include "capabilities.h"
# include "qemu_conf.h"
31
# include "qemu_domain.h"
32
# include "qemu_capabilities.h"
33 34 35 36 37 38 39 40

/* Config type for XML import/export conversions */
# define QEMU_CONFIG_FORMAT_ARGV "qemu-argv"

# define QEMU_DRIVE_HOST_PREFIX "drive-"
# define QEMU_VIRTIO_SERIAL_PREFIX "virtio-serial"
# define QEMU_FSDEV_HOST_PREFIX "fsdev-"

41 42 43 44 45 46 47
/* These are only defaults, they can be changed now in qemu.conf and
 * explicitely specified port is checked against these two (makes
 * sense to limit the values).
 *
 * This limitation is mentioned in qemu.conf, so bear in mind that the
 * configuration file should reflect any changes made to these values.
 */
48 49
# define QEMU_REMOTE_PORT_MIN  5900
# define QEMU_REMOTE_PORT_MAX  65535
50

51 52 53
# define QEMU_WEBSOCKET_PORT_MIN  5700
# define QEMU_WEBSOCKET_PORT_MAX  65535

54 55 56
# define QEMU_MIGRATION_PORT_MIN 49152
# define QEMU_MIGRATION_PORT_MAX 49215

57 58 59
typedef struct _qemuBuildCommandLineCallbacks qemuBuildCommandLineCallbacks;
typedef qemuBuildCommandLineCallbacks *qemuBuildCommandLineCallbacksPtr;
struct _qemuBuildCommandLineCallbacks {
60 61
    char * (*qemuGetSCSIDeviceSgName) (const char *sysfs_prefix,
                                       const char *adapter,
62 63 64 65 66 67
                                       unsigned int bus,
                                       unsigned int target,
                                       unsigned int unit);
};

extern qemuBuildCommandLineCallbacks buildCommandLineCallbacks;
68

69
virCommandPtr qemuBuildCommandLine(virConnectPtr conn,
70
                                   virQEMUDriverPtr driver,
71
                                   virDomainDefPtr def,
72
                                   virDomainChrSourceDefPtr monitor_chr,
73
                                   bool monitor_json,
74
                                   virQEMUCapsPtr qemuCaps,
75
                                   const char *migrateFrom,
76
                                   int migrateFd,
77
                                   virDomainSnapshotObjPtr current_snapshot,
78
                                   enum virNetDevVPortProfileOp vmop,
C
Cole Robinson 已提交
79 80
                                   qemuBuildCommandLineCallbacksPtr callbacks,
                                   bool forXMLToArgv)
81
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(11);
82

83 84 85 86 87 88
/* Generate '-device' string for chardev device */
int
qemuBuildChrDeviceStr(char **deviceStr,
                      virDomainDefPtr vmdef,
                      virDomainChrDefPtr chr,
                      virQEMUCapsPtr qemuCaps);
89

90 91
/* With vlan == -1, use netdev syntax, else old hostnet */
char * qemuBuildHostNetStr(virDomainNetDefPtr net,
92
                           virQEMUDriverPtr driver,
93 94
                           char type_sep,
                           int vlan,
95 96 97 98
                           char **tapfd,
                           int tapfdSize,
                           char **vhostfd,
                           int vhostfdSize);
99 100 101 102 103 104 105

/* Legacy, pre device support */
char * qemuBuildNicStr(virDomainNetDefPtr net,
                       const char *prefix,
                       int vlan);

/* Current, best practice */
106 107
char * qemuBuildNicDevStr(virDomainDefPtr def,
                          virDomainNetDefPtr net,
108
                          int vlan,
109
                          int bootindex,
110
                          int vhostfdSize,
111
                          virQEMUCapsPtr qemuCaps);
112 113

char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
114
                               virQEMUCapsPtr qemuCaps);
115 116

/* Both legacy & current support */
117 118
char *qemuBuildDriveStr(virConnectPtr conn,
                        virDomainDiskDefPtr disk,
119
                        bool bootable,
120
                        virQEMUCapsPtr qemuCaps);
121
char *qemuBuildFSStr(virDomainFSDefPtr fs,
122
                     virQEMUCapsPtr qemuCaps);
123 124

/* Current, best practice */
125 126
char * qemuBuildDriveDevStr(virDomainDefPtr def,
                            virDomainDiskDefPtr disk,
127
                            int bootindex,
128
                            virQEMUCapsPtr qemuCaps);
129 130
char * qemuBuildFSDevStr(virDomainDefPtr domainDef,
                         virDomainFSDefPtr fs,
131
                         virQEMUCapsPtr qemuCaps);
132
/* Current, best practice */
133 134
char * qemuBuildControllerDevStr(virDomainDefPtr domainDef,
                                 virDomainControllerDefPtr def,
135
                                 virQEMUCapsPtr qemuCaps,
136
                                 int *nusbcontroller);
137

138 139
char * qemuBuildWatchdogDevStr(virDomainDefPtr domainDef,
                               virDomainWatchdogDefPtr dev,
140
                               virQEMUCapsPtr qemuCaps);
141

142 143
char * qemuBuildMemballoonDevStr(virDomainDefPtr domainDef,
                                 virDomainMemballoonDefPtr dev,
144
                                 virQEMUCapsPtr qemuCaps);
145

146 147
char * qemuBuildUSBInputDevStr(virDomainDefPtr domainDef,
                               virDomainInputDefPtr dev,
148
                               virQEMUCapsPtr qemuCaps);
149

150 151
char * qemuBuildSoundDevStr(virDomainDefPtr domainDef,
                            virDomainSoundDefPtr sound,
152
                            virQEMUCapsPtr qemuCaps);
153 154 155 156

/* Legacy, pre device support */
char * qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev);
/* Current, best practice */
157 158
char * qemuBuildPCIHostdevDevStr(virDomainDefPtr def,
                                 virDomainHostdevDefPtr dev,
159
                                 const char *configfd,
160
                                 virQEMUCapsPtr qemuCaps);
161 162 163 164 165 166

int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);

/* Legacy, pre device support */
char * qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev);
/* Current, best practice */
167 168
char * qemuBuildUSBHostdevDevStr(virDomainDefPtr def,
                                 virDomainHostdevDefPtr dev,
169
                                 virQEMUCapsPtr qemuCaps);
170

171
char * qemuBuildSCSIHostdevDrvStr(virDomainHostdevDefPtr dev,
172 173 174
                                  virQEMUCapsPtr qemuCaps,
                                  qemuBuildCommandLineCallbacksPtr callbacks)
    ATTRIBUTE_NONNULL(3);
175 176 177 178
char * qemuBuildSCSIHostdevDevStr(virDomainDefPtr def,
                                  virDomainHostdevDefPtr dev,
                                  virQEMUCapsPtr qemuCaps);

179 180 181
char * qemuBuildHubDevStr(virDomainDefPtr def,
                          virDomainHubDefPtr dev,
                          virQEMUCapsPtr qemuCaps);
182 183
char * qemuBuildRedirdevDevStr(virDomainDefPtr def,
                               virDomainRedirdevDefPtr dev,
184
                               virQEMUCapsPtr qemuCaps);
185 186 187 188 189 190
char *qemuBuildNetworkDriveURI(int proto,
                               const char *src,
                               size_t nhosts,
                               virDomainDiskHostDefPtr hosts,
                               const char *username,
                               const char *secret);
191

192 193
int qemuNetworkIfaceConnect(virDomainDefPtr def,
                            virConnectPtr conn,
194
                            virQEMUDriverPtr driver,
195
                            virDomainNetDefPtr net,
196 197 198
                            virQEMUCapsPtr qemuCaps,
                            int *tapfd,
                            int *tapfdSize)
199
    ATTRIBUTE_NONNULL(2);
200

201
int qemuPhysIfaceConnect(virDomainDefPtr def,
202
                         virQEMUDriverPtr driver,
203
                         virDomainNetDefPtr net,
204
                         virQEMUCapsPtr qemuCaps,
205
                         enum virNetDevVPortProfileOp vmop);
206

207 208
int qemuOpenVhostNet(virDomainDefPtr def,
                     virDomainNetDefPtr net,
209
                     virQEMUCapsPtr qemuCaps,
210 211
                     int *vhostfd,
                     int *vhostfdSize);
212

213 214
int qemuNetworkPrepareDevices(virDomainDefPtr def);

215 216 217 218
/*
 * NB: def->name can be NULL upon return and the caller
 * *must* decide how to fill in a name in this case
 */
219
virDomainDefPtr qemuParseCommandLineString(virCapsPtr qemuCaps,
220
                                           virDomainXMLOptionPtr xmlopt,
221 222 223 224
                                           const char *args,
                                           char **pidfile,
                                           virDomainChrSourceDefPtr *monConfig,
                                           bool *monJSON);
225
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr qemuCaps,
226
                                        virDomainXMLOptionPtr xmlopt,
227
                                        pid_t pid,
228 229 230
                                        char **pidfile,
                                        virDomainChrSourceDefPtr *monConfig,
                                        bool *monJSON);
231

232
int qemuDomainAssignAddresses(virDomainDefPtr def,
233
                              virQEMUCapsPtr qemuCaps,
234 235
                              virDomainObjPtr obj)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
236
int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
237
                                      virQEMUCapsPtr qemuCaps);
238

239 240 241 242
void qemuDomainReleaseDeviceAddress(virDomainObjPtr vm,
                                    virDomainDeviceInfoPtr info,
                                    const char *devstr);

243 244 245 246 247 248 249 250
typedef enum {
   QEMU_PCI_CONNECT_HOTPLUGGABLE = 1 << 0,
   /* This bus supports hot-plug */
   QEMU_PCI_CONNECT_SINGLESLOT   = 1 << 1,
   /* This "bus" has only a single downstream slot/port */

   QEMU_PCI_CONNECT_TYPE_PCI     = 1 << 2,
   /* PCI devices can connect to this bus */
L
Laine Stump 已提交
251 252
   QEMU_PCI_CONNECT_TYPE_PCIE    = 1 << 3,
   /* PCI Express devices can connect to this bus */
253 254 255 256
   QEMU_PCI_CONNECT_TYPE_EITHER_IF_CONFIG = 1 << 4,
   /* PCI *and* PCIe devices allowed, if the address
    * was specified in the config by the user
    */
257 258 259 260 261 262
} qemuDomainPCIConnectFlags;

/* a combination of all bit that describe the type of connections
 * allowed, e.g. PCI, PCIe, switch
 */
# define QEMU_PCI_CONNECT_TYPES_MASK \
L
Laine Stump 已提交
263
   (QEMU_PCI_CONNECT_TYPE_PCI | QEMU_PCI_CONNECT_TYPE_PCIE)
264 265


266
int qemuDomainAssignPCIAddresses(virDomainDefPtr def,
267
                                 virQEMUCapsPtr qemuCaps,
268
                                 virDomainObjPtr obj);
269
qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
270 271
                                                         unsigned int nbuses,
                                                         bool dryRun);
272
int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs,
273 274
                                    virDevicePCIAddressPtr addr,
                                    qemuDomainPCIConnectFlags flags);
275
int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs,
276
                                    virDevicePCIAddressPtr addr,
277 278 279
                                    qemuDomainPCIConnectFlags flags,
                                    bool reserveEntireSlot,
                                    bool fromConfig);
280 281 282
int qemuDomainPCIAddressReserveNextSlot(qemuDomainPCIAddressSetPtr addrs,
                                        virDomainDeviceInfoPtr dev,
                                        qemuDomainPCIConnectFlags flags);
283 284 285
int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs,
                                   virDomainDeviceInfoPtr dev);
int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs,
286
                                    virDevicePCIAddressPtr addr);
287 288

void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs);
289
int  qemuAssignDevicePCISlots(virDomainDefPtr def,
290
                              virQEMUCapsPtr qemuCaps,
291
                              qemuDomainPCIAddressSetPtr addrs);
292

293 294 295 296
int qemuDomainCCWAddressAssign(virDomainDeviceInfoPtr dev, qemuDomainCCWAddressSetPtr addrs,
                               bool autoassign);
void qemuDomainCCWAddressSetFree(qemuDomainCCWAddressSetPtr addrs);

297
int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
298 299
int qemuDomainNetVLAN(virDomainNetDefPtr def);
int qemuAssignDeviceNetAlias(virDomainDefPtr def, virDomainNetDefPtr net, int idx);
300 301
int qemuAssignDeviceDiskAlias(virDomainDefPtr vmdef,
                              virDomainDiskDefPtr def,
302
                              virQEMUCapsPtr qemuCaps);
303
int qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr hostdev, int idx);
304
int qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller);
305
int qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, virDomainRedirdevDefPtr redirdev, int idx);
306 307 308
int qemuAssignDeviceChrAlias(virDomainDefPtr def,
                             virDomainChrDefPtr chr,
                             ssize_t idx);
309 310 311 312 313

int
qemuParseKeywords(const char *str,
                  char ***retkeywords,
                  char ***retvalues,
314
                  int *retnkeywords,
315 316
                  int allowEmptyValue);

317 318 319 320 321 322 323 324 325
int qemuGetDriveSourceString(int type,
                             const char *src,
                             int protocol,
                             size_t nhosts,
                             virDomainDiskHostDefPtr hosts,
                             const char *username,
                             const char *secret,
                             char **path);

326
#endif /* __QEMU_COMMAND_H__*/