<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pcmm="http://www.cablelabs.com/PCMM/1.0/xsd/reg/CLAB-PCMM-WS" xmlns:tns="http://www.cablelabs.com/PCMM/1.0/xsd/reg/CLAB-PCMM-WS" targetNamespace="http://www.cablelabs.com/PCMM/1.0/xsd/reg/CLAB-PCMM-WS" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:simpleType name="IPPortNumber">
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:minInclusive value="0"/>
            <xs:maxInclusive value="65535"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="IPv4Address">
        <xs:restriction base="xs:string">
            <xs:pattern value="(([0-9]{1,2} | [1][0-9]{2} | [2][0-4][0-9] | [2][5][0-5])\.){3}
                                ([0-9]{1,2} | [1][0-9]{2} | [2][0-4][0-9] | [2][5][0-5])"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="IPHostname">
        <xs:restriction base="xs:string">
            <xs:maxLength value="256"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="IPAddress">
        <xs:sequence>
            <xs:choice>
                <xs:element name="ipv4" type="tns:IPv4Address"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    <!--=========
        Direction
        =========  -->
    <xs:simpleType name="Direction">
        <xs:restriction base="xs:string">
            <xs:enumeration value="upstream"/>
            <xs:enumeration value="downstream"/>
            <xs:enumeration value="bidirectional"/>
        </xs:restriction>
    </xs:simpleType>
    <!--=========
        Classifier
        =========  -->
    <xs:complexType name="Classifier">
        <xs:annotation>
            <xs:documentation>
The Classifier element allows the AS to identify the traffic flow for which it is requesting resources for. (Section 6.2.1.3)
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="protocol" default="0">
                <xs:simpleType>
                    <xs:restriction base="xs:int">
                        <xs:minInclusive value="0"/>
                        <xs:maxInclusive value="257"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="sourceIpAddress" type="tns:IPv4Address"/>
            <xs:element name="sourceIpMask" type="tns:IPv4Address"/>
            <xs:element name="sourcePortStart" type="tns:IPPortNumber" default="0"/>
            <xs:element name="sourcePortEnd" type="tns:IPPortNumber" default="65535"/>
            <xs:element name="destinationIpAddress" type="tns:IPv4Address"/>
            <xs:element name="destinationIpMask" type="tns:IPv4Address"/>
            <xs:element name="destinationPortStart" type="tns:IPPortNumber" default="0"/>
            <xs:element name="destinationPortEnd" type="tns:IPPortNumber" default="65535"/>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
    <!--=========
        ContextID
        =========  -->
    <xs:complexType name="ContextID">
        <xs:annotation>
            <xs:documentation>
The ContextID element is the identifier that associates the resources of a given session. The ContextID element consists of a baseId element and optional idExtension elements. (Section 6.2.1.4)
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="idExtension" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="baseId" type="xs:string"/>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="wildcard" type="xs:boolean" use="optional" default="false"/>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
    <!--=========
        ContextInfo
        =========  -->
    <xs:complexType name="ContextInfo">
        <xs:annotation>
            <xs:documentation>
The ContextInfo element contains the ContextID element, described in 6.2.1.4, and the element ContextStatus , which identifies the status of the associated PacketCable Multimedia gate for the session. A context can be in a reserved or committed state.
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="contextId" type="tns:ContextID"/>
            <xs:element name="contextStatus" type="tns:ContextStatus"/>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
    <xs:simpleType name="ContextStatus">
        <xs:restriction base="xs:string">
            <xs:enumeration value="reserved"/>
            <xs:enumeration value="committed"/>
            <xs:enumeration value="unknown"/>
        </xs:restriction>
    </xs:simpleType>
    <!--=========
        QosChangeEvent
        =========  -->
    <xs:complexType name="QosChangeEvent">
        <xs:sequence>
            <xs:element name="direction" type="tns:Direction"/>
            <xs:element name="changeType">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Idle"/>
                        <xs:enumeration value="Authorized"/>
                        <xs:enumeration value="Reserved"/>
                        <xs:enumeration value="Committed"/>
                        <xs:enumeration value="Committed-Recovery"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="reason">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="[0-9]{5}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <!-- xs:element name="message" type="xs:string" minOccurs="0"/ -->
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
    <!--=========
        ServiceName
        =========  -->
    <xs:simpleType name="ServiceName">
        <xs:restriction base="xs:string">
            <xs:maxLength value="255"/>
        </xs:restriction>
    </xs:simpleType>
    <!--=========
        SubscriberID
        =========  -->
    <xs:complexType name="SubscriberID">
        <xs:annotation>
            <xs:documentation>
            Identifies the network boundary address for the subscriber. See subscriber ID in PKT-SP-MM-I02-040930 [MM]
            </xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:choice>
                <xs:element name="IPv4Address" type="tns:IPv4Address"/>
                <xs:element name="hostname" type="tns:IPHostname"/>
            </xs:choice>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute namespace="##any" processContents="lax"/>
    </xs:complexType>
    <!--=========
        Timeout
        =========  -->
    <xs:simpleType name="Timeout">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>
    <!--=========
        TimeUsageLimit
        =========  -->
    <xs:simpleType name="TimeUsageLimit">
        <xs:annotation>
            <xs:documentation>
