network_conf.h 11.9 KB
Newer Older
1 2 3
/*
 * network_conf.h: network XML handling
 *
4
 * Copyright (C) 2006-2016 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
# include "networkcommon_conf.h"
43
# include "virobject.h"
M
Michal Privoznik 已提交
44
# include "virmacmap.h"
45

46
typedef enum {
47 48 49
    VIR_NETWORK_FORWARD_NONE   = 0,
    VIR_NETWORK_FORWARD_NAT,
    VIR_NETWORK_FORWARD_ROUTE,
50
    VIR_NETWORK_FORWARD_OPEN,
51 52 53 54
    VIR_NETWORK_FORWARD_BRIDGE,
    VIR_NETWORK_FORWARD_PRIVATE,
    VIR_NETWORK_FORWARD_VEPA,
    VIR_NETWORK_FORWARD_PASSTHROUGH,
55
    VIR_NETWORK_FORWARD_HOSTDEV,
56 57

    VIR_NETWORK_FORWARD_LAST,
58
} virNetworkForwardType;
59

60 61 62 63 64 65 66 67 68 69
typedef enum {
   VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_DEFAULT = 0,
   VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_KERNEL,
   VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LIBVIRT,

   VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LAST,
} virNetworkBridgeMACTableManagerType;

VIR_ENUM_DECL(virNetworkBridgeMACTableManager)

70
typedef enum {
71 72 73 74 75 76
    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,
77
} virNetworkForwardHostdevDeviceType;
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92
/* 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)

93 94 95 96
typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
struct _virNetworkDHCPHostDef {
    char *mac;
97
    char *id;
98
    char *name;
99
    virSocketAddr ip;
100 101
};

102 103 104
typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef;
typedef virNetworkDNSTxtDef *virNetworkDNSTxtDefPtr;
struct _virNetworkDNSTxtDef {
105 106 107 108
    char *name;
    char *value;
};

109 110 111
typedef struct _virNetworkDNSSrvDef virNetworkDNSSrvDef;
typedef virNetworkDNSSrvDef *virNetworkDNSSrvDefPtr;
struct _virNetworkDNSSrvDef {
112 113 114 115
    char *domain;
    char *service;
    char *protocol;
    char *target;
116 117 118
    unsigned int port;
    unsigned int priority;
    unsigned int weight;
119 120
};

121 122 123
typedef struct _virNetworkDNSHostDef virNetworkDNSHostDef;
typedef virNetworkDNSHostDef *virNetworkDNSHostDefPtr;
struct _virNetworkDNSHostDef {
124
    virSocketAddr ip;
125
    size_t nnames;
126
    char **names;
127
};
128

129

130 131 132
typedef struct _virNetworkDNSForwarder virNetworkDNSForwarder;
typedef virNetworkDNSForwarder *virNetworkDNSForwarderPtr;
struct _virNetworkDNSForwarder {
133 134
    virSocketAddr addr;
    char *domain;
135
};
136

137 138
typedef struct _virNetworkDNSDef virNetworkDNSDef;
typedef virNetworkDNSDef *virNetworkDNSDefPtr;
139
struct _virNetworkDNSDef {
140
    int enable;            /* enum virTristateBool */
J
Ján Tomko 已提交
141
    int forwardPlainNames; /* enum virTristateBool */
142 143 144 145 146 147
    size_t ntxts;
    virNetworkDNSTxtDefPtr txts;
    size_t nhosts;
    virNetworkDNSHostDefPtr hosts;
    size_t nsrvs;
    virNetworkDNSSrvDefPtr srvs;
148
    size_t nfwds;
149
    virNetworkDNSForwarderPtr forwarders;
150
};
151

152 153 154
typedef struct _virNetworkIPDef virNetworkIPDef;
typedef virNetworkIPDef *virNetworkIPDefPtr;
struct _virNetworkIPDef {
155 156 157 158 159
    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.
160
     * Use virNetworkIPDefPrefix/virNetworkIPDefNetmask rather
161 162 163 164 165 166
     * 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 */

167 168
    int localPTR; /* virTristateBool */

169
    size_t nranges;             /* Zero or more dhcp ranges */
170
    virSocketAddrRangePtr ranges;
171

172
    size_t nhosts;              /* Zero or more dhcp hosts */
173 174 175 176 177 178 179
    virNetworkDHCPHostDefPtr hosts;

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

180 181 182
typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef;
typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr;
struct _virNetworkForwardIfDef {
183 184
    int type;
    union {
185
        virPCIDeviceAddress pci; /*PCI Address of device */
186 187 188 189
        /* 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? */
190 191
};

192 193 194 195
typedef struct _virNetworkForwardPfDef virNetworkForwardPfDef;
typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
struct _virNetworkForwardPfDef {
    char *dev;      /* name of device */
196
    int connections; /* how many guest interfaces are connected to this device? */
197 198
};

199 200 201 202 203
typedef struct _virNetworkForwardDef virNetworkForwardDef;
typedef virNetworkForwardDef *virNetworkForwardDefPtr;
struct _virNetworkForwardDef {
    int type;     /* One of virNetworkForwardType constants */
    bool managed;  /* managed attribute for hostdev mode */
204
    int driverName; /* enum virNetworkForwardDriverNameType */
205 206 207 208 209 210 211 212 213

