]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #15036 from yuwata/can-termination-mod
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 7 Mar 2020 10:11:03 +0000 (19:11 +0900)
committerGitHub <noreply@github.com>
Sat, 7 Mar 2020 10:11:03 +0000 (19:11 +0900)
network: add CAN Termination tristate option

1  2 
man/systemd.network.xml
src/libsystemd/sd-netlink/netlink-types.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network

diff --combined man/systemd.network.xml
index b43c460267498c90f0c0242b4f44719d29ecf8a5,6b8aa15ea3e4a54695b740b6137cdaf5441ab58c..da48dd04f4b2ff86f6c99ead085fc61226412378
    <refsect1>
      <title>Description</title>
  
 -    <para>Network setup is performed by
 +    <para>A plain ini-style text file that encodes network configuration for matching network interfaces,
 +    used by
      <citerefentry><refentrytitle>systemd-networkd</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
 -    </para>
 +    See <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>5</manvolnum></citerefentry>
 +    for a general description of the syntax.</para>
  
      <para>The main network file must have the extension <filename>.network</filename>; other
      extensions are ignored. Networks are applied to links whenever the links appear.</para>
          <varlistentry>
            <term><varname>Domains=</varname></term>
            <listitem>
 -            <para>A list of domains which should be resolved using the DNS servers on this link. Each item in the list
 -            should be a domain name, optionally prefixed with a tilde (<literal>~</literal>). The domains with the
 -            prefix are called "routing-only domains". The domains without the prefix are called "search domains" and
 -            are first used as search suffixes for extending single-label host names (host names containing no dots) to
 -            become fully qualified domain names (FQDNs). If a single-label host name is resolved on this interface,
 -            each of the specified search domains are appended to it in turn, converting it into a fully qualified
 -            domain name, until one of them may be successfully resolved.</para>
 +            <para>A whitespace-separated list of domains which should be resolved using the DNS servers on
 +            this link. Each item in the list should be a domain name, optionally prefixed with a tilde
 +            (<literal>~</literal>). The domains with the prefix are called "routing-only domains". The
 +            domains without the prefix are called "search domains" and are first used as search suffixes for
 +            extending single-label host names (host names containing no dots) to become fully qualified
 +            domain names (FQDNs). If a single-label host name is resolved on this interface, each of the
 +            specified search domains are appended to it in turn, converting it into a fully qualified domain
 +            name, until one of them may be successfully resolved.</para>
  
              <para>Both "search" and "routing-only" domains are used for routing of DNS queries: look-ups for host names
              ending in those domains (hence also single label names, if any "search domains" are listed), are routed to
          </varlistentry>
          <varlistentry>
            <term><varname>IPv6AcceptRA=</varname></term>
 -          <listitem><para>Takes a boolean. Controls IPv6 Router Advertisement (RA) reception support
 -          for the interface. If true, RAs are accepted; if false, RAs are ignored, independently of the
 -          local forwarding state. When RAs are accepted, they may trigger the start of the DHCPv6
 -          client if the relevant flags are set in the RA data, or if no routers are found on the link.</para>
 +          <listitem><para>Takes a boolean. Controls IPv6 Router Advertisement (RA) reception support for the
 +          interface. If true, RAs are accepted; if false, RAs are ignored. When RAs are accepted, they may
 +          trigger the start of the DHCPv6 client if the relevant flags are set in the RA data, or if no
 +          routers are found on the link. The default is to disable RA reception for bridge devices or when IP
 +          forwarding is enabled, and to enable it otherwise. Cannot be enabled on bond devices and when link
 +          local adressing is disabled.</para>
  
            <para>Further settings for the IPv6 RA support may be configured in the
            <literal>[IPv6AcceptRA]</literal> section, see below.</para>
              a prefix-hint in the DHCPv6 solicitation. Prefix ranges 1-128. Defaults to unset.</para>
            </listitem>
          </varlistentry>
 +
 +        <varlistentry>
 +          <term><varname>WithoutRA=</varname></term>
 +          <listitem>
 +            <para>When true, DHCPv6 client starts without router advertisements's managed or other address configuration flag.
 +            Defaults to false.</para>
 +          </listitem>
 +        </varlistentry>
        </variablelist>
    </refsect1>
  
            </listitem>
          </varlistentry>
  
 +        <varlistentry>
 +          <term><varname>DHCPv6Client=</varname></term>
 +          <listitem>
 +            <para>Takes a boolean. When true (the default), the DHCPv6 client will be started when the
 +            RA has the managed or other information flag.</para>
 +          </listitem>
 +        </varlistentry>
 +
        </variablelist>
    </refsect1>
  
          to 2592000 seconds (30 days).</para></listitem>
        </varlistentry>
  
 +      <varlistentry>
 +        <term><varname>Assign=</varname></term>
 +        <listitem><para>Takes a boolean. When true, adds an address from the prefix. Default to false.
 +        </para></listitem>
 +      </varlistentry>
      </variablelist>
      </refsect1>
  
              automatic restart off. By default automatic restart is disabled.</para>
            </listitem>
          </varlistentry>
