network_conf.h 9.7 KB
Newer Older
1 2 3
/*
 * network_conf.h: network XML handling
 *
4
 * Copyright (C) 2006-2008, 2012 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
O
Osier Yang 已提交
18 19
 * License along with this library;  If not, see
 * <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 34
# include "internal.h"
# include "threads.h"
35 36 37
# include "virsocketaddr.h"
# include "virnetdevbandwidth.h"
# include "virnetdevvportprofile.h"
38
# include "virnetdevvlan.h"
39
# include "virmacaddr.h"
40 41 42 43 44

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

    VIR_NETWORK_FORWARD_LAST,
};

typedef struct _virNetworkDHCPRangeDef virNetworkDHCPRangeDef;
typedef virNetworkDHCPRangeDef *virNetworkDHCPRangeDefPtr;
struct _virNetworkDHCPRangeDef {
56 57
    virSocketAddr start;
    virSocketAddr end;
58 59
};

60 61 62 63 64
typedef struct _virNetworkDHCPHostDef virNetworkDHCPHostDef;
typedef virNetworkDHCPHostDef *virNetworkDHCPHostDefPtr;
struct _virNetworkDHCPHostDef {
    char *mac;
    char *name;
65
    virSocketAddr ip;
66 67
};

68 69 70 71 72 73 74
typedef struct _virNetworkDNSTxtRecordsDef virNetworkDNSTxtRecordsDef;
typedef virNetworkDNSTxtRecordsDef *virNetworkDNSTxtRecordsDefPtr;
struct _virNetworkDNSTxtRecordsDef {
    char *name;
    char *value;
};

75 76 77 78 79 80 81 82 83 84 85 86
typedef struct _virNetworkDNSSrvRecordsDef virNetworkDNSSrvRecordsDef;
typedef virNetworkDNSSrvRecordsDef *virNetworkDNSSrvRecordsDefPtr;
struct _virNetworkDNSSrvRecordsDef {
    char *domain;
    char *service;
    char *protocol;
    char *target;
    int port;
    int priority;
    int weight;
};

87
struct _virNetworkDNSHostsDef {
88 89 90
    virSocketAddr ip;
    int nnames;
    char **names;
91
};
92

93
typedef struct _virNetworkDNSHostsDef *virNetworkDNSHostsDefPtr;
94

95
struct _virNetworkDNSDef {
96 97
    unsigned int ntxtrecords;
    virNetworkDNSTxtRecordsDefPtr txtrecords;
98 99
    unsigned int nhosts;
    virNetworkDNSHostsDefPtr hosts;
100 101
    unsigned int nsrvrecords;
    virNetworkDNSSrvRecordsDefPtr srvrecords;
102
};
103

104
typedef struct _virNetworkDNSDef *virNetworkDNSDefPtr;
105

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
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 */

    unsigned int nranges;        /* Zero or more dhcp ranges */
    virNetworkDHCPRangeDefPtr ranges;

    unsigned int nhosts;         /* Zero or more dhcp hosts */
    virNetworkDHCPHostDefPtr hosts;

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

132 133 134 135
typedef struct _virNetworkForwardIfDef virNetworkForwardIfDef;
typedef virNetworkForwardIfDef *virNetworkForwardIfDefPtr;
struct _virNetworkForwardIfDef {
    char *dev;      /* name of device */
136
    int   connections; /* how many guest interfaces are connected to this device? */
137 138
};

139 140 141 142 143 144
typedef struct _virNetworkForwardPfDef virNetworkForwardPfDef;
typedef virNetworkForwardPfDef *virNetworkForwardPfDefPtr;
struct _virNetworkForwardPfDef {
    char *dev;      /* name of device */
};

145 146 147 148 149
typedef struct _virPortGroupDef virPortGroupDef;
typedef virPortGroupDef *virPortGroupDefPtr;
struct _virPortGroupDef {
    char *name;
    bool isDefault;
150
    virNetDevVPortProfilePtr virtPortProfile;
151
    virNetDevBandwidthPtr bandwidth;
152
    virNetDevVlan vlan;
153 154
};

155 156 157 158
typedef struct _virNetworkDef virNetworkDef;
typedef virNetworkDef *virNetworkDefPtr;
struct _virNetworkDef {
    unsigned char uuid[VIR_UUID_BUFLEN];
M
Matthias Bolte 已提交
159
    bool uuid_specified;
160
    char *name;
161
    int   connections; /* # of guest interfaces connected to this network */
162 163

    char *bridge;       /* Name of bridge device */
164
    char *domain;
165
    unsigned long delay;   /* Bridge forward delay (ms) */
166
    unsigned int stp :1; /* Spanning tree protocol */
167
    virMacAddr mac; /* mac address of bridge device */
168
    bool mac_specified;
169 170

    int forwardType;    /* One of virNetworkForwardType constants */
171 172 173 174