The TimeUsageLimit is specified in seconds. This element also has a ‘direction’ attribute indicating whether the limit is for the upstream or downstream directions or for both direction.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>
    <!--=========
        TrafficProfile
        =========  -->
    <xs:simpleType name="TrafficProfileBandwidth">
        <xs:restriction base="xs:float"/>
    </xs:simpleType>
    <xs:complexType name="TrafficProfileFlowSpec">
        <xs:sequence>
            <xs:element name="serviceNumber">
                <xs:simpleType>
                    <xs:restriction base="xs:int">
                        <xs:enumeration value="2"/>
                        <xs:enumeration value="5"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="bucketRate" type="xs:float"/>
            <xs:element name="bucketDepth" type="xs:float"/>
            <xs:element name="peakRate" type="xs:float"/>
            <xs:element name="maxDatagramSize" type="xs:integer"/>
            <xs:element name="minPolicedUnit" type="xs:integer"/>
            <xs:element name="reservedRate" type="xs:float"/>
            <xs:element name="slackTerm" type="xs:integer"/>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="TrafficProfileTrafficClass">
        <xs:restriction base="xs:string">
            <xs:enumeration value="NetworkControl"/>
            <xs:enumeration value="StreamingControl"/>
            <xs:enumeration value="Voice"/>
            <xs:enumeration value="AV"/>
            <xs:enumeration value="Data"/>
            <xs:enumeration value="Audio"/>
            <xs:enumeration value="Images"/>
            <xs:enumeration value="Gaming"/>
            <xs:enumeration value="Other"/>
            <xs:enumeration value="Background"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="TrafficProfilePriority">
        <xs:restriction base="xs:int">
            <xs:minInclusive value="0"/>
            <xs:maxInclusive value="7"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="TrafficProfile">
        <xs:sequence>
            <xs:element name="priority" type="tns:TrafficProfilePriority" default="0" minOccurs="0"/>
            <xs:choice>
                <xs:element name="bandwidth" type="tns:TrafficProfileBandwidth"/>
                <xs:element name="trafficClass" type="tns:TrafficProfileTrafficClass"/>
                <xs:element name="flowSpec" type="tns:TrafficProfileFlowSpec"/>
            </xs:choice>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <!--=========
        UserName
        =========  -->
    <xs:simpleType name="UserName">
        <xs:annotation>
            <xs:documentation>
