network_conf.h 16.4 KB
Newer Older
1 2 3
/*
 * network_conf.h: network XML handling
 *
4
 * Copyright (C) 2006-2014 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006-2008 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
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#ifndef __NETWORK_CONF_H__
25
# define __NETWORK_CONF_H__
26

27
# define DNS_RECORD_LENGTH_SRV  (512 - 30)  /* Limit minus overhead as mentioned in RFC-2782 */
28

29 30 31
# include <libxml/parser.h>
# include <libxml/tree.h>
# include <libxml/xpath.h>
32

33
# include "internal.h"
34
# include "virthread.h"
35 36 37
# include "virsocketaddr.h"
# include "virnetdevbandwidth.h"
# include "virnetdevvportprofile.h"
38
# include "virnetdevvlan.h"
39
# include "virmacaddr.h"
40
# include "device_conf.h"
41
# include "virbitmap.h"
42 43 44 45 46

enum virNetworkForwardType {
    VIR_NETWORK_FORWARD_NONE   = 0,
    VIR_NETWORK_FORWARD_NAT,
    VIR_NETWORK_FORWARD_ROUTE,
47 48 49 50
    VIR_NETWORK_FORWARD_BRIDGE,
    VIR_NETWORK_FORWARD_PRIVATE,
    VIR_NETWORK_FORWARD_VEPA,
    VIR_NETWORK_FORWARD_PASSTHROUGH,
51
    VIR_NETWORK_FORWARD_HOSTDEV,
52 53 54 55

    VIR_NETWORK_FORWARD_LAST,
};

56 57 58 59 60 61 62 63 64
enum virNetworkForwardHostdevDeviceType {
    VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NONE = 0,
    VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_PCI,
    VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV,
    /* USB Device to be added here when supported */

    VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
};

65 66 67 68 69 70 71 72 73 74 75 76 77 78
/* The backend driver used for devices from the pool. Currently used
 * only for PCI devices (vfio vs. kvm), but could be used for other
 * device types in the future.
 */
typedef enum {
    VIR_NETWORK_FORWARD_DRIVER_NAME_DEFAULT, /* kvm now, could change */
    VIR_NETWORK_FORWARD_DRIVER_NAME_KVM,    /* force legacy kvm style */
    VIR_NETWORK_FORWARD_DRIVER_NAME_VFIO,   /* force vfio */

    VIR_NETWORK_FORWARD_DRIVER_NAME_LAST
} virNetworkForwardDriverNameType;

VIR_ENUM_DECL(virNetworkForwardDriverName)

79 80 81 82
typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
struct _virNetworkDHCPHostDef {
    char *mac;
83
    char *id;
84
    char *name;
85
    virSocketAddr ip;
86 87
};

88 89 90
typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef;
typedef virNetworkDNSTxtDef *virNetworkDNSTxtDefPtr;
struct _virNetworkDNSTxtDef {
91 92 93 94
    char *name;
    char *value;
};

95 96 97
typedef struct _virNetworkDNSSrvDef virNetworkDNSSrvDef;
typedef virNetworkDNSSrvDef *virNetworkDNSSrvDefPtr;
struct _virNetworkDNSSrvDef {
98 99 100 101
    char *domain;
    char *service;
    char *protocol;
    char *target;
102 103 104
    unsigned int port;
    unsigned int priority;
    unsigned int weight;
105 106
};

107 108 109
typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef;
typedef virNetworkDNSHostDef *virNetworkDNSHostDefPtr;
struct _virNetworkDNSHostDef {
110
    virSocketAddr ip;
111
    size_t nnames;
112
    char **names;
113
};
114

115 116 117 118 119 120 121 122 123 124 125 126 127
/* If forwardPlainNames is 0 (default), that is equivalent to "yes",
 * but won't be encoded in newly formatted XML.
 */