+         <varlistentry>
+           <term><varname>Termination=</varname></term>
+           <listitem>
+             <para>Takes a boolean. When <literal>yes</literal>, the termination resistor will be selected for
+             the bias network. When unset, the kernel's default will be used.</para>
+           </listitem>
+         </varlistentry>
          <varlistentry>
            <term><varname>TripleSampling=</varname></term>
            <listitem>
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
      </variablelist>
    </refsect1>
  
 +  <refsect1>
 +    <title>[StochasticFairBlue] Section Options</title>
 +    <para>The <literal>[StochasticFairBlue]</literal> section manages the queueing discipline
 +    (qdisc) of stochastic fair blue (sfb).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Handle=</varname></term>
 +        <listitem>
 +          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
 +          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>PacketLimit=</varname></term>
 +        <listitem>
 +          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
 +          dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +    </variablelist>
 +  </refsect1>
 +
    <refsect1>
      <title>[StochasticFairnessQueueing] Section Options</title>
      <para>The <literal>[StochasticFairnessQueueing]</literal> section manages the queueing discipline
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
      </variablelist>
    </refsect1>
  
 +  <refsect1>
 +    <title>[PFIFO] Section Options</title>
 +    <para>The <literal>[PFIFO]</literal> section manages the queueing discipline (qdisc) of
 +    Packet First In First Out (pfifo).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Handle=</varname></term>
 +        <listitem>
 +          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
 +          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>PacketLimit=</varname></term>
 +        <listitem>
 +          <para>Specifies the hard limit on the FIFO size in number of packets. The size limit (a buffer size) to prevent it
 +          from overflowing in case it is unable to dequeue packets as quickly as it receives them. When this limit is reached,
 +          incoming packets are dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +    </variablelist>
 +  </refsect1>
 +
 +  <refsect1>
 +    <title>[CAKE] Section Options</title>
 +    <para>The <literal>[CAKE]</literal> section manages the queueing discipline (qdisc) of
 +    Common Applications Kept Enhanced (CAKE).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Handle=</varname></term>
 +        <listitem>
 +          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
 +          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +       <varlistentry>
 +        <term><varname>Overhead=</varname></term>
 +        <listitem>
 +          <para>Specifies that bytes to be addeded to the size of each packet. Bytes may be negative.
 +          Takes an integer ranges -64 to 256. Defaults to unset and kernel's default is used.</para>
 +        </listitem>
 +       </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Bandwidth=</varname></term>
 +        <listitem>
 +          <para>Specifies the shaper bandwidth. When suffixed with K, M, or G, the specified size is
 +          parsed as Kilobits, Megabits, or Gigabits, respectively, to the base of 1000. Defaults to
 +          unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +    </variablelist>
 +  </refsect1>
 +
    <refsect1>
      <title>[ControlledDelay] Section Options</title>
      <para>The <literal>[ControlledDelay]</literal> section manages the queueing discipline (qdisc) of
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term><varname>PacketLimit=</varname></term>
          <listitem>
 -          <para>Specifies the hard lmit on the queue size in number of packets. When this limit is reached, incoming packets are
 +          <para>Specifies the hard limit on the queue size in number of packets. When this limit is reached, incoming packets are
            dropped. An unsigned integer ranges 0 to 4294967294. Defaults to unset and kernel's default is used.</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </refsect1>
  
 +  <refsect1>
 +    <title>[GenericRandomEarlyDetection] Section Options</title>
 +    <para>The <literal>[GenericRandomEarlyDetection]</literal> section manages the queueing discipline
 +    (qdisc) of Generic Random Early Detection (GRED).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Handle=</varname></term>
 +        <listitem>
 +          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
 +          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>VirtualQueues=</varname></term>
 +        <listitem>
 +          <para>Specifies the number of virtual queues. Takes a integer in the range 1-16. Defaults to unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>DefaultVirtualQueue=</varname></term>
 +        <listitem>
 +          <para>Specifies the number of default virtual queue. This must be less than <varname>VirtualQueue=</varname>.
 +          Defaults to unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>GenericRIO=</varname></term>
 +        <listitem>
 +          <para>Takes a boolean. It turns on the RIO-like buffering scheme. Defaults to
 +          unset and kernel's default is used.</para>
 +        </listitem>
 +      </varlistentry>
 +    </variablelist>
 +  </refsect1>
 +
    <refsect1>
      <title>[FairQueueingControlledDelay] Section Options</title>
      <para>The <literal>[FairQueueingControlledDelay]</literal> section manages the queueing discipline
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
          <term><varname>Parent=</varname></term>
          <listitem>
            <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 -          <literal>clsact</literal> or <literal>ingress</literal>. Defaults to <literal>root</literal>.</para>
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
          </listitem>
        </varlistentry>
  
      </variablelist>
    </refsect1>
  
 +  <refsect1>
 +    <title>[HierarchyTokenBucket] Section Options</title>
 +    <para>The <literal>[HierarchyTokenBucket]</literal> section manages the queueing discipline (qdisc) of
 +    hierarchy token bucket (htb).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          <literal>clsact</literal>, <literal>ingress</literal> or a class id. The class id takes the
 +          major and minor number in hexadecimal ranges 1 to ffff separated with a colon
 +          (<literal>major:minor</literal>). Defaults to <literal>root</literal>.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Handle=</varname></term>
 +        <listitem>
 +          <para>Specifies the major number of unique identifier of the qdisc, known as the handle.
 +          Takes a number in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>DefaultClass=</varname></term>
 +        <listitem>
 +          <para>Takes the minor id in hexadecimal of the default class. Unclassified traffic gets sent
 +          to the class. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +    </variablelist>
 +  </refsect1>
 +
 +  <refsect1>
 +    <title>[HierarchyTokenBucketClass] Section Options</title>
 +    <para>The <literal>[HierarchyTokenBucketClass]</literal> section manages the traffic control class of
 +    hierarchy token bucket (htb).</para>
 +
 +    <variablelist class='network-directives'>
 +      <varlistentry>
 +        <term><varname>Parent=</varname></term>
 +        <listitem>
 +          <para>Specifies the parent Queueing Discipline (qdisc). Takes one of <literal>root</literal>,
 +          or a qdisc id. The qdisc id takes the major and minor number in hexadecimal ranges 1 to ffff
 +          separated with a colon (<literal>major:minor</literal>). Defaults to <literal>root</literal>.
 +          </para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>ClassId=</varname></term>
 +        <listitem>
 +          <para>Specifies the major and minur number of unique identifier of the class, known as the
 +          class ID. Each number is in hexadecimal ranges 1 to ffff. Defaults to unset.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Priority=</varname></term>
 +        <listitem>
 +          <para>Specifies the priority of the class. In the round-robin process, classes with the lowest
 +          priority field are tried for packets first. This setting is mandatory.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>Rate=</varname></term>
 +        <listitem>
 +          <para>Specifies the maximum rate this class and all its children are guaranteed. When suffixed
 +          with K, M, or G, the specified size is parsed as Kilobits, Megabits, or Gigabits, respectively,
 +          to the base of 1000. This setting is mandatory.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +      <varlistentry>
 +        <term><varname>CeilRate=</varname></term>
 +        <listitem>
 +          <para>Specifies the maximum rate at which a class can send, if its parent has bandwidth to spare.
 +          When suffixed with K, M, or G, the specified size is parsed as Kilobits, Megabits, or Gigabits,
 +          respectively, to the base of 1000. When unset, the value specified with <varname>Rate=</varname>
 +          is used.</para>
 +        </listitem>
 +      </varlistentry>
 +
 +    </variablelist>
 +  </refsect1>
 +
    <refsect1>
      <title>[BridgeVLAN] Section Options</title>
        <para>The <literal>[BridgeVLAN]</literal> section manages the VLAN ID configuration of a bridge port and accepts
