2014-01-23 08:17:05 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2014 Red Hat, Inc.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "testutils.h"
|
2018-12-13 14:53:50 +00:00
|
|
|
#define LIBVIRT_VIRCOMMANDPRIV_H_ALLOW
|
2014-03-11 10:59:58 +00:00
|
|
|
#include "vircommandpriv.h"
|
2014-01-23 08:17:05 +00:00
|
|
|
#include "virnetdevbandwidth.h"
|
|
|
|
#include "netdev_bandwidth_conf.c"
|
|
|
|
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
|
|
|
|
struct testMinimalStruct {
|
|
|
|
const char *expected_result;
|
|
|
|
const char *band1;
|
|
|
|
const char *band2;
|
|
|
|
};
|
|
|
|
|
2014-01-27 13:53:00 +00:00
|
|
|
struct testSetStruct {
|
|
|
|
const char *band;
|
|
|
|
const char *exp_cmd;
|
|
|
|
const char *iface;
|
|
|
|
const bool hierarchical_class;
|
|
|
|
};
|
|
|
|
|
2017-11-03 12:09:47 +00:00
|
|
|
#define PARSE(xml, var) \
|
|
|
|
do { \
|
|
|
|
int rc; \
|
|
|
|
xmlDocPtr doc; \
|
|
|
|
xmlXPathContextPtr ctxt = NULL; \
|
|
|
|
\
|
|
|
|
if (!xml) \
|
|
|
|
break; \
|
|
|
|
\
|
|
|
|
if (!(doc = virXMLParseStringCtxt((xml), \
|
|
|
|
"bandwidth definition", \
|
|
|
|
&ctxt))) \
|
|
|
|
goto cleanup; \
|
|
|
|
\
|
|
|
|
rc = virNetDevBandwidthParse(&(var), \
|
2019-05-14 14:44:55 +00:00
|
|
|
NULL, \
|
2017-11-03 12:09:47 +00:00
|
|
|
ctxt->node, \
|
2019-01-29 17:26:40 +00:00
|
|
|
true); \
|
2017-11-03 12:09:47 +00:00
|
|
|
xmlFreeDoc(doc); \
|
|
|
|
xmlXPathFreeContext(ctxt); \
|
|
|
|
if (rc < 0) \
|
|
|
|
goto cleanup; \
|
2014-01-23 08:17:05 +00:00
|
|
|
} while (0)
|
|
|
|
|
2014-01-27 13:53:00 +00:00
|
|
|
static int
|
|
|
|
testVirNetDevBandwidthSet(const void *data)
|
|
|
|
{
|
|
|
|
int ret = -1;
|
|
|
|
const struct testSetStruct *info = data;
|
|
|
|
const char *iface = info->iface;
|
2021-03-03 10:48:19 +00:00
|
|
|
g_autoptr(virNetDevBandwidth) band = NULL;
|
2020-07-02 23:35:41 +00:00
|
|
|
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
2014-01-27 13:53:00 +00:00
|
|
|
char *actual_cmd = NULL;
|
2021-04-01 15:54:09 +00:00
|
|
|
g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
|
2014-01-27 13:53:00 +00:00
|
|
|
|
|
|
|
PARSE(info->band, band);
|
|
|
|
|
|
|
|
if (!iface)
|
|
|
|
iface = "eth0";
|
|
|
|
|
2021-04-06 08:56:23 +00:00
|
|
|
virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
|
2014-01-27 13:53:00 +00:00
|
|
|
|
2017-10-02 12:12:44 +00:00
|
|
|
if (virNetDevBandwidthSet(iface, band, info->hierarchical_class, true) < 0)
|
2014-01-27 13:53:00 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (!(actual_cmd = virBufferContentAndReset(&buf))) {
|
|
|
|
/* This is interesting, no command has been executed.
|
|
|
|
* Maybe that's expected, actually. */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (STRNEQ_NULLABLE(info->exp_cmd, actual_cmd)) {
|
2016-05-26 15:01:51 +00:00
|
|
|
virTestDifference(stderr,
|
|
|
|
NULLSTR(info->exp_cmd),
|
|
|
|
NULLSTR(actual_cmd));
|
2014-01-27 13:53:00 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
2014-03-25 06:53:44 +00:00
|
|
|
cleanup:
|
2014-01-27 13:53:00 +00:00
|
|
|
VIR_FREE(actual_cmd);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2014-01-23 08:17:05 +00:00
|
|
|
static int
|
|
|
|
mymain(void)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
2017-11-03 12:09:47 +00:00
|
|
|
#define DO_TEST_SET(Band, Exp_cmd, ...) \
|
|
|
|
do { \
|
|
|
|
struct testSetStruct data = {.band = Band, \
|
|
|
|
.exp_cmd = Exp_cmd, \
|
|
|
|
__VA_ARGS__}; \
|
|
|
|
if (virTestRun("virNetDevBandwidthSet", \
|
|
|
|
testVirNetDevBandwidthSet, \
|
|
|
|
&data) < 0) \
|
|
|
|
ret = -1; \
|
2014-01-27 13:53:00 +00:00
|
|
|
} while (0)
|
|
|
|
|
2014-01-23 08:17:05 +00:00
|
|
|
|
2014-01-31 14:04:03 +00:00
|
|
|
DO_TEST_SET(NULL, NULL);
|
|
|
|
|
2015-01-07 16:53:04 +00:00
|
|
|
DO_TEST_SET("<bandwidth/>", NULL);
|
2014-01-31 14:04:03 +00:00
|
|
|
|
|
|
|
DO_TEST_SET(("<bandwidth>"
|
|
|
|
" <inbound average='1024'/>"
|
|
|
|
"</bandwidth>"),
|
|
|
|
(TC " qdisc del dev eth0 root\n"
|
|
|
|
TC " qdisc del dev eth0 ingress\n"
|
|
|
|
TC " qdisc add dev eth0 root handle 1: htb default 1\n"
|
2016-02-02 11:48:44 +00:00
|
|
|
TC " class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps quantum 87\n"
|
2014-01-31 14:04:03 +00:00
|
|
|
TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10\n"
|
2015-04-14 13:40:17 +00:00
|
|
|
TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1\n"));
|
2014-01-31 14:04:03 +00:00
|
|
|
|
|
|
|
DO_TEST_SET(("<bandwidth>"
|
|
|
|
" <outbound average='1024'/>"
|
|
|
|
"</bandwidth>"),
|
|
|
|
(TC " qdisc del dev eth0 root\n"
|
|
|
|
TC " qdisc del dev eth0 ingress\n"
|
|
|
|
TC " qdisc add dev eth0 ingress\n"
|
2014-04-04 13:39:33 +00:00
|
|
|
TC " filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 "
|
2014-01-31 14:04:03 +00:00
|
|
|
"police rate 1024kbps burst 1024kb mtu 64kb drop flowid :1\n"));
|
|
|
|
|
2014-01-27 13:53:00 +00:00
|
|
|
DO_TEST_SET(("<bandwidth>"
|
|
|
|
" <inbound average='1' peak='2' floor='3' burst='4'/>"
|
|
|
|
" <outbound average='5' peak='6' burst='7'/>"
|
|
|
|
"</bandwidth>"),
|
2014-01-31 08:52:30 +00:00
|
|
|
(TC " qdisc del dev eth0 root\n"
|
|
|
|
TC " qdisc del dev eth0 ingress\n"
|
|
|
|
TC " qdisc add dev eth0 root handle 1: htb default 1\n"
|
2016-02-02 11:48:44 +00:00
|
|
|
TC " class add dev eth0 parent 1: classid 1:1 htb rate 1kbps ceil 2kbps burst 4kb quantum 1\n"
|
2014-01-31 08:52:30 +00:00
|
|
|
TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10\n"
|
2015-04-14 13:40:17 +00:00
|
|
|
TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1\n"
|
2014-01-31 08:52:30 +00:00
|
|
|
TC " qdisc add dev eth0 ingress\n"
|
2014-04-04 13:39:33 +00:00
|
|
|
TC " filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 "
|
2014-01-27 13:53:00 +00:00
|
|
|
"police rate 5kbps burst 7kb mtu 64kb drop flowid :1\n"));
|
|
|
|
|
2021-03-05 09:13:36 +00:00
|
|
|
DO_TEST_SET(("<bandwidth>"
|
|
|
|
" <inbound average='4294967295'/>"
|
|
|
|
" <outbound average='4294967295'/>"
|
|
|
|
"</bandwidth>"),
|
|
|
|
(TC " qdisc del dev eth0 root\n"
|
|
|
|
TC " qdisc del dev eth0 ingress\n"
|
|
|
|
TC " qdisc add dev eth0 root handle 1: htb default 1\n"
|
|
|
|
TC " class add dev eth0 parent 1: classid 1:1 htb rate 4294967295kbps quantum 366503875\n"
|
|
|
|
TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10\n"
|
|
|
|
TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1\n"
|
|
|
|
TC " qdisc add dev eth0 ingress\n"
|
|
|
|
TC " filter add dev eth0 parent ffff: protocol all u32 match "
|
|
|
|
"u32 0 0 police rate 4294967295kbps burst 4194303kb mtu 64kb "
|
|
|
|
"drop flowid :1\n"));
|
|
|
|
|
2021-03-04 17:52:32 +00:00
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
2014-01-23 08:17:05 +00:00
|
|
|
}
|
|
|
|
|
2019-08-21 16:13:16 +00:00
|
|
|
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("virnetdevbandwidth"))
|