typedef enum {
    VIR_NETWORK_DNS_FORWARD_PLAIN_NAMES_DEFAULT = 0, /* silent "yes" */
    VIR_NETWORK_DNS_FORWARD_PLAIN_NAMES_YES,
    VIR_NETWORK_DNS_FORWARD_PLAIN_NAMES_NO,

    VIR_NETWORK_DNS_FORWARD_PLAIN_NAMES_LAST,
} virNetworkDNSForwardPlainNamesType;

VIR_ENUM_DECL(virNetworkDNSForwardPlainNames)

128 129
typedef struct _virNetworkDNSDef virNetworkDNSDef;
typedef virNetworkDNSDef *virNetworkDNSDefPtr;
130
struct _virNetworkDNSDef {
131
    int forwardPlainNames; /* enum virNetworkDNSForwardPlainNamesType */
132 133 134 135 136 137
    size_t ntxts;
    virNetworkDNSTxtDefPtr txts;
    size_t nhosts;
    virNetworkDNSHostDefPtr hosts;
    size_t nsrvs;
    virNetworkDNSSrvDefPtr srvs;
138 139
    size_t nfwds;
    char **forwarders;
140
};
141

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
typedef struct _virNetworkIpDef virNetworkIpDef;
typedef virNetworkIpDef *virNetworkIpDefPtr;
struct _virNetworkIpDef {
    char *family;               /* ipv4 or ipv6 - default is ipv4 */
    virSocketAddr address;      /* Bridge IP address */

    /* One or the other of the following two will be used for a given
     * IP address, but never both. The parser guarantees this.
     * Use virNetworkIpDefPrefix/virNetworkIpDefNetmask rather
     * than accessing the data directly - these utility functions
     * will convert one into the other as necessary.
     */
    unsigned int prefix;        /* ipv6 - only prefix allowed */
    virSocketAddr netmask;      /* ipv4 - either netmask or prefix specified */

157
    size_t nranges;             /* Zero or more dhcp ranges */
158
    virSocketAddrRangePtr ranges;
159

160
    size_t nhosts;              /* Zero or more dhcp hosts */
161 162 163 164 165 166 167
    virNetworkDHCPHostDefPtr hosts;

    char *tftproot;
    char *bootfile;
    virSocketAddr bootserver;
   };

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
typedef struct _virNetworkRouteDef virNetworkRouteDef;
typedef virNetworkRouteDef *virNetworkRouteDefPtr;
struct _virNetworkRouteDef {
    char *family;               /* ipv4 or ipv6 - default is ipv4 */
    virSocketAddr address;      /* Routed Network IP address */

    /* One or the other of the following two will be used for a given
     * Network address, but never both. The parser guarantees this.
     * The virSocketAddrGetIpPrefix() can be used to get a
     * valid prefix.
     */
    virSocketAddr netmask;      /* ipv4 - either netmask or prefix specified */
    unsigned int prefix;        /* ipv6 - only prefix allowed */
    bool has_prefix;            /* prefix= was specified */
    unsigned int metric;        /* value for metric (defaults to 1) */
    bool has_metric;            /* metric= was specified */
    virSocketAddr gateway;      /* gateway IP address for ip-route */
   };

187 188 189
typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef;
typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr;
struct _virNetworkForwardIfDef {
190 191 192 193 194 195 196
    int type;
    union {
        virDevicePCIAddress pci; /*PCI Address of device */
        /* when USB devices are supported a new variable to be added here */
        char *dev;      /* name of device */
    }device;
    int connections; /* how many guest interfaces are connected to this device? */
197 198
};

199 200 201 202
typedef struct _virNetworkForwardPfDef virNetworkForwardPfDef;
typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
struct _virNetworkForwardPfDef {
    char *dev;      /* name of device */
203
    int connections; /* how many guest interfaces are connected to this device? */
204 205
};

