Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP5:Update
libvirt.1822
1dd34bbb-vif-bw-sexpr.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 1dd34bbb-vif-bw-sexpr.patch of Package libvirt.1822
commit 1dd34bbb4b70e163f1b303f43b7c3507d2db086b Author: Jim Fehlig <jfehlig@suse.com> Date: Mon Jan 4 17:46:31 2016 -0700 xenconfig: support vif bandwidth in sexpr parser and formatter The xen sexpr config format has long supported specifying vif rate limiting, e.g. (device (vif (mac '00:16:3e:1b:b1:47') (rate '10240KB/s') ... ) ) Add support for mapping rate to and from <bandwidth> in the xenconfig sexpr parser and formatter. rate is mapped to the required 'average' attribute of the <outbound> element, e.g. <interface type='bridge'> ... <bandwidth> <outbound average='10240'/> </bandwidth> </interface> Also add unit tests to check the conversion logic. This patch benefits both the old xen driver and the libxl driver. Both drivers gain support for vif bandwidth when converting to/from domXML and xen-sxpr. In addition, the old xen driver will now be able to handle vif 'rate' setting when communicating with xend. Index: libvirt-1.2.18.2/src/libvirt_xenconfig.syms =================================================================== --- libvirt-1.2.18.2.orig/src/libvirt_xenconfig.syms +++ libvirt-1.2.18.2/src/libvirt_xenconfig.syms @@ -15,6 +15,7 @@ xenParseSxpr; xenParseSxprChar; xenParseSxprSound; xenParseSxprString; +xenParseSxprVifRate; # xenconfig/xen_xm.h xenFormatXM; Index: libvirt-1.2.18.2/src/xenconfig/xen_sxpr.c =================================================================== --- libvirt-1.2.18.2.orig/src/xenconfig/xen_sxpr.c +++ libvirt-1.2.18.2/src/xenconfig/xen_sxpr.c @@ -26,6 +26,8 @@ #include <config.h> +#include <regex.h> + #include "internal.h" #include "virerror.h" #include "virconf.h" @@ -320,6 +322,56 @@ xenParseSxprChar(const char *value, } +static const char *vif_bytes_per_sec_re = "^[0-9]+[GMK]?[Bb]/s$"; + +int +xenParseSxprVifRate(const char *rate, unsigned long long *kbytes_per_sec) +{ + char *trate = NULL; + char *p; + regex_t rec; + char *suffix; + unsigned long long tmp; + int ret = -1; + + if (VIR_STRDUP(trate, rate) < 0) + return -1; + + p = strchr(trate, '@'); + if (p != NULL) + *p = 0; + + regcomp(&rec, vif_bytes_per_sec_re, REG_EXTENDED|REG_NOSUB); + if (regexec(&rec, trate, 0, NULL, 0)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid rate '%s' specified"), rate); + goto cleanup; + } + + if (virStrToLong_ull(rate, &suffix, 10, &tmp)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to parse rate '%s'"), rate); + goto cleanup; + } + + if (*suffix == 'G') + tmp *= 1024 * 1024; + else if (*suffix == 'M') + tmp *= 1024; + + if (*suffix == 'b' || *(suffix + 1) == 'b') + tmp /= 8; + + *kbytes_per_sec = tmp; + ret = 0; + + cleanup: + regfree(&rec); + VIR_FREE(trate); + return ret; +} + + /** * xenParseSxprDisks: * @def: the domain config @@ -604,6 +656,25 @@ xenParseSxprNets(virDomainDefPtr def, VIR_STRDUP(net->model, "netfront") < 0) goto cleanup; + tmp = sexpr_node(node, "device/vif/rate"); + if (tmp) { + virNetDevBandwidthPtr bandwidth; + unsigned long long kbytes_per_sec; + + if (xenParseSxprVifRate(tmp, &kbytes_per_sec) < 0) + goto cleanup; + + if (VIR_ALLOC(bandwidth) < 0) + goto cleanup; + if (VIR_ALLOC(bandwidth->out) < 0) { + VIR_FREE(bandwidth); + goto cleanup; + } + + bandwidth->out->average = kbytes_per_sec; + net->bandwidth = bandwidth; + } + if (VIR_APPEND_ELEMENT(def->nets, def->nnets, net) < 0) goto cleanup; @@ -1898,6 +1969,9 @@ xenFormatSxprNet(virConnectPtr conn, virBufferAsprintf(buf, "(mac '%s')", virMacAddrFormat(&def->mac, macaddr)); + if (def->bandwidth && def->bandwidth->out && def->bandwidth->out->average) + virBufferAsprintf(buf, "(rate '%lluKB/s')", def->bandwidth->out->average); + switch (def->type) { case VIR_DOMAIN_NET_TYPE_BRIDGE: virBufferEscapeSexpr(buf, "(bridge '%s')", def->data.bridge.brname); Index: libvirt-1.2.18.2/src/xenconfig/xen_sxpr.h =================================================================== --- libvirt-1.2.18.2.orig/src/xenconfig/xen_sxpr.h +++ libvirt-1.2.18.2/src/xenconfig/xen_sxpr.h @@ -53,6 +53,8 @@ int xenParseSxprSound(virDomainDefPtr de virDomainChrDefPtr xenParseSxprChar(const char *value, const char *tty); +int xenParseSxprVifRate(const char *rate, unsigned long long *kbytes_per_sec); + int xenFormatSxprDisk(virDomainDiskDefPtr def, virBufferPtr buf, int hvm, int xendConfigVersion, int isAttach); Index: libvirt-1.2.18.2/tests/sexpr2xmldata/sexpr2xml-vif-rate.sexpr =================================================================== --- /dev/null +++ libvirt-1.2.18.2/tests/sexpr2xmldata/sexpr2xml-vif-rate.sexpr @@ -0,0 +1,11 @@ +(domain (domid 3)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')\ +(device_model '/usr/lib64/xen/bin/qemu-dm')(boot c)\ +(acpi 1)(vnc 1)(keymap ja)))(device (vbd (dev 'ioemu:hda')\ +(uname 'file:/root/foo.img')(mode 'w')))\ +(device (vbd (dev 'hdc:cdrom')\ +(uname 'file:/root/boot.iso')(mode 'r')))\ +(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')\ +(script 'vif-bridge')(type 'netfront')(rate '10240KB/s')))) Index: libvirt-1.2.18.2/tests/sexpr2xmldata/sexpr2xml-vif-rate.xml =================================================================== --- /dev/null +++ libvirt-1.2.18.2/tests/sexpr2xmldata/sexpr2xml-vif-rate.xml @@ -0,0 +1,51 @@ +<domain type='xen' id='3'> + <name>fvtest</name> + <uuid>b5d70dd2-75cd-aca5-1776-9660b059d8bc</uuid> + <memory unit='KiB'>409600</memory> + <currentMemory unit='KiB'>409600</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <features> + <acpi/> + </features> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <disk type='file' device='disk'> + <driver name='file'/> + <source file='/root/foo.img'/> + <backingStore/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='file'/> + <source file='/root/boot.iso'/> + <backingStore/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <interface type='bridge'> + <mac address='00:16:3e:1b:b1:47'/> + <source bridge='xenbr0'/> + <bandwidth> + <outbound average='10240'/> + </bandwidth> + <script path='vif-bridge'/> + <target dev='vif3.0'/> + <model type='netfront'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' keymap='ja'/> + <memballoon model='xen'/> + </devices> +</domain> Index: libvirt-1.2.18.2/tests/sexpr2xmltest.c =================================================================== --- libvirt-1.2.18.2.orig/tests/sexpr2xmltest.c +++ libvirt-1.2.18.2/tests/sexpr2xmltest.c @@ -185,6 +185,8 @@ mymain(void) DO_TEST("boot-grub", "boot-grub", 1); + DO_TEST("vif-rate", "vif-rate", 3); + virObjectUnref(caps); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; Index: libvirt-1.2.18.2/tests/xml2sexprdata/xml2sexpr-fv-net-rate.sexpr =================================================================== --- /dev/null +++ libvirt-1.2.18.2/tests/xml2sexprdata/xml2sexpr-fv-net-rate.sexpr @@ -0,0 +1,10 @@ +(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)(acpi 1)\ +(usb 1)(parallel none)(serial none)(device_model '/usr/lib64/xen/bin/qemu-dm')\ +(vnc 1)(vncunused 0)(vncdisplay 17)(keymap 'ja')(rtc_timeoffset 0)(localtime 0)))\ +(localtime 0)\ +(device (vbd (dev 'hda:disk')(uname 'file:/root/foo.img')\ +(mode 'w')))(device (vif (mac '00:16:3e:1b:b1:47')(rate '10240KB/s')\ +(bridge 'xenbr0')(script 'vif-bridge')(type netfront)))) Index: libvirt-1.2.18.2/tests/xml2sexprdata/xml2sexpr-fv-net-rate.xml =================================================================== --- /dev/null +++ libvirt-1.2.18.2/tests/xml2sexprdata/xml2sexpr-fv-net-rate.xml @@ -0,0 +1,34 @@ +<domain type='xen'> + <name>fvtest</name> + <uuid>b5d70dd275cdaca517769660b059d8bc</uuid> + <os> + <type>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <memory unit='KiB'>409600</memory> + <vcpu>1</vcpu> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <features> + <acpi/> + </features> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <interface type='bridge'> + <source bridge='xenbr0'/> + <bandwidth> + <outbound average='10240'/> + </bandwidth> + <mac address='00:16:3e:1b:b1:47'/> + <script path='vif-bridge'/> + <model type='netfront'/> + </interface> + <disk type='file'> + <source file='/root/foo.img'/> + <target dev='ioemu:hda'/> + </disk> + <graphics type='vnc' port='5917' keymap='ja'/> + </devices> +</domain> Index: libvirt-1.2.18.2/tests/xml2sexprtest.c =================================================================== --- libvirt-1.2.18.2.orig/tests/xml2sexprtest.c +++ libvirt-1.2.18.2/tests/xml2sexprtest.c @@ -164,6 +164,7 @@ mymain(void) DO_TEST("fv-net-ioemu", "fv-net-ioemu", "fvtest", 1); DO_TEST("fv-net-netfront", "fv-net-netfront", "fvtest", 1); + DO_TEST("fv-net-rate", "fv-net-rate", "fvtest", 3); DO_TEST("boot-grub", "boot-grub", "fvtest", 1); DO_TEST("escape", "escape", "fvtest", 1);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor