<?xml version="1.0" encoding="UTF-8"?>
<!--
  This document provides a schema for representing a request
  for network measurement data. It is based on the draft
  document Requirements for a measurment request
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.ggf.org/namespaces/2004/08/gridNetworkMonitoring" xmlns:g="http://www.ggf.org/namespaces/2004/08/gridNetworkMonitoring">

<!-- **********Included from nm_subject.xsd ********** -->
  <xs:complexType name="Address">
    <xs:sequence>
      <xs:element ref="g:host"/>
      <xs:element minOccurs="0" ref="g:port"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" type="xs:token">
      <xs:annotation>
        <xs:documentation>IP version</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:element name="host" type="xs:token">
    <xs:annotation>
      <xs:documentation>Host address</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="port" type="xs:short">
    <xs:annotation>
      <xs:documentation>Port</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="Node">
    <xs:annotation>
      <xs:documentation>A node</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element ref="g:address"/>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="address" type="g:Address"/>
  <!--
    Apparently these are broken, too
    InternalNode = Node
    Router = InternalNode
  -->
  <xs:complexType name="Path">
    <xs:annotation>
      <xs:documentation>A path between two nodes</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" ref="g:source"/>
      <xs:element minOccurs="0" ref="g:destination"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="source" type="g:Node"/>
  <xs:element name="destination" type="g:Node"/>
  <!--
      Hop = Path
      Host =
         element operatingSystem { OperatingSystem },
         element interface { NetworkInterface }*
      OperatingSystem = SoftwareDescription
      NetworkInterface =
         element address { Address },
         element card { NIC }
      NIC = 
         ## The logical name of the card as seen
         ## by the OS. E.g. eth0 hme0:1
         element logicalInterfaceName { string },
         element card { HardwareDescription }?,
         element firmware { SoftwareDescription }?,
         element driver  { SoftwareDescription }?,
         element txqueuelen { IntValue }?,
         element mtu { IntValue }?,
         element iobus { string }?,
         element cpu { CPU },
         element maxTCPReadBuffer { IntValue }?,
         element maxTCPWriteBuffer { IntValue }?,
         element timer { TimerDevice }?,
         ## The protocol stack on this host, highest to lowest layer
         element protocolStack { element protocol { ProtocolLayer }+ }?
      CPU =
         element type { string },
         element speed { DoubleValue }
      ProtocolLayer = Extensibility
      ## Piece of software
      SoftwareDescription =
         element name { string },
         element major { xsd:int }?,
         element minor { xsd:int }?,
         element release { xsd:int }?,
         element buildDate { xsd:int }?,
         element vendor { string }?,
         element versionString { string }*
      ## Piece of hardware
      HardwareDescription =
         element componentType { token },
         element manufacturere { string },
         element version { string }
  -->
<!-- *********** End include nm_subject.xsd *********** -->

<!-- **********Included from nm_params.xsd ********** -->
  <xs:complexType name="ParameterSet">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:duration"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:packetSize"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:numPackets"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:packetSpacing"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:packetGap"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:protocolID"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:tos"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:dscp"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:flowLabel"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:lossThreshold"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:numBytes"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:includesDisk"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:tcpBufferSize"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:tcpType"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:numStreams"/>
      <xs:element ref="g:other"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="duration">
    <xs:annotation>
      <xs:documentation>The duration of the test</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="packetSize">
    <xs:annotation>
      <xs:documentation>Type of packets being sent</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:int">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="numPackets">
    <xs:annotation>
      <xs:documentation>Number of packets sent on network</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:int">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="packetSpacing">
    <xs:annotation>
      <xs:documentation>What algorithm is used to space packets</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="xs:anyType">
          <xs:simpleType>
            <xs:restriction base="xs:token">
              <xs:enumeration value="poisson"/>
              <xs:enumeration value="periodic"/>
            </xs:restriction>
          </xs:simpleType>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:restriction>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="packetGap">
    <xs:annotation>
      <xs:documentation>Time between test packets, in seconds (for periodic tests)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:double">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="protocolID">
    <xs:annotation>
      <xs:documentation>IP version</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:token">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="tos">
    <xs:annotation>
      <xs:documentation>Type of service (IP precedence)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:short">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="dscp">
    <xs:annotation>
      <xs:documentation>Differentiated services code point</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:byte">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="flowLabel">
    <xs:annotation>
      <xs:documentation>IPv6 option for QoS</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:byte">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="lossThreshold">
    <xs:annotation>
      <xs:documentation>Threshold used to distinguish between a large finite delay and loss</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:int">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="numBytes">
    <xs:annotation>
      <xs:documentation>Amount of test traffic</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:int">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="includesDisk">
    <xs:annotation>
      <xs:documentation>Are bytes moving memory to memory or disk to disk*</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:boolean">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="tcpBufferSize">
    <xs:annotation>
      <xs:documentation>Size of TCP buffers used</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:int">
          <xs:attribute name="units" use="required" type="xs:token"/>
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="tcpType">
    <xs:annotation>
      <xs:documentation>Reno, Vegas, HSTCP, ScalableTCP, etc</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:token">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="numStreams">
    <xs:annotation>
      <xs:documentation>Number of parallel streams</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:unsignedShort">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="other">
    <xs:annotation>
      <xs:documentation>Additional user-defined parameters</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="g:Extensibility">
          <xs:attributeGroup ref="g:ParameterAttributes"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="ParameterAttributes">
    <xs:annotation>
      <xs:documentation>Attributes that apply to all (or nearly all) parameters</xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="g:Required"/>
    <xs:attribute name="report" type="xs:boolean">
      <xs:annotation>
        <xs:documentation>If true, the value of this parameter should be reported in the response</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="range" type="xs:token">
      <xs:annotation>
        <xs:documentation>If "min", the parameter should be at least the given value; if "max", the parameter should be at most the given value; if "exact", the parameter should be exactly this value.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>