206 207 208 209 210
typedef struct _virNetworkForwardDef virNetworkForwardDef;
typedef virNetworkForwardDef *virNetworkForwardDefPtr;
struct _virNetworkForwardDef {
    int type;     /* One of virNetworkForwardType constants */
    bool managed;  /* managed attribute for hostdev mode */
211
    int driverName; /* enum virNetworkForwardDriverNameType */
212 213 214 215 216 217 218 219 220

    /* If there are multiple forward devices (i.e. a pool of
     * interfaces), they will be listed here.
     */
    size_t npfs;
    virNetworkForwardPfDefPtr pfs;

    size_t nifs;
    virNetworkForwardIfDefPtr ifs;
221

222
    /* ranges for NAT */
223 224
    virSocketAddrRange addr;
    virPortRange port;
225 226
};

227 228 229 230 231
typedef struct _virPortGroupDef virPortGroupDef;
typedef virPortGroupDef *virPortGroupDefPtr;
struct _virPortGroupDef {
    char *name;
    bool isDefault;
232
    virNetDevVPortProfilePtr virtPortProfile;
233
    virNetDevBandwidthPtr bandwidth;
234
    virNetDevVlan vlan;
235 236
};

237 238 239 240
typedef struct _virNetworkDef virNetworkDef;
typedef virNetworkDef *virNetworkDefPtr;
struct _virNetworkDef {
    unsigned char uuid[VIR_UUID_BUFLEN];
M
Matthias Bolte 已提交
241
    bool uuid_specified;
242
    char *name;
243
    int   connections; /* # of guest interfaces connected to this network */
244 245

    char *bridge;       /* Name of bridge device */
246
    char *domain;
247
    unsigned long delay;   /* Bridge forward delay (ms) */
248
    bool stp; /* Spanning tree protocol */
249
    virMacAddr mac; /* mac address of bridge device */
250
    bool mac_specified;
251

252 253 254 255 256
    /* specified if ip6tables rules added
     * when no ipv6 gateway addresses specified.
     */
    bool ipv6nogw;

257
    virNetworkForwardDef forward;
258

259 260
    size_t nips;
    virNetworkIpDefPtr ips; /* ptr to array of IP addresses on this network */
261

262 263 264
    size_t nroutes;
    virNetworkRouteDefPtr routes; /* ptr to array of static routes on this interface */

265
    virNetworkDNSDef dns;   /* dns related configuration */
266
    virNetDevVPortProfilePtr virtPortProfile;
267 268 269

    size_t nPortGroups;
    virPortGroupDefPtr portGroups;
270
    virNetDevBandwidthPtr bandwidth;
271
    virNetDevVlan vlan;
272 273 274 275 276
};

typedef struct _virNetworkObj virNetworkObj;
typedef virNetworkObj *virNetworkObjPtr;
struct _virNetworkObj {
277
    virMutex lock;
278

279
    pid_t dnsmasqPid;
280
    pid_t radvdPid;
281 282 283 284 285 286
    unsigned int active : 1;
    unsigned int autostart : 1;
    unsigned int persistent : 1;

    virNetworkDefPtr def; /* The current definition */
    virNetworkDefPtr newDef; /* New definition to activate at shutdown */
287 288 289

    virBitmapPtr class_id; /* bitmap of class IDs for QoS */
    unsigned long long floor_sum; /* sum of all 'floor'-s of attached NICs */
290 291

    unsigned int taint;
292
};
293

294 295 296
typedef struct _virNetworkObjList virNetworkObjList;
typedef virNetworkObjList *virNetworkObjListPtr;
struct _virNetworkObjList {
297
    size_t count;
298
    virNetworkObjPtr *objs;
299 300
};

301 302 303 304 305 306 307 308 309 310 311
enum virNetworkTaintFlags {
    VIR_NETWORK_TAINT_HOOK,                 /* Hook script was executed over
                                               network. We can't guarantee
                                               connectivity or other settings
                                               as the script may have played
                                               with iptables, tc, you name it.
                                             */

