]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
qdisc: netem add support to duplicate packets.
authorSusant Sahani <ssahani@vmware.com>
Wed, 30 Oct 2019 17:58:02 +0000 (18:58 +0100)
committerSusant Sahani <ssahani@vmware.com>
Thu, 31 Oct 2019 09:36:28 +0000 (10:36 +0100)
using this option the chosen percent of packets is duplicated before
queuing them

man/systemd.network.xml
src/network/networkd-network-gperf.gperf
src/network/tc/netem.c
src/network/tc/netem.h
test/fuzz/fuzz-network-parser/directives.network

index 0d49bf95895457b9c2749df94d8f806352947fa8..fb2f199ba8d16f5a3df8616726c5150a4d0bf7f9 100644 (file)
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>NetworkEmulatorDuplicateRate=</varname></term>
+        <listitem>
+          <para>Specifies that the chosen percent of packets is duplicated before queuing them.
+          Takes a percentage value, suffixed with "%". Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
index 9f53385602782d62f290df483c46673ba11b6f86..7fca93dccb954b0a7b09a5cac008e624fc9f621b 100644 (file)
@@ -247,7 +247,8 @@ CAN.TripleSampling,                     config_parse_tristate,
 TrafficControlQueueingDiscipline.Parent,                             config_parse_tc_qdiscs_parent,                     0,                             0
 TrafficControlQueueingDiscipline.NetworkEmulatorDelaySec,            config_parse_tc_network_emulator_delay,            0,                             0
 TrafficControlQueueingDiscipline.NetworkEmulatorDelayJitterSec,      config_parse_tc_network_emulator_delay,            0,                             0
-TrafficControlQueueingDiscipline.NetworkEmulatorLossRate,            config_parse_tc_network_emulator_loss_rate,        0,                             0
+TrafficControlQueueingDiscipline.NetworkEmulatorLossRate,            config_parse_tc_network_emulator_rate,             0,                             0
+TrafficControlQueueingDiscipline.NetworkEmulatorDuplicateRate,       config_parse_tc_network_emulator_rate,             0,                             0
 TrafficControlQueueingDiscipline.NetworkEmulatorPacketLimit,         config_parse_tc_network_emulator_packet_limit,     0,                             0
 /* backwards compatibility: do not add new entries to this section */
 Network.IPv4LL,                         config_parse_ipv4ll,                             0,                             offsetof(Network, link_local)
index e0e3e9a48e96acfcfe6e37c602a70db6f505fc58..053af3e7dbbd016dacde9885b7bd968b58fa0ae1 100644 (file)
@@ -50,6 +50,9 @@ int network_emulator_fill_message(Link *link, QDiscs *qdisc, sd_netlink_message
         if (qdisc->ne.loss > 0)
                 opt.loss = qdisc->ne.loss;
 
+        if (qdisc->ne.duplicate > 0)
+                opt.duplicate = qdisc->ne.duplicate;
+
         if (qdisc->ne.delay != USEC_INFINITY) {
                 r = tc_time_to_tick(qdisc->ne.delay, &opt.latency);
                 if (r < 0)
@@ -124,7 +127,7 @@ int config_parse_tc_network_emulator_delay(
         return 0;
 }
 
-int config_parse_tc_network_emulator_loss_rate(
+int config_parse_tc_network_emulator_rate(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -138,6 +141,7 @@ int config_parse_tc_network_emulator_loss_rate(
 
         _cleanup_(qdisc_free_or_set_invalidp) QDiscs *qdisc = NULL;
         Network *network = data;
+        uint32_t rate;
         int r;
 
         assert(filename);
@@ -156,14 +160,19 @@ int config_parse_tc_network_emulator_loss_rate(
                 return 0;
         }
 
-        r = parse_tc_percent(rvalue, &qdisc->ne.loss);
+        r = parse_tc_percent(rvalue, &rate);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r,
-                           "Failed to parse 'NetworkEmularorLossRate=', ignoring assignment: %s",
-                           rvalue);
+                           "Failed to parse '%s=', ignoring assignment: %s",
+                           lvalue, rvalue);
                 return 0;
         }
 
+        if (streq(lvalue, "NetworkEmulatorLossRate"))
+                qdisc->ne.loss = rate;
+        else if (streq(lvalue, "NetworkEmulatorDuplicateRate"))
+                qdisc->ne.duplicate = rate;
+
         qdisc = NULL;
         return 0;
 }
index 4bac44ca5a54eb0731788317abd92bdc0d3604e5..43abf20af87cda4dc1ef86075979ea2405d925af 100644 (file)
@@ -16,11 +16,12 @@ typedef struct NetworkEmulator {
 
         uint32_t limit;
         uint32_t loss;
+        uint32_t duplicate;
 } NetworkEmulator;
 
 int network_emulator_new(NetworkEmulator **ret);
 int network_emulator_fill_message(Link *link, QDiscs *qdisc, sd_netlink_message *req);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_tc_network_emulator_delay);
-CONFIG_PARSER_PROTOTYPE(config_parse_tc_network_emulator_loss_rate);
+CONFIG_PARSER_PROTOTYPE(config_parse_tc_network_emulator_rate);
 CONFIG_PARSER_PROTOTYPE(config_parse_tc_network_emulator_packet_limit);
index 3469dd443ec348be3b728b0bcca42e64136d7dad..a5f54610daae2c655bf24a397335a93a06597564 100644 (file)
@@ -268,4 +268,5 @@ Parent=
 NetworkEmulatorDelaySec=
 NetworkEmulatorDelayJitterSec=
 NetworkEmulatorLossRate=
+NetworkEmulatorDuplicateRate=
 NetworkEmulatorPacketLimit=