index 4846b6f74ec1e0d239d44af6628e7b28ea5921bd,3aa7002e80e02f2e8aba80c3a39c49b0976fa4d1..102cec49a1cc7fc22eceea0d470b6ffd9ad7ea82
@@@ -316,6 -316,7 +316,7 @@@ static const NLType rtnl_link_info_data
          [IFLA_CAN_BITTIMING]            = { .size = sizeof(struct can_bittiming) },
          [IFLA_CAN_RESTART_MS]           = { .type = NETLINK_TYPE_U32 },
          [IFLA_CAN_CTRLMODE]             = { .size = sizeof(struct can_ctrlmode) },
+         [IFLA_CAN_TERMINATION]          = { .type = NETLINK_TYPE_U16 },
  };
  
  static const NLType rtnl_link_info_data_macsec_types[] = {
@@@ -745,12 -746,6 +746,12 @@@ static const NLTypeSystem rtnl_nexthop_
         .types = rtnl_nexthop_types,
  };
  
 +static const NLType rtnl_tca_option_data_cake_types[] = {
 +        [TCA_CAKE_BASE_RATE64] = { .type = NETLINK_TYPE_U64 },
 +        [TCA_CAKE_OVERHEAD]    = { .type = NETLINK_TYPE_S32 },
 +        [TCA_CAKE_MPU]         = { .type = NETLINK_TYPE_U32 },
 +};
 +
  static const NLType rtnl_tca_option_data_codel_types[] = {
          [TCA_CODEL_TARGET]        = { .type = NETLINK_TYPE_U32 },
          [TCA_CODEL_LIMIT]         = { .type = NETLINK_TYPE_U32 },
@@@ -786,23 -781,6 +787,23 @@@ static const NLType rtnl_tca_option_dat
          [TCA_FQ_CODEL_MEMORY_LIMIT]    = { .type = NETLINK_TYPE_U32 },
  };
  
 +static const NLType rtnl_tca_option_data_gred_types[] = {
 +        [TCA_GRED_DPS] = { .size = sizeof(struct tc_gred_sopt) },
 +};
 +
 +static const NLType rtnl_tca_option_data_htb_types[] = {
 +        [TCA_HTB_PARMS]  = { .size = sizeof(struct tc_htb_opt) },
 +        [TCA_HTB_INIT]   = { .size = sizeof(struct tc_htb_glob) },
 +        [TCA_HTB_CTAB]   = { .size = TC_RTAB_SIZE },
 +        [TCA_HTB_RTAB]   = { .size = TC_RTAB_SIZE },
 +        [TCA_HTB_RATE64] = { .type = NETLINK_TYPE_U64 },
 +        [TCA_HTB_CEIL64] = { .type = NETLINK_TYPE_U64 },
 +};
 +
 +static const NLType rtnl_tca_option_data_sfb_types[] = {
 +        [TCA_SFB_PARMS] = { .size = sizeof(struct tc_sfb_qopt) },
 +};
 +
  static const NLType rtnl_tca_option_data_tbf_types[] = {
          [TCA_TBF_PARMS]   = { .size = sizeof(struct tc_tbf_qopt) },
          [TCA_TBF_RTAB]    = { .size = TC_RTAB_SIZE },
  };
  
  static const char* const nl_union_tca_option_data_table[] = {
 +        [NL_UNION_TCA_OPTION_DATA_CAKE] = "cake",
          [NL_UNION_TCA_OPTION_DATA_CODEL] = "codel",
          [NL_UNION_TCA_OPTION_DATA_FQ] = "fq",
          [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] = "fq_codel",
 +        [NL_UNION_TCA_OPTION_DATA_GRED] = "gred",
 +        [NL_UNION_TCA_OPTION_DATA_HTB] = "htb",
 +        [NL_UNION_TCA_OPTION_DATA_SFB] = "sfb",
          [NL_UNION_TCA_OPTION_DATA_TBF] = "tbf",
  };
  
  DEFINE_STRING_TABLE_LOOKUP(nl_union_tca_option_data, NLUnionTCAOptionData);
  
  static const NLTypeSystem rtnl_tca_option_data_type_systems[] = {
 +        [NL_UNION_TCA_OPTION_DATA_CAKE] =        { .count = ELEMENTSOF(rtnl_tca_option_data_cake_types),
 +                                                   .types = rtnl_tca_option_data_cake_types },
          [NL_UNION_TCA_OPTION_DATA_CODEL] =       { .count = ELEMENTSOF(rtnl_tca_option_data_codel_types),
                                                     .types = rtnl_tca_option_data_codel_types },
          [NL_UNION_TCA_OPTION_DATA_FQ] =          { .count = ELEMENTSOF(rtnl_tca_option_data_fq_types),
                                                     .types = rtnl_tca_option_data_fq_types },
          [NL_UNION_TCA_OPTION_DATA_FQ_CODEL] =    { .count = ELEMENTSOF(rtnl_tca_option_data_fq_codel_types),
                                                     .types = rtnl_tca_option_data_fq_codel_types },
 +        [NL_UNION_TCA_OPTION_DATA_GRED] =        { .count = ELEMENTSOF(rtnl_tca_option_data_gred_types),
 +                                                   .types = rtnl_tca_option_data_gred_types },
 +        [NL_UNION_TCA_OPTION_DATA_HTB] =         { .count = ELEMENTSOF(rtnl_tca_option_data_htb_types),
 +                                                   .types = rtnl_tca_option_data_htb_types },
 +        [NL_UNION_TCA_OPTION_DATA_SFB] =         { .count = ELEMENTSOF(rtnl_tca_option_data_sfb_types),
 +                                                   .types = rtnl_tca_option_data_sfb_types },
          [NL_UNION_TCA_OPTION_DATA_TBF] =         { .count = ELEMENTSOF(rtnl_tca_option_data_tbf_types),
                                                     .types = rtnl_tca_option_data_tbf_types },
  };
