<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns="http://www.wispa.org/calea/WCS/"
	targetNamespace="http://www.wispa.org/calea/WCS/"
	elementFormDefault="qualified" attributeFormDefault="unqualified">

	<xs:annotation>
		<xs:documentation>
			WISPA Calea Standard - IP Network Access (WISPA-CS-IPNA) 1.0
		</xs:documentation>
	</xs:annotation>

	<xs:element name="WCSMessage">
		<xs:annotation>
			<xs:documentation>
				WCSMessage is the root element of all WISPA-CS messages.
			</xs:documentation>
		</xs:annotation>

		<xs:complexType>
			<xs:choice>
				<xs:element ref="AccessAttempt" />
				<xs:element ref="AccessAccepted" />
				<xs:element ref="AccessFailed" />
				<xs:element ref="AccessSessionEnd" />
				<xs:element ref="AccessSessionStart" />
				<xs:element ref="PacketDataSummaryReport" />
				<xs:element ref="ServiceChange" />
				<xs:element ref="SurveillanceStatusReport" />
				<xs:element ref="VPNSecurityAssociationEstablish" />
				<xs:element ref="VPNSecurityAssociationRelease" />
			</xs:choice>

			<xs:attribute name="version" use="required">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="1.0" />
					</xs:restriction>
				</xs:simpleType>
			</xs:attribute>
			<xs:attribute name="series" use="optional">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="IPNA" />
					</xs:restriction>
				</xs:simpleType>
			</xs:attribute>
		</xs:complexType>
	</xs:element>

	<xs:element name="AccessAttempt">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="Location" type="xs:string"
					minOccurs="0" />
				<xs:element name="AccessMethod" type="AccessMethod"
					minOccurs="0" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="AccessAccepted">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="Location" type="xs:string"
					minOccurs="0" />
				<xs:element name="AccessMethod" type="AccessMethod"
					minOccurs="0" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" minOccurs="0" />
				<xs:element name="AccessSessionCharacteristics"
					type="xs:string" minOccurs="0" />
				<xs:element name="IPAddress" type="IPAddress"
					minOccurs="0" />
				<xs:element name="IPAssignmentMethod"
					type="IPAssignmentMethod" minOccurs="0" />
				<xs:element name="LeaseDuration" type="xs:unsignedInt"
					minOccurs="0" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="AccessFailed">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="Location" type="xs:string"
					minOccurs="0" />
				<xs:element name="IPAddress" type="IPAddress"
					minOccurs="0" />
				<xs:element name="IPAssignmentMethod"
					type="IPAssignmentMethod" minOccurs="0" />
				<xs:element name="FailureReason" type="xs:string"
					minOccurs="0" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="AccessSessionEnd">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" />
				<xs:element name="IPAddress" type="IPAddress"
					minOccurs="0" />
				<xs:element name="TerminationReason" type="xs:string"
					minOccurs="0" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="AccessSessionStart">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="Location" type="xs:string"
					minOccurs="0" />
				<xs:element name="AccessMethod" type="AccessMethod"
					minOccurs="0" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" />
				<xs:element name="AccessSessionCharacteristics"
					type="xs:string" minOccurs="0" />
				<xs:element name="IPAddress" type="IPAddress" />
				<xs:element name="IPAssignmentMethod"
					type="IPAssignmentMethod" minOccurs="0" />
				<xs:element name="LeaseDuration" type="xs:unsignedInt"
					minOccurs="0" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="PacketDataSummaryReport">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="PacketSignature"
					type="PacketSignature" maxOccurs="unbounded" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<xs:element name="ServiceChange">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string" />
				<xs:element name="PrimaryAccountSubscriberIdentity"
					type="xs:string" minOccurs="0" />
				<xs:element name="ChangesAttempted" type="xs:string" />
				<xs:element name="ChangeResult" type="ChangeResult" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="SurveillanceStatusReport">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" />
				<xs:element name="Status" type="Status" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:element name="VPNSecurityAssociationEstablish">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string"
					minOccurs="0" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" minOccurs="0" />
				<xs:element name="IPAddress" type="IPAddress"
					minOccurs="0" />
				<xs:element name="VPNSecurityAssociationIdentity"
					type="xs:integer" />
				<xs:element name="VPNSecurityAssociationProtocol">
					<xs:complexType>
						<xs:all>
							<xs:element name="Protocol"
								type="xs:string" />
							<xs:element name="AdditionalInformation"
								type="xs:string" />
						</xs:all>
					</xs:complexType>
				</xs:element>
				<xs:element name="LocalVPNEndpointIPAddress"
					type="IPAddress" />
				<xs:element name="RemoteVPNEndpointIPAddress"
					type="IPAddress" />
				<xs:element name="LocalVPNEncryptionInformation"
					maxOccurs="unbounded">
					<xs:complexType>
						<xs:all>
							<xs:element name="EncryptionAlgorithm"
								type="xs:string" />
							<xs:element name="EncryptionKey"
								type="xs:string" />
						</xs:all>
					</xs:complexType>
				</xs:element>
				<xs:element name="RemoteVPNEncryptionInformation"
					maxOccurs="unbounded" minOccurs="0">
					<xs:complexType>
						<xs:all>
							<xs:element name="EncryptionAlgorithm"
								type="xs:string" />
							<xs:element name="EncryptionKey"
								type="xs:string" />
						</xs:all>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<xs:element name="VPNSecurityAssociationRelease">
		<xs:complexType>
			<xs:all>
				<xs:element name="CaseIdentity" type="FSSafeString" />
				<xs:element name="IAPIdentifier" type="FSSafeString" />
				<xs:element name="TimeStamp" type="xs:dateTime" />
				<xs:element name="SubscriberIdentity" type="xs:string"
					minOccurs="0" />
				<xs:element name="AccessSessionIdentity"
					type="xs:string" minOccurs="0" />
				<xs:element name="VPNSecurityAssociationIdentity"
					type="xs:integer" />
				<xs:element name="VPNTerminationReason"
					type="xs:string" />
			</xs:all>
		</xs:complexType>
	</xs:element>

	<xs:simpleType name="FSSafeString">
		<xs:annotation>
			<xs:documentation>
				A string of characters intended to be safe for use in a
				filesystem name.
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="([a-zA-Z0-9_:+=\.\-])+" />
			<xs:maxLength value="255"></xs:maxLength>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="IPAddress">
		<xs:choice>
			<xs:element name="IPv4Address" type="IPv4Address" />
			<xs:element name="IPv6Address" type="IPv6Address" />
		</xs:choice>
	</xs:complexType>

	<xs:simpleType name="IPv4Address">
		<xs:annotation>
			<xs:documentation>
				IPv4 address in dotted-decimal notation.
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern
				value="((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])" />
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="IPv6Address">
		<xs:annotation>
			<xs:documentation>
				IPv6 address in standard notation.
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}" />
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="AccessMethod">
		<xs:all>
			<xs:element name="AccessType" type="xs:string" />
			<xs:element name="EquipmentID" type="xs:string" />
			<xs:element name="MultiLink" type="xs:boolean" />
		</xs:all>
	</xs:complexType>

	<xs:simpleType name="IPAssignmentMethod">
		<xs:restriction base="xs:string">
			<xs:enumeration value="static" />
			<xs:enumeration value="dynamic" />
			<xs:enumeration value="unknown" />
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="PacketSignature">
		<xs:all>
			<xs:element name="FlowSignature" type="FlowSignature" />
			<xs:element name="PacketCount" type="xs:unsignedLong">
				<xs:annotation>
					<xs:documentation>
						Count of Packets matching this Flow Signature
						since the last Packet Data Summary Report.
					</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:all>
	</xs:complexType>

	<xs:complexType name="FlowSignature">
		<xs:all>
			<xs:element name="sourceAddress" type="IPAddress" />
			<xs:element name="destAddress" type="IPAddress" />
			<xs:element name="sourcePort" type="xs:unsignedInt"
				minOccurs="0" />
			<xs:element name="destPort" type="xs:unsignedInt"
				minOccurs="0" />
			<xs:element name="ipProtocol" type="xs:unsignedByte" />
		</xs:all>
	</xs:complexType>

	<xs:complexType name="ChangeResult">
		<xs:all>
			<xs:element name="Disposition">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="accepted" />
						<xs:enumeration value="refused" />
						<xs:enumeration value="error" />
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
			<xs:element name="AdditionalInformation" type="xs:string"
				minOccurs="0" />
		</xs:all>
	</xs:complexType>

	<xs:complexType name="Status">
		<xs:all>
			<xs:element name="Status">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="active" />
						<xs:enumeration value="inactive" />
						<xs:enumeration value="error" />
						<xs:enumeration value="heartbeat" />
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
			<xs:element name="AdditionalInformation" type="xs:string"
				minOccurs="0" />
		</xs:all>
	</xs:complexType>

</xs:schema>
