提交 e2ed67a8 编写于 作者: M Michal Privoznik 提交者: Daniel Veillard

bandwidth: Add parsing and free functions

These functions parse given XML node and return pointer to the
output. Unknown elements are silently ignored. Attributes must
be integer and must fit in unsigned long long.

Free function frees elements of virBandwidth structure.
上级 73731882
...@@ -84,6 +84,7 @@ useless_free_options = \ ...@@ -84,6 +84,7 @@ useless_free_options = \
--name=qemuMigrationCookieFree \ --name=qemuMigrationCookieFree \
--name=qemuMigrationCookieGraphicsFree \ --name=qemuMigrationCookieGraphicsFree \
--name=sexpr_free \ --name=sexpr_free \
--name=virBandwidthDefFree \
--name=virBitmapFree \ --name=virBitmapFree \
--name=virCPUDefFree \ --name=virCPUDefFree \
--name=virCapabilitiesFree \ --name=virCapabilitiesFree \
......
...@@ -810,6 +810,8 @@ void virDomainNetDefFree(virDomainNetDefPtr def) ...@@ -810,6 +810,8 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
VIR_FREE(def->filter); VIR_FREE(def->filter);
virNWFilterHashTableFree(def->filterparams); virNWFilterHashTableFree(def->filterparams);
virBandwidthDefFree(def->bandwidth);
VIR_FREE(def); VIR_FREE(def);
} }
...@@ -2823,6 +2825,9 @@ virDomainNetDefParseXML(virCapsPtr caps, ...@@ -2823,6 +2825,9 @@ virDomainNetDefParseXML(virCapsPtr caps,
xmlStrEqual(cur->name, BAD_CAST "actual")) { xmlStrEqual(cur->name, BAD_CAST "actual")) {
if (virDomainActualNetDefParseXML(cur, ctxt, &actual) < 0) if (virDomainActualNetDefParseXML(cur, ctxt, &actual) < 0)
goto error; goto error;
} else if (xmlStrEqual(cur->name, BAD_CAST "bandwidth")) {
if (!(def->bandwidth = virBandwidthDefParseNode(cur)))
goto error;
} }
} }
cur = cur->next; cur = cur->next;
......
...@@ -425,6 +425,7 @@ struct _virDomainNetDef { ...@@ -425,6 +425,7 @@ struct _virDomainNetDef {
virDomainDeviceInfo info; virDomainDeviceInfo info;
char *filter; char *filter;
virNWFilterHashTablePtr filterparams; virNWFilterHashTablePtr filterparams;
virBandwidthPtr bandwidth;
}; };
enum virDomainChrDeviceType { enum virDomainChrDeviceType {
......
...@@ -167,6 +167,8 @@ void virNetworkDefFree(virNetworkDefPtr def) ...@@ -167,6 +167,8 @@ void virNetworkDefFree(virNetworkDefPtr def)
virNetworkDNSDefFree(def->dns); virNetworkDNSDefFree(def->dns);
virBandwidthDefFree(def->bandwidth);
VIR_FREE(def); VIR_FREE(def);
} }
...@@ -814,6 +816,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) ...@@ -814,6 +816,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
int nIps, nPortGroups, nForwardIfs; int nIps, nPortGroups, nForwardIfs;
char *forwardDev = NULL; char *forwardDev = NULL;
xmlNodePtr save = ctxt->node; xmlNodePtr save = ctxt->node;
xmlNodePtr bandwidthNode = NULL;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(); virReportOOMError();
...@@ -848,6 +851,10 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) ...@@ -848,6 +851,10 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
/* Parse network domain information */ /* Parse network domain information */
def->domain = virXPathString("string(./domain[1]/@name)", ctxt); def->domain = virXPathString("string(./domain[1]/@name)", ctxt);
if ((bandwidthNode = virXPathNode("./bandwidth", ctxt)) != NULL &&
(def->bandwidth = virBandwidthDefParseNode(bandwidthNode)) == NULL)
goto error;
/* Parse bridge information */ /* Parse bridge information */
def->bridge = virXPathString("string(./bridge[1]/@name)", ctxt); def->bridge = virXPathString("string(./bridge[1]/@name)", ctxt);
stp = virXPathString("string(./bridge[1]/@stp)", ctxt); stp = virXPathString("string(./bridge[1]/@stp)", ctxt);
......
...@@ -154,6 +154,7 @@ struct _virNetworkDef { ...@@ -154,6 +154,7 @@ struct _virNetworkDef {
size_t nPortGroups; size_t nPortGroups;
virPortGroupDefPtr portGroups; virPortGroupDefPtr portGroups;
virBandwidthPtr bandwidth;
}; };
typedef struct _virNetworkObj virNetworkObj; typedef struct _virNetworkObj virNetworkObj;
......
...@@ -710,6 +710,8 @@ nlComm; ...@@ -710,6 +710,8 @@ nlComm;
# network.h # network.h
virBandwidthDefFree;
virBandwidthDefParseNode;
virSocketAddrBroadcast; virSocketAddrBroadcast;
virSocketAddrBroadcastByPrefix; virSocketAddrBroadcastByPrefix;
virSocketAddrIsNetmask; virSocketAddrIsNetmask;
......
...@@ -883,3 +883,150 @@ virVirtualPortProfileFormat(virBufferPtr buf, ...@@ -883,3 +883,150 @@ virVirtualPortProfileFormat(virBufferPtr buf,
virBufferAsprintf(buf, "%s</virtualport>\n", indent); virBufferAsprintf(buf, "%s</virtualport>\n", indent);
} }
static int
virBandwidthParseChildDefNode(xmlNodePtr node, virRatePtr rate)
{
int ret = -1;
char *average = NULL;
char *peak = NULL;
char *burst = NULL;
if (!node || !rate) {
virSocketError(VIR_ERR_INVALID_ARG, "%s",
_("invalid argument supplied"));
return -1;
}
average = virXMLPropString(node, "average");
peak = virXMLPropString(node, "peak");
burst = virXMLPropString(node, "burst");
if (average) {
if (virStrToLong_ull(average, NULL, 10, &rate->average) < 0) {
virSocketError(VIR_ERR_CONFIG_UNSUPPORTED,
_("could not convert %s"),
average);
goto cleanup;
}
} else {
virSocketError(VIR_ERR_XML_DETAIL, "%s",
_("Missing mandatory average attribute"));
goto cleanup;
}
if (peak && virStrToLong_ull(peak, NULL, 10, &rate->peak) < 0) {
virSocketError(VIR_ERR_CONFIG_UNSUPPORTED,
_("could not convert %s"),
peak);
goto cleanup;
}
if (burst && virStrToLong_ull(burst, NULL, 10, &rate->burst) < 0) {
virSocketError(VIR_ERR_CONFIG_UNSUPPORTED,
_("could not convert %s"),
burst);
goto cleanup;
}
ret = 0;
cleanup:
VIR_FREE(average);
VIR_FREE(peak);
VIR_FREE(burst);
return ret;
}
/**
* virBandwidthDefParseNode:
* @node: XML node
*
* Parse bandwidth XML and return pointer to structure
*
* Returns !NULL on success, NULL on error.
*/
virBandwidthPtr
virBandwidthDefParseNode(xmlNodePtr node)
{
virBandwidthPtr def = NULL;
xmlNodePtr cur = node->children;
xmlNodePtr in = NULL, out = NULL;
if (VIR_ALLOC(def) < 0) {
virReportOOMError();
return NULL;
}
if (!node || !xmlStrEqual(node->name, BAD_CAST "bandwidth")) {
virSocketError(VIR_ERR_INVALID_ARG, "%s",
_("invalid argument supplied"));
goto error;
}
while (cur) {
if (cur->type == XML_ELEMENT_NODE) {
if (xmlStrEqual(cur->name, BAD_CAST "inbound")) {
if (in) {
virSocketError(VIR_ERR_XML_DETAIL, "%s",
_("Only one child <inbound> "
"element allowed"));
goto error;
}
in = cur;
} else if (xmlStrEqual(cur->name, BAD_CAST "outbound")) {
if (out) {
virSocketError(VIR_ERR_XML_DETAIL, "%s",
_("Only one child <outbound> "
"element allowed"));
goto error;
}
out = cur;
}
/* Silently ignore unknown elements */
}
cur = cur->next;
}
if (in) {
if (VIR_ALLOC(def->in) < 0) {
virReportOOMError();
goto error;
}
if (virBandwidthParseChildDefNode(in, def->in) < 0) {
/* helper reported error for us */
goto error;
}
}
if (out) {
if (VIR_ALLOC(def->out) < 0) {
virReportOOMError();
goto error;
}
if (virBandwidthParseChildDefNode(out, def->out) < 0) {
/* helper reported error for us */
goto error;
}
}
return def;
error:
virBandwidthDefFree(def);
return NULL;
}
void
virBandwidthDefFree(virBandwidthPtr def)
{
if (!def)
return;
VIR_FREE(def->in);
VIR_FREE(def->out);
VIR_FREE(def);
}
...@@ -150,4 +150,6 @@ virVirtualPortProfileFormat(virBufferPtr buf, ...@@ -150,4 +150,6 @@ virVirtualPortProfileFormat(virBufferPtr buf,
virVirtualPortProfileParamsPtr virtPort, virVirtualPortProfileParamsPtr virtPort,
const char *indent); const char *indent);
virBandwidthPtr virBandwidthDefParseNode(xmlNodePtr node);
void virBandwidthDefFree(virBandwidthPtr def);
#endif /* __VIR_NETWORK_H__ */ #endif /* __VIR_NETWORK_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册