@@@ -853,16 -819,16 +854,16 @@@ static const NLTypeSystemUnion rtnl_tca
          .match = TCA_KIND,
  };
  
 -static const NLType rtnl_qdisc_types[] = {
 +static const NLType rtnl_tca_types[] = {
          [TCA_KIND]           = { .type = NETLINK_TYPE_STRING },
          [TCA_OPTIONS]        = { .type = NETLINK_TYPE_UNION, .type_system_union = &rtnl_tca_option_data_type_system_union },
          [TCA_INGRESS_BLOCK]  = { .type = NETLINK_TYPE_U32 },
          [TCA_EGRESS_BLOCK]   = { .type = NETLINK_TYPE_U32 },
  };
  
 -static const NLTypeSystem rtnl_qdisc_type_system = {
 -        .count = ELEMENTSOF(rtnl_qdisc_types),
 -        .types = rtnl_qdisc_types,
 +static const NLTypeSystem rtnl_tca_type_system = {
 +        .count = ELEMENTSOF(rtnl_tca_types),
 +        .types = rtnl_tca_types,
  };
  
  static const NLType error_types[] = {
@@@ -903,12 -869,9 +904,12 @@@ static const NLType rtnl_types[] = 
          [RTM_NEWNEXTHOP]   = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_nexthop_type_system, .size = sizeof(struct nhmsg) },
          [RTM_DELNEXTHOP]   = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_nexthop_type_system, .size = sizeof(struct nhmsg) },
          [RTM_GETNEXTHOP]   = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_nexthop_type_system, .size = sizeof(struct nhmsg) },
 -        [RTM_NEWQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_qdisc_type_system, .size = sizeof(struct tcmsg) },
 -        [RTM_DELQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_qdisc_type_system, .size = sizeof(struct tcmsg) },
 -        [RTM_GETQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_qdisc_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_NEWQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_DELQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_GETQDISC]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_NEWTCLASS]    = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_DELTCLASS]    = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
 +        [RTM_GETTCLASS]    = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_tca_type_system, .size = sizeof(struct tcmsg) },
  };
  
  const NLTypeSystem rtnl_type_system_root = {
index 9345e0fd1ee8a7a33dfa29ae3c74942f04958c21,9679300b62d8e056eb0d2a0f4e8ac113eb0c0b53..8bf80afddd296082d74ddb430fb6e6d984149374
@@@ -14,7 -14,6 +14,7 @@@ _Pragma("GCC diagnostic ignored \"-Wimp
  #include "networkd-ndisc.h"
  #include "networkd-network.h"
  #include "qdisc.h"
 +#include "tclass.h"
  #include "vlan-util.h"
  %}
  struct ConfigPerfItem;
@@@ -181,7 -180,7 +181,7 @@@ DHCPv4.ListenPort
  DHCPv4.SendRelease,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_release)
  DHCPv4.SendDecline,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_send_decline)
  DHCPv4.BlackList,                            config_parse_dhcp_black_listed_ip_address,                0,                             0
 -DHCPv4.IPServiceType,                        config_parse_ip_service_type,                             0,                             offsetof(Network, ip_service_type)
 +DHCPv4.IPServiceType,                        config_parse_dhcp_ip_service_type,                        0,                             offsetof(Network, ip_service_type)
  DHCPv4.SendOption,                           config_parse_dhcp_send_option,                            0,                             offsetof(Network, dhcp_client_send_options)
  DHCPv4.RouteMTUBytes,                        config_parse_mtu,                                         AF_INET,                       offsetof(Network, dhcp_route_mtu)
  DHCPv6.UseDNS,                               config_parse_bool,                                        0,                             offsetof(Network, dhcp6_use_dns)