<!-- *********** End include nm_params.xsd *********** -->

<!-- **********Included from nm_tool.xsd ********** -->
  <xs:complexType name="Tool">
    <xs:annotation>
      <xs:documentation>The tool and optional command lines to use</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="name" type="xs:token"/>
      <xs:element minOccurs="0" ref="g:major"/>
      <xs:element minOccurs="0" ref="g:minor"/>
      <xs:element minOccurs="0" ref="g:release"/>
      <xs:element minOccurs="0" ref="g:buildDate"/>
      <xs:element minOccurs="0" ref="g:vendor"/>
      <xs:element minOccurs="0" ref="g:versionString"/>
      <xs:element minOccurs="0" ref="g:sourceCommandLine"/>
      <xs:element minOccurs="0" ref="g:destCommandLine"/>
    </xs:sequence>
    <xs:attribute name="required" type="xs:boolean"/>
  </xs:complexType>
  <xs:element name="major" type="xs:int"/>
  <xs:element name="minor" type="xs:int"/>
  <xs:element name="release" type="xs:token"/>
  <xs:element name="buildDate" type="xs:date"/>
  <xs:element name="vendor" type="xs:string"/>
  <xs:element name="versionString" type="xs:string"/>
  <xs:element name="sourceCommandLine" type="g:ToolCommandLine"/>
  <xs:element name="destCommandLine" type="g:ToolCommandLine"/>
  <xs:complexType name="ToolCommandLine">
    <xs:choice>
      <xs:element maxOccurs="unbounded" ref="g:arg"/>
      <xs:element ref="g:line"/>
    </xs:choice>
  </xs:complexType>
  <xs:element name="arg" type="xs:string"/>
  <xs:element name="line" type="xs:string"/>
<!-- *********** End include nm_tool.xsd *********** -->

<!-- **********Included from nm_timeinfo.xsd ********** -->
  <xs:complexType name="TimeInformation">
    <xs:sequence>
      <xs:element minOccurs="0" ref="g:time"/>
      <xs:element minOccurs="0" ref="g:plusTimeTolerance"/>
      <xs:element minOccurs="0" ref="g:minusTimeTolerance"/>
      <xs:element minOccurs="0" ref="g:testingInterval"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="time">
    <xs:simpleType>
      <xs:union memberTypes="xs:token xs:double"/>
    </xs:simpleType>
  </xs:element>
  <xs:element name="plusTimeTolerance">
    <xs:simpleType>
      <xs:union memberTypes="xs:token xs:double"/>
    </xs:simpleType>
  </xs:element>
  <xs:element name="minusTimeTolerance">
    <xs:simpleType>
      <xs:union memberTypes="xs:token xs:double"/>
    </xs:simpleType>
  </xs:element>
  <xs:element name="testingInterval">
    <xs:simpleType>
      <xs:union memberTypes="xs:token xs:double"/>
    </xs:simpleType>
  </xs:element>
<!-- *********** End include nm_timeinfo.xsd *********** -->

