<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!--
    Copyright 2004-2006 BBN Technologies Corporation
    
    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
    this file except in compliance with the License. You may obtain a copy of the
    License at http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software distributed
    under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    CONDITIONS OF ANY KIND, either express or implied.
    
    See the License for the specific language governing permissions and limitations
    under the License.
    
    $Id: clevent.xsd,v 1.2 2007/01/23 18:19:14 jward Exp $
-->

<!-- *********************************************************************** -->
<!-- Simple types -->

<xs:simpleType name="linkTypeType">
    <xs:annotation>
        <xs:documentation xml:lang="en">
         alwayson = The link is expected to be ALWAYS available, and any
                    convergence layer connection state is always maintained
                    for it.
         ondemand = The link is expected to be either always available, or can
                    be made available easily. Examples include DSL (always),
                    and dialup (easily available). Convergence layers are free
                    to tear down idle connection state, but are expected to be
                    able to easily re-establish it.
        scheduled = The link is only available at pre-determined times.
        predicted =
    opportunistic = The link may or may not be available, based on
                    uncontrollable factors. Examples include a wireless link
                    whose connectivity depends on the relative locations of the
                    two nodes.
        </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:enumeration value="alwayson"/>
        <xs:enumeration value="ondemand"/>
        <xs:enumeration value="scheduled"/>
        <xs:enumeration value="predicted"/>
        <xs:enumeration value="opportunistic"/>
    </xs:restriction>
</xs:simpleType>


<xs:simpleType name="linkStateType">
    <xs:annotation>
        <xs:documentation xml:lang="en">
      unavailable = The link is closed and not able to be
                    opened currently.
        available = The link is closed but is able to be
                    opened, either because it is an on demand
                    link, or because an opportunistic peer
                    node is in close proximity but no
                    convergence layer session has yet been
                    opened.
          opening = A convergence layer session is in the
                    process of being established.
             open = A convergence layer session has been
                    established, and the link has capacity
                    for a bundle to be sent on it. This may
                    be because no bundle is currently being
                    sent, or because the convergence layer
                    can handle multiple simultaneous bundle
                    transmissions.
             busy = The link is busy, i.e. a bundle is
                    currently being sent on it by the
                    convergence layer and no more bundles may
                    be delivered to the link.
           closed = The link is in the process of being closed.
        </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:enumeration value="unavailable"/>
        <xs:enumeration value="available"/>
        <xs:enumeration value="opening"/>
        <xs:enumeration value="open"/>
        <xs:enumeration value="busy"/>
        <xs:enumeration value="closed"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="linkReasonType">
    <xs:annotation>
        <xs:documentation xml:lang="en">
            no_info - No additional info.
            user - User action (i.e. console / config)
            broken - Unexpected session interruption.
            shutdown - Clean connection shutdown.
            reconnect - Re-establish link after failure.
            idle - Idle connection shut down by the CL.
            timeout - Scheduled link ended duration
            unblocked - No longer busy.
        </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:enumeration value="no_info"/>
        <xs:enumeration value="user"/>
        <xs:enumeration value="broken"/>
        <xs:enumeration value="shutdown"/>
        <xs:enumeration value="reconnect"/>
        <xs:enumeration value="idle"/>
        <xs:enumeration value="timeout"/>
        <xs:enumeration value="unblocked"/>
    </xs:restriction>
</xs:simpleType>
    

<xs:simpleType name="bundlePassMethodType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="unknown"/>
        <xs:enumeration value="filesystem"/>
    </xs:restriction>
</xs:simpleType>


<xs:simpleType name="percentType">
    <xs:restriction base="xs:integer">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="100"/>
    </xs:restriction>
</xs:simpleType>


<!-- *********************************************************************** -->
<!-- Complex types -->

