---
src/conf/domain_conf.c |3 +
src/conf/network_conf.c |3 +
src/libvirt_private.syms |3 +
src/util/network.c | 153 ++
src/util/network.h |7 ++
5 files changed, 169 insertions(+), 0 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c109153..740630f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8844,6 +8844,9 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAddLit(buf, /tune\n);
}
+if (virBandwidrhDefFormat(buf, def-bandwidth, ) 0)
+return -1;
+
if (virDomainDeviceInfoFormat(buf, def-info, flags) 0)
return -1;
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index c9929e2..43145b1 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -1093,6 +1093,9 @@ char *virNetworkDefFormat(const virNetworkDefPtr def)
if (virNetworkDNSDefFormat(buf, def-dns) 0)
goto error;
+if (virBandwidrhDefFormat(buf, def-bandwidth, ) 0)
+goto error;
+
for (ii = 0; ii def-nips; ii++) {
if (virNetworkIpDefFormat(buf, def-ips[ii]) 0)
goto error;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c0e1bfa..2131108 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -682,7 +682,10 @@ nlComm;
# network.h
+virBandwidrhDefFormat;
virBandwidthDefParseNode;
+virBpsToRate;
+virBtoSize;
virSocketAddrBroadcast;
virSocketAddrBroadcastByPrefix;
virSocketAddrIsNetmask;
diff --git a/src/util/network.c b/src/util/network.c
index 476ecde..b24f977 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -877,3 +877,156 @@ virBandwidthDefParseNode(xmlNodePtr node, virBandwidthPtr
def)
cleanup:
return ret;
}
+
+/**
+ * virBpsToRate:
+ * @buf: output
+ * @rate: input
+ *
+ * Format rate, take bps as input. Do pretty formating.
+ * Caller MUST free @buf after use.
+ *
+ * Return 0 on success, -1 otherwise.
+ */
+int virBpsToRate(char **buf, unsigned long rate) {
+int ret = -1;
+double tmp = (double)rate*8;
+
+if (tmp = 1000.*1000.*1000.) {
+if (virAsprintf(buf, %.0fmbit, tmp/1000./1000.) 0)
+goto cleanup;
+} else if (tmp = 1000.*1000.) {
+if (virAsprintf(buf, %.0fkbit, tmp/1000.) 0)
+goto cleanup;
+} else {
+if (virAsprintf(buf, %.0fbit, tmp) 0)
+goto cleanup;
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+/**
+ * virBtoSize:
+ * @buf: output
+ * @size: input
+ *
+ * Format size, take size in bytes, produce prettier format.
+ * Caller MUST free @buf after use.
+ *
+ * Return 0 on success, -1 otherwise.
+ */
+int virBtoSize(char **buf, unsigned long size) {
+int ret = -1;
+double tmp = (double)size;
+
+if (size = 1024*1024
+fabs(1024*1024 * rint(tmp/(1024*1024)) - size) 1024) {
+if (virAsprintf(buf, %gmb, rint(tmp/(1024*1024))) 0)
+goto cleanup;
+} else if (size = 1024
+ fabs(1024*rint(tmp/1024) - size) 16) {
+if (virAsprintf(buf, %gkb, rint(tmp/1024)) 0)
+goto cleanup;
+} else {
+if (virAsprintf(buf, %lub, size) 0)
+goto cleanup;
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+static int
+virBandwidthChildDefFormat(virBufferPtr buf,
+ virRatePtr def,
+ const char *elem_name)
+{
+int ret = -1;
+char *tmp = NULL;
+
+if (!buf || !def || !elem_name)
+return -1;
+
+if (def-average) {
+if (virBpsToRate(tmp, def-average) 0)
+goto cleanup;
+virBufferAsprintf(buf, %s average='%s', elem_name, tmp);
+VIR_FREE(tmp);
+
+if (def-peak) {
+if (virBpsToRate(tmp, def-peak) 0)
+goto cleanup;
+virBufferAsprintf(buf, peak='%s', tmp);
+VIR_FREE(tmp);
+}
+
+if (def-burst) {
+if (virBtoSize(tmp, def-burst))
+goto cleanup;
+virBufferAsprintf(buf, burst='%s', tmp);
+VIR_FREE(tmp);
+}
+virBufferAddLit(buf, /\n);
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+/**
+ * virBandwidrhDefFormat:
+ * @buf: Buffer to print to
+ * @def: Data source
+ * @indent: prepend all lines printed with this
+ *
+ * Formats bandwidth and prepend each line with @indent.
+ * Passing NULL to @indent is equivalent passing .
+ *
+ * Returns 0 on success, else -1.
+ */
+int
+virBandwidrhDefFormat(virBufferPtr buf,
+ virBandwidthPtr def,
+ const char *indent)
+{
+int ret = -1;
+
+if (!buf || !def)
+goto cleanup;
+
+if (!indent)
+indent = ;
+
+if (!def-in.average !def-out.average) {
+ret = 0;
+goto cleanup;
+}
+
+virBufferAsprintf(buf, %sbandwidth\n, indent);
+if (def-in.average) {
+