@@@ -189,12 -188,10 +189,12 @@@ DHCPv6.UseNTP
  DHCPv6.RapidCommit,                          config_parse_bool,                                        0,                             offsetof(Network, rapid_commit)
  DHCPv6.ForceDHCPv6PDOtherInformation,        config_parse_bool,                                        0,                             offsetof(Network, dhcp6_force_pd_other_information)
  DHCPv6.PrefixDelegationHint,                 config_parse_dhcp6_pd_hint,                               0,                             0
 +DHCPv6.WithoutRA,                            config_parse_bool,                                        0,                             offsetof(Network, dhcp6_without_ra)
  IPv6AcceptRA.UseAutonomousPrefix,            config_parse_bool,                                        0,                             offsetof(Network, ipv6_accept_ra_use_autonomous_prefix)
  IPv6AcceptRA.UseOnLinkPrefix,                config_parse_bool,                                        0,                             offsetof(Network, ipv6_accept_ra_use_onlink_prefix)
  IPv6AcceptRA.UseDNS,                         config_parse_bool,                                        0,                             offsetof(Network, ipv6_accept_ra_use_dns)
  IPv6AcceptRA.UseDomains,                     config_parse_dhcp_use_domains,                            0,                             offsetof(Network, ipv6_accept_ra_use_domains)
 +IPv6AcceptRA.DHCPv6Client,                   config_parse_bool,                                        0,                             offsetof(Network, ipv6_accept_ra_start_dhcp6_client)
  IPv6AcceptRA.RouteTable,                     config_parse_section_route_table,                         0,                             0
  IPv6AcceptRA.BlackList,                      config_parse_ndisc_black_listed_prefix,                   0,                             0
  DHCPServer.MaxLeaseTimeSec,                  config_parse_sec,                                         0,                             offsetof(Network, dhcp_server_max_lease_time_usec)
@@@ -248,19 -245,15 +248,20 @@@ IPv6Prefix.OnLink
  IPv6Prefix.AddressAutoconfiguration,         config_parse_prefix_flags,                                0,                             0
  IPv6Prefix.ValidLifetimeSec,                 config_parse_prefix_lifetime,                             0,                             0
  IPv6Prefix.PreferredLifetimeSec,             config_parse_prefix_lifetime,                             0,                             0
 +IPv6Prefix.Assign,                           config_parse_prefix_assign,                               0,                             0
  IPv6RoutePrefix.Route,                       config_parse_route_prefix,                                0,                             0
  IPv6RoutePrefix.LifetimeSec,                 config_parse_route_prefix_lifetime,                       0,                             0
  CAN.BitRate,                                 config_parse_si_uint64,                                   0,                             offsetof(Network, can_bitrate)
  CAN.SamplePoint,                             config_parse_permille,                                    0,                             offsetof(Network, can_sample_point)
  CAN.RestartSec,                              config_parse_sec,                                         0,                             offsetof(Network, can_restart_us)
  CAN.TripleSampling,                          config_parse_tristate,                                    0,                             offsetof(Network, can_triple_sampling)