An identifier for the subscriber using a service
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:maxLength value="256"/>
        </xs:restriction>
    </xs:simpleType>
    <!--=========
        VolumeUsageLimit
        =========  -->
    <xs:complexType name="VolumeUsageLimit">
        <xs:sequence>
            <xs:element name="limit" type="xs:integer"/>
            <xs:element name="direction" type="tns:Direction"/>
            <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <!--=========
        ResourceStateNotification
        ========= -->
    <xs:simpleType name="NotificationCause">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Deleted"/>
            <xs:enumeration value="Partially Deleted"/>
            <xs:enumeration value="Informational"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="ResourceStateNotification">
        <xs:sequence>
            <xs:element name="contextID" type="tns:ContextID"/>
            <xs:element name="cause" type="tns:NotificationCause"/>
            <xs:element name="statusChange" type="tns:QosChangeEvent" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="PCMMFault">
        <xs:sequence>
            <xs:element name="error-code" type="xs:string"/>
            <xs:element name="error-type" type="xs:string"/>
            <xs:element name="error-message" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <!--=========
        Global element declarations
        =========  -->
    <xs:element name="Classifier" type="tns:Classifier"/>
    <xs:element name="ContextID" type="tns:ContextID"/>
    <xs:element name="ContextInfo" type="tns:ContextInfo"/>
    <xs:element name="ContextStatus" type="tns:ContextStatus"/>
    <xs:element name="QosChangeEvent" type="tns:QosChangeEvent"/>
    <xs:element name="ServiceName" type="tns:ServiceName"/>
    <xs:element name="SubscriberID" type="tns:SubscriberID"/>
    <xs:element name="Timeout" type="tns:Timeout"/>
    <xs:element name="TimeUsageLimit" type="tns:TimeUsageLimit"/>
    <xs:element name="TrafficProfile" type="tns:TrafficProfile"/>
    <xs:element name="UserName" type="tns:UserName"/>
    <xs:element name="VolumeUsageLimit" type="tns:VolumeUsageLimit"/>
    <xs:element name="PCMMFault" type="tns:PCMMFault"/>
    <!--=========
        WSDL message type definitions
        ========= -->
    <xs:element name="ReserveResourcesReq">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SubscriberID" type="pcmm:SubscriberID"/>
                <xs:element name="ServiceName" type="pcmm:ServiceName"/>
                <xs:element name="ContextID" type="pcmm:ContextID" minOccurs="0"/>
                <xs:element name="Classifier" type="pcmm:Classifier" minOccurs="0"/>
                <xs:element name="TrafficProfile" type="pcmm:TrafficProfile" minOccurs="0"/>
                <xs:element name="VolumeUsageLimit" type="pcmm:VolumeUsageLimit" minOccurs="0"/>
                <xs:element name="TimeUsageLimit" type="pcmm:TimeUsageLimit" minOccurs="0"/>
                <xs:element name="Timeout" type="pcmm:Timeout" minOccurs="0"/>
                <xs:element name="UserName" type="pcmm:UserName" minOccurs="0"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="ReserveResourcesRsp">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ContextID" type="pcmm:ContextID"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="CommitResourcesReq">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SubscriberID" type="pcmm:SubscriberID"/>
                <xs:element name="ServiceName" type="pcmm:ServiceName"/>
                <xs:element name="ContextID" type="pcmm:ContextID" minOccurs="0"/>
                <xs:element name="Classifier" type="pcmm:Classifier" minOccurs="0"/>
                <xs:element name="TrafficProfile" type="pcmm:TrafficProfile" minOccurs="0"/>
                <xs:element name="VolumeUsageLimit" type="pcmm:VolumeUsageLimit" minOccurs="0"/>
                <xs:element name="TimeUsageLimit" type="pcmm:TimeUsageLimit" minOccurs="0"/>
                <xs:element name="Timeout" type="pcmm:Timeout" minOccurs="0"/>
                <xs:element name="UserName" type="pcmm:UserName" minOccurs="0"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="CommitResourcesRsp">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ContextID" type="pcmm:ContextID"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="QueryAvailableServicesReq">
        <xs:complexType>
            <xs:sequence>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="QueryAvailableServicesRsp">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ServiceName" type="pcmm:ServiceName"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="ReleaseResourcesReq">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SubscriberID" type="pcmm:SubscriberID"/>
                <xs:element name="ServiceName" type="pcmm:ServiceName" minOccurs="0"/>
                <xs:element name="ContextID" type="pcmm:ContextID" minOccurs="0"/>
                <xs:element name="UserName" type="pcmm:UserName" minOccurs="0"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="ReleaseResourcesRsp">
        <xs:complexType>
            <xs:sequence>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="QueryContextsReq">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SubscriberID" type="pcmm:SubscriberID" minOccurs="0"/>
                <xs:element name="ServiceName" type="pcmm:ServiceName" minOccurs="0"/>
                <xs:element name="ContextID" type="pcmm:ContextID" minOccurs="0"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="QueryContextsRsp">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="ContextInfo" type="pcmm:ContextInfo"/>
                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