<xs:element name="Parameter">
    <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundleAttributes">
    <xs:complexType>
        <xs:attribute name="source_eid" type="xs:string" use="required"/>
        <xs:attribute name="timestamp" type="xs:long" use="required"/>
        <xs:attribute name="is_fragment" type="xs:boolean" use="required"/>
        <xs:attribute name="fragment_length" type="xs:long" use="optional"/>
        <xs:attribute name="fragment_offset" type="xs:long" use="optional"/>
    </xs:complexType>
</xs:element>


<xs:element name="linkAttributes">
    <xs:complexType>
        <xs:attribute name="type" type="linkTypeType" use="required"/>
        <xs:attribute name="state" type="linkStateType" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="required"/>
        <xs:attribute name="is_reachable" type="xs:boolean" use="required"/>
        <xs:attribute name="is_usable" type="xs:boolean" use="required"/>
        <xs:attribute name="how_reliable" type="percentType" use="required"/>
        <xs:attribute name="how_available" type="percentType" use="required"/>
        <xs:attribute name="reactive_fragment" type="xs:boolean" use="required"/>
        <xs:attribute name="underlay_address" type="xs:string" use="required"/>
        <xs:attribute name="cla_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="contactAttributes">
    <xs:complexType>
        <xs:attribute name="start_time" type="xs:long" use="required"/>
        <xs:attribute name="duration" type="xs:long" use="required"/>
        <xs:attribute name="bps" type="xs:long" use="required"/>
        <xs:attribute name="latency" type="xs:integer" use="required"/>
        <xs:attribute name="packet_loss_prob" type="percentType" use="required"/>
    </xs:complexType>
</xs:element>


<!-- *********************************************************************** -->
<!-- CLA messages -->

<xs:element name="cla_add_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestAddCLA
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="cla_delete_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestDeleteCLA
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="cla_set_params_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestSetCLAParams
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>

        <xs:attribute name="local_eid" type="xs:string" use="optional"/>
        <xs:attribute name="create_discovered_links" type="xs:boolean" use="optional"/>
        <xs:attribute name="bundle_pass_method" type="bundlePassMethodType" use="optional"/>
    </xs:complexType>
</xs:element>


<xs:element name="cla_params_set_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventCLAParamsSet
    </xs:documentation></xs:annotation>

    <xs:complexType>
    </xs:complexType>
</xs:element>


<!-- *********************************************************************** -->
<!-- Interface messages -->

<xs:element name="interface_set_defaults_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestSetInterfaceDefaults
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>


<xs:element name="interface_create_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestAddInterface
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>

        <xs:attribute name="interface_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="interface_created_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventInterfaceAdded
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="interface_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="interface_reconfigure_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestReconfigureInterface
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        
        <xs:attribute name="interface_name" type="xs:string" use="required"/>
        <xs:attribute name="up" type="xs:boolean" use="optional"/>
        <xs:attribute name="discovery" type="xs:boolean" use="optional"/>
    </xs:complexType>
</xs:element>


<xs:element name="interface_reconfigured_event">
    <xs:annotation><xs:documentation xml:lang="en">
            CLA Interface document equivalent: EventInterfaceReconfigured
        </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="interface_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="interface_destroy_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestDeleteInterface
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:attribute name="interface_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="eid_reachable_event">
    <xs:annotation><xs:documentation xml:lang="en">
            CLA Interface document equivalent: EventEIDReachable
        </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="interface_name" type="xs:string" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<!-- *********************************************************************** -->
<!-- Link messages -->

<xs:element name="link_set_defaults_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestSetLinkDefaults
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>


<xs:element name="link_create_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestAddLink
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>

        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="type" type="linkTypeType" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="optional"/>
    </xs:complexType>
</xs:element>
    

<xs:element name="link_created_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventLinkCreated
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:sequence>
            <xs:element ref="linkAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>

        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="reason" type="linkReasonType" use="required"/>
    </xs:complexType>
</xs:element>
    