+ CAN.Termination,                             config_parse_tristate,                                    0,                             offsetof(Network, can_termination)
  QDisc.Parent,                                config_parse_qdisc_parent,                                _QDISC_KIND_INVALID,           0
  QDisc.Handle,                                config_parse_qdisc_handle,                                _QDISC_KIND_INVALID,           0
 +CAKE.Parent,                                 config_parse_qdisc_parent,                                QDISC_KIND_CAKE,               0
 +CAKE.Handle,                                 config_parse_qdisc_handle,                                QDISC_KIND_CAKE,               0
 +CAKE.Bandwidth,                              config_parse_cake_bandwidth,                              QDISC_KIND_CAKE,               0
 +CAKE.Overhead,                               config_parse_cake_overhead,                               QDISC_KIND_CAKE,               0
  ControlledDelay.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_CODEL,              0
  ControlledDelay.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_CODEL,              0
  ControlledDelay.PacketLimit,                 config_parse_controlled_delay_u32,                        QDISC_KIND_CODEL,              0
@@@ -268,9 -261,6 +269,9 @@@ ControlledDelay.TargetSec
  ControlledDelay.IntervalSec,                 config_parse_controlled_delay_usec,                       QDISC_KIND_CODEL,              0
  ControlledDelay.CEThresholdSec,              config_parse_controlled_delay_usec,                       QDISC_KIND_CODEL,              0
  ControlledDelay.ECN,                         config_parse_controlled_delay_bool,                       QDISC_KIND_CODEL,              0
 +PFIFO.Parent,                                config_parse_qdisc_parent,                                QDISC_KIND_PFIFO,              0
 +PFIFO.Handle,                                config_parse_qdisc_handle,                                QDISC_KIND_PFIFO,              0
 +PFIFO.PacketLimit,                           config_parse_fifo_size,                                   QDISC_KIND_PFIFO,              0
  FairQueueing.Parent,                         config_parse_qdisc_parent,                                QDISC_KIND_FQ,                 0
  FairQueueing.Handle,                         config_parse_qdisc_handle,                                QDISC_KIND_FQ,                 0
  FairQueueing.PacketLimit,                    config_parse_fair_queueing_u32,                           QDISC_KIND_FQ,                 0
@@@ -292,19 -282,6 +293,19 @@@ FairQueueingControlledDelay.TargetSec
  FairQueueingControlledDelay.IntervalSec,     config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
  FairQueueingControlledDelay.CEThresholdSec,  config_parse_fair_queueing_controlled_delay_usec,         QDISC_KIND_FQ_CODEL,           0
  FairQueueingControlledDelay.ECN,             config_parse_fair_queueing_controlled_delay_bool,         QDISC_KIND_FQ_CODEL,           0
 +GenericRandomEarlyDetection.Parent,          config_parse_qdisc_parent,                                QDISC_KIND_GRED,               0
 +GenericRandomEarlyDetection.Handle,          config_parse_qdisc_handle,                                QDISC_KIND_GRED,               0
 +GenericRandomEarlyDetection.VirtualQueues,   config_parse_generic_random_early_detection_u32,          QDISC_KIND_GRED,               0
 +GenericRandomEarlyDetection.DefaultVirtualQueue, config_parse_generic_random_early_detection_u32,      QDISC_KIND_GRED,               0
 +GenericRandomEarlyDetection.GenericRIO,      config_parse_generic_random_early_detection_bool,         QDISC_KIND_GRED,               0
 +HierarchyTokenBucket.Parent,                 config_parse_qdisc_parent,                                QDISC_KIND_HTB,                0
 +HierarchyTokenBucket.Handle,                 config_parse_qdisc_handle,                                QDISC_KIND_HTB,                0
 +HierarchyTokenBucket.DefaultClass,           config_parse_hierarchy_token_bucket_default_class,        QDISC_KIND_HTB,                0
 +HierarchyTokenBucketClass.Parent,            config_parse_tclass_parent,                               TCLASS_KIND_HTB,               0
 +HierarchyTokenBucketClass.ClassId,           config_parse_tclass_classid,                              TCLASS_KIND_HTB,               0
 +HierarchyTokenBucketClass.Priority,          config_parse_hierarchy_token_bucket_u32,                  TCLASS_KIND_HTB,               0
 +HierarchyTokenBucketClass.Rate,              config_parse_hierarchy_token_bucket_rate,                 TCLASS_KIND_HTB,               0
 +HierarchyTokenBucketClass.CeilRate,          config_parse_hierarchy_token_bucket_rate,                 TCLASS_KIND_HTB,               0
  NetworkEmulator.Parent,                      config_parse_qdisc_parent,                                QDISC_KIND_NETEM,              0
  NetworkEmulator.Handle,                      config_parse_qdisc_handle,                                QDISC_KIND_NETEM,              0
  NetworkEmulator.DelaySec,                    config_parse_network_emulator_delay,                      QDISC_KIND_NETEM,              0