    /* 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;
214

215
    /* ranges for NAT */
216 217
    virSocketAddrRange addr;
    virPortRange port;
218 219
};

220 221 222 223 224
typedef struct _virPortGroupDef virPortGroupDef;
typedef virPortGroupDef *virPortGroupDefPtr;
struct _virPortGroupDef {
    char *name;
    bool isDefault;
225
    virNetDevVPortProfilePtr virtPortProfile;
226
    virNetDevBandwidthPtr bandwidth;
227
    virNetDevVlan vlan;
228
    int trustGuestRxFilters; /* enum virTristateBool */
229 230
};

231 232 233 234
typedef struct _virNetworkDef virNetworkDef;
typedef virNetworkDef *virNetworkDefPtr;
struct _virNetworkDef {
    unsigned char uuid[VIR_UUID_BUFLEN];
M
Matthias Bolte 已提交
235
    bool uuid_specified;
236
    char *name;
237
    int   connections; /* # of guest interfaces connected to this network */
238 239

    char *bridge;       /* Name of bridge device */
240
    int  macTableManager; /* enum virNetworkBridgeMACTableManager */
241
    char *domain;
242
    int domainLocalOnly; /* enum virTristateBool: yes disables dns forwarding */
243
    unsigned long delay;   /* Bridge forward delay (ms) */
244
    bool stp; /* Spanning tree protocol */
245
    unsigned int mtu; /* MTU for bridge, 0 means "default" i.e. unset in config */
246
    virMacAddr mac; /* mac address of bridge device */
247
    bool mac_specified;
248

249 250 251 252 253
    /* specified if ip6tables rules added
     * when no ipv6 gateway addresses specified.
     */
    bool ipv6nogw;

254
    virNetworkForwardDef forward;
255

256
    size_t nips;
257
    virNetworkIPDefPtr ips; /* ptr to array of IP addresses on this network */
258

259
    size_t nroutes;
260
    virNetDevIPRoutePtr *routes; /* ptr to array of static routes on this interface */
261

262
    virNetworkDNSDef dns;   /* dns related configuration */
263
    virNetDevVPortProfilePtr virtPortProfile;
264 265 266

    size_t nPortGroups;
    virPortGroupDefPtr portGroups;
267
    virNetDevBandwidthPtr bandwidth;
268
    virNetDevVlan vlan;
269
    int trustGuestRxFilters; /* enum virTristateBool */
270 271 272

    /* Application-specific custom metadata */
    xmlNodePtr metadata;
273 274
};

275
typedef enum {
276 277 278 279 280 281 282 283
    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
284
} virNetworkTaintFlags;
285

286
void virNetworkDefFree(virNetworkDefPtr def);
287

288 289 290 291
enum {
    VIR_NETWORK_OBJ_LIST_ADD_LIVE = (1 << 0),
    VIR_NETWORK_OBJ_LIST_ADD_CHECK_LIVE = (1 << 1),
};
292

J
John Ferlan 已提交
293 294
virNetworkDefPtr virNetworkDefCopy(virNetworkDefPtr def, unsigned int flags);
virNetworkDefPtr virNetworkDefParseXML(xmlXPathContextPtr ctxt);
295 296 297
virNetworkDefPtr virNetworkDefParseString(const char *xmlStr);
virNetworkDefPtr virNetworkDefParseFile(const char *filename);
virNetworkDefPtr virNetworkDefParseNode(xmlDocPtr xml,
298
                                        xmlNodePtr root);
E
Eric Blake 已提交
299
char *virNetworkDefFormat(const virNetworkDef *def, unsigned int flags);
300 301 302
int virNetworkDefFormatBuf(virBufferPtr buf,
                           const virNetworkDef *def,
                           unsigned int flags);
303

304
const char * virNetworkDefForwardIf(const virNetworkDef *def, size_t n);
305 306 307 308

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

309 310
virNetworkIPDefPtr
virNetworkDefGetIPByIndex(const virNetworkDef *def,
311
                          int family, size_t n);
312
virNetDevIPRoutePtr
313 314
virNetworkDefGetRouteByIndex(const virNetworkDef *def,
                             int family, size_t n);
315 316
int virNetworkIPDefPrefix(const virNetworkIPDef *def);
int virNetworkIPDefNetmask(const virNetworkIPDef *def,
317
                           virSocketAddrPtr netmask);
318

319
int virNetworkSaveXML(const char *configDir,
320 321 322
                      virNetworkDefPtr def,
                      const char *xml);

323
int virNetworkSaveConfig(const char *configDir,
324
                         virNetworkDefPtr def);
325

326
char *virNetworkConfigFile(const char *dir,
327 328
                           const char *name);

329 330
void virNetworkSetBridgeMacAddr(virNetworkDefPtr def);

M
Matthias Bolte 已提交
331 332
VIR_ENUM_DECL(virNetworkForward)

333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
# 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)

J
Ján Tomko 已提交
350 351 352 353 354 355 356 357 358
/* for testing */
int
virNetworkDefUpdateSection(virNetworkDefPtr def,
                           unsigned int command, /* virNetworkUpdateCommand */
                           unsigned int section, /* virNetworkUpdateSection */
                           int parentIndex,
                           const char *xml,
                           unsigned int flags);  /* virNetworkUpdateFlags */

359
VIR_ENUM_DECL(virNetworkTaint)
360
#endif /* __NETWORK_CONF_H__ */