    VIR_NETWORK_TAINT_LAST
};

312
static inline int
E
Eric Blake 已提交
313
virNetworkObjIsActive(const virNetworkObj *net)
314 315 316 317
{
    return net->active;
}

318 319 320
bool virNetworkObjTaint(virNetworkObjPtr obj,
                        enum virNetworkTaintFlags taint);

E
Eric Blake 已提交
321
virNetworkObjPtr virNetworkFindByUUID(virNetworkObjListPtr nets,
322
                                      const unsigned char *uuid);
E
Eric Blake 已提交
323
virNetworkObjPtr virNetworkFindByName(virNetworkObjListPtr nets,
324 325 326 327 328
                                      const char *name);


void virNetworkDefFree(virNetworkDefPtr def);
void virNetworkObjFree(virNetworkObjPtr net);
329
void virNetworkObjListFree(virNetworkObjListPtr vms);
330

331 332 333 334

typedef bool (*virNetworkObjListFilter)(virConnectPtr conn,
                                        virNetworkDefPtr def);

335
virNetworkObjPtr virNetworkAssignDef(virNetworkObjListPtr nets,
E
Eric Blake 已提交
336
                                     virNetworkDefPtr def,
337 338
                                     bool live);
int virNetworkObjAssignDef(virNetworkObjPtr network,
E
Eric Blake 已提交
339
                           virNetworkDefPtr def,
340 341
                           bool live);
int virNetworkObjSetDefTransient(virNetworkObjPtr network, bool live);
342
void virNetworkObjUnsetDefTransient(virNetworkObjPtr network);
343 344 345 346 347 348
virNetworkDefPtr virNetworkObjGetPersistentDef(virNetworkObjPtr network);
int virNetworkObjReplacePersistentDef(virNetworkObjPtr network,
                                      virNetworkDefPtr def);
virNetworkDefPtr virNetworkDefCopy(virNetworkDefPtr def, unsigned int flags);
int virNetworkConfigChangeSetup(virNetworkObjPtr dom, unsigned int flags);

349
void virNetworkRemoveInactive(virNetworkObjListPtr nets,
E
Eric Blake 已提交
350
                              virNetworkObjPtr net);
351

352 353 354
virNetworkDefPtr virNetworkDefParseString(const char *xmlStr);
virNetworkDefPtr virNetworkDefParseFile(const char *filename);
virNetworkDefPtr virNetworkDefParseNode(xmlDocPtr xml,
355
                                        xmlNodePtr root);
E
Eric Blake 已提交
356
char *virNetworkDefFormat(const virNetworkDef *def, unsigned int flags);
357 358 359
int virNetworkDefFormatBuf(virBufferPtr buf,
                           const virNetworkDef *def,
                           unsigned int flags);
360

361
static inline const char *
E
Eric Blake 已提交
362
virNetworkDefForwardIf(const virNetworkDef *def, size_t n)
363
{
364 365 366
    return ((def->forward.ifs && (def->forward.nifs > n) &&
             def->forward.ifs[n].type == VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NETDEV)
            ? def->forward.ifs[n].device.dev : NULL);
367 368 369 370 371
}

virPortGroupDefPtr virPortGroupFindByName(virNetworkDefPtr net,
                                          const char *portgroup);

372
virNetworkIpDefPtr
E
Eric Blake 已提交
373
virNetworkDefGetIpByIndex(const virNetworkDef *def,
374
                          int family, size_t n);
E
Eric Blake 已提交
375 376
int virNetworkIpDefPrefix(const virNetworkIpDef *def);
int virNetworkIpDefNetmask(const virNetworkIpDef *def,
377
                           virSocketAddrPtr netmask);
378

379
int virNetworkSaveXML(const char *configDir,
380 381 382
                      virNetworkDefPtr def,
                      const char *xml);

383
int virNetworkSaveConfig(const char *configDir,
384
                         virNetworkDefPtr def);
385