@@@ -312,9 -289,6 +313,9 @@@ NetworkEmulator.DelayJitterSec
  NetworkEmulator.LossRate,                    config_parse_network_emulator_rate,                       QDISC_KIND_NETEM,              0
  NetworkEmulator.DuplicateRate,               config_parse_network_emulator_rate,                       QDISC_KIND_NETEM,              0
  NetworkEmulator.PacketLimit,                 config_parse_network_emulator_packet_limit,               QDISC_KIND_NETEM,              0
 +StochasticFairBlue.Parent,                   config_parse_qdisc_parent,                                QDISC_KIND_SFB,                0
 +StochasticFairBlue.Handle,                   config_parse_qdisc_handle,                                QDISC_KIND_SFB,                0
 +StochasticFairBlue.PacketLimit,              config_parse_stochastic_fair_blue_u32,                    QDISC_KIND_SFB,                0
  StochasticFairnessQueueing.Parent,           config_parse_qdisc_parent,                                QDISC_KIND_SFQ,                0
  StochasticFairnessQueueing.Handle,           config_parse_qdisc_handle,                                QDISC_KIND_SFQ,                0
  StochasticFairnessQueueing.PerturbPeriodSec, config_parse_stochastic_fairness_queueing_perturb_period, QDISC_KIND_SFQ,                0
index 3047674212f41ac4eb0849cf4a9e36ec9eae7dc9,41f8245c22517e4c06084b3ed5b7d74dfb650e0e..40e4009bec2334f2245e7cb75ac92427d3449e70
@@@ -22,7 -22,6 +22,7 @@@
  #include "string-table.h"
  #include "string-util.h"
  #include "strv.h"
 +#include "tc.h"
  #include "util.h"
  
  /* Let's assume that anything above this number is a user misconfiguration. */
@@@ -155,7 -154,7 +155,7 @@@ int network_verify(Network *network) 
          Prefix *prefix, *prefix_next;
          Route *route, *route_next;
          FdbEntry *fdb, *fdb_next;
 -        QDisc *qdisc;
 +        TrafficControl *tc;
          Iterator i;
  
          assert(network);
                          routing_policy_rule_free(rule);
  
          bool has_root = false, has_clsact = false;
 -        ORDERED_HASHMAP_FOREACH(qdisc, network->qdiscs_by_section, i)
 -                if (qdisc_section_verify(qdisc, &has_root, &has_clsact) < 0)
 -                        qdisc_free(qdisc);
 +        ORDERED_HASHMAP_FOREACH(tc, network->tc_by_section, i)
 +                if (traffic_control_section_verify(tc, &has_root, &has_clsact) < 0)
 +                        traffic_control_free(tc);
  
          return 0;
  }
@@@ -452,11 -451,11 +452,12 @@@ int network_load_one(Manager *manager, 
                  .ipv6_accept_ra_use_onlink_prefix = true,
                  .ipv6_accept_ra_route_table = RT_TABLE_MAIN,
                  .ipv6_accept_ra_route_table_set = false,
 +                .ipv6_accept_ra_start_dhcp6_client = true,
  
                  .keep_configuration = _KEEP_CONFIGURATION_INVALID,
  
                  .can_triple_sampling = -1,
+                 .can_termination = -1,
                  .ip_service_type = -1,
          };
  
                                "TrafficControlQueueingDiscipline\0"
                                "CAN\0"
                                "QDisc\0"
 +                              "CAKE\0"
                                "ControlledDelay\0"
 +                              "PFIFO\0"
                                "FairQueueing\0"
                                "FairQueueingControlledDelay\0"
 +                              "GenericRandomEarlyDetection\0"
 +                              "HierarchyTokenBucket\0"
 +                              "HierarchyTokenBucketClass\0"
                                "NetworkEmulator\0"
 +                              "StochasticFairBlue\0"
                                "StochasticFairnessQueueing\0"
                                "TokenBucketFilter\0"
                                "TrivialLinkEqualizer\0",