<xs:element name="link_reachable_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventAddReachableLink
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_open_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestOpenLink
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_opened_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventLinkOpened
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="contactAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_close_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestCloseLink
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_closed_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventLinkClosed
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="contactAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_state_changed_event">
    <xs:complexType>
        <xs:annotation><xs:documentation xml:lang="en">
            CLA Interface document equivalent: EventlinkStateTypeChange
        </xs:documentation></xs:annotation>

        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="new_state" type="linkStateType" use="required"/>
        <xs:attribute name="reason" type="linkReasonType" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_delete_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestDeleteLink
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_deleted_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventLinkDeleted
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="linkAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="reason" type="linkReasonType" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="link_attribute_changed_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventLinkAttributeChange
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="linkAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="reason" type="linkReasonType" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="contact_attribute_changed_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventContactAttributeChange
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="contactAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="reason" type="linkReasonType" use="required"/>
    </xs:complexType>
</xs:element>


<!-- *********************************************************************** -->
<!-- Bundle messages -->
    
<xs:element name="bundle_send_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestSendBundle
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bundleAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="location" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundle_receive_started_event">
    <xs:annotation><xs:documentation xml:lang="en">
            CLA Interface document equivalent: EventBundleReceiveStarted
        </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:attribute name="location" type="xs:string" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="optional"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundle_received_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventBundleReceived
    </xs:documentation></xs:annotation>

    <xs:complexType>
        <xs:attribute name="location" type="xs:string" use="required"/>
        <xs:attribute name="bytes_received" type="xs:long" use="required"/>
        <xs:attribute name="peer_eid" type="xs:string" use="optional"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundle_transmitted_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventBundleTransmitted
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bundleAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
        <xs:attribute name="bytes_sent" type="xs:long" use="required"/>
        <xs:attribute name="reliably_sent" type="xs:long" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundle_cancel_request">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: RequestCancelBundleSend
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bundleAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<xs:element name="bundle_cancelled_event">
    <xs:annotation><xs:documentation xml:lang="en">
        CLA Interface document equivalent: EventBundleSendCanceled
    </xs:documentation></xs:annotation>
    
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="bundleAttributes" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        
        <xs:attribute name="link_name" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>


<!-- *********************************************************************** -->
<!-- The root element -->

<xs:element name="cl_message">
    <xs:complexType>
        <xs:choice>
            <xs:element ref="cla_add_request"/>
            <xs:element ref="cla_delete_request"/>
            <xs:element ref="cla_set_params_request"/>
            <xs:element ref="cla_params_set_event"/>
            
            <xs:element ref="interface_set_defaults_request"/>
            <xs:element ref="interface_create_request"/>
            <xs:element ref="interface_created_event"/>
            <xs:element ref="interface_reconfigure_request"/>
            <xs:element ref="interface_reconfigured_event"/>
            <xs:element ref="interface_destroy_request"/>
            <xs:element ref="eid_reachable_event"/>
            
            <xs:element ref="link_set_defaults_request"/>
            <xs:element ref="link_create_request"/>
            <xs:element ref="link_created_event"/>
            <xs:element ref="link_reachable_event"/>
            <xs:element ref="link_open_request"/>
            <xs:element ref="link_opened_event"/>
            <xs:element ref="link_close_request"/>
            <xs:element ref="link_closed_event"/>
            <xs:element ref="link_state_changed_event"/>
            <xs:element ref="link_delete_request"/>
            <xs:element ref="link_deleted_event"/>
            <xs:element ref="link_attribute_changed_event"/>
            <xs:element ref="contact_attribute_changed_event"/>
            
            <xs:element ref="bundle_send_request"/>
            <xs:element ref="bundle_receive_started_event"/>
            <xs:element ref="bundle_received_event"/>
            <xs:element ref="bundle_transmitted_event"/>
            <xs:element ref="bundle_cancel_request"/>
            <xs:element ref="bundle_cancelled_event"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

</xs:schema>