    /* If there are multiple forward devices (i.e. a pool of
     * interfaces), they will be listed here.
     */
175
    size_t nForwardPfs;
176
    virNetworkForwardPfDefPtr forwardPfs;
177

178 179
    size_t nForwardIfs;
    virNetworkForwardIfDefPtr forwardIfs;
180

181 182
    size_t nips;
    virNetworkIpDefPtr ips; /* ptr to array of IP addresses on this network */
183 184

    virNetworkDNSDefPtr dns; /* ptr to dns related configuration */
185
    virNetDevVPortProfilePtr virtPortProfile;
186 187 188

    size_t nPortGroups;
    virPortGroupDefPtr portGroups;
189
    virNetDevBandwidthPtr bandwidth;
190
    virNetDevVlan vlan;
191 192 193 194 195
};

typedef struct _virNetworkObj virNetworkObj;
typedef virNetworkObj *virNetworkObjPtr;
struct _virNetworkObj {
196
    virMutex lock;
197

198
    pid_t dnsmasqPid;
199
    pid_t radvdPid;
200 201 202 203 204 205
    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 */
206
};
207

208 209 210 211 212
typedef struct _virNetworkObjList virNetworkObjList;
typedef virNetworkObjList *virNetworkObjListPtr;
struct _virNetworkObjList {
    unsigned int count;
    virNetworkObjPtr *objs;
213 214 215
};

static inline int
D
Daniel P. Berrange 已提交
216
virNetworkObjIsActive(const virNetworkObjPtr net)
217 218 219 220
{
    return net->active;
}

221
virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
222
                                      const unsigned char *uuid);
223
virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets,
224 225 226 227 228
                                      const char *name);


void virNetworkDefFree(virNetworkDefPtr def);
void virNetworkObjFree(virNetworkObjPtr net);
229
void virNetworkObjListFree(virNetworkObjListPtr vms);
230

231
virNetworkObjPtr virNetworkAssignDef(virNetworkObjListPtr nets,
232
                                     const virNetworkDefPtr def);
233
void virNetworkRemoveInactive(virNetworkObjListPtr nets,
234 235
                              const virNetworkObjPtr net);

236 237 238
virNetworkDefPtr virNetworkDefParseString(const char *xmlStr);
virNetworkDefPtr virNetworkDefParseFile(const char *filename);
virNetworkDefPtr virNetworkDefParseNode(xmlDocPtr xml,
239 240
                                        xmlNodePtr root);

241
char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags);
242

243 244 245 246 247 248 249 250 251 252
static inline const char *
virNetworkDefForwardIf(const virNetworkDefPtr def, size_t n)
{
    return ((def->forwardIfs && (def->nForwardIfs > n))
            ? def->forwardIfs[n].dev : NULL);
}

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

253 254 255 256 257 258
virNetworkIpDefPtr
virNetworkDefGetIpByIndex(const virNetworkDefPtr def,
                          int family, size_t n);
int virNetworkIpDefPrefix(const virNetworkIpDefPtr def);
int virNetworkIpDefNetmask(const virNetworkIpDefPtr def,
                           virSocketAddrPtr netmask);
259

260
int virNetworkSaveXML(const char *configDir,
261 262 263
                      virNetworkDefPtr def,
                      const char *xml);

264
int virNetworkSaveConfig(const char *configDir,
265
                         virNetworkDefPtr def);
266

267
virNetworkObjPtr virNetworkLoadConfig(virNetworkObjListPtr nets,
268 269 270 271
                                      const char *configDir,
                                      const char *autostartDir,
                                      const char *file);

272
int virNetworkLoadAllConfigs(virNetworkObjListPtr nets,
273 274 275
                             const char *configDir,
                             const char *autostartDir);

276
int virNetworkDeleteConfig(const char *configDir,
277
                           const char *autostartDir,
278 279
                           virNetworkObjPtr net);

280
char *virNetworkConfigFile(const char *dir,
281 282
                           const char *name);

283 284 285 286
int virNetworkBridgeInUse(const virNetworkObjListPtr nets,
                          const char *bridge,
                          const char *skipname);

287
char *virNetworkAllocateBridge(const virNetworkObjListPtr nets,
288
                               const char *template);
289

290
int virNetworkSetBridgeName(const virNetworkObjListPtr nets,
291 292
                            virNetworkDefPtr def,
                            int check_collision);
293

294 295
void virNetworkSetBridgeMacAddr(virNetworkDefPtr def);

296 297 298 299
int virNetworkObjIsDuplicate(virNetworkObjListPtr doms,
                             virNetworkDefPtr def,
                             unsigned int check_active);

D
Daniel P. Berrange 已提交
300 301 302
void virNetworkObjLock(virNetworkObjPtr obj);
void virNetworkObjUnlock(virNetworkObjPtr obj);

M
Matthias Bolte 已提交
303 304
VIR_ENUM_DECL(virNetworkForward)

305
#endif /* __NETWORK_CONF_H__ */