@@@ -698,7 -691,7 +699,7 @@@ static Network *network_free(Network *n
          hashmap_free(network->prefixes_by_section);
          hashmap_free(network->route_prefixes_by_section);
          hashmap_free(network->rules_by_section);
 -        ordered_hashmap_free_with_destructor(network->qdiscs_by_section, qdisc_free);
 +        ordered_hashmap_free_with_destructor(network->tc_by_section, traffic_control_free);
  
          if (network->manager &&
              network->manager->duids_requesting_uuid)
@@@ -738,7 -731,7 +739,7 @@@ int network_get_by_name(Manager *manage
          return 0;
  }
  
 -int network_get(Manager *manager, sd_device *device,
 +int network_get(Manager *manager, unsigned short iftype, sd_device *device,
                  const char *ifname, char * const *alternative_names,
                  const struct ether_addr *address, const struct ether_addr *permanent_address,
                  enum nl80211_iftype wlan_iftype, const char *ssid, const struct ether_addr *bssid,
                                       network->match_path, network->match_driver,
                                       network->match_type, network->match_name, network->match_property,
                                       network->match_wlan_iftype, network->match_ssid, network->match_bssid,
 -                                     device, address, permanent_address,
 +                                     iftype, device, address, permanent_address,
                                       ifname, alternative_names, wlan_iftype, ssid, bssid)) {
                          if (network->match_name && device) {
                                  const char *attr;
index 0cb8303c9ed23b4b6521342cb9ea2fc389aa20fb,3bcf9ac493691bfffae6ac5f9d09780d96d46e0d..f8ecb1f687ba9ad0e132a3107f05998a1dc0b0a1
@@@ -30,6 -30,7 +30,6 @@@
  #include "networkd-routing-policy-rule.h"
  #include "networkd-util.h"
  #include "ordered-set.h"
 -#include "qdisc.h"
  #include "resolve-util.h"
  
  typedef enum IPv6PrivacyExtensions {
@@@ -125,7 -126,6 +125,7 @@@ struct Network 
          /* DHCPv6 Client support*/
          bool dhcp6_use_dns;
          bool dhcp6_use_ntp;
 +        bool dhcp6_without_ra;
          uint8_t dhcp6_pd_length;
          struct in6_addr dhcp6_pd_address;
  
          unsigned can_sample_point;
          usec_t can_restart_us;
          int can_triple_sampling;
+         int can_termination;
  
          AddressFamily ip_forward;
          bool ip_masquerade;
          bool ipv6_accept_ra_use_dns;
          bool ipv6_accept_ra_use_autonomous_prefix;
          bool ipv6_accept_ra_use_onlink_prefix;
 +        bool ipv6_accept_ra_start_dhcp6_client;
          bool active_slave;
          bool primary_slave;
          DHCPUseDomains ipv6_accept_ra_use_domains;
          Hashmap *prefixes_by_section;
          Hashmap *route_prefixes_by_section;
          Hashmap *rules_by_section;
 -        OrderedHashmap *qdiscs_by_section;
 +        OrderedHashmap *tc_by_section;
  
          /* All kinds of DNS configuration */
          struct in_addr_data *dns;
@@@ -304,7 -304,7 +305,7 @@@ int network_load_one(Manager *manager, 
  int network_verify(Network *network);
  
  int network_get_by_name(Manager *manager, const char *name, Network **ret);
 -int network_get(Manager *manager, sd_device *device, const char *ifname, char * const *alternative_names,
 +int network_get(Manager *manager, unsigned short iftype, sd_device *device, const char *ifname, char * const *alternative_names,
                  const struct ether_addr *mac, const struct ether_addr *permanent_mac,
                  enum nl80211_iftype wlan_iftype, const char *ssid,
                  const struct ether_addr *bssid, Network **ret);
index 5754e443575f65e71180d71866e843d3b9c89686,c1c667d237aa7d2a2ff1af474dc10d8e8a32a6ac..b97daca959e6d761e2d8f9291e1b703125610f5f
@@@ -107,7 -107,6 +107,7 @@@ UseDNS
  RapidCommit=
  ForceDHCPv6PDOtherInformation=
  PrefixDelegationHint=
 +WithoutRA=
  [Route]
  Destination=
  Protocol=
@@@ -187,7 -186,6 +187,7 @@@ OnLink
  PreferredLifetimeSec=
  AddressAutoconfiguration=
  ValidLifetimeSec=
 +Assign=
  [IPv6RoutePrefix]
  Route=
  LifetimeSec=
@@@ -200,6 -198,7 +200,7 @@@ SamplePoint
  BitRate=
  RestartSec=
  TripleSampling=
+ Termination=
  [Address]
  DuplicateAddressDetection=
  AutoJoin=
@@@ -251,7 -250,6 +252,7 @@@ Prefix
  UseDomains=
  RouteTable=
  UseDNS=
 +DHCPv6Client=
  UseAutonomousPrefix=
  UseOnLinkPrefix=
  BlackList=
@@@ -329,11 -327,6 +330,11 @@@ TargetSec
  IntervalSec=
  CEThresholdSec=
  ECN=
 +[CAKE]
 +Parent=
 +Handle=
 +Bandwidth=
 +Overhead=
  [TrafficControlQueueingDiscipline]
  Parent=
  NetworkEmulatorDelaySec=
@@@ -345,27 -338,3 +346,27 @@@ NetworkEmulatorPacketLimit
  Parent=
  Handle=
  Id=
 +[HierarchyTokenBucket]
 +Parent=
 +Handle=
 +DefaultClass=
 +[HierarchyTokenBucketClass]
 +Parent=
 +ClassId=
 +Priority=
 +Rate=
 +CeilRate=
 +[PFIFO]
 +Parent=
 +Handle=
 +PacketLimit=
 +[GenericRandomEarlyDetection]
 +Parent=
 +Handle=
 +VirtualQueues=
 +DefaultVirtualQueue=
 +GenericRIO=
 +[StochasticFairBlue]
 +Parent=
 +Handle=
 +PacketLimit=