386 387 388
int virNetworkSaveStatus(const char *statusDir,
                         virNetworkObjPtr net) ATTRIBUTE_RETURN_CHECK;

389
virNetworkObjPtr virNetworkLoadConfig(virNetworkObjListPtr nets,
390 391 392 393
                                      const char *configDir,
                                      const char *autostartDir,
                                      const char *file);

394 395 396 397
virNetworkObjPtr virNetworkLoadState(virNetworkObjListPtr nets,
                                     const char *stateDir,
                                     const char *name);

398
int virNetworkLoadAllConfigs(virNetworkObjListPtr nets,
399 400 401
                             const char *configDir,
                             const char *autostartDir);

402 403 404
int virNetworkLoadAllState(virNetworkObjListPtr nets,
                           const char *stateDir);

405
int virNetworkDeleteConfig(const char *configDir,
406
                           const char *autostartDir,
407 408
                           virNetworkObjPtr net);

409
char *virNetworkConfigFile(const char *dir,
410 411
                           const char *name);

E
Eric Blake 已提交
412
int virNetworkBridgeInUse(virNetworkObjListPtr nets,
413 414 415
                          const char *bridge,
                          const char *skipname);

E
Eric Blake 已提交
416
char *virNetworkAllocateBridge(virNetworkObjListPtr nets,
417
                               const char *template);
418

E
Eric Blake 已提交
419
int virNetworkSetBridgeName(virNetworkObjListPtr nets,
420 421
                            virNetworkDefPtr def,
                            int check_collision);
422

423 424
void virNetworkSetBridgeMacAddr(virNetworkDefPtr def);

425 426 427 428 429 430 431 432
int
virNetworkObjUpdate(virNetworkObjPtr obj,
                    unsigned int command, /* virNetworkUpdateCommand */
                    unsigned int section, /* virNetworkUpdateSection */
                    int parentIndex,
                    const char *xml,
                    unsigned int flags);  /* virNetworkUpdateFlags */

433 434
int virNetworkObjIsDuplicate(virNetworkObjListPtr doms,
                             virNetworkDefPtr def,
435
                             bool check_active);
436

D
Daniel P. Berrange 已提交
437 438 439
void virNetworkObjLock(virNetworkObjPtr obj);
void virNetworkObjUnlock(virNetworkObjPtr obj);

M
Matthias Bolte 已提交
440 441
VIR_ENUM_DECL(virNetworkForward)

442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
# define VIR_CONNECT_LIST_NETWORKS_FILTERS_ACTIVE   \
                (VIR_CONNECT_LIST_NETWORKS_ACTIVE | \
                 VIR_CONNECT_LIST_NETWORKS_INACTIVE)

# define VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT   \
                (VIR_CONNECT_LIST_NETWORKS_PERSISTENT | \
                 VIR_CONNECT_LIST_NETWORKS_TRANSIENT)

# define VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART    \
                (VIR_CONNECT_LIST_NETWORKS_AUTOSTART |  \
                 VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART)

# define VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL                  \
                (VIR_CONNECT_LIST_NETWORKS_FILTERS_ACTIVE     | \
                 VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \
                 VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART)

459 460 461 462 463
int virNetworkObjListExport(virConnectPtr conn,
                            virNetworkObjList netobjs,
                            virNetworkPtr **nets,
                            virNetworkObjListFilter filter,
                            unsigned int flags);
464

J
Ján Tomko 已提交
465 466 467 468 469 470 471 472 473
/* for testing */
int
virNetworkDefUpdateSection(virNetworkDefPtr def,
                           unsigned int command, /* virNetworkUpdateCommand */
                           unsigned int section, /* virNetworkUpdateSection */
                           int parentIndex,
                           const char *xml,
                           unsigned int flags);  /* virNetworkUpdateFlags */

474
VIR_ENUM_DECL(virNetworkTaint)
475
#endif /* __NETWORK_CONF_H__ */