<?xml version="1.0" encoding="UTF-8"?>
<!--
  USP Device:2.15 Root Object definition

  Copyright (c) 2010-2022, Broadband Forum

  The undersigned members have elected to grant the copyright to
  their contributed material used in this software:
    Copyright (c) 2017-2019, 2021 ARRIS Enterprises, LLC.

  Redistribution and use in source and binary forms, with or
  without modification, are permitted provided that the following
  conditions are met:

  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above
     copyright notice, this list of conditions and the following
     disclaimer in the documentation and/or other materials
     provided with the distribution.

  3. Neither the name of the copyright holder nor the names of its
     contributors may be used to endorse or promote products
     derived from this software without specific prior written
     permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  The above license is used as a license under copyright only.
  Please reference the Forum IPR Policy for patent licensing terms
  <https://www.broadband-forum.org/ipr-policy>.

  Any moral rights which are necessary to exercise under the above
  license grant are also deemed granted under this license.

  Comments or questions about this Broadband Forum data model should be
  directed to <info@broadband-forum.org>.
-->

<dm:document
    xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-9"
    xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-1-0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      urn:broadband-forum-org:cwmp:datamodel-1-9
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-1-9.xsd
      urn:broadband-forum-org:cwmp:datamodel-report-1-0
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-report-1-0.xsd"
    spec="urn:broadband-forum-org:tr-181-2-15-1-usp"
    file="tr-181-2-15-1-usp.xml">

  <import file="tr-069-biblio.xml" spec="urn:broadband-forum-org:tr-069"/>

  <import file="tr-106-types.xml" spec="urn:broadband-forum-org:tr-106">
    <dataType name="Alias" ref="_AliasUSP"/>
    <dataType name="IPAddress"/>
    <dataType name="JSONObject"/>
    <dataType name="MACAddress"/>
    <dataType name="StatsCounter32"/>
    <dataType name="StatsCounter64"/>
    <dataType name="URL"/>
    <dataType name="UUID"/>
  </import>

  <import file="tr-181-2-iot.xml"
      spec="urn:broadband-forum-org:tr-181-2-15-iot">
    <component name="IoT_NodeComponent"/>
    <component name="IoT_ProxiedDeviceExtensionComponent"/>
    <component name="IoT_ObjectComponent"/>
  </import>

  <import file="tr-181-2-common.xml"
      spec="urn:broadband-forum-org:tr-181-2-15-common">
    <component name="ADSLLineDiagnosticsInput"/>
    <component name="ADSLLineDiagnosticsOutput"/>
    <component name="SELTUERDiagnosticsInput"/>
    <component name="SELTUERDiagnosticsOutput"/>
    <component name="SELTQLNDiagnosticsInput"/>
    <component name="SELTQLNDiagnosticsOutput"/>
    <component name="SELTPDiagnosticsInput"/>
    <component name="SELTPDiagnosticsOutput"/>
    <component name="ATMF5LoopbackDiagnosticsInput"/>
    <component name="ATMF5LoopbackDiagnosticsOutput"/>
    <component name="HPNAPHYThroughputDiagnosticsInput"/>
    <component name="HPNAPHYThroughputDiagnosticsOutput"/>
    <component name="HPNAPerformanceMonitoringDiagnosticsInput"/>
    <component name="HPNAPerformanceMonitoringDiagnosticsOutput"/>
    <component name="GhnPHYThroughputDiagnosticsInput"/>
    <component name="GhnPHYThroughputDiagnosticsOutput"/>
    <component name="GhnPerformanceMonitoringDiagnosticsInput"/>
    <component name="GhnPerformanceMonitoringDiagnosticsOutput"/>
    <component name="UPAInterfaceMeasurementDiagnosticsInput"/>
    <component name="UPAInterfaceMeasurementDiagnosticsOutput"/>
    <component name="IPPingDiagnosticsInput"/>
    <component name="IPPingDiagnosticsOutput"/>
    <component name="IPTraceRouteDiagnosticsInput"/>
    <component name="IPTraceRouteDiagnosticsOutput"/>
    <component name="IPDownloadDiagnosticsCapabilities"/>
    <component name="IPDownloadDiagnosticsInput"/>
    <component name="IPDownloadDiagnosticsInput2"/>
    <component name="IPDownloadDiagnosticsOutput"/>
    <component name="IPUploadDiagnosticsCapabilities"/>
    <component name="IPUploadDiagnosticsInput"/>
    <component name="IPUploadDiagnosticsInput2"/>
    <component name="IPUploadDiagnosticsOutput"/>
    <component name="IPUDPEchoDiagnosticsInput"/>
    <component name="IPUDPEchoDiagnosticsCapabilities"/>
    <component name="IPUDPEchoDiagnosticsInput2"/>
    <component name="IPUDPEchoDiagnosticsOutput"/>
    <component name="IPLayerCapacityCapabilities"/>
    <component name="IPLayerCapacityInput"/>
    <component name="IPLayerCapacityOutput"/>
    <component name="IPServerSelectionDiagnosticsInput"/>
    <component name="IPServerSelectionDiagnosticsOutput"/>
    <component name="DNSLookupDiagnosticsInput"/>
    <component name="DNSLookupDiagnosticsOutput"/>
    <component name="SelfTestDiagnosticsOutput"/>
    <component name="SendMagicPacketInput"/>
    <component name="PacketCaptureDiagnosticsInput"/>
    <component name="PacketCaptureDiagnosticsOutput"/>
    <component name="RemoteMeasurementRequestInput"/>
    <component name="RemoteMeasurementRequestOutput"/>
    <component name="CCAMeasurementInput"/>
    <component name="CCAMeasurementOutput"/>
    <component name="CheckCredentialsInput"/>
    <component name="USPLocalAgent"/>
    <component name="STOMP"/>
    <component name="ManagementServerCommon"/>
    <model name="_Device:2.15" ref="Device:2.15"/>
  </import>

  <import file="tr-181-2-wifi.xml"
      spec="urn:broadband-forum-org:tr-181-2-15-wifi">
    <component name="WiFiNeighboringWiFiDiagnosticsOutput"/>
    <component name="BigScanResult"/>
    <component name="WiFiScanInput"/>
    <component name="WiFiChannelScanInput"/>
    <component name="SteerWiFiBackhaulInput"/>
    <component name="BTMRequestInput"/>
    <component name="DisassociateInput"/>
    <component name="AssociationEventData"/>
    <component name="DisassociationEventData"/>
    <component name="FailedConnectionEventData"/>
    <component name="MandatoryOpClassChannels"/>
    <component name="SpatialReuse"/>
  </import>

  <!-- Templates used in object and/or parameter descriptions -->

  <template id="MQTTReconnect">
    {{template|MQTTChange}} If the change needs to be applied immediately, the
    command {{command|ForceReconnect()}} has to be executed.
  </template>

  <template id="MQTTWillChange">
    {{template|MQTTChange}}

    If will handling is enabled (Parameter {{param|WillEnable}} is set to
    {{true}}) and the change needs to be applied immediately, the command
    {{command|ForceReconnect()}} has to be executed.
  </template>

  <template id="Reset">
    {{command|Reset()}} command is invoked
  </template>

  <template id="BULK-DATA-HTTP-REF">
    {{bibref|TR-369|Annex A}}
  </template>

  <template id="BULK-DATA-HTTP-QUERY-REF">
    {{bibref|TR-369|Annex A.1.1}}
  </template>

  <template id="BULK-DATA-HTTP-RETRY-REF">
    {{bibref|TR-369|Annex A.1.2.1}}
  </template>

  <template id="BULK-DATA-WILD-REF">
    {{bibref|TR-369|Annex A.2.1}}
  </template>

  <template id="BULK-DATA-CSV-REF">
    {{bibref|TR-369|Annex A.2.4}}
  </template>

  <template id="BULK-DATA-JSON-REF">
    {{bibref|TR-369|Annex A.2.5}}
  </template>

  <template id="BULK-DATA-OPT-SOLNS">
    The USPEventNotif solution is based on sending a
    {{event|Profile.{i}.Push!}} Event Notification via USP {{bibref|TR-369}}.
  </template>

  <template id="BULK-DATA-TIMESTAMP"/>

  <template id="FAP-GPS-RESET">
    This value is retained across reboots and is only reset after another scan
    completes successfully or {{command|GPSReset()}} is invoked.
  </template>

  <template id="PERIODICSTATISTICS-FORCESAMPLE">
    {{command|Device.PeriodicStatistics.SampleSet.{i}.ForceSample()}}
  </template>

  <template id="USP-REQUEST-CHALLENGE">
    {{command|#.RequestChallenge()}}
  </template>

  <template id="USP-CHALLENGE-RESPONSE">
    {{command|#.ChallengeResponse()}}
  </template>

  <template id="XMPP-REF"/>

  <template id="XMPP-APP-REF"/>

  <template id="VENDORCONFIGFILE-DESC">
    Whenever the Agent successfully restores a configuration file as a
    result of the {{command|Restore()}} Command, the Agent MUST update this
    Object.
  </template>

  <template id="VENDORCONFIGFILE-NAME">
    Otherwise, the value of this parameter MUST be set to the value of
    the Command input argument {{param|Restore().Input.TargetFileName}}
    used to restore this configuration file.
  </template>

  <component name="SetTrafficSeparation">
    <command name="SetTrafficSeparation()" async="true" version="2.15">
      <description>
        This command allows or disallows EasyMesh traffic separation
        {{bibref|EasyMesh|Section 19.1}}. If {{param|Enable}} is {{true}} then
        the parameters defining traffic separation details can also be input
        with this command.

        This command applies to all EasyMesh Agent devices in the Wi-Fi
        network.

        This command can configure
        {{object|#.Device.{i}.SSIDtoVIDMapping.{i}.}} and
        {{param|#.Device.{i}.TrafficSeparationAllowed}}.

        Status is to be returned after implementation or failed implementation
        on all agents/devices/APs in this Multi-AP network.
      </description>
      <input>
        <parameter name="Enable" mandatory="true" version="2.15">
          <description>
            : {{true}}: EasyMesh traffic separation is allowed.

            : {{false}}: EasyMesh traffic separation is not allowed.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>

        <object name="SSIDtoVIDMapping.{i}." minEntries="0"
            maxEntries="unbounded" version="2.15">
          <description>
            The Service Set Identifier (SSID) to VLAN ID (VID) mapping for
            EasyMesh traffic separation {{bibref|EasyMesh}}. Consists of a
            table of pairs of {{param|SSID}} and corresponding {{param|VID}}.

            If this input is not provided, then existing
            {{object|##.Device.{i}.SSIDtoVIDMapping.{i}.}} apply.
          </description>
          <uniqueKey>
            <parameter ref="SSID"/>
          </uniqueKey>

          <parameter name="SSID">
            <description>
              The SSID name.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="VID">
            <description>
              The VLAN ID (VID).
            </description>
            <syntax>
              <unsignedInt>
                <range maxInclusive="4095"/>
              </unsignedInt>
            </syntax>
          </parameter>

        </object>

      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to allow or disallow
            EasyMesh traffic separation. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success">
                <description>
                  Indicates successful implementation on all agents/devices/APs
                  in this Multi-AP network.
                </description>
              </enumeration>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetServicePrioritization">

    <command name="SetServicePrioritization()" async="true" version="2.15">
      <description>
        This command allows or disallows EasyMesh service prioritization
        {{bibref|EasyMesh|Section 20}}. If {{param|Enable}} is {{true}} then
        the parameters defining service prioritization details can also be
        input with this command.

        This command can configure {{object|#.Device.{i}.SPRule.{i}.}},
        {{param|#.Device.{i}.DSCPMap}} and
        {{param|#.Device.{i}.ServicePrioritizationAllowed}}.

        This command applies to all EasyMesh Agent devices in the Wi-Fi
        network.

        Status is to be returned after implementation or failed implementation
        on all agents/devices/APs in this Multi-AP network.
      </description>
      <input>
        <parameter name="Enable" mandatory="true" version="2.15">
          <description>
            : {{true}}: EasyMesh service prioritization is allowed.

            : {{false}}: EasyMesh service prioritization is not allowed.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>

        <object name="SPRule.{i}." minEntries="0" maxEntries="unbounded"
            version="2.15">
          <description>
            This object describes a list of service prioritization (SP) rules
            {{bibref|EasyMesh}}.

            If this input is not provided, then existing
            {{object|##.Device.{i}.SPRule.{i}.}} apply.
          </description>
          <uniqueKey>
            <parameter ref="ID"/>
          </uniqueKey>

          <parameter name="ID" version="2.15">
            <description>
              Service prioritization rule Identifier.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="Precedence" version="2.15">
            <description>
              Rule Precedence – higher number means higher priority.
            </description>
            <syntax>
              <unsignedInt>
                <range maxInclusive="254"/>
              </unsignedInt>
            </syntax>
          </parameter>

          <parameter name="Output" version="2.15">
            <description>
              Rule Output. The value of, or method used to select the 802.1Q
              C-TAG Priority Code Point (PCP) output value.
            </description>
            <syntax>
              <unsignedInt>
                <range maxInclusive="9"/>
              </unsignedInt>
            </syntax>
          </parameter>

          <parameter name="AlwaysMatch" version="2.15">
            <description>
              Indicates if the rule always matches.
            </description>
            <syntax>
              <boolean/>
            </syntax>
          </parameter>
        </object>

        <parameter name="DSCPMap" version="2.15">
          <description>
            A hexadecimal string of 64 PCP values (one octet per value)
            corresponding to the DSCP markings 0x00 to 0x3F, ordered by
            increasing DSCP value. Each octet is in the range 0x00 – 0x07. This
            is used to select a PCP value if a Service Prioritization Rule
            specifies Rule Output: 0x08.

            If this input is not provided, then the existing
            {{param|#.Device.{i}.DSCPMap}} applies.
          </description>
          <syntax>
            <hexBinary>
              <size maxLength="64"/>
            </hexBinary>
          </syntax>
        </parameter>

      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to allow or disallow
            EasyMesh service prioritization. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success">
                 <description>
                   Indicates successful implementation on all agents/devices/APs
                   in this Multi-AP network
                 </description>
              </enumeration>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="ChannelScanRequest">

    <command name="ChannelScanRequest()" async="true" version="2.15">
      <description>
        Request to initiate a channel scan. The operating classes, and list of
        channels for each operating class, are input. For 2.4GHz and 5GHz
        bands, only 20MHz operating classes are valid inputs.

        This command should result in updating
        {{object|Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.}}
      </description>
      <input>
        <component ref="MandatoryOpClassChannels"/>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to initiate a channel
            scan. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="RadioEnable">

    <command name="RadioEnable()" async="true" version="2.15">
      <description>
        Request to enable or disable this radio.

        This command can result in updating {{param|Enabled}}.
      </description>
      <input>
        <parameter name="Enable" mandatory="true" version="2.15">
          <description>
            : {{true}}: this radio is to be enabled.

            : {{false}}: this radio is to be disabled.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to enable or disable
            this radio. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="WiFiRestart">

    <command name="WiFiRestart()" async="true" version="2.15">
      <description>
        Request a restart of the Wi-Fi subsystem.
      </description>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to restart the Wi-Fi
            subsystem. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetSTASteeringState">

    <command name="SetSTASteeringState()" async="true" version="2.15">
      <description>
        Disallow or allow EasyMesh {{bibref|EasyMesh}} controller-initiated
        station (STA) steering on this device.

        This command can configure {{param|STASteeringState}}.
      </description>
      <input>
        <parameter name="Disallowed" mandatory="true" version="2.15">
          <description>
            : {{true}}: EasyMesh controller-initiated station steering
              disallowed;

            : {{false}}: EasyMesh controller-initiated station steering
              allowed.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to allow or disallow
            EasyMesh controller-initiated station steering. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetTxPowerLimit">

    <command name="SetTxPowerLimit()" async="true" version="2.15">
      <description>
        This command sets the upper limit on transmit power
        {{param|TransmitPowerLimit}} for this radio and
        {{param|OperatingClass}}.

        This command can configure
        {{param|#.CurrentOperatingClassProfile.{i}.TransmitPowerLimit}}.
      </description>

      <input>

        <parameter name="TransmitPowerLimit" mandatory="true">
          <description>
            This is the upper limit on nominal transmit Equivalent
            Isotropically Radiated Power (EIRP) that this radio can use for the
            {{param|OperatingClass}}. In units of decibels relative to 1 mW
            {{units}}.
          </description>
          <syntax>
            <int>
              <range minInclusive="-128" maxInclusive="127"/>
              <units value="dBm"/>
            </int>
          </syntax>
        </parameter>

        <parameter name="OperatingClass" mandatory="true">
          <description>
            The Operating Class per {{bibref|802.11-2020|Table E-4}} of the
            radio. Note that the Operating Class identifies the band and
            channel width.
          </description>
          <syntax>
            <unsignedInt>
              <range maxInclusive="255"/>
            </unsignedInt>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to set a transmit
            power limit. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetPreferredBackhauls">
    <command name="SetPreferredBackhauls()" async="true" version="2.15">
      <description>
        This command sets preferred backhaul links for EasyMesh
        {{bibref|EasyMesh}} backhaul.
      </description>
      <input>
        <object name="PreferredBackhauls.{i}." minEntries="1"
            maxEntries="unbounded" version="2.15">
          <description>
            Indicates preferred backhaul links for EasyMesh {{bibref|EasyMesh}}
            backhaul. Consists of a table of pairs of MAC addresses. For a
            WI-Fi connection pair, an entry contains the BSSID and bSTA MAC
            address. For a wired connection pair, an entry contains the
            interface MAC addresses. This command applies to all EasyMesh Agent
            devices in the Wi-Fi network.

            Status is to be returned after implementation or failed
            implementation on all agents/devices/APs in this Multi-AP network.
          </description>
          <uniqueKey>
            <parameter ref="BackhaulMACAddress"/>
          </uniqueKey>

          <parameter name="BackhaulMACAddress" mandatory="true">
            <description>
              The MAC address of the BSS, or similar Ethernet interface, on
              this preferred backhaul link.
            </description>
            <syntax>
              <dataType ref="MACAddress"/>
            </syntax>
          </parameter>

          <parameter name="bSTAMACAddress" mandatory="true">
            <description>
              The MAC address of the backhaul STA (bSTA), or similar Ethernet
              interface, on this preferred backhaul link.
            </description>
            <syntax>
              <dataType ref="MACAddress"/>
            </syntax>
          </parameter>
        </object>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to set preferred
            backhaul links. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success">
                <description>
                  Indicates successful implementation of all preferred backhaul
                  links in this Multi-AP network.
                </description>
              </enumeration>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetSSID">
    <command name="SetSSID()" async="true" version="2.15">
      <description>
        This command specifies an {{param|SSID}} for fronthaul use across this
        Wi-Fi Multi-AP network, or on this single-AP. Also specifies the
        {{param|PassPhrase}}, whether to add or remove this SSID, and specifies
        the {{param|Band}} for each {{param|SSID}}.

        This command applies to all EasyMesh Agent devices in the Wi-Fi
        network, or to this AP in the single-AP case.

        This command can be used to set only {{param|PassPhrase}} if
        {{param|SSID}} matches an existing {{param|#.SSID.{i}.SSID}} for this
        {{param|Band}} for fronthaul use across this Wi-Fi Multi-AP network.

        This command can configure {{object|#.SSID.{i}}}.

        Status is to be returned after implementation or failed implementation
        on all agents/devices/APs in this Multi-AP network.
      </description>

      <input>

        <parameter name="SSID" mandatory="true">
          <description>
            The SSID for fronthaul use across this Wi-Fi Multi-AP network.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="AddRemove" mandatory="true">
          <description>
            Indicates whether to add or remove this {{param|SSID}}.

            : {{true}}: add this SSID,

            : {{false}}: remove this SSID.

            Status is to be returned after implementation or failed
            implementation on all agents/devices/APs in this Multi-AP network.

            If set to {{true}}, and this {{param|SSID}} already exists for this
            {{param|Band}}, then there is no change to the {{param|SSID}}, but
            the {{param|PassPhrase}} is set.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="PassPhrase">
          <description>
            The WPA2 Passphrase and/or SAE password for this {{param|SSID}}.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

       <parameter name="Band">
          <description>
            The band(s) for which this {{param|SSID}} applies. {{enum}}

            If this input is not provided, then a value of {{enum|All}}
            applies.
          </description>
          <syntax>
            <list/>
            <string>
              <enumeration value="All">
                <description>Applies to all bands</description>
              </enumeration>
              <enumeration value="2.4">
                <description>2.4 GHz band</description>
              </enumeration>
              <enumeration value="5">
                <description>The entire 5 GHz band</description>
              </enumeration>
              <enumeration value="6">
                <description>The entire 6 GHz band</description>
              </enumeration>
              <enumeration value="5_UNII_1">
                <description>5 GHz UNII-1 band, 5.15 to 5.25 GHz</description>
              </enumeration>
              <enumeration value="5_UNII_2">
                <description>5 GHz UNII-2 band, 5.25 to 5.725 GHz</description>
              </enumeration>
              <enumeration value="5_UNII_3">
                <description>5 GHz UNII-3 band, 5.725 to 5.85 GHz</description>
              </enumeration>
              <enumeration value="5_UNII_4">
                <description>5 GHz UNII-4 band, 5.85 to 5.925 GHz</description>
              </enumeration>
              <enumeration value="6_UNII_5">
                <description>
                  6 GHz UNII-5 band, 5.925 to 6.425 GHz
                </description>
              </enumeration>
              <enumeration value="6_UNII_6">
                <description>
                  6 GHz UNII-6 band, 6.425 to 6.525 GHz
                </description>
              </enumeration>
              <enumeration value="6_UNII_7">
                <description>
                  5 GHz UNII-7 band, 6.525 to 6.875 GHz
                </description>
              </enumeration>
              <enumeration value="6_UNII_8">
                <description>
                  5 GHz UNII-8 band, 6.875 to 7.125 GHz
                </description>
              </enumeration>
            </string>
          </syntax>
        </parameter>

      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to set the SSID.
            {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success">
                <description>
                  Indicates successful implementation on all agents/devices/APs
                  in this Multi-AP network
                </description>
              </enumeration>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetDFSState">

    <command name="SetDFSState()" async="true" version="2.15">
      <description>
        Enables/disables the use of Dynamic Frequency Selection (DFS) channels
        on this device.

        This command can configure {{param|#DFSEnable}}.
      </description>
      <input>
        <parameter name="DFSEnable" mandatory="true" version="2.15">
          <description>
            : {{true}}: the use of Dynamic Frequency Selection (DFS) channels
              is allowed;

            : {{false}}: the use of Dynamic Frequency Selection (DFS) channels
              is disallowed;
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to allow or disallow
            the use of Dynamic Frequency Selection (DFS) channels. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetAnticipatedChannelPreference">

    <command name="SetAnticipatedChannelPreference()" async="true"
        version="2.15">
      <description>
        This command requests to set the Anticipated Channel Preference. The
        operating classes, and list of channels for each operating class, are
        input. For 2.4GHz and 5GHz bands, only 20MHz operating classes are
        valid inputs.
      </description>
      <input>
        <component ref="MandatoryOpClassChannels"/>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to set the anticipated
            channel preference. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetMSCSDisallowed">
    <command name="SetMSCSDisallowed()" async="true" version="2.15">
      <description>
        This command disallows Mirrored Stream Classification Service (MSCS)
        service prioritization to particular STA(s). {{bibref|EasyMesh}}

        This command applies to all EasyMesh Agent devices in the Wi-Fi
        network.

        This command configures {{param|#.MSCSDisallowedStaList}}.
      </description>
      <input>
        <parameter name="MSCSDisallowedStaList" mandatory="true"
            version="2.15">
          <description>
            List of STAs for which MSCS operation is disallowed.
          </description>
          <syntax>
            <list/>
            <dataType ref="MACAddress"/>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to disallow MSCS
            service prioritization to particular STA(s) {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetSCSDisallowed">
    <command name="SetSCSDisallowed()" async="true" version="2.15">
      <description>
        This command disallows Stream Classification Service (SCS) service
        prioritization to particular STA(s). {{bibref|EasyMesh}}

        This command applies to all EasyMesh Agent devices in the Wi-Fi
        network.

        This command can configure {{param|#.SCSDisallowedStaList}}.
      </description>
      <input>
        <parameter name="SCSDisallowedStaList" mandatory="true" version="2.15">
          <description>
            List of STAs for which SCS operation is disallowed.
          </description>
          <syntax>
            <list/>
            <dataType ref="MACAddress"/>
          </syntax>
        </parameter>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to disallow SCS
            service prioritization to particular STA(s). {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetQMDescriptors">
    <command name="SetQMDescriptors()" async="true" version="2.15">
      <description>
        This command configures each of the descriptor elements for Mirrored
        Stream Classification Service (MSCS), Stream Classification Service
        (SCS), or QoS Management. {{bibref|EasyMesh}}.

        This command can configure {{object|#QMDescriptor.{i}.}}.

        If {{param|QMDescriptor.{i}.DescriptorElement}} is for SCS or MSCS, the
        AP adds/changes/removes the rule according to the descriptor element
        request type.

        If a {{param|QMDescriptor.{i}.DescriptorElement}} is a QoS Management
        DSCP Policy, the AP sends it to the STA identified by the
        {{param|QMDescriptor.{i}.ClientMAC}}.
      </description>
      <input>
        <object name="QMDescriptor.{i}." minEntries="1" maxEntries="unbounded"
            version="2.15">
          <description>
            This object contains a table of {{param|DescriptorElement}}.
          </description>
          <uniqueKey>
            <parameter ref="ClientMAC"/>
          </uniqueKey>

          <parameter name="ClientMAC" mandatory="true">
            <description>
              MAC address of the Station (STA) for which this descriptor
              applies.
            </description>
            <syntax>
              <dataType ref="MACAddress"/>
            </syntax>
          </parameter>
          <parameter name="DescriptorElement" mandatory="true">
            <description>
              The descriptor element. One of:

              : MSCS descriptor element (as described in
                {{bibref|802.11-2020|Section 9.4.2.243}}, or

              : SCS descriptor element (as described in
                {{bibref|802.11-2020|Section 9.4.2.121}}, or

              : QoS Management DSCP policy element (as described in
                {{bibref|RFC8325|Section 5.3}}).
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </object>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to configure
            descriptor elements. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="SetSpatialReuse">
    <command name="SetSpatialReuse()" async="true" version="2.15">
      <description>
        This command sets the spatial reuse configuration of this radio.
        Applies only to Wi-Fi 6 and possibly later generations of radios.

        Acronyms: Spatial Reuse Group (SRG), Overlapping Basic Service Set
        (OBSS), Preamble Detection (PD).

        This command can configure {{object|#SpatialReuse.}}.

        If some input parameter(s) are not provided, then the corresponding
        existing parameter in {{object|#SpatialReuse.}} applies.
      </description>
      <input>
        <component ref="SpatialReuse"/>
      </input>

      <output>
        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to set the spatial
            reuse configuration of this radio. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
      </output>
    </command>
  </component>

  <component name="ChannelScan">

    <command name="ChannelScan()" async="true" version="2.15">
      <description>
        This parameter represents a request to initiate a channel scan on this
        radio on the given channel using a specific {{param|DwellTime}}. This
        command should result in updating
        {{object|Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.}}
      </description>
      <input>
        <component ref="WiFiChannelScanInput"/>
      </input>
      <output>

        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to initiate a channel
            scan. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Not_Ready"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Interface_Down"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
        <component ref="BigScanResult" version="2.15"/>
      </output>
    </command>
  </component>

  <component name="FullScan">

    <command name="FullScan()" async="true" version="2.15">
      <description>
        This parameter represents a request to initiate a full scan on this
        radio, including all channels supported by this radio, for a specific
        {{param|DwellTime}} and {{param|HomeTime}}. This command will result in
        updating
        {{object|Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.ScanResult.}}
      </description>
      <input>
        <component ref="WiFiScanInput"/>
      </input>
      <output>

        <parameter name="Status">
          <description>
            Indicates the type of outcome of the request to initiate a full
            band scan. {{enum}}
          </description>
          <syntax>
            <string>
              <enumeration value="Success"/>
              <enumeration value="Error_Not_Ready"/>
              <enumeration value="Error_Timeout"/>
              <enumeration value="Error_Invalid_Input"/>
              <enumeration value="Error_Interface_Down"/>
              <enumeration value="Error_Other" optional="true"/>
            </string>
          </syntax>
        </parameter>
        <component ref="BigScanResult" version="2.15"/>
      </output>
    </command>
  </component>

  <model name="Device:2.15" base="_Device:2.15">
    <object base="Device." access="readOnly" minEntries="1" maxEntries="1"
        version="2.0">

      <parameter name="ProxiedDeviceNumberOfEntries" access="readOnly"
          version="2.12">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <command name="Reboot()" version="2.12">
        <description>
          Reboot the entity associated with the containing {{object}}.
        </description>
      </command>

      <event name="Boot!" version="2.12">
        <description>
          Boot event indicating that the {{object}} was rebooted.
        </description>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the boot, or {{empty}}
            if the boot was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="Cause">
          <description>
            The cause of the boot.
          </description>
          <syntax>
            <string>
              <enumeration value="LocalReboot">
                <description>
                  A {{object}} Event that was the result of a reboot triggered
                  locally on the Device (NOT as a result of a
                  {{command|#.Reboot()}} Command or other remote trigger, e.g.
                  another remote management protocol)
                </description>
              </enumeration>
              <enumeration value="RemoteReboot">
                <description>
                  A {{object}} Event that was the result of a reboot triggered
                  via the {{command|#.Reboot()}} Command or other remote
                  trigger, e.g. another remote management protocol
                </description>
              </enumeration>
              <enumeration value="FactoryReset" version="2.15">
                <description>
                  A {{object}} Event that was the result of a factory reset
                  triggered locally on the Device or remotely (as a result of a
                  {{command|#.FactoryReset()}} Command or other remote trigger,
                  e.g. another remote management protocol), which is to be used
                  when the Agent cannot differentiate between local and remote
                </description>
              </enumeration>
              <enumeration value="LocalFactoryReset">
                <description>
                  A {{object}} Event that was the result of a factory reset
                  triggered locally on the Device (NOT as a result of a
                  {{command|#.FactoryReset()}} Command or other remote trigger,
                  e.g. another remote management protocol)
                </description>
              </enumeration>
              <enumeration value="RemoteFactoryReset">
                <description>
                  A {{object}} Event that was the result of a factory reset
                  triggered via the {{command|#.FactoryReset()}} Command or
                  other remote trigger, e.g. another remote management protocol
                </description>
              </enumeration>
            </string>
          </syntax>
        </parameter>

        <parameter name="FirmwareUpdated">
          <description>
            {{true}} if the firmware was updated as a result of the boot that
            caused this Event Notification; otherwise {{false}}.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>

        <parameter name="ParameterMap">
          <description>
            Boot parameters configured via the recipient Controller's
            {{object|.LocalAgent.Controller.{i}.BootParameter}} table.

            Formatted as a {{datatype|expand}}
          </description>
          <syntax>
            <dataType ref="JSONObject"/>
          </syntax>
        </parameter>
      </event>

      <command name="FactoryReset()">
        <description>
          Factory reset the entity associated with the containing {{object}}.
        </description>
      </command>

      <command name="SelfTestDiagnostics()" async="true" version="2.12">
        <description>
          This diagnostics test is vendor-specific and MAY include testing
          hardware, software, and/or firmware.
        </description>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SelfTestDiagnosticsOutput"/>
        </output>
      </command>

      <command name="PacketCaptureDiagnostics()" async="true" version="2.13">
        <description>
          This diagnostic command is used to record packet capture data on a
          valid (layer 2 or above) interface in libpcap or pcapng format.
        </description>
        <input>
          <component ref="PacketCaptureDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="PacketCaptureDiagnosticsOutput"/>
        </output>
      </command>

      <command name="ScheduleTimer()" async="true" version="2.12">
        <description>
          Schedule an async timer operation. A scheduled timer MUST persist
          across reboots.

          NOTE: This command changed from synchronous to asynchronous in
          version 2.14.
        </description>
        <input>

          <parameter name="DelaySeconds" mandatory="true">
            <description>
              The number of {{units}} from the time this command is invoked
              until the Agent responds with an OperationComplete Event
              notification (based on the associated subscriptions).
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo." access="readOnly" minEntries="1"
        maxEntries="1" version="2.12">

      <parameter base="ManufacturerOUI" access="readOnly">
        <description action="append">
          Any change would indicate that it's a new Agent and would therefore
          require a {{event|#.Boot!}} Event with a
          {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated value in the
          {{param|#.Boot!.Cause}} argument.
        </description>
      </parameter>

      <parameter name="FriendlyName" access="readWrite">
        <description>
          The friendly name of the device.

          In {{bibref|TR-369}} the friendly name is used during the
          advertisement of an endpoint - see section IANA-Registered USP
          Service Names of {{bibref|TR-369}}.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="CID" access="readOnly"
          dmr:previousParameter="ManufacturerOUI">
        <description>
          Company identifier assigned and registered by the IEEE Registration
          Authority to the entity responsible for this Agent. Represented as a
          six hexadecimal-digit value using all upper-case letters and
          including any leading zeros. {{pattern}}

          This value MUST remain fixed over the lifetime of the Agent,
          including across firmware updates. Any change would indicate that
          it's a new Agent and would therefore require a {{event|#.Boot!}}
          Event with a {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated
          value in the {{param|#.Boot!.Cause}} argument.
        </description>
        <syntax>
          <string>
            <size minLength="6" maxLength="6"/>
            <pattern value="[0-9A-F]{6}"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="PEN" access="readOnly">
        <description>
          Private Enterprise Number assigned and registered by IANA to the
          entity responsible for this Agent. Represented as a decimal encoding
          of the IANA-assinged number.

          This value MUST remain fixed over the lifetime of the Agent,
          including across firmware updates. Any change would indicate that
          it's a new Agent and would therefore require a {{event|#.Boot!}}
          Event with a {{enum|LocalFactoryReset|#.Boot!.Cause}} enumerated
          value in the {{param|#.Boot!.Cause}} argument.
        </description>
        <syntax>
          <string>
            <size maxLength="10"/>
          </string>
        </syntax>
      </parameter>
    </object>

    <object base="Device.BulkData." access="readOnly" minEntries="1"
        maxEntries="1">

      <parameter base="Protocols" access="readOnly" version="2.5">
        <syntax>
          <list/>
          <string>
            <enumeration value="Streaming" status="deprecated">
              <description>
                IPDR Streaming Protocol {{bibref|IPDR-SP}}
                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}
              </description>
            </enumeration>
            <enumeration value="File" status="deprecated">
              <description>
                IPDR File Transfer Protocol {{bibref|IPDR-FTP}}
                {{deprecated|2.15|because IPDR Bulk Data Collection is not
                supported in USP}}
              </description>
            </enumeration>
            <enumeration value="HTTP"/>
            <enumeration value="MQTT"/>
            <enumeration value="USPEventNotif">
              <description>
                User Services Platform (USP - {{bibref|TR-369|Annex A}}) Event
                Notification
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter base="EncodingTypes" access="readOnly" version="2.5">
        <syntax>
          <list/>
          <string>
            <enumeration value="XML" status="deprecated">
              <description>
                Used with the IPDR Streaming and File Protocols.
                {{bibref|IPDR-XML}} {{deprecated|2.15|because IPDR Bulk Data
                Collection is not supported in USP}}
              </description>
            </enumeration>
            <enumeration value="XDR" status="deprecated">
              <description>
                Used with the IPDR Streaming and File Protocols.
                {{bibref|IPDR-XDR}} {{deprecated|2.15|because IPDR Bulk Data
                Collection is not supported in USP}}
              </description>
            </enumeration>
            <enumeration value="CSV">
              <description action="replace">
                Comma Separated Values. Used with the HTTP and USPEventNotif
                Protocols. {{bibref|RFC4180}}
              </description>
            </enumeration>
            <enumeration value="JSON">
              <description action="replace">
                JavaScript Object Notation. Used with the HTTP and
                USPEventNotif Protocols. {{bibref|RFC7159}}
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>
    </object>

    <object base="Device.BulkData.Profile.{i}." access="readWrite"
        numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable"
        minEntries="0" maxEntries="unbounded">

      <parameter name="Controller" access="readOnly"
          dmr:previousParameter="Name" version="2.12">
        <description>
          {{reference|the {{object|Device.LocalAgent.Controller.}} instance
          that created {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter also defines the set
          of permissions to use when generating the Bulk Data report.
          Furthermore, only the USP Controller referenced by this parameter
          will receive a {{event|Push!}} Event (assuming it has an associated
          Subscription) when the Profile has {{param|Protocol}} configured to
          {{enum|USPEventNotif|Protocol}}, even if another USP Controller has
          an associated Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong"
                targetParent="Device.LocalAgent.Controller." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="StreamingHost" access="readWrite" status="deprecated">
        <description>
          This is the host name or IP Address of the IPDR Collector to be used
          by the CPE to stream bulk data records if this collection profile is
          configured for the IPDR Streaming Protocol {{bibref|IPDR-SP}} (the
          {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="StreamingPort" access="readWrite" status="deprecated">
        <description>
          This is the port number of the IPDR Collector to be used by the CPE
          to stream bulk data records if this collection profile is configured
          for the IPDR Streaming Protocol {{bibref|IPDR-SP}} (the
          {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0" maxInclusive="65535"/>
          </unsignedInt>
          <default type="object" value="4737"/>
        </syntax>
      </parameter>

      <parameter name="StreamingSessionID" access="readWrite"
          status="deprecated">
        <description>
          This is the unique identification of an IPDR Session to be used when
          this collection profile is configured for the IPDR Streaming Protocol
          {{bibref|IPDR-SP}} (the {{param|Protocol}} parameter has a value of
          {{enum|Streaming|#.Protocols}}).

          A Controller MUST NOT configure multiple IPDR Streaming Protocol
          collection profiles with the same {{param}}. Doing so MUST cause the
          CPE to fail the SetParameterValues.

          Within the IPDR Streaming Protocol specification the Session ID has a
          type of a single 'char', but we are restricting the range even
          further (ASCII values of '0' - '9' and 'A' - 'Z').

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="48" maxInclusive="57"/>
            <range minInclusive="65" maxInclusive="90"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="FileTransferURL" access="readWrite" status="deprecated">
        <description>
          This is the {{datatype}} within the CPE that is used by an IPDR
          Collector to retrieve the IPDRDocs when this collection profile is
          configured for the IPDR File Transfer Protocol {{bibref|IPDR-FTP}}
          (the {{param|Protocol}} parameter has a value of
          {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <dataType ref="URL"/>
        </syntax>
      </parameter>

      <parameter name="FileTransferUsername" access="readWrite"
          status="deprecated">
        <description>
          Username used for authentication of the {{param|FileTransferURL}}.

          This is the {{param}} that the IPDR Collector uses to access the CPE
          when this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="FileTransferPassword" access="readWrite"
          status="deprecated">
        <description>
          Password used for authentication of the {{param|FileTransferURL}}.

          This is the {{param}} that the IPDR Collector uses to access the CPE
          when this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}).

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax hidden="true">
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ControlFileFormat" access="readWrite"
          status="deprecated">
        <description>
          If this collection profile is configured for the IPDR File Transfer
          Protocol {{bibref|IPDR-FTP}} (the {{param|Protocol}} parameter has a
          value of {{enum|File|#.Protocols}}) then the control file names will
          be of the following format:

          :
            &lt;ControlFilePrefix&gt;_&lt;ControlFilePolicy&gt;.&lt;ControlFileSuffix&gt;

          Where the following rules apply:

          * ControlFilePrefix MUST NOT contain an underscore '_' or any other
            character not suitable for a file name.

          * ControlFilePolicy MUST contain one or more 'N' characters, where
            the number of 'N' characters denotes the number of digits in the
            sequence number, including leading zeros as necessary to match the
            number of 'N' characters.

          * ControlFileSuffix is a file extension.

          For example, BulkData_NNNN.log where "BulkData" would be the prefix,
          "NNNN" would be the policy, and "log" would be the suffix. Files
          adhering to this file format would look like: BulkData_0000.log,
          BulkData_0001.log, etc.

          {{deprecated|2.15|because IPDR Bulk Data Collection is not supported
          in USP}}
        </description>
        <syntax>
          <string>
            <size maxLength="128"/>
          </string>
        </syntax>
      </parameter>

      <event name="Push!" version="2.13">
        <description>
          Bulk Data Push event for delivering a bulk data report within a USP
          Notification message.
        </description>

        <parameter name="Data">
          <description>
            The contents of the bulk data report in the configured CSV or JSON
            Encoding Type.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>

      <command name="ForceCollection()" version="2.15">
        <description>
          Start the bulk data collection and transmission as defined in this
          profile immediately, regardless of the current values of the
          {{param|Enable}} and {{param|ReportingInterval}} parameters.

          This command can be used for testing of the bulk data collection
          mechanism and profile but also to preempt any regular schedule
          without affecting it.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent." access="readOnly" minEntries="1"
        maxEntries="1" version="2.12">
      <description>
        This object contains general information about the USP Agent itself.
        For information related to the Device that hosts the Agent, please
        reference the {{object|.DeviceInfo}} object.

        NOTE: The Vendor Log File table ({{object|.DeviceInfo.VendorLogFile}})
        details are located on the {{object|.DeviceInfo}} object.
      </description>

      <component ref="USPLocalAgent" version="2.12"/>

      <event name="Periodic!" dmr:previousParameter="UpTime">
        <description>
          Periodic event configured via the recipient Controller's
          {{param|Controller.{i}.PeriodicNotifInterval}} and
          {{param|Controller.{i}.PeriodicNotifTime}} parameters.
        </description>
      </event>

      <event name="WakeUp!">
        <description>
          Wake-up event.
        </description>
      </event>

      <event name="TransferComplete!">
        <description>
          Indicates that a file has been transferred to or from the Device. The
          event is sent when the transfer has either completed successfully (in
          which case {{param|FaultCode}} will be zero), or else has failed (in
          which case {{param|FaultCode}} will be non-zero and
          {{param|FaultString}} will give further details).

          The file transfer can be requested via a USP operation or via some
          other mechanism. If it's requested via a USP operation
          {{param|Command}}, {{param|CommandKey}} and {{param|Requestor}} give
          further details.
        </description>

        <parameter name="Command">
          <description>
            The Path Name of the command that requested the transfer, or
            {{empty}} if the transfer was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the transfer, or
            {{empty}} if the transfer was not requested via a USP operation.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="Requestor">
          <description>
            The Endpoint ID of the Controller that requested the transfer, or
            {{empty}} if no Controller requested it.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="TransferType">
          <description>
            The type (direction) of the transfer.
          </description>
          <syntax>
            <string>
              <enumeration value="Download">
                <description>Downstream transfer; to the Agent.</description>
              </enumeration>
              <enumeration value="Upload">
                <description>Upstream transfer; from the Agent.</description>
              </enumeration>
            </string>
            <default type="parameter" value="Download"/>
          </syntax>
        </parameter>

        <parameter name="Affected">
          <description>
            The Path Name of the Object or Object Instance that was affected by
            the transfer, or {{empty}} if no data model object was affected by
            the transfer.
          </description>
          <syntax>
            <string/>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>

        <parameter name="TransferURL">
          <description>
            The {{datatype}} from or to which this transfer was performed, or
            {{empty}} if no such URL is available.
          </description>
          <syntax>
            <dataType ref="URL"/>
          </syntax>
        </parameter>

        <parameter name="StartTime">
          <description>
            The date and time in UTC at which the transfer was started. The
            Device SHOULD record this information and report it in this
            argument, but if this information is not available, the value of
            this argument MUST be set to the ''Unknown Time'' value.
          </description>
          <syntax>
            <dateTime/>
            <default type="parameter" value="0001-01-01T00:00:00Z"/>
          </syntax>
        </parameter>

        <parameter name="CompleteTime">
          <description>
            The date and time in UTC at which the transfer was fully completed.
            This need only be filled in if the transfer has been fully
            completed. The Device SHOULD record this information and report it
            in this argument, but if this information is not available or the
            transfer has not completed, the value of this argument MUST be set
            to the ''Unknown Time'' value.
          </description>
          <syntax>
            <dateTime/>
            <default type="parameter" value="0001-01-01T00:00:00Z"/>
          </syntax>
        </parameter>

        <parameter name="FaultCode">
          <description>
            The numerical fault code as defined in {{bibref|TR-369}}. A value
            of 0 (zero) indicates no fault.
          </description>
          <syntax>
            <unsignedInt/>
            <default type="parameter" value="0"/>
          </syntax>
        </parameter>

        <parameter name="FaultString">
          <description>
            A human-readable text description of the fault. This field SHOULD
            be {{empty}} if the {{param|FaultCode}} equals 0 (zero).
          </description>
          <syntax>
            <string>
              <size maxLength="256"/>
            </string>
            <default type="parameter" value=""/>
          </syntax>
        </parameter>
      </event>

      <command name="AddCertificate()">
        <description>
          This command is issued to allow a Controller (with the proper
          permissions) to add a new certificate to
          {{object|#.Certificate.{i}}}. This does not automatically produce a
          trust relationship with the host identified by the Certificate. To
          produce a trust relationship, an entry is required to exist in
          {{param|#.Controller.{i}.Credential}} or
          {{param|#.ControllerTrust.Credential.{i}.Credential}} that references
          the new {{object|#.Certificate.{i}}} entry. The Agent will use the
          Serial Number and Issuer fields from the input {{param|Certificate}}
          to populate the {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters. If
          {{object|#.Certificate}} already has an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters, this command will
          fail. To replace an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}}, the existing instance must first
          be deleted.
        </description>
        <input>

          <parameter name="Alias">
            <description>
              An optional input the Controller can use to specify the
              {{param|##.Certificate.{i}.Alias}} value for the added entry. If
              provided as an input and the value already exists in
              {{object|##.Certificate.{i}}}, this commmand will fail.
            </description>
            <syntax>
              <dataType ref="Alias"/>
            </syntax>
          </parameter>

          <parameter name="Certificate" mandatory="true">
            <description>
              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM)
              {{bibref|RFC7468}} format.
            </description>
            <syntax>
              <string>
                <size maxLength="65535"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <parameter name="SupportedThresholdOperator" access="readOnly"
          dmr:previousParameter="SupportedFingerprintAlgorithms" version="2.13">
        <description>
          {{list|each entry is a threshold operation for
          {{param|Threshold.{i}.ThresholdOperator}} supported by the Agent}}
        </description>
        <syntax>
          <list/>
          <string>
            <enumeration value="Rise">
              <description>
                Parameter value changes from below the
                {{param|Threshold.{i}.ThresholdValue}} to a value above
              </description>
            </enumeration>
            <enumeration value="Fall">
              <description>
                Parameter value changes from above the
                {{param|Threshold.{i}.ThresholdValue}} to a value below
              </description>
            </enumeration>
            <enumeration value="Cross">
              <description>
                Parameter value either changes from above the
                {{param|Threshold.{i}.ThresholdValue}} to a value below or vice
                versa
              </description>
            </enumeration>
            <enumeration value="Eq">
              <description>
                Parameter value changes from any value to the
                {{param|Threshold.{i}.ThresholdValue}}
              </description>
            </enumeration>
            <enumeration value="NotEq">
              <description>
                Parameter value changes from the
                {{param|Threshold.{i}.ThresholdValue}} to any other value
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="ThresholdNumberOfEntries" access="readOnly"
          dmr:previousParameter="MaxSubscriptionChangeAdoptionTime"
          version="2.13">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="SubscriptionNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="RequestNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Threshold.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="ThresholdNumberOfEntries" enableParameter="Enable"
        dmr:previousObject="Device.LocalAgent.MTP.{i}.MQTT." version="2.13">
      <description>
        Each {{object}} instance of this table represents a Threshold Event.

        {{param|ThresholdParam}} is monitored to determine if it has met the
        {{param|ThresholdOperator}} condition against {{param|ThresholdValue}},
        when it meets the condition a {{event|Triggered!}} Event is sent.

        {{param|ThresholdParam}} may only reference integer parameters and
        {{param|ThresholdValue}} only usese integer values.

        For example:

           {{param|ReferencePath}}:
           Device.Ethernet.Interface.[Enable=="1"].Stats.

           {{param|ThresholdParam}}: BytesSent

           {{param|ThresholdOperator}}: Rise

           {{param|ThresholdValue}}: 100000

        This would trigger a {{event|Triggered!}} Event whenever a value of a
        parameter matching
        Device.Ethernet.Interface.[Enable==1].Stats.BytesSent rises from below
        to above 100000.

        When creating a {{object}}, if the {{param|ReferencePath}},
        {{param|ThresholdParam}} or {{param|ThresholdValue}} are invalid (not
        in the supported Data Model), the object will not be created.

        If the concatenation of {{param|ReferencePath}} and
        {{param|ThresholdParam}} reference a parameter that isn't in the
        instantiated data model, then there will be no {{event|Triggered!}}
        Event.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Enable" access="readWrite">
        <description>
          Enable/Disable this {{object}} instance.

          If the {{object}} instance is disabled, the {{event|Triggered!}}
          Event will not be invoked, even if there is a
          {{object|.LocalAgent.Subscription.{i}.}} instance that references it
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="OperatingMode" access="readWrite">
        <description>
          Determines whether to disable this {{object}} instance after the
          {{event|Triggered!}} Event has been invoked.
        </description>
        <syntax>
          <string>
            <enumeration value="Normal">
              <description>
                The {{object}} will generate events as long as the
                {{param|Enable}} is {{true}}
              </description>
            </enumeration>
            <enumeration value="Single">
              <description>
                After invoking the {{event|Triggered!}} Event, the
                {{param|Enable}} parameter will be automatically set to
                {{false}}
              </description>
            </enumeration>
          </string>
          <default type="object" value="Normal"/>
        </syntax>
      </parameter>

      <parameter name="ReferencePath" access="readWrite">
        <description>
          The concatenation of {{param}} and {{param|ThresholdParam}} refers to
          the parameter being checked for the threshold test.

          {{param}} can be either an Object Path, Object Instance Path, or and
          Object Instance Path with a Search Expression instead of an Instance
          Identifier, as defined in the introduction section of
          {{bibref|TR-369}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ThresholdParam" access="readWrite">
        <description>
          The concatenation of {{param|ReferencePath}} and {{param}} refers to
          the parameter being checked for the threshold test.

          {{param}} is the name of the Parameter in the context of
          {{param|ReferencePath}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ThresholdOperator" access="readWrite">
        <description>
          The operator used for the threshold test.
        </description>
        <syntax>
          <string>
            <enumerationRef
                targetParam="Device.LocalAgent.SupportedThresholdOperator"/>
          </string>
          <default type="object" value="Rise"/>
        </syntax>
      </parameter>

      <parameter name="ThresholdValue" access="readWrite">
        <description>
          The Value used for the threshold test.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Controller" access="readOnly" version="2.15">
        <description>
          {{reference|the {{object|Device.LocalAgent.Controller.}} instance
          that created {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter also defines the set
          of permissions to use when evaluating the threshold. Furthermore,
          only the USP Controller referenced by this parameter will receive a
          {{event|Triggered!}} Event (assuming it has an associated
          Subscription), even if another USP Controller has an associated
          Subscription.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong"
                targetParent="Device.LocalAgent.Controller." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <event name="Triggered!">
        <description>
          Triggered event requested via a {{object}} object.

          When any of the {{param|##.Threshold.{i}.ThresholdParam}}s that are
          in the {{param|##.Threshold.{i}.ReferencePath}} change and the
          threshold test conditation changes from {{false}} to {{true}}, the
          Triggered Event will be invoked. The Triggered Event will only be
          eligible for retriggering if the test condition is fulfilled again.
        </description>

        <parameter name="ParamPath">
          <description>
            The parameter ({{param|.LocalAgent.Threshold.{i}.ReferencePath}}
            and {{param|.LocalAgent.Threshold.{i}.ThresholdParam}}) for which
            the threshold has been triggered.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>

        <parameter name="ParamValue">
          <description>
            The new ({{param|.LocalAgent.Threshold.{i}.ReferencePath}} and
            {{param|.LocalAgent.Threshold.{i}.ThresholdParam}}) Value.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>
    </object>

    <object base="Device.LocalAgent.Controller.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="ControllerNumberOfEntries"
        enableParameter="Enable" version="2.12">

      <command name="ScheduleTimer()" status="deprecated"
          dmr:previousParameter="USPNotifRetryIntervalMultiplier">
        <description>
          Schedule a ''Timer!'' event on the associated {{object}}.

          {{deprecated|2.14|because it was replaced by a more flexible
          asynchronous {{command|Device.ScheduleTimer()}}}}
        </description>
        <input>

          <parameter name="DelaySeconds" mandatory="true">
            <description>
              The number of {{units}} from the time this command is invoked
              until the Agent initiates a Timer! Event notification (based on
              the associated subscriptions).
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
                <units value="seconds"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
      </command>

      <event name="Timer!" status="deprecated">
        <description>
          Timer event requested via a ScheduleTimer() command invoked on the
          same Controller instance via an Operate USP message.
          {{deprecated|2.14|because the associated {{command|ScheduleTimer()}}
          was replaced by a more flexible asynchronous
          {{command|Device.ScheduleTimer()}}}}
        </description>

        <parameter name="CommandKey">
          <description>
            The ''command_key'' supplied when requesting the timer event.
          </description>
          <syntax>
            <string/>
          </syntax>
        </parameter>
      </event>

      <command name="AddMyCertificate()">
        <description>
          This command is issued to allow a Controller to add a new certificate
          for itself. This can be useful when the current certificate is
          expiring or has become compromised. This command creates a new entry
          in {{object|#.Certificate}} and adds a reference to the new entry to
          the Controller's {{param|#.Controller.{i}.Credential}}. The Agent
          will use the Serial Number and Issuer fields from the input
          {{param|Certificate}} to populate the
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters. If
          {{object|#.Certificate}} already has an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}} parameters, this command will
          fail. To replace an instance with the same
          {{param|#.Certificate.{i}.SerialNumber}} and
          {{param|#.Certificate.{i}.Issuer}}, the existing instance must first
          be deleted.

          This command can only be used by the Controller to whom the object
          belongs. If the Controller issuing the USP Operate message is a
          different Controller, the message MUST be denied.
        </description>
        <input>

          <parameter name="Alias">
            <description>
              An optional input the Controller can use to specify the
              {{param|###.Certificate.{i}.Alias}} value for the added entry. If
              provided as an input and the value already exists in
              {{object|###.Certificate.{i}}}, this commmand will fail.
            </description>
            <syntax>
              <dataType ref="Alias"/>
            </syntax>
          </parameter>

          <parameter name="Certificate" mandatory="true">
            <description>
              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM)
              {{bibref|RFC7468}} format.
            </description>
            <syntax>
              <string>
                <size maxLength="65535"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="SendOnBoardRequest()">
        <description>
          Requests the Agent to send an ''OnBoardRequest'' notification to this
          Controller.
        </description>
      </command>

      <parameter name="BootParameterNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>
    </object>

    <object base="Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket."
        access="readOnly" minEntries="0" maxEntries="1">

      <command name="Reset()" async="true">
        <description>
          If enabled, this command will either request to start or restart an
          WebSocket session with the Controller.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.TransferCompletePolicy."
        access="readOnly" minEntries="1" maxEntries="1" version="2.12">
      <description>
        The policy defined in this object determines the conditions under which
        the USP Agent notifies a USP Controller, that has an appropriate
        Subscription, of the completion of file transfers.
      </description>

      <parameter name="ResultTypeFilter" access="readWrite">
        <description>
          Indicates the transfer results that MUST be included when the USP
          Agent notifies a USP Controller of file transfers. Transfer results
          omitted from this list MUST NOT be included when the USP Agent
          notifies a USP Controller.
        </description>
        <syntax>
          <string>
            <enumeration value="Success">
              <description>
                The autonomous file transfer completed successfully; i.e., the
                {{event|##.TransferComplete!}} event's
                {{param|##.TransferComplete!.FaultCode}} was zero
              </description>
            </enumeration>
            <enumeration value="Failure">
              <description>
                The autonomous file transfer did not complete successfully;
                i.e., the the {{event|##.TransferComplete!}} event's
                {{param|##.TransferComplete!.FaultCode}} was non-zero
              </description>
            </enumeration>
            <enumeration value="Both">
              <description>Success and Failure</description>
            </enumeration>
          </string>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.BootParameter.{i}."
        access="readWrite" minEntries="0" maxEntries="unbounded"
        numEntriesParameter="BootParameterNumberOfEntries"
        enableParameter="Enable" version="2.12">
      <description>
        This table provides the Controller with the ability to dictate the
        Parameters that are delivered via ''Boot!'' events.

        Any Parameter (identified by {{param|ParameterName}}) contained in this
        table MUST be included within the ''param_map'' element of the
        ''Boot!'' event.
      </description>
      <uniqueKey>
        <parameter ref="ParameterName"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Enable" access="readWrite">
        <description>
          Enables or disables this {{object}}.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="ParameterName" access="readWrite">
        <description>
          A pattern that describes the Parameter(s) to be included in the
          ''param_map'' element of a ''Boot!'' event. Specifically, patterns
          with wildcards (an "*" character) in place of Instance Identifiers
          are allowed.

          If the pattern does not match any existing Parameters at the time
          that the Agent is creating the ''Boot!'' event, then this
          {{object|#.BootParameter}} instance is not included in the
          ''param_map'' of the ''Boot!'' event.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
          <default type="object" value=""/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Controller.{i}.E2ESession."
        access="readOnly" minEntries="1" maxEntries="1" version="2.12">
      <description>
        The {{object}} object represents the End to End (E2E) Session Context
        functionality for this {{object|##.Controller.{i}}} object instance.
      </description>

      <parameter name="Enable" access="readWrite" status="deprecated">
        <description>
          Enable/Disable this {{object}} instance.

          When {{true}}, Session Context is used when exchanging USP Records
          with the remote endpoint represented by this
          {{object|##.Controller.{i}}} object instance.

          When {{false}}, Session Context is not used when exchanging USP
          Records with the remote endpoint represented by this
          {{object|##.Controller.{i}}} object instance.

          {{deprecated|2.15|because it is replaced by {{param|SessionMode}}}}
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="SessionMode" access="readWrite" version="2.15">
        <description>
          The desired usage mode of an End-to-End Session Context with this
          particular Controller.
        </description>
        <syntax>
          <string>
            <enumeration value="Require">
              <description>
                A Session Context MUST be used and no USP Messages are allowed
                to be exchanged prior to establishment.

                Setting the parameter to Require MUST result in the
                establishment of a Session Context.
              </description>
            </enumeration>
            <enumeration value="Allow">
              <description>
                A Session Context MAY be used but is not required.

                When setting the parameter to Allow, the Agent MUST NOT
                initiate Session Context but MUST perpetuate any existing
                Session Context or Controller-initiated Session Context.
              </description>
            </enumeration>
            <enumeration value="Forbid">
              <description>
                A Session Context MUST NOT be used.

                Setting the parameter to Forbid MUST result in the immediate
                termination of any established Session Context.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          The current status of the Session Context.
        </description>
        <syntax>
          <string>
            <enumeration value="Up"/>
            <enumeration value="Negotiating" optional="true">
              <description>
                A new Session Context is being negotiated (i.e., a USP Record
                with sequence_id of 1 and session_id not previously used with
                this remote endpoint was sent and response has not yet been
                received).
              </description>
            </enumeration>
            <enumeration value="Down"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="SessionExpiration" access="readWrite">
        <description>
          The duration in {{units}} in which the current Session Context will
          expire since the last session-related activity (e.g., Message sent or
          received, Session Context start or restart).

          A value of 0 means session expiration is disabled.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0"/>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="SessionRetryMinimumWaitInterval" access="readWrite">
        <description>
          Configures the first retry wait interval, in {{units}}, as specified
          in {{bibref|TR-369|Section "Failure Handling in the Session
          Context"}}.

          A value of 5 corresponds to the default behavior that is described in
          {{bibref|TR-369}}.

          The USP Agent MUST use a random value between {{param}} and
          ({{param}} * {{param|SessionRetryIntervalMultiplier}} / 1000) as the
          first retry wait interval. Other values in the retry pattern MUST be
          calculated using this value as a starting point.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1" maxInclusive="65535"/>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="5"/>
        </syntax>
      </parameter>

      <parameter name="SessionRetryIntervalMultiplier" access="readWrite">
        <description>
          Configures the retry interval multiplier as specified in
          {{bibref|TR-369|Section "Failure Handling in the Session Context"}}.

          This value is expressed in units of 0.001. Hence the values of the
          multiplier range between 1.000 and 65.535.

          A value of 2000 corresponds to the default behavior that is described
          in {{bibref|TR-369}}.

          The USP Agent MUST use a random value between
          {{param|SessionRetryMinimumWaitInterval}} and
          ({{param|SessionRetryMinimumWaitInterval}} * {{param}} / 1000) as the
          first retry wait interval. Other values in the retry pattern MUST be
          calculated using this value as a starting point.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="1000" maxInclusive="65535"/>
          </unsignedInt>
          <default type="object" value="2000"/>
        </syntax>
      </parameter>

      <parameter name="CurrentRetryCount" access="readOnly">
        <description>
          The current retry count of the Session Context. When zero (0), the
          Session Context is not in a retry state.
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="SegmentedPayloadChunkSize" access="readWrite">
        <description>
          The maximum size, in {{units}}, of the Record (payload(s) and
          headers) that can be transmitted to the remote endpoint. The smallest
          size, which can be configured is 512 bytes.

          A value of 0 means that the segmentation function is effectively
          disabled.
        </description>
        <syntax>
          <unsignedInt>
            <range minInclusive="0" maxInclusive="0"/>
            <range minInclusive="512"/>
            <units value="bytes"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="MaxRetransmitTries" access="readWrite">
        <description>
          The maximum times that a USP Endpoint attempts to retransmit the
          requested USP Record to the remote endpoint.

          If the maximum tries is met for any requested USP Record, the USP
          Endpoint will restart the E2E Session.

          A value of -1 means that the USP Endpoint will always attempt to
          retransmit the requested USP Record.

          A value of 0 means that the USP Endpoint will not attempt to
          retransmit the requested USP Record and will restart the E2E Session.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1" maxInclusive="10"/>
          </int>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="PayloadSecurity" access="readWrite">
        <description>
          The security mechanism to use when exchanging the payload of the
          Record with the remote endpoint.
        </description>
        <syntax>
          <string>
            <enumeration value="Plaintext"/>
            <enumeration value="TLS">
              <description>
                The payload is encrypted at the originating endpoint and
                decrypted at the receiving endpoint using TLS.

                The procedures for using TLS in a Session Context is defined in
                {{bibref|TR-369}}.
              </description>
            </enumeration>
          </string>
          <default type="object" value="TLS"/>
        </syntax>
      </parameter>

      <command name="Reset()" async="true">
        <description>
          If the {{object}} is enabled then this command will either request to
          start or restart a Session Context with the remote endpoint.

          If the {{object}} is not enabled and there is an active Session
          Context then this command will terminate that Session Context with
          the remote endpoint.

          If the {{object}} is not enabled and there is no active Session
          Context then this command does nothing.
        </description>
      </command>
    </object>

    <object name="Device.LocalAgent.Subscription.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="SubscriptionNumberOfEntries"
        enableParameter="Enable" version="2.12">
      <description>
        A Subscription dictates how a USP Agent issues USP Notification
        Messages to a USP Controller.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Recipient"/>
        <parameter ref="ID"/>
      </uniqueKey>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Enable" access="readWrite">
        <description>
          Enables/disables this {{object}}. A disabled entry MUST NOT be
          processed by the USP Agent.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="Recipient" access="readOnly">
        <description>
          {{reference|the {{object|#.Controller}} instance that will receive
          the Notification associated with this {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.Controller."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ID" access="readWrite">
        <description>
          Unique identifier of the {{object}} itself, which is specific to the
          USP Controller that creates the instance of the {{object}}.

          This value is used as the ''subscription_id'' element of every
          Notification message from a USP Agent to a USP Controller caused by
          this subscription entry.
        </description>
        <syntax>
          <string>
            <size minLength="1" maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="CreationDate" access="readOnly">
        <description>
          The date and time when this instance of {{object}} was created. This
          is internally used by the {{param|TimeToLive}} parameter to determine
          the expiration of this {{object}} instance.

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="NotifType" access="readWrite">
        <description>
          Type of Notification message that will be sent to the USP Controller
          specified by {{param|Recipient}} when this {{object}} is triggered.
        </description>
        <syntax>
          <string>
            <enumeration value="ValueChange"/>
            <enumeration value="ObjectCreation"/>
            <enumeration value="ObjectDeletion"/>
            <enumeration value="OperationComplete"/>
            <enumeration value="Event"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ReferenceList" access="readWrite" version="2.13">
        <description>
          Each entry in the list is a Path Name, Search Path, Command
          reference, or Event reference that determines the element(s) of the
          data model that the {{object}} is applicable to.

          Different values of the {{param|NotifType}} parameter will cause the
          {{object}} to interact with {{param}} differently. For example, an
          instance of {{object}} with {{enum|ValueChange|NotifType}} will
          utilize the value of this parameter differently than an instance with
          {{enum|Event|NotifType}}.

          Once the value of the {{param}} is written, the value cannot be
          changed as the {{object}} instance is considered to be immutable. If
          the value of a non-empty {{param}} parameter needs to change, the
          {{object}} instance MUST be deleted and a new {{object}} instance
          created.

          The following bullet points describe what is allowed as a value of
          {{param}} based on the different values of the {{param|NotifType}}
          parameter:

          * ValueChange: may be either a Path Name or Search Path; if an Object
            Path (one type of Path Name) then it is treated like a filter match
            such that all supported parameters in all objects below this point
            will be relevant for the subscription.

          * ObjectCreation: may be either a Path Name or Search Path as long as
            it only refers to a Multi-Instance Object; only the referenced
            Multi-Instance Objects will be relevant for the subscription.

          * ObjectDeletion: may be either a Path Name or Search Path as long as
            it only refers to instances of a Multi-Instance Object; only the
            referenced instances (wildcard references all instances over time)
            of the Multi-Instance Objects will be relevant for the
            subscription.

          * OperationComplete: may be either a Path Name, Search Path, or
            Command reference; if an Object Path (one type of Path Name) then
            it is treated like a filter match such that all supported data
            model commands in all objects below this point will be relevant for
            the subscription.

          * Event: may be either a Path Name, Search Path, or Event reference;
            if an Object Path (one type of Path Name) then it is treated like a
            filter match such that all supported Events in all objects below
            this point will be relevant for the subscription.
        </description>
        <syntax>
          <list/>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Persistent" access="readWrite">
        <description>
          Determines whether or not this {{object}} remains after the USP Agent
          is restarted (either via a reset of the software or reboot of the
          underlying device).

          If {{true}}, this {{object}} stays in existence until either a Delete
          message removes it or the {{param|TimeToLive}} parameter expires.

          If {{false}}, this {{object}} is automatically removed by the USP
          Agent whenever it is restarted.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="TimeToLive" access="readWrite">
        <description>
          Specifies the duration of time (in {{units}}) that this {{object}}
          remains in existence. After {{param}} has expired, this {{object}}
          instance is automatically removed by the USP Agent.

          If the value of {{param}} is 0, then this parameter is ignored and
          this {{object}} stays in existence until either a Delete message
          removes it or the {{param|Persistent}} parameter determines that it
          needs to be removed.

          If the value of {{param}} is greater than 0, then this parameter
          determines the length of time (from {{object}} creation) until it
          will be automatically removed by the USP Agent (unless the
          {{param|Persistent}} parameter is {{false}} and the USP Agent is
          restarted, in which case it will be removed before the {{param}}
          expiration). NOTE: This parameter does not count down as time moves
          forward; it will always read back with the same value that it was
          last set to.

          If the USP Agent is incapable of maintaining absolute time then
          {{param}} will automatically expire if the USP Agent is restarted
          (either via a reset of the software or reboot of the underlying
          device) before {{param}} expiration.
        </description>
        <syntax>
          <unsignedInt>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>

      <parameter name="NotifRetry" access="readWrite">
        <description>
          Specifies whether or not the USP Agent attempts to re-deliver the
          Notification in the event that it could not be delivered to the USP
          Controller.

          When {{param}} is {{true}}, the USP Agent MUST retry the delivery of
          the Notification. This implies that the Notification MUST be
          generated with the "send_resp" flag set to {{true}} such that the USP
          Agent knows when the Notification has been successfully delivered.
          The retry attempt(s) are performed using the retry algorithm defined
          in {{bibref|TR-369|Section "Responses to Notifications and
          Notification Retry"}}.

          When {{param}} is {{false}}, the USP Agent MUST NOT retry the
          delivery of the Notification, and SHOULD generate the notification
          with "send_resp" flag set to {{false}}.
        </description>
        <syntax>
          <boolean/>
          <default type="object" value="false"/>
        </syntax>
      </parameter>

      <parameter name="NotifExpiration" access="readWrite">
        <description>
          Specifies the duration of time (in {{units}}) that the Notification
          associated with this {{object}} will continue to be retried. After
          {{param}} has expired, if the Notification has still not been
          successfully delivered then the USP Agent MUST stop attempting to
          re-deliver the Notification.

          If {{param|NotifRetry}} is set to {{false}} then this parameter is
          ignored.

          If {{param|NotifRetry}} is set to {{true}} and the value of {{param}}
          is 0, then the USP Agent will attempt to re-deliver the Notification
          until it has been successfully delivered or until the USP Agent is
          restarted (either via a reset of the software or reboot of the
          underlying device).

          If {{param|NotifRetry}} is set to {{true}} and the value of {{param}}
          is greater than 0, then the USP Agent will attempt to re-deliver the
          Notification until either it has been successfully delivered, until
          the length of time (from the time the Notification was initially
          attempted to be delivered) specified in this parameter expires, or
          until the USP Agent is restarted (either via a reset of the software
          or reboot of the underlying device).

          NOTE: This parameter does not count down as time moves forward; it
          will always read back with the same value that it was last set to.
        </description>
        <syntax>
          <unsignedInt>
            <units value="seconds"/>
          </unsignedInt>
          <default type="object" value="0"/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.LocalAgent.Request.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="RequestNumberOfEntries" version="2.12">
      <description>
        {{object}} instances are created using USP ''Operate'' messages. Only
        ''Operate'' messages with ''async''=''true'' will create a {{object}}
        instance in the data model.

        When the command of the ''Operate'' completes, then this {{object}}
        instance is removed from this table.
      </description>
      <uniqueKey functional="true">
        <parameter ref="Originator"/>
        <parameter ref="Command"/>
        <parameter ref="CommandKey"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Originator" access="readOnly">
        <description>
          The USP Endpoint Identifier that originated the command.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Command" access="readOnly">
        <description>
          The command to be executed. This parameter is a Path Name that
          addresses a Command in an Object or Object Instance.

          The command is a result of the evaluation of the ''command'' argument
          of an ''Operate'' message.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="CommandKey" access="readOnly">
        <description>
          The ''command_key'' from the USP ''Operate'' message.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          The operational status of the request to execute the command.
        </description>
        <syntax>
          <string>
            <enumeration value="Requested">
              <description>
                The command has been requested but is currently not executing.
              </description>
            </enumeration>
            <enumeration value="Active">
              <description>The command is currently executing.</description>
            </enumeration>
            <enumeration value="Canceling">
              <description>
                The command has been requested to be canceled.
              </description>
            </enumeration>
            <enumeration value="Canceled">
              <description>
                The command has successfully been canceled.
              </description>
            </enumeration>
            <enumeration value="Success">
              <description>
                The command has successfully been completed its execution.
              </description>
            </enumeration>
            <enumeration value="Error">
              <description>
                The command has unsuccessfully completed its execution or has
                unsuccessfully been canceled.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <command name="Cancel()">
        <description>
          Request cancelation of this {{object}}'s command.

          This command completes immediately. If successful, {{param|Status}}
          will immediately change to {{enum|Canceling|Status}} and will change
          to {{enum|Canceled|Status}} when the cancelation is complete.
        </description>
      </command>
    </object>

    <object base="Device.LocalAgent.Certificate.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="CertificateNumberOfEntries" version="2.12">

      <command name="Delete()">
        <description>
          This command is issued to allow a Controller (with the proper
          permissions) to delete an entry from the
          {{object|##.Certificate.{i}}}. It also removes references to the
          Certificate in {{param|##.LocalAgent.Controller.{i}.Credential}} or
          {{param|##.LocalAgent.ControllerTrust.Credential.{i}.Credential}} and
          removes any X.509 certificate data the Agent had stored related to
          the entry.
        </description>
      </command>

      <command name="GetFingerprint()">
        <description>
          This command is issued to allow a Controller to request the value of
          a fingerprint calculated for the specified table entry using the
          input {{param|FingerprintAlgorithm}}.
        </description>
        <input>

          <parameter name="FingerprintAlgorithm" mandatory="true">
            <description>
              The algorithm to be used to calculate the requested fingerprint.
              The value MUST be one the Agent supports, as noted in
              {{param|###.SupportedFingerprintAlgorithms}}.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Fingerprint">
            <description>
              The value of the fingerprint.
            </description>
            <syntax>
              <hexBinary>
                <size maxLength="128"/>
              </hexBinary>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.LocalAgent.ControllerTrust." access="readOnly"
        minEntries="1" maxEntries="1" version="2.12">

      <command name="RequestChallenge()"
          dmr:previousParameter="TOFUInactivityTimer">
        <description>
          This command is issued to retrieve the instruction for the referenced
          challenge.

          There is at most one (1) outstanding RequestChallenge for a
          requesting Controller.

          As such, any new challenges with a different value of the
          {{param|ChallengeRef}} parameter are denied until a successful
          response to the outstanding challenge is received by the Agent or the
          current RequestChallenge expires.

          When the value of the {{param|ChallengeRef}} parameter defined in the
          RequestChallenge does not exist, the Agent returns an "Invalid Value"
          error.
        </description>
        <input>

          <parameter name="ChallengeRef" mandatory="true">
            <description>
              {{reference|the {{object|#.Challenge}} object instance for this
              request}}
            </description>
            <syntax>
              <string>
                <pathRef refType="weak" targetParent="#.Challenge."
                    targetType="row"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="RequestExpiration">
            <description>
              The expiration period, in {{units}}, where the Controller request
              that this challenge request expire (times-out).

              A value of zero indicates that the challenge request will never
              expire. The default is 900 {{units}}.
            </description>
            <syntax>
              <int>
                <range minInclusive="0"/>
                <units value="seconds"/>
              </int>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Instruction">
            <description>
              The value of the {{param|##.Challenge.{i}.Instruction}} parameter
              associated with the requested challenge in the
              {{param|#.Input.ChallengeRef}} parameter.
            </description>
            <syntax>
              <base64/>
            </syntax>
          </parameter>

          <parameter name="InstructionType">
            <description>
              The media type with a format as defined by {{bibref|RFC6838}} of
              the content of the {{param|Instruction}} parameter.

              The allowable values of the media type are defined by the
              {{param|##.Challenge.{i}.InstructionType}} parameter.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="ValueType">
            <description>
              The media type with a format as defined by {{bibref|RFC6838}} of
              the content of the {{param|##.Challenge.{i}.Value}} parameter.

              The allowable values of the media type are defined by the
              {{param|##.Challenge.{i}.ValueType}} parameter.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="ChallengeID">
            <description>
              The challenge identifier the Controller uses in the
              ChallengeResponse command to correlate this request with a
              response.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>
        </output>
      </command>

      <command name="ChallengeResponse()">
        <description>
          This command is issued to return the response of challenge.
        </description>
        <input>

          <parameter name="ChallengeID" mandatory="true">
            <description>
              The challenge identifier the Controller uses to correlate the
              challenge request with a response.
            </description>
            <syntax>
              <string/>
            </syntax>
          </parameter>

          <parameter name="Value" mandatory="true">
            <description>
              The value of the challenge that is specific to the type of
              challenge. The challenge value is provided by the external party
              to the Controller.
            </description>
            <syntax>
              <base64/>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object name="Device.Standby." access="readOnly" minEntries="1"
        maxEntries="1" version="2.12">
      <description>
        Capabilities of a Device as it pertains to entering a standby state.
      </description>

      <parameter name="NetworkAware" access="readOnly">
        <description>
          Indicates that the device is capable of maintaining a network
          connection and responding to communications via the network
          connection while in a standby state.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="TimerAware" access="readOnly">
        <description>
          Indicates that the device is capable of maintaining and responding to
          timers while in a standby state.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.SoftwareModules." access="readOnly" minEntries="1"
        maxEntries="1" version="2.1">
      <description>
        Top level object for dynamically managed software applications.
      </description>

      <command name="InstallDU()" async="true" version="2.12">
        <description>
          Install one or more Deployment Units (DUs) to the associated
          {{object}}.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} that specifies the location of the DU to be
              installed.

              The URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.

              HTTP and HTTPS transports MUST be supported. Other optional
              transports MAY be supported.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="UUID">
            <description>
              The UUID (see {{bibref|RFC4122}}) of the DU to be installed.

              If this parameter is {{empty}} the device MUST generate the UUID
              based on the rules defined in {{bibref|RFC4122}} and
              {{bibref|TR-181i2|Annex C}}.
            </description>
            <syntax>
              <dataType ref="UUID"/>
            </syntax>
          </parameter>

          <parameter name="Username">
            <description>
              Username to be used by the device to authenticate with the file
              server, if authentication is required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
              <default type="parameter" value=""/>
            </syntax>
          </parameter>

          <parameter name="Password">
            <description>
              Password to be used by the device to authenticate with the file
              server, if authentication is required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
              <default type="parameter" value=""/>
            </syntax>
          </parameter>

          <parameter name="ExecutionEnvRef">
            <description>
              A reference to the Execution Environment upon which the DU is to be
              installed.

              If {{empty}} the device MUST choose the Execution Environment to
              use.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
                <pathRef refType="weak" targetParent="#.ExecEnv."
                    targetType="row"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <event name="DUStateChange!" version="2.12">
        <description>
          This event informs a Controller of the completion (successful or
          unsuccessful) of a DU state change.

          When used, this event MUST be issued after the device has completed
          any file transfers and carried out all operations related to the DU
          State Change.

          This event MAY contain the results from multiple DU state changes; it
          is implementation specific how the device chooses to aggregate the DU
          state changes, although the device MUST notify the Controller of any
          DU state changes within 24 hours of the time the operations were
          completed by the device.

          The device SHOULD make every attempt to aggregate, as much as
          possible, the DU State Change notifications to the Controller in the
          interest of scalability.
        </description>

        <parameter name="UUID">
          <description>
            The UUID as defined in {{bibref|RFC4122}} of the DU that affected
            by the state change.
          </description>
          <syntax>
            <dataType ref="UUID"/>
          </syntax>
        </parameter>

        <parameter name="DeploymentUnitRef">
          <description>
            A reference to the DU that was affected by the state change.
          </description>
          <syntax>
            <string>
              <pathRef refType="weak"
                  targetParent=".SoftwareModules.DeploymentUnit."
                  targetType="row"/>
            </string>
          </syntax>
        </parameter>

        <parameter name="Version">
          <description>
            In the case of an Install, this will be the version of the DU
            created. In the case of an Update, it will be the updated version
            of the DU. In the case of an Uninstall, it will be the version of
            the uninstalled DU.

            This MUST match the
            {{param|.SoftwareModules.DeploymentUnit.{i}.Version}} Parameter
            contained within the instance of the DeploymentUnit that is
            contained within the {{param|DeploymentUnitRef}} argument.
          </description>
          <syntax>
            <string>
              <size maxLength="32"/>
            </string>
          </syntax>
        </parameter>

        <parameter name="CurrentState">
          <description>
            The current state of the created DU.
          </description>
          <syntax>
            <string>
              <enumeration value="Installed">
                <description>
                  The DU is in an Installed state due to one of the following:
                  successful Install, successful Update, failed Update, or
                  failed Uninstall. In the case of a failed Update or failed
                  Uninstall the Fault argument will contain an explanation of
                  the failure.
                </description>
              </enumeration>
              <enumeration value="UnInstalled">
                <description>
                  The DU was successfully uninstalled from the device.
                </description>
              </enumeration>
              <enumeration value="Failed">
                <description>
                  The DU could not be installed in which case a DU instance
                  MUST NOT be created in the Data Model.
                </description>
              </enumeration>
            </string>
          </syntax>
        </parameter>

        <parameter name="Resolved">
          <description>
            Whether or not the DU operation resolved all of its dependencies.

            In the case of a successful Uninstall, this value is meaningless
            and should be {{true}}.
          </description>
          <syntax>
            <boolean/>
          </syntax>
        </parameter>

        <parameter name="ExecutionUnitRefList">
          <description>
            The Execution Units affected by this operation.

            In the case of an Install, this will be the list of EUs that were
            created as a result of the DU’s installation.

            In the case an Update, this will be the list of all EUs currently
            associated with the updated DU, including those that were created
            through the initial DU installation and any updates that had
            already occurred but not including any EUs that no longer exist on
            the device because of this or previous updates.

            In the case of an Uninstall, this will be the list of the EUs
            removed from the device due to the DU being removed.
          </description>
          <syntax>
            <list/>
            <string>
              <pathRef refType="weak"
                  targetParent=".SoftwareModules.ExecutionUnit."
                  targetType="row"/>
            </string>
          </syntax>
        </parameter>

        <parameter name="StartTime">
          <description>
            The date and time transfer was started in UTC. The device SHOULD
            record this information and report it in this argument, but if this
            information is not available, the value of this argument MUST be
            set to the Unknown Time value.
          </description>
          <syntax>
            <dateTime/>
          </syntax>
        </parameter>

        <parameter name="CompleteTime">
          <description>
            The date and time the transfer was fully completed and applied in
            UTC. This need only be filled in if the transfer has been fully
            completed and applied. The device SHOULD record this information
            and report it in this argument, but if this information is not
            available or the transfer has not completed, the value of this
            argument MUST be set to the Unknown Time value.
          </description>
          <syntax>
            <dateTime/>
          </syntax>
        </parameter>

        <parameter name="OperationPerformed">
          <description>
            The operation that was performed against the DU causing the DU
            state change.
          </description>
          <syntax>
            <string>
              <enumeration value="Install">
                <description>
                  The operation attempted was the Installation of a DU.
                </description>
              </enumeration>
              <enumeration value="Update">
                <description>
                  The operation attempted was the Update of an existing DU.
                </description>
              </enumeration>
              <enumeration value="Uninstall">
                <description>
                  The operation attempted was the Un-Installation of an
                  existing DU.
                </description>
              </enumeration>
            </string>
          </syntax>
        </parameter>

        <object name="Fault." minEntries="1" maxEntries="1">
          <description>
            Fault Structure. If the operation was successful, the
            {{param|FaultCode}} MUST be zero. Otherwise a non-zero
            {{param|FaultCode}} is specified along with a {{param|FaultString}}
            indicating the failure reason.
          </description>

          <parameter name="FaultCode">
            <description>
              The numerical fault code. Valid values are:

              *If the operation was successful, the fault code is 0.

              *If the device cannot complete the operation for some unknown
               reason, it SHOULD reject the operation with a 7002 (Request
               Denied) fault code.

              *If the device detects the presence of the "userinfo" component
               in the file source URL, it SHOULD reject the operation with a
               7004 (Invalid Arguments) fault code.

              *If the device cannot find the Execution Environment specified in
               the Install or Update command, it SHOULD reject the operation
               with a 7223 (Unknown Execution Environment) fault code.

              *If the device determines that the Deployment Unit being
               installed does not match either the Execution Environment
               specified or any Execution Environment on the device, it SHOULD
               reject the operation with a 7225 (Deployment Unit to Execution
               Environment Mismatch) fault code

              *If the device detects that the Deployment Unit being installed
               already has the same version as one already installed on the
               same Execution Environment, it SHOULD reject the operation with
               a 7226 (Duplicate Deployment Unit) fault code.

              *If the device detects that that there are no more system
               resources (disk space, memory, etc.) to perform the Install or
               Update of a Deployment Unit, it SHOULD reject the operation with
               a 7227 (System Resources Exceeded) fault code.

              *If a requested operation attempts to alter the State of a
               Deployment Unit in a manner that conflicts with the Deployment
               Unit State Machine Diagram {{bibref|TR-369|Appendix I "Software
               Module Management"}}, it SHOULD reject the operation with a 7229
               (Invalid Deployment Unit State) fault code.

              *If a requested operation attempts to Uninstall a DU that caused
               an EE to come into existence, where that EE has at least 1
               installed DU or at least 1 child EE, then the device SHOULD
               reject the operation with a 7229 (Invalid Deployment Unit State)
               fault code.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="FaultString">
            <description>
              A human-readable text description of the fault. This field SHOULD
              be empty if the FaultCode equals 0 (zero).
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </object>
      </event>

      <parameter name="ExecEnvNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="DeploymentUnitNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

      <parameter name="ExecutionUnitNumberOfEntries" access="readOnly">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>
    </object>

    <object name="Device.SoftwareModules.ExecEnv.{i}." access="readOnly"
        numEntriesParameter="ExecEnvNumberOfEntries" minEntries="0"
        maxEntries="unbounded" version="2.1">
      <description>
        The Execution Environments that are available on the device, along with
        their properties and configurable settings.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Name"/>
      </uniqueKey>

      <parameter name="Enable" access="readWrite">
        <description>
          Indicates whether or not this {{object}} is enabled.

          Disabling an enabled Execution Environment stops it, while enabling a
          disabled Execution Environment starts it.

          When an Execution Environment is disabled, Deployment Units installed
          to that Execution Environment will be unaffected, but any Execution
          Units currently running on that Execution Environment will
          automatically transition to {{enum|Idle|#.ExecutionUnit.{i}.Status}}.

          If an Update or Uninstall operation is attempted on a
          {{object|#.DeploymentUnit}} that is to be applied against a disabled
          {{object}}, that operation fails and the associated event will
          contain a FaultStruct for that operation.

          Disabling an Execution Environment could place the device in a
          non-manageable state. For example, if the operating system itself was
          modeled as an {{object}} and a Controller disabled it, the Agent
          might be terminated leaving the device unmanageable.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          Indicates the status of this {{object}}.
        </description>
        <syntax>
          <string>
            <enumeration value="Up"/>
            <enumeration value="Error" optional="true"/>
            <enumeration value="Disabled"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Name" access="readOnly">
        <description>
          A Name provided by the device that adequately distinguishes this
          {{object}} from all other {{object}} instances.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Type" access="readOnly">
        <description>
          Indicates the complete type and specification version of this
          {{object}}.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="InitialRunLevel" access="readWrite">
        <description>
          The run level that this {{object}} will be in upon startup (whether
          that is caused by a device Boot or the Execution Environment
          starting).

          Run levels dictate which Execution Units will be started. Execution
          Units will be started if {{param|CurrentRunLevel}} is greater than or
          equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and
          {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.

          If the value of {{param|CurrentRunLevel}} is -1, then the value of
          this parameter is irrelevant when read and setting its value has no
          impact on the Run Level of this {{object}}.
        </description>
        <syntax>
          <unsignedInt>
            <range maxInclusive="65535"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="CurrentRunLevel" access="readOnly">
        <description>
          The run level that this {{object}} is currently operating in. This
          value is altered by executing the {{command|SetRunLevel()}} command.

          Upon startup (whether that is caused by a device Boot or the
          Execution Environment starting) {{param}} will be equal to
          {{param|InitialRunLevel}}, unless Run Levels are not supported by
          this {{object}} in which case {{param}} will be -1.

          Run levels dictate which Execution Units will be started. Execution
          Units will be started if {{param}} is greater than or equal to
          {{param|#.ExecutionUnit.{i}.RunLevel}} and
          {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.

          If {{param}} is -1 then Run Levels are not supported by this
          {{object}} and setting {{param|InitialRunLevel}} or executing the
          command {{command|SetRunLevel()}} will not impact the Run Level of
          this {{object}}.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1" maxInclusive="65535"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="InitialExecutionUnitRunLevel" access="readWrite">
        <description>
          Indicates the initial value on creation for
          {{param|#.ExecutionUnit.{i}.RunLevel}} for all Execution Unit
          instances associated with this {{object}}.

          If the value of {{param|CurrentRunLevel}} is -1, then the value of
          this parameter is irrelevant when read and setting its value has no
          impact on the Run Level of any Execution Unit.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1" maxInclusive="65535"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="Vendor" access="readOnly">
        <description>
          The vendor that produced this {{object}}.
        </description>
        <syntax>
          <string>
            <size maxLength="128"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Version" access="readOnly">
        <description>
          The Version of this {{object}} as specified by the Vendor that
          implemented this {{object}}, not the version of the specification.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ParentExecEnv" access="readOnly">
        <description>
          Represents the parent {{object}} of this {{object}}.

          If this value is {{empty}} then this is the Primary Execution
          Environment.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.ExecEnv."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="AllocatedDiskSpace" access="readOnly">
        <description>
          The amount of disk space measured in {{units}} allocated to this
          {{object}}. A value of -1 MUST be used for {{object}} instances where
          this parameter is not applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="AvailableDiskSpace" access="readOnly">
        <description>
          The amount of disk space measured in {{units}} currently available to
          this {{object}}. This value changes as the {{object|#.ExecutionUnit}}
          instances associated with this {{object}} consumes disk space. A
          value of -1 MUST be used for {{object}} instances where this
          parameter is not applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="AllocatedMemory" access="readOnly">
        <description>
          The amount of physical RAM measured in {{units}} allocated to this
          {{object}}. A value of -1 MUST be used for {{object}} instances where
          this parameter is not applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="AvailableMemory" access="readOnly">
        <description>
          The amount of physical RAM measured in {{units}} currently available
          to this {{object}}. This value changes as the
          {{object|#.ExecutionUnit}} instances associated with this {{object}}
          are started/stopped and consume the physical RAM. A value of -1 MUST
          be used for {{object}} instances where this parameter is not
          applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="ActiveExecutionUnits" access="readOnly">
        <description>
          Represents the {{object|#.ExecutionUnit}} instances currently running
          on this {{object}}. This parameter only contains
          {{object|#.ExecutionUnit}} instances that currently have a
          {{param|#.ExecutionUnit.{i}.Status}} of
          {{enum|Active|#.ExecutionUnit.{i}.Status}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong" targetParent="#.ExecutionUnit."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ProcessorRefList" access="readOnly">
        <description>
          Represents the processors that this {{object}} has available to it.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong" targetParent=".DeviceInfo.Processor."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <command name="SetRunLevel()" version="2.12">
        <description>
          Provides a mechanism to remotely manipulate the run level of this
          {{object}}, meaning that altering this comand will change the value
          of the {{param|#.CurrentRunLevel}}.

          Run levels dictate which Execution Units will be started. Execution
          Units will be started if {{param|CurrentRunLevel}} is greater than or
          equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and
          {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
        </description>
        <input>

          <parameter name="RequestedRunLevel" mandatory="true">
            <description>
              This parameter will request to change the value of the
              {{param|#.CurrentRunLevel}} to the value of this parameter.

              Setting this value when {{param|#.CurrentRunLevel}} is -1 has no
              impact to the Run Level of this instance of the {{object|##.}}
              object.
            </description>
            <syntax>
              <int>
                <range minInclusive="-1" maxInclusive="65535"/>
              </int>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Reset()" version="2.12">
        <description>
          This command causes this {{object}} to revert back to the state it
          was in when the device last issued a Boot event with a cause of a
          local or remote factory reset.

          The following requirements dictate what MUST happen for the reset to
          be complete:

          # All Deployment Units that were installed after the last Boot (with
            cause of a factory reset) event MUST be removed

          # All persistent storage, configuration files, and log files that
            were associated with the removed Deployment Units MUST be removed

          # Any Deployment Unit that is still installed against the Execution
            Environment MUST be restored to the version present when the last
            Boot (with cause of a factory reset) event was issued

          # Any Deployment Unit that was present when the last Boot (with cause
            of a factory reset) event was issued, but was subsequently
            uninstalled and is now not present, MUST be installed with the
            version that was present when the last Boot (with cause of a
            factory reset) event was issued

          # The Execution Environment MUST be restored to the version and
            configuration present when the last Boot (with cause of a factory
            reset) event was issued

          # The Execution Environment MUST be restarted after all other
            restoration requirements have been met
        </description>
      </command>
    </object>

    <object name="Device.SoftwareModules.DeploymentUnit.{i}."
        access="readOnly" numEntriesParameter="DeploymentUnitNumberOfEntries"
        minEntries="0" maxEntries="unbounded" version="2.1">
      <description>
        This table serves as the Deployment Unit inventory and contains status
        information about each Deployment Unit.

        A new instance of this table gets created during the installation of a
        Software Module.
      </description>
      <uniqueKey>
        <parameter ref="UUID"/>
        <parameter ref="Version"/>
        <parameter ref="ExecutionEnvRef"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="UUID" access="readOnly">
        <description>
          A Universally Unique Identifier either provided by the Controller, or
          generated by the device, at the time of Deployment Unit Installation.

          The format of this value is defined by {{bibref|RFC4122}} Version 5
          (Name-Based) and {{bibref|TR-181i2|Annex C}}.

          This value MUST NOT be altered when the {{object}} is updated.
        </description>
        <syntax>
          <string>
            <size maxLength="36"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="DUID" access="readOnly">
        <description>
          Deployment Unit Identifier chosen by the targeted
          {{object|#.ExecEnv}}. The format of this value is Execution
          Environment specific.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Name" access="readOnly">
        <description>
          Indicates the Name of this {{object}}, which is chosen by the author
          of the Deployment Unit.

          The value of this parameter is used in the generation of the
          {{param|UUID}} based on the rules defined in {{bibref|TR-181i2|Annex
          C}}.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          Indicates the status of this {{object}}.
        </description>
        <syntax>
          <string>
            <enumeration value="Installing">
              <description>
                This instance is in the process of being Installed and SHOULD
                transition to the {{enum|Installed}} state.
              </description>
            </enumeration>
            <enumeration value="Installed">
              <description>
                This instance has been successfully Installed. The
                {{param|Resolved}} flag SHOULD also be referenced for
                dependency resolution.
              </description>
            </enumeration>
            <enumeration value="Updating">
              <description>
                This instance is in the process of being Updated and SHOULD
                transition to the {{enum|Installed}} state.
              </description>
            </enumeration>
            <enumeration value="Uninstalling">
              <description>
                This instance is in the process of being Uninstalled and SHOULD
                transition to the {{enum|Uninstalled}} state.
              </description>
            </enumeration>
            <enumeration value="Uninstalled">
              <description>
                This instance has been successfully Uninstalled. This status
                will typically not be seen within a {{object}} instance.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="Resolved" access="readOnly">
        <description>
          Indicates whether or not this {{object}} has resolved all of its
          dependencies.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="URL" access="readOnly">
        <description>
          Contains the {{datatype}} used by the most recent
          {{command|#.InstallDU()}} or {{command|Update()}} to either Install
          or Update this {{object}}.
        </description>
        <syntax>
          <dataType ref="URL"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Textual description of this {{object}}. The format of this value is
          Execution Environment specific.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Vendor" access="readOnly">
        <description>
          The author of this {{object}} formatted as a domain name.

          The value of this parameter is used in the generation of the
          {{param|UUID}} based on the rules defined in {{bibref|TR-181i2|Annex
          C}}.
        </description>
        <syntax>
          <string>
            <size maxLength="128"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Version" access="readOnly">
        <description>
          Version of this {{object}}. The format of this value is Execution
          Environment specific.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="VendorLogList" access="readOnly">
        <description>
          Represents the vendor log files that have come into existence because
          of this {{object}}.

          This does not include any vendor log files that have come into
          existence because of {{object|#.ExecutionUnit}} instances that are
          contained within this {{object}}.

          When this {{object}} is uninstalled the vendor log files referenced
          here SHOULD be removed from the device.

          Not all {{object}} instances will actually have a corresponding
          vendor log file, in which case the value of this parameter will be
          {{empty}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong"
                targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="VendorConfigList" access="readOnly">
        <description>
          Represents the vendor config files that have come into existence
          because of this {{object}}.

          This does not include any vendor config files that have come into
          existence because of {{object|#.ExecutionUnit}} instances that are
          contained within this {{object}}.

          When this {{object}} is uninstalled the vendor config files
          referenced here SHOULD be removed from the device.

          Not all {{object}} instances will actually have a corresponding
          vendor config file, in which case the value of this parameter will be
          {{empty}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong"
                targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecutionUnitList" access="readOnly">
        <description>
          Represents the {{object|#.ExecutionUnit}} instances that are
          associated with this {{object}} instance.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong" targetParent="#.ExecutionUnit."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecutionEnvRef" access="readOnly">
        <description>
          Represents the {{object|#.ExecEnv}} instance where this {{object}}
          instance is installed.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.ExecEnv."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <command name="Update()" async="true">
        <description>
          Update the associated {{object}}.
        </description>
        <input>

          <parameter name="URL" version="2.12">
            <description>
              The {{datatype}} that specifies the location of the DU to be
              installed.

              The URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.

              HTTP and HTTPS transports MUST be supported. Other optional
              transports MAY be supported.

              If the device receives an Update command with the same source URL
              as a previous Update or Install comamnd, the device MUST perform
              each Update as requested, and MUST NOT assume that the content of
              the file to be downloaded is the same each time.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" version="2.12">
            <description>
              Username to be used by the device to authenticate with the file
              server, if authentication is required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
              <default type="parameter" value=""/>
            </syntax>
          </parameter>

          <parameter name="Password" version="2.12">
            <description>
              Password to be used by the device to authenticate with the file
              server, if authentication is required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
              <default type="parameter" value=""/>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Uninstall()" async="true">
        <description>
          Uninstall the associated {{object}}.
        </description>
      </command>
    </object>

    <object name="Device.SoftwareModules.ExecutionUnit.{i}." access="readOnly"
        numEntriesParameter="ExecutionUnitNumberOfEntries" minEntries="0"
        maxEntries="unbounded" version="2.1">
      <description>
        This table serves as the Execution Unit inventory and contains both
        status information about each Execution Unit as well as configurable
        parameters for each Execution Unit.

        Each {{object|#.DeploymentUnit}} that is installed can have zero or
        more Execution Units.

        Once a Deployment Unit is installed it populates this table with its
        contained Execution Units.

        When the Deployment Unit (that caused this {{object}} to come into
        existence) is updated, this instance MAY be removed and new instances
        MAY come into existence. While the Deployment Unit (that caused this
        {{object}} to come into existence) is being updated, all {{object}}
        instances associated with the Deployment Unit will be stopped until the
        update is complete at which time they will be restored to the state
        that they were in before the update started.

        When the Deployment Unit (that caused this {{object}} to come into
        existence) is uninstalled, this instance is removed.

        Each {{object}} MAY also contain a set of vendor specific parameters
        displaying status and maintaining configuration that reside under the
        {{object|Extensions}} object.
      </description>
      <uniqueKey>
        <parameter ref="EUID"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="EUID" access="readOnly">
        <description>
          Execution Unit Identifier chosen by the {{object|#.ExecEnv}} during
          installation of the associated {{object|#.DeploymentUnit}}.

          The format of this value is Execution Environment specific, but it
          MUST be unique across {{object|#.ExecEnv}} instances. Thus, it is
          recommended that this be a combination of the
          {{param|#.ExecEnv.{i}.Name}} and an Execution Environment local
          unique value.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>

      <parameter name="Name" access="readOnly">
        <description>
          The name of this {{object}} as it pertains to its associated
          {{object|#.DeploymentUnit}}, which SHOULD be unique across all
          {{object}} instances contained within its associated
          {{object|#.DeploymentUnit}}.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecEnvLabel" access="readOnly">
        <description>
          The name of this {{object}} as provided by the {{object|#.ExecEnv}},
          which SHOULD be unique across all {{object}} instances contained
          within a specific {{object|#.ExecEnv}}.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Status" access="readOnly">
        <description>
          Indicates the status of this {{object}}.
        </description>
        <syntax>
          <string>
            <enumeration value="Idle">
              <description>
                This instance is in an Idle state and not running.
              </description>
            </enumeration>
            <enumeration value="Starting">
              <description>
                This instance is in the process of Starting and SHOULD
                transition to the {{enum|Active}} state.
              </description>
            </enumeration>
            <enumeration value="Active">
              <description>This instance is currently running.</description>
            </enumeration>
            <enumeration value="Stopping">
              <description>
                This instance is in the process of Stopping and SHOULD
                transition to the {{enum|Idle}} state.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecutionFaultCode" access="readOnly">
        <description>
          If while running or transitioning between states this {{object}}
          identifies a fault this parameter embodies the problem. The value of
          {{enum|NoFault}} MUST be used when everything is working as intended.
          {{enum}}

          For fault codes not included in this list, the vendor MAY include
          vendor-specific values, which MUST use the format defined in
          {{bibref|TR-106|Section 3.3}}.
        </description>
        <syntax>
          <string>
            <enumeration value="NoFault"/>
            <enumeration value="FailureOnStart"/>
            <enumeration value="FailureOnAutoStart"/>
            <enumeration value="FailureOnStop"/>
            <enumeration value="FailureWhileActive"/>
            <enumeration value="DependencyFailure"/>
            <enumeration value="UnStartable"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecutionFaultMessage" access="readOnly">
        <description>
          If while running or transitioning between states this {{object}}
          identifies a fault this parameter provides a more detailed
          explanation of the problem.

          If {{param|ExecutionFaultCode}} has the value of
          {{enum|NoFault|ExecutionFaultCode}} then the value of this parameter
          MUST be {{empty}} and ignored by the Controller.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="AutoStart" access="readWrite">
        <description>
          If {{true}} and the {{param|RunLevel}} verification is also met, then
          this {{object}} will be automatically started by the device after its
          {{object|#.ExecEnv}} is either rebooted or restarted.

          If {{false}} this {{object}} will not be started after its
          {{object|#.ExecEnv}} is either rebooted or restarted until it is
          explicitly commanded to do so by either the Controller or another
          Execution Unit.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="RunLevel" access="readWrite">
        <description>
          Determines when this {{object}} will be started.

          If {{param|AutoStart}} is {{true}} and
          {{param|#.ExecEnv.{i}.CurrentRunLevel}} is greater than or equal to
          {{param}}, then this {{object}} will be started.

          If the value of {{param|#.ExecEnv.{i}.CurrentRunLevel}} is -1, then
          the associated {{object|#.ExecEnv.}} doesn't support Run Levels, thus
          the value of this parameter is irrelevant when read and setting its
          value has no impact to the Run Level of this {{object}}.
        </description>
        <syntax>
          <unsignedInt>
            <range maxInclusive="65535"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="Vendor" access="readOnly">
        <description>
          Vendor of this {{object}}.
        </description>
        <syntax>
          <string>
            <size maxLength="128"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Version" access="readOnly">
        <description>
          Version of the {{object}}. The format of this value is Execution
          Environment specific.
        </description>
        <syntax>
          <string>
            <size maxLength="32"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Textual description of this {{object}}. The format of this value is
          Execution Environment specific.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="DiskSpaceInUse" access="readOnly">
        <description>
          The amount of disk space measured in {{units}} currently being used
          by this {{object}}. A value of -1 MUST be used for {{object}}
          instances where this parameter is not applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="MemoryInUse" access="readOnly">
        <description>
          The amount of physical RAM measured in {{units}} currently being used
          by this {{object}}. A value of -1 MUST be used for {{object}}
          instances where this parameter is not applicable.
        </description>
        <syntax>
          <int>
            <range minInclusive="-1"/>
            <units value="KiB"/>
          </int>
        </syntax>
      </parameter>

      <parameter name="References" access="readOnly">
        <description>
          Represents the instances of multi-instanced objects that are directly
          controlled by, and have come into existence because of, this
          {{object}}.

          NOTE: All other objects and parameters (i.e. not multi-instanced
          objects) that this {{object}} has caused to come into existence can
          be discovered via the GetSupportedDM and GetInstances USP messages.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong" targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="AssociatedProcessList" access="readOnly">
        <description>
          Represents the system processes that are active in the system because
          of this {{object}}.

          If {{param|Status}} is not {{enum|Active|Status}} it is expected that
          this list will be {{empty}}. Some {{object}} instances MIGHT NOT have
          any system processes irrespective of the value of {{param|Status}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong"
                targetParent=".DeviceInfo.ProcessStatus.Process."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="VendorLogList" access="readOnly">
        <description>
          Represents the vendor log files that have come into existence because
          of this {{object}}.

          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to
          come into existence) is uninstalled the vendor log files referenced
          here SHOULD be removed from the device.

          Not all {{object}} instances will actually have a corresponding
          vendor log file, in which case the value of this parameter will be
          {{empty}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong"
                targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="VendorConfigList" access="readOnly">
        <description>
          Represents the vendor config files that have come into existence
          because of this {{object}}.

          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to
          come into existence) is uninstalled the vendor config files
          referenced here SHOULD be removed from the device.

          Not all {{object}} instances will actually have a corresponding
          vendor config file, in which case the value of this parameter will be
          {{empty}}.
        </description>
        <syntax>
          <list/>
          <string>
            <pathRef refType="strong"
                targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="ExecutionEnvRef" access="readOnly">
        <description>
          Represents the {{object|#.ExecEnv}} that this {{object}} is
          associated with.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="#.ExecEnv."
                targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <command name="SetRequestedState()">
        <description>
          Set the state transition that the Controller is requesting for this
          instance of the {{object}} object.

          If this instance of the {{object}} object is associated with an
          Execution Environment that is disabled and an attempt is made to
          alter this value, then a error message MUST be generated.
        </description>
        <input>

          <parameter name="RequestedState" mandatory="true" version="2.12">
            <description>
              Indicates the requested state to transition this instance of the
              {{object|##.}} object. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Idle">
                  <description>
                    If this {{object|##.}} is currently in
                    {{enum|Starting|###.ExecutionUnit.{i}.Status}} or
                    {{enum|Active|###.ExecutionUnit.{i}.Status}} the device
                    will attempt to Stop the Execution Unit; otherwise this
                    requested state is ignored.
                  </description>
                </enumeration>
                <enumeration value="Active">
                  <description>
                    If this {{object|##.}} is currently in
                    {{enum|Idle|###.ExecutionUnit.{i}.Status}} the device will
                    attempt to Start the Execution Unit.

                    If this {{object|##.}} is in
                    {{enum|Stopping|###.ExecutionUnit.{i}.Status}} the request
                    is rejected and a fault raised. Otherwise this requested
                    state is ignored.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object name="Device.SoftwareModules.ExecutionUnit.{i}.Extensions."
        access="readOnly" minEntries="1" maxEntries="1" version="2.12">
      <description>
        This object proposes a general location for vendor extensions specific
        to this Execution Unit, which allows multiple Execution Units to expose
        parameters without the concern of conflicting parameter names. These
        vendor extensions are related to displaying status and maintaining
        configuration for this Execution Unit.

        It is also possible for the Execution Unit to expose status and
        configuration parameters within Service objects or as embedded objects
        and parameters directly within the root data model, in which case the
        combination of {{param|#.References}} and use of GetSupportDM and
        GetInstances USP messages will be used to determine their locations.
      </description>
    </object>

    <object name="Device.ProxiedDevice.{i}." access="readOnly" minEntries="0"
        maxEntries="unbounded" mountType="mountPoint"
        numEntriesParameter="ProxiedDeviceNumberOfEntries" version="2.12">
      <description>
        Each entry in the table is a ProxiedDevice object that is a mount
        point. Each ProxiedDevice represents distinct hardware Devices.
        ProxiedDevice objects are virtual and abstracted representation of
        functionality, that exists on hardware other than that which the Agent
        is running.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <parameter name="Alias" access="readWrite">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="Alias"/>
        </syntax>
      </parameter>
      <component ref="IoT_ProxiedDeviceExtensionComponent"/>
      <component ref="IoT_NodeComponent"/>
    </object>
    <!-- IoT specific objects -->

    <object base="Device.DeviceInfo.FirmwareImage.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Download()" async="true" version="2.12">
        <description>
          This command is issued to download a firmware into this Firmware
          Image instance.

          All results of the actual download will be contained within the
          {{event|Device.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the source file location. HTTP and
              HTTPS transports MUST be supported.

              If the Agent receives multiple download requests with the same
              source URL, the Agent MUST perform each download as requested,
              and MUST NOT assume that the content of the file to be downloaded
              is the same each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="AutoActivate" mandatory="true">
            <description>
              If {{true}} the Agent MUST automatically activate the firmware
              once it is successfully downloaded.

              If {{false}} the Agent MUST NOT activate the firmware until
              explicitly instructed to do so by either invoking
              {{command|#.Activate()}} or setting
              {{param|##.BootFirmwareImage}} and rebooting the Agent.
            </description>
            <syntax>
              <boolean/>
            </syntax>
          </parameter>

          <parameter name="Username">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This argument is omitted if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This argument is omitted if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="FileSize">
            <description>
              The size of the file to be downloaded in bytes.

              The FileSize argument is intended as a hint to the Agent, which
              the Agent MAY use to determine if it has sufficient space for the
              file to be downloaded, or to prepare space to accept the file.

              The Controller MAY set this value to zero. The Agent MUST
              interpret a zero value to mean that that the Controller has
              provided no information about the file size. In this case, the
              Agent MUST attempt to proceed with the download under the
              presumption that sufficient space is available, though during the
              course of download, the Agent might determine otherwise.

              The Controller SHOULD set the value of this Parameter to the
              exact size of the file to be downloaded. If the value is
              non-zero, the Agent MAY reject the ScheduleDownload request on
              the basis of insufficient space.

              If the Agent attempts to proceed with the download based on the
              value of this argument, but the actual file size differs from the
              value of this argument, this could result in a failure of the
              download. However, the Agent MUST NOT cause the download to fail
              solely because it determines that the value of this argument is
              inaccurate.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="CheckSumAlgorithm">
            <description>
              The hash algorithm to use when performing a checksum validation
              of the downloaded file.

              If the {{param|CheckSum}} input argument is specified, the Agent
              MUST validate the integrity of the downloaded file by comparing
              the value contained in the {{param|CheckSum}} input argument
              against a hash of the downloaded file.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSum">
            <description>
              The hash value of the downloaded file used to validate the
              integrity of the downloaded file.

              If this argument is specified, the Agent MUST validate the
              integrity of the downloaded file by comparing the provided value
              against a hash of the downloaded file using the hashing algorithm
              specified in the {{param|CheckSumAlgorithm}} input argument.

              If this argument is {{empty}}, the Agent MUST NOT perform a
              checksum validation of the downloaded file.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Activate()" async="true" version="2.12">
        <description>
          This command is issued to activate this {{object}} instance.

          A {{object}} instance can also be activated by setting the
          {{param|Device.DeviceInfo.BootFirmwareImage}} parameter and causing
          the Agent to reboot.

          A successful activation will result in a reboot of the device with
          this {{object}} as the currently running firmware image. Furthermore,
          this {{object}} will be referenced by the
          {{param|Device.DeviceInfo.ActiveFirmwareImage}} parameter.

          A failed activation will result in this {{object}} instance's
          {{param|BootFailureLog}} being updated.
        </description>
        <input>

          <object name="TimeWindow.{i}." minEntries="1" maxEntries="5">
            <description>
              The time window(s) that dictate when the Agent activates the
              firmware image.

              An Agent MUST be able to accept a request with either one or two
              {{object}} instances.

              The time windows MUST NOT overlap, i.e. if there are two time
              windows, the second window’s Start value has to be greater than
              or equal to the first window’s End value.
            </description>

            <parameter name="Start" mandatory="true">
              <description>
                Start of this time window as an offset in {{units}} after
                invoking the command. An offset is used in order to avoid a
                dependence on absolute time.
              </description>
              <syntax>
                <unsignedInt>
                  <units value="seconds"/>
                </unsignedInt>
              </syntax>
            </parameter>

            <parameter name="End" mandatory="true">
              <description>
                End of this time window as an offset in {{units}} after
                invoking the command. An offset is used in order to avoid a
                dependence on absolute time.
              </description>
              <syntax>
                <unsignedInt>
                  <units value="seconds"/>
                </unsignedInt>
              </syntax>
            </parameter>

            <parameter name="Mode" mandatory="true">
              <description>
                Specifies when within this time window the Agent is permitted
                to activate the specified firmware image.
              </description>
              <syntax>
                <string>
                  <enumeration value="AnyTime">
                    <description>
                      The Agent MAY activate the firmware image at any time
                      during the time window even if this results in
                      interruption of service for the subscriber.
                    </description>
                  </enumeration>
                  <enumeration value="Immediately">
                    <description>
                      The Agent MUST activate the firmware image immediately at
                      the start of the time window even if this results in
                      interruption of service for the subscriber.
                    </description>
                  </enumeration>
                  <enumeration value="WhenIdle">
                    <description>
                      The Agent MUST NOT cause an interruption of service from
                      the subscriber's standpoint while activating the firmware
                      image during the time window.

                      How the Agent determines this is outside the scope of
                      this specification.
                    </description>
                  </enumeration>
                  <enumeration value="ConfirmationNeeded">
                    <description>
                      The Agent MUST ask for and receive confirmation before
                      activating the firmware image.

                      It is outside the scope of this specification how the
                      Agent asks for and receives this confirmation.

                      If confirmation is not received, this time window MUST
                      NOT be used.
                    </description>
                  </enumeration>
                </string>
              </syntax>
            </parameter>

            <parameter name="UserMessage">
              <description>
                A message that informs the user of a request to activate a new
                firmware image.

                The Agent MAY use this message when seeking confirmation from
                the user, e.g. when {{param|Mode}} is
                {{enum|ConfirmationNeeded|Mode}}.

                When there is no need for such a message, it SHOULD be
                {{empty}} and MUST be ignored.
              </description>
              <syntax>
                <string/>
              </syntax>
            </parameter>

            <parameter name="MaxRetries">
              <description>
                The maximum number of retries for activating the firmware image
                before regarding the transfer as having failed. Refers only to
                this time window (each time window can specify its own value).

                A value of 0 means “No retries are permitted”. A value of -1
                means “the Agent determines the number of retries”, i.e. that
                the Agent can use its own retry policy, not that it has to
                retry forever.

                Only applicable when the {{param|Mode}} input argument is
                {{enum|ConfirmationNeeded|Mode}}, otherwise this input argument
                MUST be ignored.
              </description>
              <syntax>
                <int>
                  <range minInclusive="-1" maxInclusive="10"/>
                </int>
              </syntax>
            </parameter>
          </object>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo.VendorLogFile.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Upload()" async="true" version="2.12">
        <description>
          This command is issued to upload the log file specified by this
          Vendor Log File instance.

          All results of the actual upload will be contained within the
          {{event|Device.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the destination file location. HTTP
              and HTTPS transports MUST be supported.

              This argument specifies only the destination file location, and
              does not indicate in any way the name or location of the local
              file to be uploaded.

              If the Agent receives multiple upload requests with the same URL,
              the Agent MUST perform each upload as requested, and MUST NOT
              assume that the content of the file to be uploaded is the same
              each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>

    <object base="Device.DeviceInfo.VendorConfigFile.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Backup()" async="true" version="2.12">
        <description>
          This command is issued to upload the configuration file specified by
          this {{object}} instance.

          All results of the actual upload will be contained within the
          {{event|Device.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the destination file location. HTTP
              and HTTPS transports MUST be supported.

              This argument specifies only the destination file location, and
              does not indicate in any way the name or location of the local
              file to be uploaded.

              If the Agent receives multiple upload requests with the same URL,
              the Agent MUST perform each upload as requested, and MUST NOT
              assume that the content of the file to be uploaded is the same
              each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="Restore()" async="true" version="2.12">
        <description>
          This command is issued to download a configuration file into this
          {{object}} instance.

          All results of the actual download will be contained within the
          {{event|Device.LocalAgent.TransferComplete!}} event.
        </description>
        <input>

          <parameter name="URL" mandatory="true">
            <description>
              The {{datatype}} specifying the source file location. HTTP and
              HTTPS transports MUST be supported.

              If the Agent receives multiple download requests with the same
              source URL, the Agent MUST perform each download as requested,
              and MUST NOT assume that the content of the file to be downloaded
              is the same each time.

              This URL MUST NOT include the "userinfo" component, as defined in
              {{bibref|RFC3986}}.
            </description>
            <syntax>
              <dataType ref="URL"/>
            </syntax>
          </parameter>

          <parameter name="Username" mandatory="true">
            <description>
              Username to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="Password" mandatory="true">
            <description>
              Password to be used by the Agent to authenticate with the file
              server. This string is set to {{empty}} if no authentication is
              required.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="FileSize">
            <description>
              The size of the file to be downloaded in bytes.

              The FileSize argument is intended as a hint to the Agent, which
              the Agent MAY use to determine if it has sufficient space for the
              file to be downloaded, or to prepare space to accept the file.

              The Controller MAY set this value to zero. The Agent MUST
              interpret a zero value to mean that that the Controller has
              provided no information about the file size. In this case, the
              Agent MUST attempt to proceed with the download under the
              presumption that sufficient space is available, though during the
              course of download, the Agent might determine otherwise.

              The Controller SHOULD set the value of this Parameter to the
              exact size of the file to be downloaded. If the value is
              non-zero, the Agent MAY reject the ScheduleDownload request on
              the basis of insufficient space.

              If the Agent attempts to proceed with the download based on the
              value of this argument, but the actual file size differs from the
              value of this argument, this could result in a failure of the
              download. However, the Agent MUST NOT cause the download to fail
              solely because it determines that the value of this argument is
              inaccurate.
            </description>
            <syntax>
              <unsignedInt/>
            </syntax>
          </parameter>

          <parameter name="TargetFileName">
            <description>
              The name of the file to be used on the target file system. This
              argument MAY be {{empty}} if the target file name can be
              extracted from the downloaded file itself, or from the URL
              argument, or if no target file name is needed.

              If this argument is specified, but the target file name is also
              indicated by another source (for example, if it is extracted from
              the downloaded file itself), this argument MUST be ignored.

              If the target file name is used, the downloaded file would
              replace any existing file of the same name (whether or not the
              Agent archives the replaced file is a local matter).

              If present, this Parameter is treated as an opaque string with no
              specific requirements for its format. That is, the TargetFileName
              value is to be interpreted based on the Agent's vendor-specific
              file naming conventions.

              Note that this specification does not preclude the use of a file
              naming convention in which the file’s path can be specified as
              part of the file name.
            </description>
            <syntax>
              <string>
                <size maxLength="256"/>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSumAlgorithm">
            <description>
              The hash algorithm to use when performing a checksum validation
              of the downloaded file.

              If the {{param|CheckSum}} input argument is specified, the Agent
              MUST validate the integrity of the downloaded file by comparing
              the value contained in the {{param|CheckSum}} input argument
              against a hash of the downloaded file.
            </description>
            <syntax>
              <string>
                <enumeration value="SHA-1">
                  <description>
                    As specified in {{bibref|RFC3174}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-224">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-256">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-384">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
                <enumeration value="SHA-512">
                  <description>
                    As specified in {{bibref|RFC6234}}.
                  </description>
                </enumeration>
              </string>
            </syntax>
          </parameter>

          <parameter name="CheckSum">
            <description>
              The hash value of the downloaded file used to validate the
              integrity of the downloaded file.

              If this argument is specified, the Agent MUST validate the
              integrity of the downloaded file by comparing the provided value
              against a hash of the downloaded file using the hashing algorithm
              specified in the {{param|CheckSumAlgorithm}} input argument.

              If this argument is {{empty}}, the Agent MUST NOT perform a
              checksum validation of the downloaded file.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
      </command>
    </object>
    <!-- Diagnostics Commands from common model -->

    <object base="Device.DSL.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="ADSLLineTest()" async="true" version="2.12">
        <description>
          This command is to provide diagnostic information for a CPE with an
          ADSL2 or ADSL2+ modem WAN interface, but MAY also be used for ADSL.
        </description>
        <input>
          <component ref="ADSLLineDiagnosticsInput"/>

          <parameter base="Interface" mandatory="true"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="ADSLLineDiagnosticsOutput"/>
        </output>
      </command>

      <command name="SELTUER()" async="true" version="2.13">
        <description>
          This command performs a DSL Single Ended Line Test - Physical Medium
          Dependent (SELT-PMD) Uncalibrated Echo Response (UER).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2|Clause A.2, SELT-PMD
          management entity}}.
        </description>
        <input>
          <component ref="SELTUERDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTUERDiagnosticsOutput"/>
        </output>
      </command>

      <command name="SELTQLN()" async="true" version="2.13">
        <description>
          This command performs a DSL Single Ended Line Test - Physical Medium
          Dependent (SELT-PMD) Quiet Line Noise (QLN).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2|Clause A.2, SELT-PMD
          management entity}}.
        </description>
        <input>
          <component ref="SELTQLNDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTQLNDiagnosticsOutput"/>
        </output>
      </command>

      <command name="SELTP()" async="true" version="2.13">
        <description>
          This command performs a DSL Single-Ended Line Test - Processed
          (SELT-P).

          This command is for the CPE, aka the Transmission Unit - Remote end
          (TU-R).

          Reference: ITU-T Recommendation {{bibref|G.996.2}}.
        </description>
        <input>
          <component ref="SELTPDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="SELTPDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.ATM." access="readOnly" minEntries="1" maxEntries="1">
      <description action="replace">
        Asynchronous Transfer Mode (ATM) object that contains the
        {{object|Link}} interface and {{object|Diagnostics.F5Loopback()}}
        diagnostics.
      </description>
    </object>

    <object base="Device.ATM.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="F5Loopback()" async="true" version="2.12">
        <description>
          This command provides access to an ATM-layer F5 OAM loopback test.
        </description>
        <input>
          <component ref="ATMF5LoopbackDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="ATMF5LoopbackDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.HPNA.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PHYThroughput()" async="true" version="2.12">
        <description>
          HPNA PHY throughput diagnostics configuration and results.

          When diagnostics are requested, all HPNA nodes for which the
          {{param|#.Interface.{i}.AssociatedDevice.{i}.PHYDiagnosticsEnable}}
          parameter is set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="HPNAPHYThroughputDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_FailToEnableCert"/>
                <enumeration value="Error_CertCmdTimeout"/>
                <enumeration value="Error_UnknownErr"/>
                <enumeration value="Error_UnsupportedOpcode"/>
                <enumeration value="Error_InvalidParam"/>
                <enumeration value="Error_UnsupportedCmdSegment"/>
                <enumeration value="Error_UnsupportedDataGen"/>
                <enumeration value="Error_InvalidSequence"/>
                <enumeration value="Error_InvalidFrame"/>
                <enumeration value="Eror_InvalidOpcode"/>
              </string>
            </syntax>
          </parameter>
          <component ref="HPNAPHYThroughputDiagnosticsOutput"/>
        </output>
      </command>

      <command name="PerformanceMonitoring()" async="true" version="2.12">
        <description>
          HPNA performance monitoring configuration and results.

          Performance monitoring results are sampled from all nodes in the HPNA
          network. All packet related counters are sampled synchronized at all
          nodes in the HPNA network in order to derive packet loss calculations
          in the HPNA network.
        </description>
        <input>
          <component ref="HPNAPerformanceMonitoringDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_SampleIntervalTooSmall"/>
              </string>
            </syntax>
          </parameter>
          <component ref="HPNAPerformanceMonitoringDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.Ghn.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PHYThroughput()" async="true" version="2.12">
        <description>
          G.hn PHY throughput diagnostics configuration and results.

          When diagnostics are requested, all G.hn nodes for which the
          {{param|#.Interface.{i}.PHYThroughputDiagnosticsEnable}} parameter is
          set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="GhnPHYThroughputDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="GhnPHYThroughputDiagnosticsOutput"/>
        </output>
      </command>

      <command name="PerformanceMonitoring()" async="true" version="2.12">
        <description>
          G.hn Performance Monitoring diagnostics configuration and results.

          When diagnostics are requested, all G.hn nodes for which the
          {{param|#.Interface.{i}.PerformanceMonitoringDiagnosticsEnable}}
          parameter is set enter PHY diagnostics mode.
        </description>
        <input>
          <component ref="GhnPerformanceMonitoringDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="GhnPerformanceMonitoringDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.UPA.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="InterfaceMeasurement()" async="true" version="2.12">
        <description>
          This command provides access to either a Signal-to-Noise-Ratio (SNR)
          Port Measurement test or a Channel Frequency Response (CFR) Port
          Measurement test. The {{param|Type}} parameter is used to select
          which type of test to perform.

          CFR and SNR measurements are done between a two UPA devices (a local
          interface and a remote device belonging to the same network).
        </description>
        <input>
          <component ref="UPAInterfaceMeasurementDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_InvalidPort"/>
              </string>
            </syntax>
          </parameter>
          <component ref="UPAInterfaceMeasurementDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.WiFi." access="readOnly" minEntries="1"
        maxEntries="1" version="2.7">

      <command name="NeighboringWiFiDiagnostic()" async="true" version="2.12">
        <description>
          This command defines access to other WiFi SSIDs that this device is
          able to receive.
        </description>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
              </string>
            </syntax>
          </parameter>
          <component ref="WiFiNeighboringWiFiDiagnosticsOutput"/>
        </output>
      </command>

      <command name="Reset()" version="2.12">
        <description>
          This command represents a request to reset or reboot the Wi-Fi
          sub-system without resetting or rebooting the device.
        </description>
      </command>
    </object>

    <object base="Device.WiFi.DataElements.Network." access="readOnly"
        minEntries="1" maxEntries="1" version="2.15">
      <component ref="SetTrafficSeparation"/>
      <component ref="SetServicePrioritization"/>
      <component ref="SetPreferredBackhauls"/>
      <component ref="SetSSID"/>
      <component ref="SetMSCSDisallowed"/>
      <component ref="SetSCSDisallowed"/>
    </object>

    <object base="Device.WiFi.DataElements.Network.Device.{i}."
        access="readOnly" minEntries="1" maxEntries="unbounded" version="2.15">
      <component ref="SetSTASteeringState"/>
      <component ref="SetDFSState"/>
      <component ref="SetAnticipatedChannelPreference"/>
    </object>

    <object base="Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}."
        access="readOnly" minEntries="1" maxEntries="unbounded" version="2.15">
      <component ref="ChannelScanRequest"/>
      <component ref="RadioEnable"/>
      <component ref="SetTxPowerLimit"/>
      <component ref="SetSpatialReuse"/>
      <component ref="WiFiRestart"/>
    </object>

    <object
        base="Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.BSS.{i}."
        access="readOnly" minEntries="1" maxEntries="unbounded" version="2.15">
      <component ref="SetQMDescriptors"/>
    </object>

    <object
        base="Device.WiFi.DataElements.Network.Device.{i}.MultiAPDevice.Backhaul."
        access="readOnly" minEntries="1" maxEntries="1">
      <command name="SteerWiFiBackhaul()" async="true" version="2.15">
        <description>
          This command requests the Wi-Fi backhaul link to be steered to
          associate to a different BSS when the device is working as a bridge
          in a mesh network. The device needs to already have the necessary
          credentials for the switch to happen.

          The {{param|TargetBSS}} should be an instance of a
          Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.BSS.{i}.BSSID.
        </description>
        <input>
          <component ref="SteerWiFiBackhaulInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the response to the Wi-Fi backhaul steering request.
              {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Interface_Down"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object
        base="Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.MultiAPRadio."
        access="readOnly" minEntries="1" maxEntries="1">
      <component ref="FullScan"/>
      <component ref="ChannelScan"/>
    </object>

    <object
        base="Device.WiFi.DataElements.Network.Device.{i}.Radio.{i}.BSS.{i}.STA.{i}.MultiAPSTA."
        access="readOnly" minEntries="1" maxEntries="1">

      <command name="Disassociate()" async="true">
        <description>
          This command represents a request to disassociate this associated
          device.
        </description>
        <input>
          <component ref="DisassociateInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the response to the request to disassociate an
              associated device. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Interface_Down"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>

      <command name="BTMRequest()" async="true">
        <description>
          This command requests initiation of a BSS Transition Management (BTM)
          request to influence this client's roaming behavior to another BSS as
          defined in {{bibref|802.11-2020|Section 9.6.13.9}}.
        </description>
        <input>
          <component ref="BTMRequestInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the response to the BSS Transition Management (BTM)
              request. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Invalid_Mac"/>
                <enumeration value="Error_Interface_Down"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.WiFi.DataElements.AssociationEvent."
        access="readOnly" minEntries="1" maxEntries="1">
      <event name="Associated!" version="2.15">
        <description>
          The event is generated when an Associated Device (STA) associates to
          a BSS.
        </description>
        <component ref="AssociationEventData"/>
      </event>
    </object>

    <object base="Device.WiFi.DataElements.DisassociationEvent."
        access="readOnly" minEntries="1" maxEntries="1">
      <event name="Disassociated!" version="2.15">
        <description>
          The event is generated when an Associated Device (STA) disassociates
          from a BSS.
        </description>
        <component ref="DisassociationEventData"/>
      </event>
    </object>

    <object base="Device.WiFi.DataElements.FailedConnectionEvent."
        access="readOnly" minEntries="1" maxEntries="1">
      <event name="FailedConnection!" version="2.15">
        <description>
          The event is generated when an Associated Device (STA) fails to
          connect to a BSS.
        </description>
        <component ref="FailedConnectionEventData"/>
      </event>
    </object>

    <object base="Device.WiFi.Radio.{i}." access="readOnly" minEntries="0"
        maxEntries="unbounded">

      <command name="RemoteMeasurementRequest()" async="true" version="2.15">
        <description>
          This command requests initiation of a Remote Measurement request to
          retrieve measurement data from a BSS on this radio. Upon receipt of
          this request, this radio is to initiate a measurement of the output
          {{param|SignalStrength}} and {{param|Noise}} for the indicated input.
        </description>
        <input>
          <component ref="RemoteMeasurementRequestInput"/>
        </input>
        <output>
          <component ref="RemoteMeasurementRequestOutput"/>

          <parameter name="Status">
            <description>
              Indicates the response to the Remote Measurement request.
              {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Invalid_Mac"/>
                <enumeration value="Error_Interface_Down"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>

      <command name="InitiateCCAMeasurement()" async="true" version="2.15">
        <description>
          This command represents a request to initiate a Clear Channel
          Assessment (CCA) measurement scan on this radio on the given channel
          using a specific {{param|DwellTime}}.
        </description>
        <input>
          <component ref="CCAMeasurementInput"/>
        </input>
        <output>
          <component ref="CCAMeasurementOutput"/>

          <parameter name="Status">
            <description>
              Indicates the response to the request to initiate a Clear Channel
              Assessment (CCA) measurement. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Implemented"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Interface_Down"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
      <component ref="FullScan"/>
      <component ref="ChannelScan"/>
    </object>

    <object base="Device.WiFi.AccessPoint.{i}.WPS." access="readOnly"
        minEntries="1" maxEntries="1">

      <command name="InitiateWPSPBC()" async="true" version="2.15">
        <description>
          Initiates a Wi-Fi Protected Setup (WPS) Push Button Configuration
          (PBC) process as defined in {{bibref|WPS 2.0}} .
        </description>
        <output>

          <parameter name="Status">
            <description>
              Indicates the response to the request to start Wi-Fi Protected
              Setup (WPS) Push Button Configuration (PBC). {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Success"/>
                <enumeration value="Error_Not_Ready"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.IP.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="IPPing()" async="true" version="2.12">
        <description>
          This command provides access to an IP-layer ping test.
        </description>
        <input>
          <component ref="IPPingDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost">
                  <description>
                    The CPE can not reach the requested Ping host address
                  </description>
                </enumeration>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPPingDiagnosticsOutput"/>

          <parameter base="IPAddressUsed">
            <description action="replace">
              Indicates which IP address was used to send the Ping request.
            </description>
          </parameter>
        </output>
      </command>

      <command name="TraceRoute()" async="true" version="2.12">
        <description>
          This command defines access to an IP-layer trace-route test for the
          specified IP interface.
        </description>
        <input>
          <component ref="IPTraceRouteDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Canceled" optional="true"/>
                <enumeration value="Complete"/>
                <enumeration value="Error" optional="true"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost">
                  <description>
                    The CPE can not reach the requested TraceRoute host address
                  </description>
                </enumeration>
                <enumeration value="Error_MaxHopCountExceeded"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPTraceRouteDiagnosticsOutput"/>

          <parameter base="IPAddressUsed">
            <description action="replace">
              Indicates which IP address was used for TraceRoute.
            </description>
          </parameter>
        </output>
      </command>
      <component ref="IPDownloadDiagnosticsCapabilities"/>

      <parameter base="DownloadDiagnosticsMaxIncrementalResult"
          access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|DownloadDiagnostics().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="DownloadDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a HTTP and FTP
          DownloadDiagnostics Test.

          Files received in the DownloadDiagnostics do not require file storage
          on the CPE device.
        </description>
        <input>
          <component ref="IPDownloadDiagnosticsInput"/>
          <component ref="IPDownloadDiagnosticsInput2"/>

          <parameter base="NumberOfConnections">
            <description action="replace">
              The number of connections to be used in the test. The default
              value SHOULD be 1. {{param}} MUST NOT be set to a value greater
              than {{param|#.DownloadDiagnosticMaxConnections}}.
            </description>
            <syntax>
              <unsignedInt>
                <range minInclusive="1"/>
              </unsignedInt>
            </syntax>
          </parameter>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_TransferFailed"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_NoTransferMode"/>
                <enumeration value="Error_NoPASV"/>
                <enumeration value="Error_IncorrectSize"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPDownloadDiagnosticsOutput"/>

          <object base="PerConnectionResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for individual connections. This table is only populated
              when {{param|#.EnablePerConnectionResults}} is {{true}}. A new
              object is created for each connection specified in
              {{param|#.NumberOfConnections}}. Instance numbers MUST start at 1
              and sequentially increment as new instances are created.
            </description>
          </object>

          <object base="IncrementalResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for time segmented tests (tests where
              {{param|#.TimeBasedTestDuration}} &gt; 0 and
              {{param|#.TimeBasedTestMeasurementInterval}} &gt; 0). This data
              is totaled across all connections in the test. A new object is
              created every {{param|#.TimeBasedTestMeasurementInterval}} after
              that interval has completed. Instance numbers MUST start at 1 and
              sequentially increment as new instances are created.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPUploadDiagnosticsCapabilities"/>

      <parameter base="UploadDiagnosticsMaxIncrementalResult"
          access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|UploadDiagnostics().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="UploadDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a HTTP or FTP
          UploadDiagnostics test.

          Files sent by the UploadDiagnostics do not require file storage on
          the CPE device, and MAY be an arbitrary stream of bytes.
        </description>
        <input>
          <component ref="IPUploadDiagnosticsInput"/>
          <component ref="IPUploadDiagnosticsInput2"/>

          <parameter base="NumberOfConnections">
            <description action="replace">
              The number of connections to be used in the test. The default
              value SHOULD be 1. {{param}} MUST NOT be set to a value greater
              than {{param|#.UploadDiagnosticsMaxConnections}}.
            </description>
          </parameter>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_NoTransferMode"/>
                <enumeration value="Error_NoPASV"/>
                <enumeration value="Error_NoCWD"/>
                <enumeration value="Error_NoSTOR"/>
                <enumeration value="Error_NoTransferComplete"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPUploadDiagnosticsOutput"/>

          <object base="PerConnectionResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for individual connections. This table is only populated
              when {{param|#.EnablePerConnectionResults}} is {{true}}. A new
              object is created for each connection specified in
              {{param|#.NumberOfConnections}}. Instance numbers MUST start at 1
              and sequentially increment as new instances are created.
            </description>
          </object>

          <object base="IncrementalResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              Results for time segmented tests (tests where
              {{param|#.TimeBasedTestDuration}} &gt; 0 and
              {{param|#.TimeBasedTestMeasurementInterval}} &gt; 0). This data
              is totaled across all connections in the test. A new object is
              created every {{param|#.TimeBasedTestMeasurementInterval}} after
              that interval has completed. Instance numbers MUST start at 1 and
              sequentially increment as new instances are created.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPUDPEchoDiagnosticsCapabilities"/>

      <parameter base="UDPEchoDiagnosticsMaxResults" access="readOnly">
        <description action="replace">
          The maximum number of rows in
          {{object|UDPEchoDiagnostics().IndividualPacketResult}} that the CPE
          will store. If a test would create more rows than {{param}} only the
          first {{param}} rows are present in
          {{object|UDPEchoDiagnostics().IndividualPacketResult}}.
        </description>
      </parameter>

      <command name="UDPEchoDiagnostics()" async="true" version="2.12">
        <description>
          This command defines the diagnostics configuration for a UDP Echo
          test {{bibref|TR-143|Appendix A.1}} defined in {{bibref|RFC862}} or a
          UDP Echo Plus test defined in {{bibref|TR-143|Appendix A.1}}.
        </description>
        <input>
          <component ref="IPUDPEchoDiagnosticsInput"/>
          <component ref="IPUDPEchoDiagnosticsInput2"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPUDPEchoDiagnosticsOutput"/>

          <object base="IndividualPacketResult.{i}." minEntries="0"
              maxEntries="unbounded">
            <description action="replace">
              This object provides the results from individual UDPEchoPlus test
              packets collected during a test if
              {{param|#.EnableIndividualPacketResults}} is set to true. It
              should contain {{param|#.NumberOfRepetitions}} objects. Instance
              numbers MUST start at 1 and sequentially increment as new
              instances are created. The instance number should match the
              TestIterationNumber field of the request and response packet.
            </description>
          </object>
        </output>
      </command>
      <component ref="IPLayerCapacityCapabilities"/>

      <parameter base="IPLayerMaxIncrementalResult" access="readOnly">
        <description action="replace">
          The maximum number of instances in
          {{object|IPLayerCapacity().IncrementalResult}} that the
          implementation will return.
        </description>
      </parameter>

      <command name="IPLayerCapacity()" async="true" version="2.14">
        <description>
          This command defines the IP Layer Capacity measurement configuration.
          IP Layer Capacity measurement is specified in {{bibref|TR-471}}.

          Data received in the IP Layer Capacity measurement do not require
          storage on the device.
        </description>
        <input>
          <component ref="IPLayerCapacityInput"/>
        </input>
        <output>

          <parameter name="Status">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_NoRouteToHost"/>
                <enumeration value="Error_InitConnectionFailed"/>
                <enumeration value="Error_NoResponse"/>
                <enumeration value="Error_PasswordRequestFailed"/>
                <enumeration value="Error_LoginFailed"/>
                <enumeration value="Error_RejectedByRemote"/>
                <enumeration value="Error_IncorrectSize"/>
                <enumeration value="Error_Timeout"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPLayerCapacityOutput"/>
        </output>
      </command>

      <command name="ServerSelectionDiagnostics()" async="true" version="2.12">
        <description>
          This command provides access to a diagnostics test that performs
          either an ICMP Ping or UDP Echo ping against multiple hosts
          determining which one has the smallest average response time. There
          MUST be a ping response to the transmitted ping, or timeout, before
          the next ping is sent out.
        </description>
        <input>
          <component ref="IPServerSelectionDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_CannotResolveHostName"/>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="IPServerSelectionDiagnosticsOutput"/>
        </output>
      </command>
    </object>

    <object base="Device.DNS.Diagnostics." access="readOnly" minEntries="1"
        maxEntries="1">
      <description action="replace">
        The DNS Diagnostics object containing the
        {{object|NSLookupDiagnostics()}} test.
      </description>

      <command name="NSLookupDiagnostics()" async="true" version="2.12">
        <description>
          This command defines access to an IP-layer NS Lookup test for the
          specified IP interface.

          When initiated, the NS Lookup test will contact {{param|DNSServer}}
          and look up {{param|HostName}} {{param|NumberOfRepetitions}} times.

          There will be a {{object|Result}} instance for each time the device
          performs a DNS lookup, which is determined by the value of
          {{param|NumberOfRepetitions}}.

          Any previous {{object|Result}} instances are removed when a new test
          is initiated.
        </description>
        <input>
          <component ref="DNSLookupDiagnosticsInput"/>
        </input>
        <output>

          <parameter name="Status" version="2.13">
            <description>
              Indicates the availability of diagnostics data. {{enum}}

              If the value of this parameter is anything other than
              {{enum|Complete}}, the values of the other results parameters for
              this test are indeterminate.
            </description>
            <syntax>
              <string>
                <enumeration value="Complete"/>
                <enumeration value="Error_DNSServerNotResolved">
                  <description>Unable to resolve DNSServer Name</description>
                </enumeration>
                <enumeration value="Error_Internal"/>
                <enumeration value="Error_Other"/>
              </string>
            </syntax>
          </parameter>
          <component ref="DNSLookupDiagnosticsOutput"/>

          <object base="Result.{i}." minEntries="0" maxEntries="unbounded">

            <parameter base="Status">
              <description action="replace">
                Result Parameter to represent whether the NS Lookup was
                successful or not.
              </description>
            </parameter>
          </object>
        </output>
      </command>
    </object>
    <!-- Commands from common model (converted true parameters) -->

    <object base="Device.WiFi.AccessPoint.{i}.Security." access="readOnly"
        minEntries="1" maxEntries="1">

      <command name="Reset()" version="2.12">
        <description>
          Reset this {{object|#}} instance's WiFi security settings to their
          factory default values. The affected settings include
          {{param|ModeEnabled}}, {{param|WEPKey}}, {{param|PreSharedKey}},
          {{param|KeyPassphrase}}, {{param|SAEPassphrase}}, and
          {{param|#.WPS.PIN}} (if applicable).

          If the command cannot be executed, the agent MUST reject the command.
          Possible failure reasons include a lack of default values or if
          {{param|ModeEnabled}} is an Enterprise type, i.e.
          {{enum|WPA-Enterprise|ModesSupported}},
          {{enum|WPA2-Enterprise|ModesSupported}},
          {{enum|WPA3-Enterprise|ModesSupported}}, or
          {{enum|WPA-WPA2-Enterprise|ModesSupported}}.
        </description>
      </command>
    </object>

    <object base="Device.Users." access="readOnly" minEntries="1"
        maxEntries="1">
      <command name="CheckCredentialsDiagnostics()" async="true"
          version="2.15">
        <description>
          Checks whether the input {{param|Username}} and {{param|Password}}
          are valid for allowing access to the user interface on the device. If
          not valid, then an indication of why they are not valid is output.
        </description>

        <input>
          <component ref="CheckCredentialsInput"/>
        </input>

        <output>
          <parameter name="Status">
            <description>
              Indicates the response to request to check whether the
              credentials are valid and, if not, why not. {{enum}}
            </description>
            <syntax>
              <string>
                <enumeration value="Credentials_Good"/>
                <enumeration
                    value="Credentials_Bad_Requested_Username_Not_Supported"/>
                <enumeration
                    value="Credentials_Bad_Requested_Password_Incorrect"/>
                <enumeration value="Credentials_Missing"/>
                <enumeration value="Error_Invalid_Input"/>
                <enumeration value="Error_Other" optional="true"/>
              </string>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object base="Device.DHCPv6.Client.{i}." access="readWrite" minEntries="1"
        maxEntries="unbounded">

      <command name="Renew()" dmr:previousParameter="RapidCommit"
          version="2.12">
        <description>
          The {{object}} will renew its DHCPv6-supplied information (i.e. the
          Agent will do a renew or information request as needed, updating both
          stateful and stateless parameter values discovered by this Client
          instance).
        </description>
      </command>
    </object>

    <object base="Device.FAP.GPS." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="GPSReset()" dmr:previousParameter="NumberOfSatellites"
          version="2.12">
        <description>
          Reset the GPS Hardware.
        </description>
      </command>
    </object>

    <object base="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
        access="readOnly" minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Status" version="2.12">
        <description>
          Resets the temperature sensor.
        </description>
      </command>
    </object>

    <object base="Device.UserInterface." access="readOnly" minEntries="1"
        maxEntries="1">

      <command name="PasswordReset()"
          dmr:previousParameter="PasswordUserSelectable" version="2.12">
        <description>
          Present only if the Agent provides a password-protected LAN-side user
          interface and supports LAN-side Auto-Configuration.

          Reset {{param|.LANConfigSecurity.ConfigPassword}} to its factory
          value.
        </description>
      </command>
    </object>

    <object base="Device.USB.USBHosts.Host.{i}." access="readOnly"
        minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Type" version="2.12">
        <description>
          Reset the Host Controller and apply the reset signaling (see
          {{bibref|USB2.0|Chapter 7.1.7.5}}) to all of the Host Controller Hub
          downstream ports.
        </description>
      </command>
    </object>

    <object base="Device.PPP.Interface.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="LowerLayers"
          version="2.12">
        <description>
          On a reset the device MUST tear down the existing PPP connection
          represented by this object and establish a new one.

          The device MAY delay resetting the connection in order to avoid
          interruption of a user service such as an ongoing voice call.

          Reset on a disabled interface is a no-op (not an error).
        </description>
      </command>
    </object>

    <object base="Device.IP.Interface.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Router" version="2.12">
        <description>
          On a reset device MUST tear down the existing IP connection
          represented by this object and establish a new one.

          The device MAY delay resetting the connection in order to avoid
          interruption of a user service such as an ongoing voice call.

          Reset on a disabled interface is a no-op (not an error).
        </description>
      </command>
    </object>

    <object base="Device.DHCPv4.Client.{i}." access="readWrite" minEntries="1"
        maxEntries="unbounded">

      <command name="Renew()" dmr:previousParameter="DHCPStatus"
          version="2.12">
        <description>
          The DHCP client will renew its DHCP lease.
        </description>
      </command>
    </object>

    <object base="Device.IEEE8021x.Supplicant.{i}." access="readWrite"
        minEntries="1" maxEntries="unbounded">

      <command name="Reset()"
          dmr:previousParameter="AuthenticationSuccessPolicy" version="2.12">
        <description>
          On a reset the device MUST reset the session by performing an initial
          authentication attempt as defined in {{bibref|802.1x-2004|9.6.1.3}},
          Initialize Port by sending out the EAP start message.

          The device MAY delay resetting the resource in order to avoid
          interruption of a user service such as an ongoing voice call.
        </description>
      </command>

      <command name="Disconnect()" version="2.12">
        <description>
          On a reset the device MUST disconnect (forced unauthentication) the
          resource.

          The device MAY delay re-authentication of the resource in order to
          avoid interruption of a user service such as an ongoing voice call.
        </description>
      </command>
    </object>

    <object base="Device.SmartCardReaders.SmartCardReader.{i}."
        access="readOnly" minEntries="0" maxEntries="unbounded">

      <command name="Reset()" dmr:previousParameter="Name" version="2.12">
        <description>
          Reset the SmartCard Reader and the associated SmartCard.
        </description>
      </command>
    </object>

    <object base="Device.PeriodicStatistics.SampleSet.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded">

      <parameter name="Controller" access="readOnly"
          dmr:previousParameter="Name" version="2.15">
        <description>
          {{reference|the {{object|Device.LocalAgent.Controller.}} instance
          that created {{object}}|delete}}

          The value of this parameter is automatically populated by the USP
          Agent upon {{object}} creation using the reference to the USP
          Controller that created the instance.

          The USP Controller referenced by this parameter defines the set of
          permissions to use when updating the
          {{object|Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.}}
          table. Furthermore, only the USP Controller referenced by this
          parameter will have access to the {{param|Parameter.{i}.Values}},
          {{param|Parameter.{i}.SampleSeconds}},
          {{param|Parameter.{i}.SuspectData}} and
          {{param|Parameter.{i}.Failures}} parameters.
        </description>
        <syntax>
          <string>
            <pathRef refType="strong"
                targetParent="Device.LocalAgent.Controller." targetType="row"/>
          </string>
        </syntax>
      </parameter>

      <command name="ForceSample()" dmr:previousParameter="FetchSamples"
          version="2.12">
        <description>
          Force statistics for the current sample to be calculated and updated
          in the data model.

          If this is the first time that this command is called during the
          current sample interval, this MUST cause a new value to be added to
          each of the periodic statistics comma-separated list parameters, and
          the {{param|ReportEndTime}} and all {{param|SampleSeconds}}
          parameters MUST be updated accordingly.

          If this is not the first time that this command is during the current
          sample interval, then the new values that were added as described in
          the previous paragraph, and the {{param|ReportEndTime}} and all
          {{param|SampleSeconds}} parameters, MUST be updated accordingly.

          Note that {{param}} just provides a "sneak preview" of the current
          sample. It does not create a new sample and it does not interfere
          with the sample interval schedule.

          At the end of each sample interval, if this command was executed
          during the sample interval then the new values that were added as
          described above, and the {{param|ReportEndTime}} and all
          {{param|SampleSeconds}} parameters, will be updated accordingly. In
          other words, the partial sample data that was created when the
          command was executed will be updated one last time at the end of the
          sample interval.
        </description>
      </command>
    </object>

    <object base="Device.MQTT.Client.{i}." access="readWrite" minEntries="0"
        maxEntries="unbounded">

      <command name="ForceReconnect()" dmr:previousParameter="KeepAliveTime"
          version="2.12">
        <description>
          Disconnects the MQTT client from the MQTT broker and reconnects it
          again (toggle connection). It is only effective if the MQTT client is
          currently connected to the MQTT broker (Parameter {{param|Status|}}
          is {{enum|Connected|Status}}).

          If the MQTT client is in a different state, the command has no
          effect.

          This command may be used to immediately apply changes in the MQTT
          connection settings.
        </description>
      </command>
    </object>

    <object base="Device.MQTT.Broker.{i}.Bridge.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded">

      <command name="ForceReconnect()" dmr:previousParameter="KeepAliveTime"
          version="2.12">
        <description>
          Disconnects the MQTT bridge to the remote MQTT broker and reconnects
          it again (toggle connection). It is only effective if the MQTT bridge
          is currently connected to the remote MQTT broker (Parameter
          {{param|Status|}} is {{enum|Connected|Status}}).

          If the MQTT bridge is in a different state, the command has no
          effect.

          This command may be used to immediately apply changes in the MQTT
          connection settings.
        </description>
      </command>
    </object>

    <object base="Device.Ethernet.WoL." access="readOnly" minEntries="1"
        maxEntries="1" version="2.13">

      <command name="SendMagicPacket()" async="true">
        <description>
          This command sends a magic packet over the CPE active Ethernet
          interfaces.
        </description>
        <input>
          <component ref="SendMagicPacketInput"/>
        </input>
      </command>
    </object>

    <object base="Device.Routing.Babel." access="readOnly" minEntries="1"
        maxEntries="1">
      <command name="StatsReset()">
        <description>
          This command represents a request to reset all statistics counters to
          zero. Statistics are provided in
          {{object|#.InterfaceSetting.{i}.Stats.}}.
        </description>
      </command>
    </object>
    <object base="Device.Routing.Babel.MACKeySet.{i}.MACKey.{i}."
        access="readWrite" minEntries="0" maxEntries="unbounded">
      <command name="MACTest()">
        <description>
          This command allows the MAC key and MAC algorithm to be tested to see
          if they produce an expected outcome. The command calculates a MAC for
          {{param|InputString}} using the {{param|#.KeyValue}} and
          {{param|#.MACKeyAlgorithm}} and compares that to the value of
          {{param|InputMAC}}. If the values match, the output {{param|Match}}
          is {{true}}.
        </description>
        <input>
          <parameter name="InputString" mandatory="true">
            <description>
              The command calculates a MAC of {{param}} using the
              {{param|#.KeyValue}} and {{param|#.MACKeyAlgorithm}}.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
          <parameter name="InputMAC" mandatory="true">
            <description>
              The command compares the calculated MAC to {{param}}.
            </description>
            <syntax>
              <hexBinary/>
            </syntax>
          </parameter>
        </input>
        <output>
          <parameter name="Match">
            <description>
              {{param}} is {{true}} if the calculated MAC and
              {{param|InputMAC}} are the same.
            </description>
            <syntax>
              <boolean/>
            </syntax>
          </parameter>
        </output>
      </command>
    </object>

    <object name="Device.CWMPManagementServer." access="readOnly"
        minEntries="1" maxEntries="1" version="2.15">
      <component ref="ManagementServerCommon" version="2.15"/>
    </object>

    <!-- Profiles -->
    <component ref="STOMP" version="2.12"/>

    <component ref="IoT_ObjectComponent" path="Device."/>
    <component ref="IoT_NodeComponent" path="Device."/>
    <!-- General Commands from common model -->

    <profile name="Download:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPv4DownloadDiagnosticsSupported"
            requirement="readOnly"/>
        <parameter ref="IPv6DownloadDiagnosticsSupported"
            requirement="readOnly"/>
        <parameter ref="DownloadTransports" requirement="readOnly"/>
        <command ref="DownloadDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="DownloadURL"/>
            <parameter ref="DSCP"/>
            <parameter ref="EthernetPriority"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ROMTime"/>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="TestBytesReceived"/>
            <parameter ref="TotalBytesReceived"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPLayerCapacity:1" version="2.14" status="deprecated">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPLayerCapacitySupported" requirement="readOnly"/>
        <parameter ref="IPLayerMaxConnections" requirement="readOnly"/>
        <parameter ref="IPLayerMaxIncrementalResult" requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedMetrics" requirement="readOnly"/>
        <command ref="IPLayerCapacity()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Role"/>
            <parameter ref="Host"/>
            <parameter ref="Port"/>
            <parameter ref="JumboFramesPermitted"/>
            <parameter ref="NumberOfConnections"/>
            <parameter ref="EthernetPriority"/>
            <parameter ref="DSCP"/>
            <parameter ref="ProtocolVersion"/>
            <parameter ref="UDPPayloadMin"/>
            <parameter ref="UDPPayloadMax"/>
            <parameter ref="PortMin"/>
            <parameter ref="PortMax"/>
            <parameter ref="TestType"/>
            <parameter ref="PreambleDuration"/>
            <parameter ref="StartSendingRate"/>
            <parameter ref="NumberTestSubIntervals"/>
            <parameter ref="TestSubInterval"/>
            <parameter ref="StatusFeedbackInterval"/>
            <parameter ref="TimeoutNoTraffic" status="deprecated"/>
            <parameter ref="Tmax"/>
            <parameter ref="TmaxRTT"/>
            <parameter ref="TimestampResolution"/>
            <parameter ref="LowerThresh"/>
            <parameter ref="UpperThresh"/>
            <parameter ref="HighSpeedDelta"/>
            <parameter ref="SlowAdjThresh"/>
            <parameter ref="HSpeedThresh"/>
          </input>
          <output>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="Tmax"/>
            <parameter ref="TestInterval"/>
            <parameter ref="MaxIPLayerCapacity"/>
            <parameter ref="TimeOfMax"/>
            <parameter ref="LossRatioAtMax"/>
            <parameter ref="RTTRangeAtMax"/>
            <parameter ref="PDVRangeAtMax"/>
            <parameter ref="MinOnewayDelayAtMax"/>
            <parameter ref="ReorderedRatioAtMax"/>
            <object ref="IncrementalResult.{i}.">
              <parameter ref="IPLayerCapacity"/>
              <parameter ref="TimeOfSubInterval"/>
              <parameter ref="LossRatio"/>
              <parameter ref="RTTRange"/>
              <parameter ref="PDVRange"/>
              <parameter ref="MinOnewayDelay"/>
              <parameter ref="ReorderedRatio"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPLayerCapacityTest:1" version="2.15">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPLayerCapacitySupported" requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedSoftwareVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedControlProtocolVersion"
            requirement="readOnly"/>
        <parameter ref="IPLayerCapSupportedMetrics" requirement="readOnly"/>
        <command ref="IPLayerCapacity()">
          <input>
            <parameter ref="Role"/>
            <parameter ref="Host"/>
            <parameter ref="JumboFramesPermitted"/>
            <parameter ref="DSCP"/>
            <parameter ref="TestType"/>
            <parameter ref="IPDVEnable"/>
            <parameter ref="TestSubInterval"/>
            <parameter ref="StatusFeedbackInterval"/>
            <parameter ref="SeqErrThresh"/>
            <parameter ref="ReordDupIgnoreEnable"/>
            <parameter ref="LowerThresh"/>
            <parameter ref="UpperThresh"/>
            <parameter ref="HighSpeedDelta"/>
            <parameter ref="SlowAdjThresh"/>
          </input>
          <output>
            <parameter ref="BOMTime"/>
            <parameter ref="MaxIPLayerCapacity"/>
            <parameter ref="TimeOfMax"/>
            <parameter ref="LossRatioAtMax"/>
            <parameter ref="RTTRangeAtMax"/>
            <parameter ref="PDVRangeAtMax"/>
            <parameter ref="MaxETHCapacityNoFCS"/>
            <parameter ref="MaxETHCapacityWithFCS"/>
            <parameter ref="MaxETHCapacityWithFCSVLAN"/>
            <parameter ref="IPLayerCapacitySummary"/>
            <parameter ref="LossRatioSummary"/>
            <parameter ref="MinRTTSummary"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="DownloadTCP:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="DownloadDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="TCPOpenRequestTime"/>
            <parameter ref="TCPOpenResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Upload:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <parameter ref="IPv4UploadDiagnosticsSupported" requirement="readOnly"/>
        <parameter ref="IPv6UploadDiagnosticsSupported" requirement="readOnly"/>
        <parameter ref="UploadTransports" requirement="readOnly"/>
        <command ref="UploadDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="UploadURL"/>
            <parameter ref="DSCP"/>
            <parameter ref="EthernetPriority"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ROMTime"/>
            <parameter ref="BOMTime"/>
            <parameter ref="EOMTime"/>
            <parameter ref="TestFileLength"/>
            <parameter ref="TotalBytesSent"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UploadTCP:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="UploadDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="TCPOpenRequestTime"/>
            <parameter ref="TCPOpenResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="SelfTestDiag:1" version="2.12">
      <object ref="Device." requirement="present">
        <command ref="SelfTestDiagnostics()">
          <output>
            <parameter ref="Status"/>
            <parameter ref="Results"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="NSLookupDiag:1" version="2.12">
      <object ref="Device.DNS.Diagnostics." requirement="present">
        <command ref="NSLookupDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="HostName"/>
            <parameter ref="DNSServer"/>
            <parameter ref="Timeout"/>
            <parameter ref="NumberOfRepetitions"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <object ref="Result.{i}.">
              <parameter ref="Status"/>
              <parameter ref="AnswerType"/>
              <parameter ref="HostNameReturned"/>
              <parameter ref="IPAddresses"/>
              <parameter ref="DNSServerIP"/>
              <parameter ref="ResponseTime"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Baseline:1" extends="_Baseline:1" status="deleted"/>

    <profile name="Baseline:2" base="Baseline:1" extends="_Baseline:2"
        version="2.2" status="deleted"/>

    <profile name="Baseline:3" base="Baseline:2" extends="_Baseline:3"
        version="2.4" status="deleted"/>

    <!-- this is defined from scratch in order to omit Device.LANConfigSecurity -->
    <profile name="Baseline:4" extends="_Baseline:4" version="2.15"/>

    <profile name="IPPingDetailed:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTimeDetailed"/>
            <parameter ref="MinimumResponseTimeDetailed"/>
            <parameter ref="MaximumResponseTimeDetailed"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="IPPing:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="IPPing()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="TraceRoute:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="TraceRoute()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfTries"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
            <parameter ref="MaxHopCount"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ResponseTime"/>
            <object ref="RouteHops.{i}.">
              <parameter ref="Host"/>
              <parameter ref="HostAddress"/>
              <parameter ref="ErrorCode"/>
              <parameter ref="RTTimes"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="ATMLoopback:1" version="2.12">
      <object ref="Device.ATM.Diagnostics." requirement="present">
        <command ref="F5Loopback()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="DSLDiagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.992.1 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="BITSpsds"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="ADSL2Diagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.992.3 and G.992.5 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINSCus"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="HLINpsus"/>
            <parameter ref="HLOGpsds"/>
            <parameter ref="HLOGpsus"/>
            <parameter ref="HLOGMTds"/>
            <parameter ref="HLOGMTus"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="QLNpsus"/>
            <parameter ref="QLNMTds"/>
            <parameter ref="QLNMTus"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="SNRpsus"/>
            <parameter ref="SNRMTds"/>
            <parameter ref="SNRMTus"/>
            <parameter ref="LATNpbds"/>
            <parameter ref="LATNpbus"/>
            <parameter ref="SATNds"/>
            <parameter ref="SATNus"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="VDSL2Diagnostics:1" version="2.12">
      <description>
        Note: This profile is valid for G.993.2 modems.
      </description>
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="ADSLLineTest()">
          <input>
            <parameter ref="Interface"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="ACTPSDds"/>
            <parameter ref="ACTPSDus"/>
            <parameter ref="ACTATPds"/>
            <parameter ref="ACTATPus"/>
            <parameter ref="HLINSCds"/>
            <parameter ref="HLINSCus"/>
            <parameter ref="HLINGds"/>
            <parameter ref="HLINGus"/>
            <parameter ref="HLINpsds"/>
            <parameter ref="HLINpsus"/>
            <parameter ref="HLOGGds"/>
            <parameter ref="HLOGGus"/>
            <parameter ref="HLOGpsds"/>
            <parameter ref="HLOGpsus"/>
            <parameter ref="HLOGMTds"/>
            <parameter ref="HLOGMTus"/>
            <parameter ref="QLNGds"/>
            <parameter ref="QLNGus"/>
            <parameter ref="QLNpsds"/>
            <parameter ref="QLNpsus"/>
            <parameter ref="QLNMTds"/>
            <parameter ref="QLNMTus"/>
            <parameter ref="SNRGds"/>
            <parameter ref="SNRGus"/>
            <parameter ref="SNRpsds"/>
            <parameter ref="SNRpsus"/>
            <parameter ref="SNRMTds"/>
            <parameter ref="SNRMTus"/>
            <parameter ref="LATNpbds"/>
            <parameter ref="LATNpbus"/>
            <parameter ref="SATNds"/>
            <parameter ref="SATNus"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="SELTDiagnostics:1" version="2.13">
      <object ref="Device.DSL.Diagnostics." requirement="present">
        <command ref="SELTUER()">
          <input>
            <parameter ref="UERMaxMeasurementDuration"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="UER"/>
            <parameter ref="UERScaleFactor"/>
            <parameter ref="UERGroupSize"/>
            <parameter ref="UERVar"/>
          </output>
        </command>
        <command ref="SELTQLN()">
          <input>
            <parameter ref="QLNMaxMeasurementDuration"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="QLN"/>
            <parameter ref="QLNGroupSize"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="HPNADiagnostics:1" version="2.12">
      <object ref="Device.HPNA.Diagnostics." requirement="present">
        <command ref="PHYThroughput()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="NumPacketsInBurst"/>
            <parameter ref="BurstInterval"/>
            <parameter ref="TestPacketPayloadLength"/>
            <parameter ref="PayloadEncoding"/>
            <parameter ref="PayloadDataGen"/>
            <parameter ref="PayloadType"/>
            <parameter ref="PriorityLevel"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <object ref="Result.{i}.">
              <parameter ref="SrcMACAddress"/>
              <parameter ref="DestMACAddress"/>
              <parameter ref="PHYRate"/>
              <parameter ref="BaudRate"/>
              <parameter ref="SNR"/>
              <parameter ref="PacketsReceived"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UPADiagnostics:1" version="2.12">
      <object ref="Device.UPA.Diagnostics." requirement="present">
        <command ref="InterfaceMeasurement()">
          <input>
            <parameter ref="Type"/>
            <parameter ref="Interface"/>
            <parameter ref="Port"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="Measurements"/>
            <parameter ref="RxGain"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="UDPEchoDiag:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="UDPEchoDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Host"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="EnableIndividualPacketResults"/>
            <parameter ref="Timeout"/>
            <parameter ref="DataBlockSize"/>
            <parameter ref="DSCP"/>
            <parameter ref="InterTransmissionTime"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="SuccessCount"/>
            <parameter ref="FailureCount"/>
            <parameter ref="AverageResponseTime"/>
            <parameter ref="MinimumResponseTime"/>
            <parameter ref="MaximumResponseTime"/>
            <object ref="IndividualPacketResult.{i}.">
              <parameter ref="PacketSuccess"/>
              <parameter ref="PacketSendTime"/>
              <parameter ref="PacketReceiveTime"/>
              <parameter ref="TestGenSN"/>
              <parameter ref="TestRespSN"/>
              <parameter ref="TestRespRcvTimeStamp"/>
              <parameter ref="TestRespReplyTimeStamp"/>
              <parameter ref="TestRespReplyFailureCount"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="ServerSelectionDiag:1" version="2.12">
      <object ref="Device.IP.Diagnostics." requirement="present">
        <command ref="ServerSelectionDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="HostList"/>
            <parameter ref="NumberOfRepetitions"/>
            <parameter ref="Timeout"/>
          </input>
          <output>
            <parameter ref="Status"/>
            <parameter ref="FastestHost"/>
            <parameter ref="AverageResponseTime"/>
          </output>
        </command>
      </object>
    </profile>

    <profile name="STOMPConn:1" version="2.12">
      <object ref="Device.STOMP." requirement="present">
        <parameter ref="ConnectionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.STOMP.Connection.{i}." requirement="createDelete">
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Host" requirement="readWrite"/>
        <parameter ref="Port" requirement="readWrite"/>
        <parameter ref="VirtualHost" requirement="readWrite"/>
        <parameter ref="ServerRetryInitialInterval" requirement="readWrite"/>
        <parameter ref="ServerRetryIntervalMultiplier" requirement="readWrite"/>
        <parameter ref="ServerRetryMaxInterval" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="STOMPHeartbeat:1" extends="STOMPConn:1" version="2.12">
      <object ref="Device.STOMP.Connection.{i}." requirement="createDelete">
        <parameter ref="EnableHeartbeats" requirement="readWrite"/>
        <parameter ref="OutgoingHeartbeat" requirement="readWrite"/>
        <parameter ref="IncomingHeartbeat" requirement="readWrite"/>
      </object>
    </profile>
    <!-- Profiles with command parameter impacts -->

    <profile name="TempStatusAdv:1" extends="TempStatus:1"
        dmr:previousProfile="TempStatus:1">
      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
          requirement="present">
        <command ref="Reset()"/>
        <parameter ref="LowAlarmValue" requirement="readWrite"/>
        <parameter ref="LowAlarmTime" requirement="readOnly"/>
        <parameter ref="HighAlarmValue" requirement="readWrite"/>
        <parameter ref="HighAlarmTime" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="TempStatusAdv:2" base="TempStatusAdv:1"
        dmr:previousProfile="TempStatusAdv:1" version="2.1">
      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}."
          requirement="present">
        <parameter ref="PollingInterval" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="USBHostsAdv:1" extends="USBHostsBasic:1"
        dmr:previousProfile="USBHostsBasic:1">
      <object ref="Device.USB.USBHosts.Host.{i}." requirement="present">
        <command ref="Reset()"/>
        <parameter ref="PowerManagementEnable" requirement="readWrite"/>
      </object>
      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}."
          requirement="present">
        <parameter ref="IsSuspended" requirement="readOnly"/>
        <parameter ref="IsSelfPowered" requirement="readOnly"/>
        <parameter ref="ConfigurationNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}."
          requirement="present">
        <parameter ref="ConfigurationNumber" requirement="readOnly"/>
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object
          ref="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}."
          requirement="present">
        <parameter ref="InterfaceNumber" requirement="readOnly"/>
        <parameter ref="InterfaceClass" requirement="readOnly"/>
        <parameter ref="InterfaceSubClass" requirement="readOnly"/>
        <parameter ref="InterfaceProtocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PeriodicStatsAdv:1" extends="PeriodicStatsBase:1"
        dmr:previousProfile="PeriodicStatsBase:1">
      <object ref="Device.PeriodicStatistics.SampleSet.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="TimeReference" requirement="readWrite"/>
        <parameter ref="FetchSamples" requirement="readWrite"/>
        <command ref="ForceSample()"/>
      </object>
      <object ref="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="SampleMode" requirement="readWrite"/>
        <parameter ref="CalculationMode" requirement="readWrite"/>
        <parameter ref="LowThreshold" requirement="readWrite"/>
        <parameter ref="HighThreshold" requirement="readWrite"/>
        <parameter ref="Failures" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPInterface:1" dmr:previousProfile="IPv6Routing:1">
      <object ref="Device.IP." requirement="present">
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <parameter ref="Type" requirement="readOnly"/>
        <command ref="Reset()"/>
        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}.IPv4Address.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="IPAddress" requirement="readWrite"/>
        <parameter ref="SubnetMask" requirement="readWrite"/>
        <parameter ref="AddressingType" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}.Stats." requirement="present">
        <parameter ref="BytesSent" requirement="readOnly"/>
        <parameter ref="BytesReceived" requirement="readOnly"/>
        <parameter ref="PacketsSent" requirement="readOnly"/>
        <parameter ref="PacketsReceived" requirement="readOnly"/>
        <parameter ref="ErrorsSent" requirement="readOnly"/>
        <parameter ref="ErrorsReceived" requirement="readOnly"/>
        <parameter ref="UnicastPacketsSent" requirement="readOnly"/>
        <parameter ref="UnicastPacketsReceived" requirement="readOnly"/>
        <parameter ref="DiscardPacketsSent" requirement="readOnly"/>
        <parameter ref="DiscardPacketsReceived" requirement="readOnly"/>
        <parameter ref="MulticastPacketsSent" requirement="readOnly"/>
        <parameter ref="MulticastPacketsReceived" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsSent" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsReceived" requirement="readOnly"/>
        <parameter ref="UnknownProtoPacketsReceived" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPInterface:2" base="IPInterface:1"
        dmr:previousProfile="IPInterface:1" version="2.2">
      <description>
        This profile is IPv4 specific.
      </description>
      <object ref="Device.IP." requirement="present">
        <parameter ref="IPv4Enable" requirement="readWrite"/>
        <parameter ref="IPv4Status" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="IPv4Enable" requirement="readWrite"/>
      </object>
      <object ref="Device.IP.Interface.{i}.IPv4Address.{i}."
          requirement="createDelete">
        <parameter ref="Status" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="IPv6Interface:1" dmr:previousProfile="IPInterface:2"
        version="2.2">
      <object ref="Device.IP." requirement="present">
        <parameter ref="IPv6Capable" requirement="readOnly"/>
        <parameter ref="IPv6Enable" requirement="readWrite"/>
        <parameter ref="IPv6Status" requirement="readOnly"/>
        <parameter ref="ULAPrefix" requirement="readWrite"/>
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="IPv6Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="ULAEnable" requirement="readWrite"/>
        <command ref="Reset()"/>
        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
        <parameter ref="IPv6PrefixNumberOfEntries" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PPPInterface:1" dmr:previousProfile="IPv6Interface:1">
      <object ref="Device.PPP." requirement="present">
        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.PPP.Interface.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="LastChange" requirement="readOnly"/>
        <parameter ref="LowerLayers" requirement="readWrite"/>
        <command ref="Reset()"/>
        <parameter ref="Username" requirement="readWrite"/>
        <parameter ref="Password" requirement="readWrite"/>
        <parameter ref="ConnectionTrigger" requirement="readWrite"/>
      </object>
      <object ref="Device.PPP.Interface.{i}.PPPoE." requirement="present">
        <parameter ref="SessionID" requirement="readOnly"/>
        <parameter ref="ACName" requirement="readWrite"/>
        <parameter ref="ServiceName" requirement="readWrite"/>
      </object>
      <object ref="Device.PPP.Interface.{i}.Stats." requirement="present">
        <parameter ref="BytesSent" requirement="readOnly"/>
        <parameter ref="BytesReceived" requirement="readOnly"/>
        <parameter ref="PacketsSent" requirement="readOnly"/>
        <parameter ref="PacketsReceived" requirement="readOnly"/>
        <parameter ref="ErrorsSent" requirement="readOnly"/>
        <parameter ref="ErrorsReceived" requirement="readOnly"/>
        <parameter ref="UnicastPacketsSent" requirement="readOnly"/>
        <parameter ref="UnicastPacketsReceived" requirement="readOnly"/>
        <parameter ref="DiscardPacketsSent" requirement="readOnly"/>
        <parameter ref="DiscardPacketsReceived" requirement="readOnly"/>
        <parameter ref="MulticastPacketsSent" requirement="readOnly"/>
        <parameter ref="MulticastPacketsReceived" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsSent" requirement="readOnly"/>
        <parameter ref="BroadcastPacketsReceived" requirement="readOnly"/>
        <parameter ref="UnknownProtoPacketsReceived" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PPPInterface:2" base="PPPInterface:1"
        dmr:previousProfile="PPPInterface:1" version="2.2">
      <object ref="Device.PPP." requirement="present">
        <parameter ref="SupportedNCPs" requirement="readOnly"/>
      </object>
      <object ref="Device.PPP.Interface.{i}." requirement="createDelete">
        <parameter ref="IPv6CPEnable" requirement="readWrite">
          <description>
            REQUIRED only for IPv6 capable devices.
          </description>
        </parameter>
      </object>
      <object ref="Device.PPP.Interface.{i}.IPv6CP." requirement="present">
        <description>
          REQUIRED only for IPv6 capable devices.
        </description>
        <parameter ref="LocalInterfaceIdentifier" requirement="readOnly"/>
        <parameter ref="RemoteInterfaceIdentifier" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="DHCPv4Client:1"
        dmr:previousProfile="IEEE8021xAuthentication:2">
      <object ref="Device.DHCPv4." requirement="present">
        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv4.Client.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Interface" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <command ref="Renew()"/>
        <parameter ref="IPAddress" requirement="readOnly"/>
        <parameter ref="SubnetMask" requirement="readOnly"/>
        <parameter ref="IPRouters" requirement="readOnly"/>
        <parameter ref="DNSServers" requirement="readOnly"/>
        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
        <parameter ref="DHCPServer" requirement="readOnly"/>
        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
        <parameter ref="ReqOptionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv4.Client.{i}.SentOption.{i}."
          requirement="createDelete">
        <description>
          This table is REQUIRED to support sending of option 60 (Vendor Class
          Identifier) and option 77 (User Class Identifier) values.
        </description>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Tag" requirement="readWrite"/>
        <parameter ref="Value" requirement="readWrite"/>
      </object>
      <object ref="Device.DHCPv4.Client.{i}.ReqOption.{i}."
          requirement="createDelete">
        <description>
          This table is REQUIRED to support requesting of option 60 (Vendor
          Class Identifier), option 61 (Client Identifier) and option 77 (User
          Class Identifier) values.
        </description>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Order" requirement="readWrite"/>
        <parameter ref="Tag" requirement="readWrite"/>
        <parameter ref="Value" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="DHCPv6Client:1"
        dmr:previousProfile="DHCPv4ServerClientInfo:1" version="2.2">
      <object ref="Device.DHCPv6." requirement="present">
        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="Interface" requirement="readWrite"/>
        <parameter ref="DUID" requirement="readOnly"/>
        <parameter ref="RequestAddresses" requirement="readWrite"/>
        <parameter ref="RequestPrefixes" requirement="readWrite"/>
        <parameter ref="RapidCommit" requirement="readWrite"/>
        <command ref="Renew()"/>
        <parameter ref="SuggestedT1" requirement="readWrite"/>
        <parameter ref="SuggestedT2" requirement="readWrite"/>
        <parameter ref="SupportedOptions" requirement="readOnly"/>
        <parameter ref="RequestedOptions" requirement="readWrite"/>
        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
        <parameter ref="ReceivedOptionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv6.Client.{i}.SentOption.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Tag" requirement="readWrite"/>
        <parameter ref="Value" requirement="readWrite"/>
      </object>
      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}."
          requirement="present">
        <parameter ref="Tag" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="DHCPv6ClientServerIdentity:1" extends="DHCPv6Client:1"
        dmr:previousProfile="DHCPv6Client:1" version="2.2">
      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv6.Client.{i}.Server.{i}." requirement="present">
        <parameter ref="SourceAddress" requirement="readOnly"/>
        <parameter ref="DUID" requirement="readOnly"/>
        <parameter ref="InformationRefreshTime" requirement="readOnly"/>
      </object>
      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}."
          requirement="present">
        <parameter ref="Server" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTClientExtended:1" base="MQTTClientBase:1"
        dmr:previousProfile="MQTTClientSubscribe:1" version="2.10">
      <description>
        Adds client authentication, will handling and extends statistics
      </description>
      <object ref="Device.MQTT.Client.{i}." requirement="present">
        <parameter ref="Name" requirement="readWrite"/>
        <parameter ref="ClientID" requirement="readWrite"/>
        <parameter ref="Username" requirement="readWrite"/>
        <parameter ref="Password" requirement="readWrite"/>
        <parameter ref="TransportProtocol" requirement="readWrite"/>
        <parameter ref="MessageRetryTime" requirement="readWrite"/>
        <parameter ref="ConnectRetryTime" requirement="readWrite"/>
        <command ref="ForceReconnect()"/>
        <parameter ref="WillEnable" requirement="readWrite"/>
        <parameter ref="WillTopic" requirement="readWrite"/>
        <parameter ref="WillValue" requirement="readWrite"/>
        <parameter ref="WillQoS" requirement="readWrite"/>
        <parameter ref="WillRetain" requirement="readWrite"/>
      </object>
      <object ref="Device.MQTT.Client.{i}.Stats." requirement="present">
        <parameter ref="LastPublishMessageSent" requirement="readOnly"/>
        <parameter ref="LastPublishMessageReceived" requirement="readOnly"/>
        <parameter ref="PublishSent" requirement="readOnly"/>
        <parameter ref="PublishReceived" requirement="readOnly"/>
        <parameter ref="SubscribeSent" requirement="readOnly"/>
        <parameter ref="UnSubscribeSent" requirement="readOnly"/>
        <parameter ref="PublishErrors" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="HPNAQoS:1" dmr:previousProfile="HPNA:1">
      <object ref="Device.HPNA.Interface.{i}.QoS." requirement="present">
        <parameter ref="FlowSpecNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.HPNA.Interface.{i}.QoS.FlowSpec.{i}."
          requirement="createDelete">
        <parameter ref="FlowType" requirement="readWrite"/>
        <parameter ref="Priority" requirement="readWrite"/>
        <parameter ref="Latency" requirement="readWrite"/>
        <parameter ref="Jitter" requirement="readWrite"/>
        <parameter ref="PacketSize" requirement="readWrite"/>
        <parameter ref="MinRate" requirement="readWrite"/>
        <parameter ref="AvgRate" requirement="readWrite"/>
        <parameter ref="MaxRate" requirement="readWrite"/>
        <parameter ref="PER" requirement="readWrite"/>
        <parameter ref="Timeout" requirement="readWrite"/>
      </object>
    </profile>
    <!-- Basic USP profiles -->

    <profile name="DeviceInfo:1" version="2.12">
      <object ref="Device.DeviceInfo." requirement="present">
        <parameter ref="Manufacturer" requirement="readOnly"/>
        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
        <parameter ref="ProductClass" requirement="readOnly"/>
        <parameter ref="SerialNumber" requirement="readOnly"/>
        <parameter ref="ModelName" requirement="readOnly"/>
        <parameter ref="HardwareVersion" requirement="readOnly"/>
        <parameter ref="FriendlyName" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="PacketCaptureDiagnostics:1" version="2.13">
      <object ref="Device." requirement="present">
        <command ref="PacketCaptureDiagnostics()">
          <input>
            <parameter ref="Interface"/>
            <parameter ref="Duration"/>
            <parameter ref="FileTarget"/>
          </input>
          <output>
            <object ref="PacketCaptureResult.{i}.">
              <parameter ref="FileLocation"/>
            </object>
          </output>
        </command>
      </object>
    </profile>

    <profile name="Reboot:1" version="2.12">
      <object ref="Device." requirement="present">
        <command ref="Reboot()"/>
        <event ref="Boot!"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}.BootParameter.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="ParameterName" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Firmware:1" version="2.12">
      <object ref="Device.DeviceInfo." requirement="present">
        <parameter ref="ActiveFirmwareImage" requirement="readOnly"/>
        <parameter ref="BootFirmwareImage" requirement="readWrite"/>
        <parameter ref="FirmwareImageNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.DeviceInfo.FirmwareImage.{i}." requirement="present">
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Name" requirement="readOnly"/>
        <parameter ref="Version" requirement="readOnly"/>
        <parameter ref="Available" requirement="readWrite"/>
        <parameter ref="Status" requirement="readOnly"/>
        <parameter ref="BootFailureLog" requirement="readOnly"/>
        <command ref="Download()"/>
      </object>
      <object ref="Device.LocalAgent." requirement="present">
        <event ref="TransferComplete!"/>
      </object>
    </profile>

    <profile name="LocalAgent:1" version="2.12">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="EndpointID" requirement="readOnly"/>
        <parameter ref="AdvertisedDeviceSubtypes" requirement="readOnly"/>
        <event ref="Periodic!"/>
        <parameter ref="MTPNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.MTP.{i}." requirement="present">
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Protocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="CoAPAgent:1" extends="LocalAgent:1" version="2.13"
        status="deprecated">
      <object ref="Device.LocalAgent.MTP.{i}.CoAP." requirement="present"
          status="deprecated">
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="STOMPAgent:1" extends="LocalAgent:1" version="2.12">
      <object ref="Device.LocalAgent.MTP.{i}.STOMP." requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="Destination" requirement="readOnly"/>
        <parameter ref="DestinationFromServer" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="WebSocketAgent:1" extends="LocalAgent:1" version="2.13">
      <object ref="Device.LocalAgent.MTP.{i}.WebSocket." requirement="present">
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTAgent:1" extends="LocalAgent:1" version="2.13">
      <description>
        This profile adds USP agent extensions for MQTT transport.
      </description>
      <object ref="Device.LocalAgent.MTP.{i}.MQTT." requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="ResponseTopicConfigured" requirement="readWrite"/>
        <parameter ref="ResponseTopicDiscovered" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="Controllers:1" version="2.12">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="ControllerNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}." requirement="present">
        <parameter ref="Enable" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="EndpointID" requirement="readOnly"/>
        <parameter ref="AssignedRole" requirement="readOnly"/>
        <parameter ref="PeriodicNotifInterval" requirement="readOnly"/>
        <parameter ref="MTPNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}."
          requirement="present">
        <parameter ref="Enable" requirement="readOnly"/>
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Protocol" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="CoAPController:1" extends="Controllers:1" version="2.13"
        status="deprecated">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.CoAP."
          requirement="present" status="deprecated">
        <parameter ref="Host" requirement="readOnly"/>
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="STOMPController:1" extends="Controllers:1" version="2.12">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.STOMP."
          requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="Destination" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="WebSocketController:1" extends="Controllers:1"
        version="2.13">
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket."
          requirement="present">
        <parameter ref="Host" requirement="readOnly"/>
        <parameter ref="Port" requirement="readOnly"/>
        <parameter ref="Path" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="MQTTController:1" extends="Controllers:1" version="2.13">
      <description>
        This profile adds USP controller extensions for MQTT transport.
      </description>
      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.MQTT."
          requirement="present">
        <parameter ref="Reference" requirement="readOnly"/>
        <parameter ref="Topic" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Subscriptions:1" version="2.13">
      <object ref="Device.LocalAgent." requirement="present">
        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.Subscription.{i}."
          requirement="createDelete">
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="ID" requirement="readWrite"/>
        <parameter ref="Recipient" requirement="readOnly"/>
        <parameter ref="CreationDate" requirement="readOnly"/>
        <parameter ref="NotifType" requirement="readWrite"/>
        <parameter ref="ReferenceList" requirement="readWrite"/>
        <parameter ref="Persistent" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="Challenge:1" version="2.12">
      <object ref="Device.LocalAgent.ControllerTrust." requirement="present">
        <command ref="RequestChallenge()"/>
        <command ref="ChallengeResponse()"/>
        <parameter ref="ChallengeNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Challenge.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="readOnly"/>
        <parameter ref="Description" requirement="readOnly"/>
        <parameter ref="Role" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
        <parameter ref="ValueType" requirement="readOnly"/>
        <parameter ref="Instruction" requirement="readOnly"/>
        <parameter ref="InstructionType" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="ControllerTrust:1" version="2.13">
      <object ref="Device.LocalAgent.ControllerTrust." requirement="present">
        <parameter ref="UntrustedRole" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Role.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Name" requirement="readWrite"/>
        <parameter ref="PermissionNumberOfEntries" requirement="readOnly"/>
      </object>
      <object ref="Device.LocalAgent.ControllerTrust.Role.{i}.Permission.{i}."
          requirement="present">
        <parameter ref="Alias" requirement="readWrite"/>
        <parameter ref="Enable" requirement="readWrite"/>
        <parameter ref="Targets" requirement="readOnly"/>
        <parameter ref="Param" requirement="readOnly"/>
        <parameter ref="Obj" requirement="readOnly"/>
        <parameter ref="InstantiatedObj" requirement="readOnly"/>
        <parameter ref="CommandEvent" requirement="readOnly"/>
      </object>
    </profile>
    <!-- Can use this for generating a DT (report tool needs some work...) -->

    <profile
        name="USPAgent:1"
        extends="
          DeviceInfo:1
          Reboot:1
          Firmware:1
          LocalAgent:1
          Controllers:1
          Subscriptions:1
          Challenge:1"
        version="2.12"/>
  </model>
</dm:document>