<!-- **********Included from nm_statistic.xsd ********** -->
  <xs:complexType name="Statistics">
    <xs:annotation>
      <xs:documentation>These elements indicate a request for various statistical summaries of data</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" ref="g:raw"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:count"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:min"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:mean"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:median"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:max"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:stddev"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:percentile"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:confidence"/>
    </xs:sequence>
    <xs:attribute name="interval">
      <xs:annotation>
        <xs:documentation>The interval provides a hint to the service as to the interval between measurements required if it is to make new measurements</xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:union memberTypes="xs:token xs:double"/>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  <xs:element name="raw">
    <xs:annotation>
      <xs:documentation>Request the raw data</xs:documentation>
    </xs:annotation>
    <xs:complexType/>
  </xs:element>
  <xs:element name="count">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="min">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="mean">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="median">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="max">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="stddev">
    <xs:complexType>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="percentile">
    <xs:complexType>
      <xs:attribute name="n" use="required" type="xs:double"/>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="confidence">
    <xs:complexType>
      <xs:attribute name="n" use="required" type="xs:double"/>
      <xs:attributeGroup ref="g:StatisticsAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="StatisticsAttributes">
    <xs:attributeGroup ref="g:Required"/>
  </xs:attributeGroup>
<!-- *********** End include nm_statistic.xsd *********** -->

<!-- **********Included from nm_extend.xsd ********** -->
  <!--
    Extensibility element(s)
    Only restriction is that they must be in a namespace,
    and it must differ from this one
  -->
  <xs:complexType name="Extensibility">
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
<!-- *********** End include nm_extend.xsd *********** -->
  <xs:element name="networkMeasurementRequest" type="g:NetworkMeasurementRequest"/>
  <xs:complexType name="NetworkMeasurementRequest">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" ref="g:request"/>
    </xs:sequence>
    <xs:attribute name="version" type="xs:token"/>
  </xs:complexType>
  <xs:element name="request" type="g:Request"/>
  <xs:complexType name="Request">
    <xs:sequence>
      <xs:element ref="g:characteristic"/>
      <xs:element ref="g:subject"/>
      <xs:element minOccurs="0" ref="g:methodology"/>
      <xs:element minOccurs="0" ref="g:statistics"/>
    </xs:sequence>
    <xs:attribute name="maxResults">
      <xs:annotation>
        <xs:documentation>The maximum number of measurements to be returned</xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:union memberTypes="xs:token xs:positiveInteger"/>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="allowNewMeasurements" type="xs:boolean">
      <xs:annotation>
        <xs:documentation>If false, new measurements should not be made to satisfy this request</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="reportEverything" type="xs:boolean">
      <xs:annotation>
        <xs:documentation>If true, everything that can be reported, should be, otherwise individual report attributes are used</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:element name="characteristic" type="xs:token">
    <xs:annotation>
      <xs:documentation>The requested characteristic</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="subject">
    <xs:annotation>
      <xs:documentation>The subject of the measurement(s) to be returned</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:choice>
        <xs:element ref="g:node"/>
        <xs:element ref="g:path"/>
      </xs:choice>
      <xs:attributeGroup ref="g:Report"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="node" type="g:Node"/>
  <xs:element name="path" type="g:Path"/>
  <xs:element name="methodology" type="g:Methodology">
    <xs:annotation>
      <xs:documentation>The methodology to employ</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="statistics" type="g:Statistics">
    <xs:annotation>
      <xs:documentation>A request for statistics to be returned</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:complexType name="Methodology">
    <xs:sequence>
      <xs:element ref="g:endpoint"/>
      <xs:element minOccurs="0" ref="g:tool"/>
      <xs:element ref="g:when"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="g:parameterSet"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="endpoint" type="g:Endpoint">
    <xs:annotation>
      <xs:documentation>The endpoint to which the parameters apply FIXME: does this work?</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="tool" type="g:Tool">
    <xs:annotation>
      <xs:documentation>The measurement(s) should have been made using this tool, if this element is present</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="when" type="g:TimeInformation">
    <xs:annotation>
      <xs:documentation>The measurement(s) must have been made in this time period</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="parameterSet" type="g:ParameterSet">
    <xs:annotation>
      <xs:documentation>Tool parameters</xs:documentation>
    </xs:annotation>
  </xs:element>
  <!--
    Enumerations break wsdl2spy
    Endpoint = token "source" | token "destination" | token "all" | token "none"
  -->
  <xs:simpleType name="Endpoint">
    <xs:restriction base="xs:token"/>
  </xs:simpleType>
  <!-- This is a global declaration as "required" will be used all over the place -->
  <xs:attributeGroup name="Required">
    <xs:attribute name="required" type="xs:boolean"/>
  </xs:attributeGroup>
  <!-- This is a global declaration as "report" will be used all over the place -->
  <xs:attributeGroup name="Report">
    <xs:attribute name="report" type="xs:boolean"/>
  </xs:attributeGroup>
</xs:schema>

