ECRIT | R. Gellens |
Internet-Draft | Qualcomm Technologies, Inc. |
Intended status: Standards Track | B. Rosen |
Expires: June 11, 2015 | NeuStar |
H. Tschofenig | |
(no affiliation) | |
R. Marshall | |
TeleCommunication Systems, Inc. | |
J. Winterbottom | |
(no affiliation) | |
December 8, 2014 |
Additional Data related to an Emergency Call
draft-ietf-ecrit-additional-data-26.txt
When an emergency call is sent to a Public Safety Answering Point (PSAP), the device that sends it, as well as any application service provider in the path of the call, or access network provider through which the call originated may have information about the call, the caller or the location which the PSAP may be able to use. This document describes data structures and a mechanism to convey such data to the PSAP. The mechanism uses a Uniform Resource Identifier (URI), which may point to either an external resource or an object in the body of the SIP message. The mechanism thus allows the data to be passed by reference (when the URI points to an external resource) or by value (when it points into the body of the message). This follows the tradition of prior emergency services standardization work where data can be conveyed by value within the call signaling (i.e., in body of the SIP message) and also by reference.
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
This Internet-Draft will expire on June 11, 2015.
Copyright (c) 2014 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
When an IP-based emergency call is initiated, a rich set of data from multiple data sources is conveyed to the Public Safety Answering Point (PSAP). This data includes information about the calling party identity, the multimedia capabilities of the device, the request for emergency services, location information, and meta-data about the sources of the data. The device, the access network provider, and any service provider in the call path may have even more information useful for a PSAP. This document extends the basic set of data communicated with an IP-based emergency call, as described in [RFC6443] and [RFC6881], in order to carry additional data which may be useful to an entity or call taker handling the call. This data is "additional" to the basic information found in the emergency call signaling used.
In general, there are three categories of this additional data that may be transmitted with an emergency call:
While this document defines data structures only within the category of Data Associated with a Call, by establishing the overall framework of Additional Data, along with general mechanisms for transport of such data, extension points and procedures for future extensions, it minimizes the work needed to carry data in the other categories. Other specifications may make use of the facilities provided here.
For interoperability, there needs to be a common way for the information conveyed to a PSAP to be encoded and identified. Identification allows emergency services authorities to know during call processing which types of data are present and to determine if they wish to access it. A common encoding allows the data to be successfully accessed.
This document defines an extensible set of data structures, and mechanisms to transmit this data either by value or by reference, either in the Session Initiation Protocol (SIP) call signaling or in the Presence Information Data Format Location Object (PIDF-LO). The data structures are usable by other communication systems and transports as well. The data structures are defined in Section 4, and the transport mechanisms (using SIP and HTTPS) are defined in Section 5.
Each data structure described in this document is encoded as a "block" of information. Each block is an XML structure with an associated Multipurpose Internet Mail Extensions (MIME) type for identification within transport such as SIP and HTTPS. The set of blocks is extensible. Registries are defined to identify the block types that may be used and to allow blocks to be included in emergency call signaling.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119].
This document also uses terminology from [RFC5012]. We use the term service provider to refer to an Application Service Provider (ASP). A Voice Service Provider (VSP) is a special type of ASP. With the term "Access Network Provider" we refer to the Internet Access Provider (IAP) and the Internet Service Provider (ISP) without further distinguishing these two entities, since the difference between the two is not relevant for this document. Note that the roles of ASP and access network provider may be provided by a single company. An Emergency Services Provider is an entity directly involved in providing emergency services. This includes PSAPs, dispatch, police, fire, emergency medical, other responders, and other similar agencies.
Within each data block definition (see Section 4), the values for the "Use:" label are specified as one of the following:
vCard is a data format for representing and exchanging a variety of information about individuals and other entities. For applications that use XML the format defined in vCard is not immediately applicable. For this purpose an XML-based encoding of the information elements defined in the vCard specification has been defined and the name of that specification is xCard. Since the term vCard is more familiar to most readers, we use the term xCard and vCard interchangeably.
The scope of this document is explicitly limited to emergency calls. The data structures defined here are not appropriate to be conveyed with non-emergency calls because they carry sensitive and private data.
This section defines the following five data structures, each as a data block. For each block we define the MIME type, and the XML encoding. The five data structures are:
Each block contains a mandatory <DataProviderReference> element. The purpose of the <DataProviderReference> element is to associate all blocks added by the same data provider as a unit. The <DataProviderReference> element associates the data provider block to each of the other blocks added as a unit. Consequently, when a data provider adds additional data to an emergency call (such as device information) it MUST add information about itself (via the data provider block) and the blocks added contain the same value in the <DataProviderReference> element. All blocks added by a single entity at the same time MUST have the same <DataProviderReference> value. The value of the <DataProviderReference> element has the same syntax and properties (specifically, world-uniqueness) as the value of the "Message-ID" message body header field specified in RFC 5322 [RFC5322] except that the <DataProviderReference> element is not enclosed in brackets (the "<" and ">" symbols are omitted). In other words, the value of a <DataProviderReference> element is syntactically a msg-id as specified in RFC 5322 [RFC5322].
Note that the xCard format is re-used in some of the data structures to provide contact information. In an xCard there is no way to specify a "main" telephone number. These numbers are useful to emergency responders who are called to a large enterprise. This document adds a new property value to the "tel" property of the TYPE parameter called "main". It can be used in any xCard in additional data.
This block is intended to be supplied by any service provider in the path of the call or the access network provider. It includes identification and contact information. This block SHOULD be supplied by every service provider in the call path, and by the access network provider. Devices MAY use this block to provide identifying information. The MIME subtype is "application/EmergencyCallData.ProviderInfo+xml". An access network provider SHOULD provide this block either by value or by reference in the provided-by section of a PIDF-LO
+------------------------------+------------------------------------+ | Token | Description | +------------------------------+------------------------------------+ |Access Network Provider | Access network service provider | |Telecom Provider | Calling or origination telecom SP | |Telematics Provider | A sensor based service provider, | | | especially vehicle based | |Language Translation Provider | A spoken language translation SP | |Emergency Service Provider | An emergency service provider | | | conveying information to another| | | emergency service provider. | |Emergency Modality Translation| An emergency call specific | | | modality translation service | | | e.g., for sign language | |Relay Provider | A interpretation SP, for example, | | | video relay for sign language | | | interpreting | |Other | Any other type of service provider | +------------------------------+------------------------------------+
Figure 1: Type of Data Provider Registry.
When the entity providing the data is a subcontractor, the Data Provider Type is set to that of the primary service provider and this entry is supplied to provide information regarding the subcontracting entity.
<?xml version="1.0" encoding="UTF-8"?> <ad:EmergencyCallData.ProviderInfo xmlns:ad="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ad:DataProviderReference>string0987654321@example.org </ad:DataProviderReference> <ad:DataProviderString>Example VoIP Provider </ad:DataProviderString> <ad:ProviderID>urn:nena:companyid:ID123</ad:ProviderID> <ad:ProviderIDSeries>NENA</ad:ProviderIDSeries> <ad:TypeOfProvider>Telecom Provider</ad:TypeOfProvider> <ad:ContactURI>tel:+1-201-555-0123</ad:ContactURI> <ad:Language>EN</ad:Language> <ad:DataProviderContact xmlns="urn:ietf:params:xml:ns:vcard-4.0"> <vcards> <vcard> <fn><text>Hannes Tschofenig</text></fn> <n> <surname>Hannes</surname> <given>Tschofenig</given> <additional/> <prefix/> <suffix>Dipl. Ing.</suffix> </n> <bday><date>--0203</date></bday> <anniversary> <date-time>20090808T1430-0500</date-time> </anniversary> <gender><sex>M</sex></gender> <lang> <parameters><pref><integer>1</integer></pref> </parameters> <language-tag>de</language-tag> </lang> <lang> <parameters><pref><integer>2</integer></pref> </parameters> <language-tag>en</language-tag> </lang> <org> <parameters><type><text>work</text></type> </parameters> <text>Example VoIP Provider</text> </org> <adr> <parameters> <type><text>work</text></type> <label><text>Hannes Tschofenig Linnoitustie 6 Espoo , Finland 02600</text></label> </parameters> <pobox/> <ext/> <street>Linnoitustie 6</street> <locality>Espoo</locality> <region>Uusimaa</region> <code>02600</code> <country>Finland</country> </adr> <tel> <parameters> <type> <text>work</text> <text>voice</text> </type> </parameters> <uri>tel:+358 50 4871445</uri> </tel> <email> <parameters><type><text>work</text></type> </parameters> <text>hannes.tschofenig@nsn.com</text> </email> <geo> <parameters><type><text>work</text></type> </parameters> <uri>geo:60.210796,24.812924</uri> </geo> <key> <parameters><type><text>home</text></type> </parameters> <uri> http://www.tschofenig.priv.at/key.asc </uri> </key> <tz><text>Finland/Helsinki</text></tz> <url> <parameters><type><text>home</text></type> </parameters> <uri>http://www.tschofenig.priv.at</uri> </url> </vcard> </vcards> </ad:DataProviderContact> </ad:EmergencyCallData.ProviderInfo>
Figure 2: EmergencyCallData.ProviderInfo Example.
This block describes the service that the service provider provides to the caller. It SHOULD be included by all SPs in the path of the call. The mime subtype is "application/EmergencyCallData.ServiceInfo+xml".
+--------------+----------------------------------------+ | Name | Description | +--------------+----------------------------------------+ | wireless | Wireless Telephone Service: Includes | | | CDMA, GSM, Wi-Fi, WiMAX, LTE (but | | | not satellite) | | coin | Fixed public pay/coin telephones: Any | | | coin or credit card operated device | | one-way | One way outbound service | | prison | Inmate call/service | | temp | Soft dial tone/quick service/warm | | | disconnect/suspended | | MLTS-hosted | Hosted multi-line telephone system | | | such as Centrex | | MLTS-local | Local multi-line telephone system, | | | includes all PBX, key systems, | | | Shared Tenant Service | | sensor- | | unattended | These are devices that generate DATA | | | ONLY. This is a one-way information | | | transmit without interactive media | | sensor- | | | attended | Devices that are supported by a | | | monitoring service provider or that | | | are capable of supporting interactive| | | media | | POTS | Wireline: Plain Old Telephone Service | | VOIP | An over-the-top service that provides | | | communication over arbitrary Internet| | | access (fixed, nomadic, mobile) | | remote | Off premise extension | | relay | A service where there is a human third | | | party agent who provides additional | | | assistance. This includes sign | | | language relay and telematics | | | services that provide a human on the | | | call. | +--------------+----------------------------------------+
Figure 3: Service Delivered by Provider to End User Registry.
<?xml version="1.0" encoding="UTF-8"?> <svc:EmergencyCallData.ServiceInfo xmlns:svc="urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <svc:DataProviderReference>2468.IBOC.MLTS.1359@example.org </svc:DataProviderReference> <svc:ServiceEnvironment>Business</svc:ServiceEnvironment> <svc:ServiceType>MLTS-hosted</svc:ServiceType> <svc:ServiceMobility>Fixed</svc:ServiceMobility> </svc:EmergencyCallData.ServiceInfo>
Figure 4: EmergencyCallData.ServiceInfo Example.
This block provides information about the device used to place the call. It should be provided by any service provider that knows what device is being used, and by the device itself. The mime subtype is "application/EmergencyCallData.DeviceInfo+xml".
+---------------+----------------------------------------+ | Token | Description | +---------------+----------------------------------------+ |cordless | Cordless handset | |fixed | Fixed phone | |satellite | Satellite phone | |sensor-fixed | Fixed (non mobile) sensor/alarm device | |desktop | Soft client on desktop PC | |laptop | Soft client on laptop type device | |tablet | Soft client on tablet type device | |alarm-monitored| Alarm system | |sensor-mobile | Mobile sensor device | |aircraft | Aircraft telematics device | |automobile | Automobile/cycle/off-road telematics | |truck | Truck/construction telematics | |farm | Farm equipment telematics | |marine | Marine telematics | |personal | Personal telematics device | |feature-phone | Feature- (not smart-) cellular phone | |smart-phone | Smart-phone cellular phone (native) | |smart-phone-app| Soft client app on smart-phone | |unknown-device | Soft client on unknown device type | |game | Gaming console | |text-only | Other text device | |NA | Not Available | +---------------+----------------------------------------+
Figure 5: Device Classification Registry.
+--------+------------------------------------------+ | Token | Description | +--------+------------------------------------------+ | MEID | Mobile Equipment Identifier (CDMA) | | ESN | Electronic Serial Number (GSM) | | MAC | Media Access Control Address (IEEE) | | WiMAX | Device Certificate Unique ID | | IMEI | International Mobile Equipment ID (GSM) | | IMSI | International Mobile Subscriber ID (GSM) | | UDI | Unique Device Identifier | | RFID | Radio Frequency Identification | | SN | Manufacturer Serial Number | +--------+------------------------------------------+
Figure 6: Registry with Device Identifier Types.
IEEE 1512 is the USDoT model for traffic incidents.
This document describes two mechanisms which allow extension of the kind of data provided with an emergency call: define a new block or define a new service specific additional data URL for the DeviceInfo block. While defining new data types and getting a new device or application to send the new data may be easy, getting PSAPs and responders to actually retrieve the data and use it will be difficult. New mechanism providers should understand that acquiring and using new forms of data usually require software upgrades at the PSAP and/or responders, as well as training of call takers and responders in how to interpret and use the information. Legal and operational review may also be needed. Overwhelming a call taker or responder with too much information is highly discouraged. Thus, the barrier to supporting new data is quite high.
The mechanisms this document describes are meant to encourage development of widely supported, common data formats for classes of devices. If all manufacturers of a class of device use the same format, and the data can be shown to improve outcomes, then PSAPs and responders may be encouraged to upgrade their systems and train their staff to use the data. Variations, however well intentioned, are unlikely to be supported.
Implementers should consider that data from sensor-based devices in some cases may not be useful to call takers or PSAPs (and privacy or other considerations may preclude the PSAP from touching the data), but may be of use to responders. Some standards being developed by other organizations to carry data from the PSAP to responders are designed to carry all additional data supplied in the call that conform to this document, even if the PSAP does not fetch or interpret the data. This allows responders to get the data even if the PSAP does not.
For devices that have device or service specific data, there are two choices to carry it. A new block can be defined, or the device/service specific additional data URL the DeviceInfo block can be used and a new type for it defined . The data passed would likely be the same in both cases. Considerations for choosing which mechanism to register under include:
<?xml version="1.0" encoding="UTF-8"?> <dev:EmergencyCallData.DeviceInfo xmlns:dev="urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <dev:DataProviderReference>d4b3072df.201409182208075@example.org </dev:DataProviderReference> <dev:DeviceClassification>fixed</dev:DeviceClassification> <dev:DeviceMfgr>Nokia</dev:DeviceMfgr> <dev:DeviceModelNr>Lumia 800</dev:DeviceModelNr> <dev:UniqueDeviceID TypeOfDeviceID="IMEI">35788104 </dev:UniqueDeviceID> </dev:EmergencyCallData.DeviceInfo>
Figure 7: EmergencyCallData.DeviceInfo Example.
This block describes the owner of the device (if provided by the device) or the subscriber information (if provided by a service provider). The contact location is not necessarily the location of the caller or incident, but is rather the nominal contact address. The MIME type is "application/EmergencyCallData.SubscriberInfo+xml".
In some jurisdictions some or all parts of the subscriber-specific information are subject to privacy constraints. These constraints vary but dictate what information can be displayed and logged. A general privacy indicator expressing a desire for privacy is provided. The interpretation of how this is applied is left to the receiving jurisdiction as the custodians of the local regulatory requirements.
<?xml version="1.0" encoding="UTF-8"?> <sub:EmergencyCallData.SubscriberInfo xmlns:sub= "urn:ietf:params:xml:ns:EmergencyCallData:SubscriberInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" privacyRequested="false"> <sub:DataProviderReference>FEABFECD901@example.org </sub:DataProviderReference> <sub:SubscriberData xmlns="urn:ietf:params:xml:ns:vcard-4.0"> <vcards> <vcard> <fn><text>Simon Perreault</text></fn> <n> <surname>Perreault</surname> <given>Simon</given> <additional/> <prefix/> <suffix>ing. jr</suffix> <suffix>M.Sc.</suffix> </n> <bday><date>--0203</date></bday> <anniversary> <date-time>20090808T1430-0500</date-time> </anniversary> <gender><sex>M</sex></gender> <lang> <parameters><pref><integer>1</integer></pref> </parameters> <language-tag>fr</language-tag> </lang> <lang> <parameters><pref><integer>2</integer></pref> </parameters> <language-tag>en</language-tag> </lang> <org> <parameters><type><text>work</text></type> </parameters> <text>Viagenie</text> </org> <adr> <parameters> <type><text>work</text></type> <label><text>Simon Perreault 2875 boul. Laurier, suite D2-630 Quebec, QC, Canada G1V 2M2</text></label> </parameters> <pobox/> <ext/> <street>2875 boul. Laurier, suite D2-630</street> <locality>Quebec</locality> <region>QC</region> <code>G1V 2M2</code> <country>Canada</country> </adr> <tel> <parameters> <type> <text>work</text> <text>voice</text> </type> </parameters> <uri>tel:+1-418-656-9254;ext=102</uri> </tel> <tel> <parameters> <type> <text>work</text> <text>text</text> <text>voice</text> <text>cell</text> <text>video</text> </type> </parameters> <uri>tel:+1-418-262-6501</uri> </tel> <email> <parameters><type><text>work</text></type> </parameters> <text>simon.perreault@viagenie.ca</text> </email> <geo> <parameters><type><text>work</text></type> </parameters> <uri>geo:46.766336,-71.28955</uri> </geo> <key> <parameters><type><text>work</text></type> </parameters> <uri> http://www.viagenie.ca/simon.perreault/simon.asc </uri> </key> <tz><text>America/Montreal</text></tz> <url> <parameters><type><text>home</text></type> </parameters> <uri>http://nomis80.org</uri> </url> </vcard> </vcards> </sub:SubscriberData> </sub:EmergencyCallData.SubscriberInfo>
Figure 8: EmergencyCallData.SubscriberInfo Example.
This block provides a mechanism for the data provider to supply extra, human readable information to the PSAP. It is not intended for a general purpose extension mechanism nor does it aim to provide machine-readable content. The mime subtype is "application/EmergencyCallData.Comment+xml"
<?xml version="1.0" encoding="UTF-8"?> <com:EmergencyCallData.Comment xmlns:com="urn:ietf:params:xml:ns:EmergencyCallData:Comment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <com:DataProviderReference>string0987654321@example.org </com:DataProviderReference> <com:Comment xml:lang="en">This is an example text.</com:Comment> </com:EmergencyCallData.Comment>
Figure 9: EmergencyCallData.Comment Example.
This section defines how to convey additional data to an emergency service provider. Two different means are specified: the first uses the call signaling; the second uses the <provided-by> element of a PIDF-LO [RFC4119].
One or more blocks of data registered in the Emergency Call Additional Data registry, as defined in Section 10.1, may be included or referenced in the SIP signaling (using the Call-Info header field) or in the <provided-by> element of a PIDF-LO. Every block must be one of the types in the registry. Since the data of an emergency call may come from multiple sources, the data itself needs information describing the source. Consequently, each entity adding additional data MUST supply the "Data Provider" block. All other blocks are optional, but each entity SHOULD supply any blocks where it has at least some of the information in the block.
A URI to a block MAY be inserted in a SIP request or response method (most often INVITE or MESSAGE) with a Call-Info header field containing a purpose value starting with 'EmergencyCallData' and the type of data available at the URI. The type of data is denoted by including the root of the MIME type (not including the 'EmergencyCallData' prefix and any suffix such as '+xml') with a '.' separator. For example, when referencing a block with MIME type 'application/EmergencyCallData.ProviderInfo+xml', the 'purpose' parameter is set to 'EmergencyCallData.ProviderInfo'. An example "Call-Info" header field for this would be:
A Call-info header with a purpose value starting with 'EmergencyCallData' MUST only be sent on an emergency call, which can be ascertained by the presence of an emergency service urn in a Route header of a SIP message.
If the data is provided by reference, an HTTPS URI MUST be included and consequently Transport Layer Security (TLS) protection is applied for protecting the retrieval of the information.
The data may also be supplied by value in a SIP message. In this case, Content Indirection (CID) [RFC2392] is used, with the CID URL referencing the MIME body part.
More than one Call-Info header with a purpose value starting with 'EmergencyCallData' can be expected, but at least one MUST be provided. The device MUST provide one if it knows no service provider is in the path of the call. The device MAY insert one if it uses a service provider. Any service provider in the path of the call MUST insert its own. For example, a device, a telematics service provider in the call path, as well as the mobile carrier handling the call will each provide one. There may be circumstances where there is a service provider who is unaware that the call is an emergency call and cannot reasonably be expected to determine that it is an emergency call. In that case, that service provider is not expected to provide EmergencyCallData.
The 'EmergencyCallDataReference' element is used to transmit an additional data block by reference within a 'provided-by' element of a PIDF-LO. The 'EmergencyCallDataReference' element has two attributes: 'ref' to specify the URL, and 'purpose' to indicate the type of data block referenced. The value of 'ref' is an HTTPS URL that resolves to a data structure with information about the call. The value of 'purpose' is the same as used in a 'Call-Info' header field (as specified in Section 5.1).
For example, to reference a block with MIME type 'application/EmergencyCallData.ProviderInfo+xml', the 'purpose' parameter is set to 'EmergencyCallData.ProviderInfo'. An example 'EmergencyCallDataReference' element for this would be:
The 'EmergencyCallDataReference' element transmits one additional data block; multiple additional data blocks may be transmitted by using multiple 'EmergencyCallDataReference' elements.
<gp:provided-by xmlns="urn:ietf:params:xml:ns:EmergencyCallData"> <ad:EmergencyCallDataReference purpose="EmergencyCallData.ServiceInfo" ref="https://example.com/ref2" /> <ad:EmergencyCallDataReference purpose="EmergencyCallData.ProviderInfo" ref="https://example.com/ref3" /> <ad:EmergencyCallDataReference purpose="EmergencyCallData.Comment" ref="https://example.com/ref4" /> </gp:provided-by>
Example provided-by by Reference.
For example:
It is RECOMMENDED that access networks supply the data specified in this document by reference, but they MAY provide the data by value.
The 'EmergencyCallDataValue' element is used to transmit one or more additional data blocks by value within a 'provided-by' element of a PIDF-LO. Each block being transmitted is placed (as a child element) inside the 'EmergencyCallDataValue' element. (The same XML structure as would be contained in the corresponding MIME type body part is placed inside the 'EmergencyCallDataValue' element.)
<gp:provided-by xmlns="urn:ietf:params:xml:ns:EmergencyCallData"> <EmergencyCallDataValue> <EmergencyCallData.ProviderInfo xmlns= "urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo"> <DataProviderReference>flurbit735@es.example.com </DataProviderReference> <DataProviderString>Access Network Examples, Inc </DataProviderString> <ProviderID>urn:nena:companyid:Test</ProviderID> <ProviderIDSeries>NENA</ProviderIDSeries> <TypeOfProvider>Access Network Provider </TypeOfProvider> <ContactURI>tel:+1-555-555-0897</ContactURI> <Language>EN</Language> </EmergencyCallData.ProviderInfo> <EmergencyCallData.Comment xmlns= "urn:ietf:params:xml:ns:EmergencyCallData:Comment"> <DataProviderReference>flurbit735@es.example.com </DataProviderReference> <Comment xml:lang="en">This is an example text. </Comment> </EmergencyCallData.Comment> </EmergencyCallDataValue> </gp:provided-by>
Example provided-by by Value.
For example:
RFC 5621 [RFC5621] discusses the handling of message bodies in SIP. It updates and clarifies handling originally defined in RFC 3261 [RFC3261] based on implementation experience. While RFC 3261 did not mandate support for 'multipart' message bodies, 'multipart/mixed' MIME bodies are used by many extensions (including this document) today. For example, adding a PIDF-LO, SDP, and additional data in body of a SIP message requires a 'multipart' message body.
RFC 3204 [RFC3204] and RFC 3459 [RFC3459] define the 'handling' parameter for the Content-Disposition header field. These RFCs describe how a UAS reacts if it receives a message body whose content type or disposition type it does not understand. If the 'handling' parameter has the value "optional", the UAS ignores the message body. If the 'handling' parameter has the value "required", the UAS returns a 415 (Unsupported Media Type) response. The 'by-reference' disposition type allows a SIP message to contain a reference to the body part, and the SIP UA processes the body part according to the reference. This is the case for the Call-info header containing a Content Indirection (CID) URL.
Content-Type: application/sdp ...Omit Content-Disposition here; defaults are ok ...SDP goes in here --boundary1 Content-Type: application/pidf+xml Content-ID: <target123@atlanta.example.com> Content-Disposition: by-reference;handling=optional ...PIDF-LO goes in here --boundary1-- Content-Type: application/EmergencyCallData.ProviderInfo+xml Content-ID: <1234567890@atlanta.example.com> Content-Disposition: by-reference; handling=optional ...Data provider information data goes in here --boundary1--
Figure 10: Example for use of the Content-Disposition Parameter in SIP.
As an example, a SIP message indicates the Content-Disposition parameter in the body of the SIP message as shown in Figure 10.
This section illustrates a longer and more complex example, as shown in Figure 11. In this example additional data is added by the end device, included by the VoIP provider (via the PIDF-LO), and provided by the access network provider.
O +----+ [============] [=============] /|\ | UA | [ Access ] [ VoIP ] | +----+ [ Network ] [ Provider ] / \ [ Provider ] [ example.org ] [ ] [ ] (1) [ ] (2) [ ] Emergency Call [ ] Emergency Call [ ] -------------------------------------------------------> ] +Device Info [ ] +Device Info [ ] +Data Prov. Info [ ^ ] +Data Provider Info [ | ] +Location URI [=======.====] +Location URI [==|==========] . | . | +Location . [==============] | +Owner/Subscriber Info . [ ] (3) | +Device Info . (4) [ <----------+ +Data Provider Info #3 ..........> ] Emergency Call [ ] +Device Info [ PSAP ] +Data Prov. Info #2 [ ] +Location URI [==============] Legend: --- Emergency Call Setup Procedure ... Location Retrieval/Response
Figure 11: Additional Data Example Flow
The example scenario starts with the end device itself adding device information, owner/subscriber information, a location URI, and data provider information to the outgoing emergency call setup message (see step #1 in Figure 11). The SIP INVITE example is shown in Figure 12.
INVITE urn:service:sos SIP/2.0 Via: SIPS/2.0/TLS server.example.com;branch=z9hG4bK74bf9 Max-Forwards: 70 To: <urn:service:sos> From: Hannes Tschofenig <sips:hannes@example.com>;tag=9fxced76sl Call-ID: 3848276298220188511@example.com Call-Info: <http://wwww.example.com/hannes/photo.jpg> ;purpose=icon, <http://www.example.com/hannes/> ;purpose=info, <cid:1234567890@atlanta.example.com> ;purpose=EmergencyCallData.ProviderInfo, <cid:0123456789@atlanta.example.com> ;purpose=EmergencyCallData.DeviceInfo Geolocation: <https://ls.example.net:9768/357yc6s64ceyoiuy5ax3o> Geolocation-Routing: yes Accept: application/sdp, application/pidf+xml, application/EmergencyCallData.ProviderInfo+xml CSeq: 31862 INVITE Contact: <sips:hannes@example.com> Content-Type: multipart/mixed; boundary=boundary1 Content-Length: ... --boundary1 Content-Type: application/sdp ...SDP goes here --boundary1-- Content-Type: application/EmergencyCallData.DeviceInfo+xml Content-ID: <0123456789@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <dev:EmergencyCallData.DeviceInfo xmlns:dev="urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <dev:DataProviderReference>d4b3072df09876543@[93.184.216.119] </dev:DataProviderReference> <dev:DeviceClassification>laptop</dev:DeviceClassification> <dev:UniqueDeviceID TypeOfDeviceID="MAC">00-0d-4b-30-72-df</dev:UniqueDeviceID> </dev:EmergencyCallData.DeviceInfo> --boundary1-- Content-Type: application/EmergencyCallData.ProviderInfo+xml Content-ID: <1234567890@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <pi:EmergencyCallData.ProviderInfo xmlns:pi="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <pi:DataProviderReference>d4b3072df09876543@[93.184.216.119] </pi:DataProviderReference> <pi:DataProviderString>Hannes Tschofenig </pi:DataProviderString> <pi:TypeOfProvider>Other</pi:TypeOfProvider> <pi:ContactURI>tel:+1-555-555-0123</pi:ContactURI> <pi:Language>EN</pi:Language> <xc:DataProviderContact xmlns:xc="urn:ietf:params:xml:ns:vcard-4.0"> <vcards> <vcard> <fn><text>Hannes Tschofenig</text></fn> <n> <surname>Hannes</surname> <given>Tschofenig</given> <additional/> <prefix/> <suffix>Dipl. Ing.</suffix> </n> <bday><date>--0203</date></bday> <anniversary> <date-time>20090808T1430-0500</date-time> </anniversary> <gender><sex>M</sex></gender> <lang> <parameters><pref><integer>1</integer></pref> </parameters> <language-tag>de</language-tag> </lang> <lang> <parameters><pref><integer>2</integer></pref> </parameters> <language-tag>en</language-tag> </lang> <adr> <parameters> <type><text>work</text></type> <label><text>Hannes Tschofenig Linnoitustie 6 Espoo, Finland 02600</text></label> </parameters> <pobox/> <ext/> <street>Linnoitustie 6</street> <locality>Espoo</locality> <region>Uusimaa</region> <code>02600</code> <country>Finland</country> </adr> <tel> <parameters> <type> <text>work</text> <text>voice</text> </type> </parameters> <uri>tel:+358 50 4871445</uri> </tel> <email> <parameters><type><text>work</text></type> </parameters> <text>hannes.tschofenig@nsn.com</text> </email> <geo> <parameters><type><text>work</text></type> </parameters> <uri>geo:60.210796,24.812924</uri> </geo> <key> <parameters> <type><text>home</text></type> </parameters> <uri>https://www.example.com/key.asc </uri> </key> <tz><text>Finland/Helsinki</text></tz> <url> <parameters><type><text>home</text></type> </parameters> <uri>http://example.com/hannes.tschofenig </uri> </url> </vcard> </vcards> </xc:DataProviderContact> </pi:EmergencyCallData.ProviderInfo> --boundary1--
Figure 12: End Device sending SIP INVITE with Additional Data.
In this example, information available to the access network provider is included in the call setup message only indirectly via the use of the location reference. The PSAP has to retrieve it via a separate look-up step. Since the access network provider and the VoIP service provider are two independent entities in this scenario, the access network provider is not involved in application layer exchanges; the SIP INVITE transits the access network transparently, as illustrated in steps #1 and #2. The access network does not alter the SIP INVITE.
The VoIP service provider receives the message and determines based on the Service URN that the incoming request is an emergency call. It performs typical emergency services related tasks, including location-based routing, and adds additional data, namely service and subscriber information as well as data provider information #2, to the outgoing message. For the example we assume a VoIP service provider that deploys a back-to-back user agent allowing additional data to be included in the body of the SIP message (rather than per reference in the header), which allows us to illustrate the use of multiple data provider info blocks. The resulting message is shown in Figure 13. The SIP INVITE is sent to the PSAP in step #3.
INVITE sips:psap@example.org SIP/2.0 Via: SIPS/2.0/TLS server.example.com;branch=z9hG4bK74bf9 Max-Forwards: 70 To: <urn:service:sos> From: Hannes Tschofenig <sips:hannes@example.com>;tag=9fxced76sl Call-ID: 3848276298220188511@example.com Call-Info: <http://wwww.example.com/hannes/photo.jpg> ;purpose=icon, <http://www.example.com/hannes/> ;purpose=info, <cid:1234567890@atlanta.example.com> ;purpose=EmergencyCallData.ProviderInfo <cid:0123456789@atlanta.example.com> ;purpose=EmergencyCallData.DeviceInfo Call-Info: <cid:bloorpyhex@atlanta.example.com> ;purpose=EmergencyCallData.ServiceInfo Call-Info: <cid:aaabbb@atlanta.example.com> ;purpose=EmergencyCallData.ProviderInfo Geolocation: <https://ls.example.net:9768/357yc6s64ceyoiuy5ax3o> Geolocation-Routing: yes Accept: application/sdp, application/pidf+xml, application/EmergencyCallData.ProviderInfo+xml CSeq: 31862 INVITE Contact: <sips:hannes@example.com> Content-Type: multipart/mixed; boundary=boundary1 Content-Length: ... --boundary1 Content-Type: application/sdp ...SDP goes here --boundary1-- Content-Type: application/EmergencyCallData.DeviceInfo+xml Content-ID: <0123456789@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <dev:EmergencyCallData.DeviceInfo xmlns:dev="urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <dev:DataProviderReference>d4b3072df09876543@[93.184.216.119] </dev:DataProviderReference> <dev:DeviceClassification>laptop</dev:DeviceClassification> <dev:UniqueDeviceID TypeOfDeviceID="MAC">00-0d-4b-30-72-df</dev:UniqueDeviceID> </dev:EmergencyCallData.DeviceInfo> --boundary1-- Content-Type: application/EmergencyCallData.ProviderInfo+xml Content-ID: <1234567890@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <pi:EmergencyCallData.ProviderInfo xmlns:pi="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <pi:DataProviderReference>d4b3072df09876543@[93.184.216.119] </pi:DataProviderReference> <pi:DataProviderString>Hannes Tschofenig </pi:DataProviderString> <pi:TypeOfProvider>Other</pi:TypeOfProvider> <pi:ContactURI>tel:+1-555-555-0123</pi:ContactURI> <pi:Language>EN</pi:Language> <xc:DataProviderContact xmlns:xc="urn:ietf:params:xml:ns:vcard-4.0"> <vcards> <vcard> <fn><text>Hannes Tschofenig</text></fn> <n> <surname>Hannes</surname> <given>Tschofenig</given> <additional/> <prefix/> <suffix>Dipl. Ing.</suffix> </n> <bday><date>--0203</date></bday> <anniversary> <date-time>20090808T1430-0500</date-time> </anniversary> <gender><sex>M</sex></gender> <lang> <parameters><pref><integer>1</integer></pref> </parameters> <language-tag>de</language-tag> </lang> <lang> <parameters><pref><integer>2</integer></pref> </parameters> <language-tag>en</language-tag> </lang> <adr> <parameters> <type><text>work</text></type> <label><text>Hannes Tschofenig Linnoitustie 6 Espoo, Finland 02600</text></label> </parameters> <pobox/> <ext/> <street>Linnoitustie 6</street> <locality>Espoo</locality> <region>Uusimaa</region> <code>02600</code> <country>Finland</country> </adr> <tel> <parameters> <type> <text>work</text> <text>voice</text> </type> </parameters> <uri>tel:+358 50 4871445</uri> </tel> <email> <parameters><type><text>work</text></type> </parameters> <text>hannes.tschofenig@nsn.com</text> </email> <geo> <parameters><type><text>work</text></type> </parameters> <uri>geo:60.210796,24.812924</uri> </geo> <key> <parameters> <type><text>home</text></type> </parameters> <uri>https://www.example.com/key.asc </uri> </key> <tz><text>Finland/Helsinki</text></tz> <url> <parameters><type><text>home</text></type> </parameters> <uri>http://example.com/hannes.tschofenig </uri> </url> </vcard> </vcards> </xc:DataProviderContact> </pi:EmergencyCallData.ProviderInfo> --boundary1-- Content-Type: application/EmergencyCallData.ServiceInfo+xml Content-ID: <bloorpyhex@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <svc:EmergencyCallData.ServiceInfo xmlns:svc="urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <svc:DataProviderReference>string0987654321@example.org </svc:DataProviderReference> <svc:ServiceEnvironment>Residence</svc:ServiceEnvironment> <svc:ServiceType>VOIP</svc:ServiceType> <svc:ServiceMobility>Unknown</svc:ServiceMobility> </svc:EmergencyCallData.ServiceInfo> --boundary1-- Content-Type: application/EmergencyCallData.ProviderInfo+xml Content-ID: <aaabbb@atlanta.example.com> Content-Disposition: by-reference;handling=optional <?xml version="1.0" encoding="UTF-8"?> <pi:EmergencyCallData.ProviderInfo xmlns:pi="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <pi:DataProviderReference>string0987654321@example.org </pi:DataProviderReference> <pi:DataProviderString>Example VoIP Provider </pi:DataProviderString> <pi:ProviderID>urn:nena:companyid:ID123</pi:ProviderID> <pi:ProviderIDSeries>NENA</pi:ProviderIDSeries> <pi:TypeOfProvider>Service Provider</pi:TypeOfProvider> <pi:ContactURI>sip:voip-provider@example.com</pi:ContactURI> <pi:Language>EN</pi:Language> <xc:DataProviderContact xmlns:xc="urn:ietf:params:xml:ns:vcard-4.0"> <vcards> <vcard> <fn><text>John Doe</text></fn> <n> <surname>John</surname> <given>Doe</given> <additional/> <prefix/> <suffix/> </n> <bday><date>--0203</date></bday> <anniversary> <date-time>20090808T1430-0500</date-time> </anniversary> <gender><sex>M</sex></gender> <lang> <parameters><pref><integer>1</integer></pref> </parameters> <language-tag>en</language-tag> </lang> <org> <parameters><type><text>work</text></type> </parameters> <text>Example VoIP Provider</text> </org> <adr> <parameters> <type><text>work</text></type> <label><text>John Doe Downing Street 10 London, UK</text></label> </parameters> <pobox/> <ext/> <street>Downing Street 10</street> <locality>London</locality> <region/> <code>SW1A 2AA</code> <country>UK</country> </adr> <tel> <parameters> <type> <text>work</text> <text>voice</text> </type> </parameters> <uri>sips:john.doe@example.com</uri> </tel> <email> <parameters><type><text>work</text></type> </parameters> <text>john.doe@example.com</text> </email> <geo> <parameters><type><text>work</text></type> </parameters> <uri>geo:51.503396, 0.127640</uri> </geo> <tz><text>Europe/London</text></tz> <url> <parameters><type><text>home</text></type> </parameters> <uri>http://www.example.com/john.doe</uri> </url> </vcard> </vcards> </xc:DataProviderContact> </pi:EmergencyCallData.ProviderInfo>
Figure 13: VoIP Provider sending SIP INVITE with Additional Data.
Finally, the PSAP requests location information from the access network provider. The response is shown in Figure 14. Along with the location information, additional data is provided in the <provided-by> element of the PIDF-LO. This request and response is step #4.
<?xml version="1.0" encoding="UTF-8"?> <presence xmlns="urn:ietf:params:xml:ns:pidf" xmlns:gp="urn:ietf:params:xml:ns:pidf:geopriv10" xmlns:gbp="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" entity="pres:alice@atlanta.example.com"> <dm:device id="target123-1"> <gp:geopriv> <gp:location-info> <civicAddress xmlns="urn:ietf:params:xml:ns:pidf:geopriv10:civicAddr"> <country>AU</country> <A1>NSW</A1> <A3>Wollongong</A3> <A4>North Wollongong</A4> <RD>Flinders</RD> <STS>Street</STS> <RDBR>Campbell Street</RDBR> <LMK>Gilligan's Island</LMK> <LOC>Corner</LOC> <NAM>Video Rental Store</NAM> <PC>2500</PC> <ROOM>Westerns and Classics</ROOM> <PLC>store</PLC> <POBOX>Private Box 15</POBOX> </civicAddress> </gp:location-info> <gp:usage-rules> <gbp:retransmission-allowed>true </gbp:retransmission-allowed> <gbp:retention-expiry>2013-12-10T20:00:00Z </gbp:retention-expiry> </gp:usage-rules> <gp:method>802.11</gp:method> <gp:provided-by xmlns="urn:ietf:params:xml:ns:EmergencyCallData"> <EmergencyCallDataReference purpose="EmergencyCallData.ServiceInfo" ref="https://example.com/ref2"/> <EmergencyCallDataValue> <EmergencyCallData.ProviderInfo xmlns= "urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo"> <DataProviderReference>88QV4FpfZ976T@example.com </DataProviderReference> <DataProviderString>University of Example </DataProviderString> <ProviderID>urn:nena:companyid:uoi</ProviderID> <ProviderIDSeries>NENA</ProviderIDSeries> <TypeOfProvider>Other</TypeOfProvider> <ContactURI>tel:+1-555-824-5222</ContactURI> <Language>EN</Language> </EmergencyCallData.ProviderInfo> <EmergencyCallData.Comment xmlns="urn:ietf:params:xml:ns:EmergencyCallData:Comment"> <DataProviderReference>88QV4FpfZ976T@example.com </DataProviderReference> <Comment xml:lang="en">This is an example text.</Comment> </EmergencyCallData.Comment> </EmergencyCallDataValue> </gp:provided-by> </gp:geopriv> <dm:deviceID>mac:00-0d-4b-30-72-df</dm:deviceID> <dm:timestamp>2013-07-09T20:57:29Z</dm:timestamp> </dm:device> </presence>
Figure 14: Access Network Provider returning PIDF-LO with Additional Data.
This section defines the XML schemas of the five data blocks. Additionally, the provided-by schema is specified.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pi="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xc="urn:ietf:params:xml:ns:vcard-4.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:import namespace="urn:ietf:params:xml:ns:vcard-4.0"> <xs:simpleType name="iso3166a2"> <xs:restriction base="xs:token"> <xs:pattern value="[A-Z]{2}"/> </xs:restriction> </xs:simpleType> <xs:element name="EmergencyCallData.ProviderInfo" type="pi:ProviderInfoType"/> <xs:simpleType name="SubcontractorPriorityType"> <xs:restriction base="xs:string"> <xs:enumeration value="sub"/> <xs:enumeration value="main"/> </xs:restriction> </xs:simpleType> <xs:complexType name="ProviderInfoType"> <xs:sequence> <xs:element name="DataProviderReference" type="xs:token" minOccurs="1" maxOccurs="1"/> <xs:element name="DataProviderString" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="ProviderID" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="ProviderIDSeries" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="TypeOfProvider" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="ContactURI" type="xs:anyURI" minOccurs="1" maxOccurs="1"/> <xs:element name="Language" type="pi:iso3166a2" minOccurs="1" maxOccurs="unbounded" /> <xs:element name="DataProviderContact" type="xc:vcardType" minOccurs="0" maxOccurs="1"/> <xs:element name="SubcontratorPrincipal" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="SubcontractorPriority" type="pi:SubcontractorPriorityType" minOccurs="0" maxOccurs="1"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema>
Figure 15: EmergencyCallData.ProviderInfo XML Schema.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:svc="urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo" xmlns:xml="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:element name="EmergencyCallData.ServiceInfo" type="svc:ServiceInfoType"/> <xs:complexType name="ServiceInfoType"> <xs:sequence> <xs:element name="DataProviderReference" type="xs:token" minOccurs="1" maxOccurs="1"/> <xs:element name="ServiceEnvironment" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:element name="ServiceType" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="ServiceMobility" type="xs:string" minOccurs="1" maxOccurs="1"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema>
Figure 16: EmergencyCallData.ServiceInfo XML Schema.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dev="urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:xml="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:element name="EmergencyCallData.DeviceInfo" type="dev:DeviceInfoType"/> <xs:complexType name="DeviceInfoType"> <xs:sequence> <xs:element name="DataProviderReference" type="xs:token" minOccurs="1" maxOccurs="1"/> <xs:element name="DeviceClassification" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="DeviceMfgr" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="DeviceModelNr" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="UniqueDeviceID" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="TypeOfDeviceID" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="DeviceSpecificData" type="xs:anyURI" minOccurs="0" maxOccurs="1"/> <xs:element name="DeviceSpecificType" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema>
Figure 17: EmergencyCallData.DeviceInfo XML Schema.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData:SubscriberInfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sub= "urn:ietf:params:xml:ns:EmergencyCallData:SubscriberInfo" xmlns:xc="urn:ietf:params:xml:ns:vcard-4.0" xmlns:xml="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:import namespace="urn:ietf:params:xml:ns:vcard-4.0"/> <xs:element name="EmergencyCallData.SubscriberInfo" type="sub:SubscriberInfoType"/> <xs:complexType name="SubscriberInfoType"> <xs:complexContent> <xs:sequence> <xs:element name="DataProviderReference" type="xs:token" minOccurs="1" maxOccurs="1"/> <xs:element name="SubscriberData" type="xc:vcardType" minOccurs="0" maxOccurs="1" /> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="privacyRequested" type="xs:boolean" use="required"/> </xs:complexContent> </xs:complexType> </xs:schema>
Figure 18: EmergencyCallData.SubscriberInfo XML Schema.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData:Comment" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:com="urn:ietf:params:xml:ns:EmergencyCallData:Comment" xmlns:xml="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:element name="EmergencyCallData.Comment" type="com:CommentType"/> <xs:complexType name="CommentType"> <xs:sequence> <xs:element name="DataProviderReference" type="xs:token" minOccurs="1" maxOccurs="1"/> <xs:element name="Comment" type="com:CommentSubType" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="CommentSubType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute ref="xml:lang"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:schema>
Figure 19: EmergencyCallData.Comment XML Schema.
<?xml version="1.0"?> <xs:schema targetNamespace= "urn:ietf:params:xml:ns:EmergencyCallData" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ad="urn:ietf:params:xml:ns:EmergencyCallData" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:pi="urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo" xmlns:svc="urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo" xmlns:dev="urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo" xmlns:sub= "urn:ietf:params:xml:ns:EmergencyCallData:SubscriberInfo" xmlns:com="urn:ietf:params:xml:ns:EmergencyCallData:Comment" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace= "urn:ietf:params:xml:ns:EmergencyCallData:ProviderInfo"/> <xs:import namespace= "urn:ietf:params:xml:ns:EmergencyCallData:ServiceInfo"/> <xs:import namespace= "urn:ietf:params:xml:ns:EmergencyCallData:DeviceInfo"/> <xs:import namespace= "urn:ietf:params:xml:ns:EmergencyCallData:SubscriberInfo"/> <xs:import namespace= "urn:ietf:params:xml:ns:EmergencyCallData:Comment"/> <xs:element name="provided-by" type="ad:provided-by-Type"/> <xs:complexType name="provided-by-Type"> <xs:sequence> <xs:element name="EmergencyCallDataReference" type="ad:ByRefType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="EmergencyCallDataValue" type="ad:EmergencyCallDataValueType" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <!-- Additional Data By Reference --> <xs:complexType name="ByRefType"> <xs:complexContent> <xs:restriction base="xs:anyType"> <xs:sequence> <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/> </xs:sequence> <xs:attribute name="purpose" type="xs:token" use="required"/> <xs:attribute name="ref" type="xs:anyURI" use="required"/> </xs:restriction> </xs:complexContent> </xs:complexType> <!-- Additional Data By Value --> <xs:complexType name="EmergencyCallDataValueType"> <xs:sequence> <xs:element name="EmergencyCallData.ProviderInfo" type="pi:ProviderInfoType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="EmergencyCallData.ServiceInfo" type="svc:ServiceInfoType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="EmergencyCallData.DeviceInfo" type="dev:DeviceInfoType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="EmergencyCallData.SubscriberInfo" type="sub:SubscriberInfoType" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="EmergencyCallData.Comment" type="com:CommentType" minOccurs="0" maxOccurs="unbounded"/> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema>
Figure 20: provided-by XML Schema.
This section defines the provided-by schema.
The data structures described in this document contain information usually considered private. When information is provided by value, entities that are a party to the SIP signaling (such as proxy servers and back-to-back user agents) will have access to it and need to protect it against inappropriate disclosure. An entity that is able to eavesdrop on the SIP signaling will also have access. Some media (such as in the clear Wi-Fi) is more vulnerable than others (such as 3G or 4G cellular data traffic) to eavesdropping. Mechanisms that protect against eavesdropping (such as Transport Layer Security (TLS)) SHOULD be preferentially used whenever feasible. When information is provided by reference, HTTPS is specified for dereferencing, and the provider of the information is REQUIRED to validate the credentials of the requester. While the creation of a public key infrastructure (PKI) that has global scope may be difficult, the alternatives to creating devices and services that can provide critical information securely are more daunting. The provider of the information MAY enforce any policy it wishes to use, but PSAPs and responder agencies SHOULD deploy a PKI so that providers of additional data can check the certificate of the client and decide the appropriate policy to enforce based on that certificate.
Ideally, the PSAP and emergency responders will be given credentials signed by an authority trusted by the data provider. In most circumstances, nationally recognized credentials would be sufficient, and if the emergency services arranges a PKI, data providers could be provisioned with the root CA public key for a given nation. Some nations are developing a PKI for this, and related, purposes. Since calls could be made from devices where the device and/or the service provider(s) are not local to the emergency services authorities, globally recognized credentials are useful. This might be accomplished by extending the notion of the "forest guide" described in [RFC5582] to allow the forest guide to provide the credential of the PKI root for areas for which it has coverage information, but standards for such a mechanism are not yet available. In its absence, the data provider will need to obtain by out of band means the root CA credentials for any areas to which it is willing to provide additional data. With the credential of the root CA for a national emergency services PKI, the data provider server can validate the credentials of an entity requesting additional data by reference.
The data provider also needs a credential that can be verified by the emergency services to know that it is receiving data from an authorized server. The emergency services authorities could provide credentials, distinguishable from credentials provided to emergency responders and PSAPs, which could be used to validate data providers. Such credentials would have to be acceptable to any PSAP or responder that could receive a call with additional data supplied by that provider. This would be extensible to global credential validation using the forest guide as mentioned above. In the absence of such credentials, the emergency services authorities could maintain a list of local data providers' credentials as provided to them out of band. At a minimum, the emergency services authorities could obtain a credential from the DNS entry of the domain in the Additional Data URI to at least validate that the server is known to the domain providing the URI.
Data provided by devices by reference have similar credential validation issues as for service providers, and the solutions are the same.
Much of the information supplied by service providers and devices is private and confidential; service providers and devices generally go to lengths to protect this information; disclosing it in the context of an emergency call is a trade-off to protect the greater interest of the customer in an emergency.
Neither service providers nor devices will supply private information unless the call is recognized as an emergency call. In cellular telephony systems (such as those using 3GPP IMS), there are different procedures for an originating device to place an emergency versus a normal call. If a call that is really an emergency call is initiated as a normal call and the cellular service provider recognizes this, 3GPP IMS permits the service provider to either accept the call anyway or reject it with a specific code that instructs the device to retry the call as an emergency call. Service providers SHOULD choose the latter, because otherwise the device will not have included the information specified in this document (since the device didn't recognize the call as being an emergency call).
This document enables functionality for conveying additional information about the caller and the caller's device and service to the callee. Some of this information is personal data and therefore privacy concerns arise. An explicit privacy indicator for information directly relating to the caller's identity is defined and use is mandatory. However, observance of this request for privacy and what information it relates to is determined by the destination jurisdiction.
There are a number of privacy concerns with non-emergency real-time communication services that are also applicable to emergency calling. Data protection regulation world-wide has, however, decided to create exceptions for emergency services since the drawbacks of disclosing personal data are outweighed by the benefit for the emergency caller. Hence, the data protection rights of individuals are commonly waived for emergency situations. There are, however, still various countries that offer some degree of anonymity for the caller towards PSAP call takers.
The functionality defined in this document, however, far exceeds the amount of information sharing found in the legacy POTS system. For this reason there are additional privacy threats to consider, which are described in more detail in [RFC6973].
To mitigate these privacy risks the following countermeasures can be taken:
In regions where callers can elect to suppress certain personally identifying information, network or PSAP functionality can inspect privacy flags within the SIP headers to determine what information may be passed, stored, or displayed to comply with local policy or law. RFC 3325 [RFC3325] defines the "id" priv-value token. The presence of this privacy type in a Privacy header field indicates that the user would like the network asserted identity to be kept private with respect to SIP entities outside the trust domain with which the user authenticated, including the PSAP.
This document defines various data structures that contain privacy-sensitive data. For example, identifiers for the device (e.g., serial number, MAC address) or account/SIM (e.g., IMSI), contact information for the user, location of the caller. Local regulations may govern what data must be provided in emergency calls, but in general, the emergency call system is aided by the information described in this document. There is a tradeoff between the privacy considerations and the utility of the data. For protection, this specification requires all retrieval of data passed by reference to be protected against eavesdropping and alteration via communication security techniques (namely TLS). Furthermore, security safeguards are required to prevent unauthorized access to stored data. Various security incidents over at least the past few decades have shown that data breaches are not uncommon and are often caused by lack of proper access control frameworks, software bugs (such as buffer overflows), or missing input parsing (such as SQL injection attacks). The risks of data breaches is increased with the obligation for emergency services to retain emergency call related data for extended periods (e.g., several years are the norm).
Finally, it is also worth highlighting the nature of the SIP communication architecture, which introduces additional complications for privacy. Some forms of data can be sent by value in the SIP signaling or by reference (a URL in the SIP signaling). When data is sent by value, all intermediaries have access to the data. As such, these intermediaries may also introduce additional privacy risk. Therefore, in situations where the conveyed information is privacy-sensitive and intermediaries are involved, transmitting by reference might be appropriate, assuming the source of the data can operate a sufficient dereferencing infrastructure and that proper access control policies are available for distinguishing the different entities dereferencing the reference. Without access control policies any party in possession of the reference is able to resolve the reference and to obtain the data, including intermediaries.
This document creates a new registry called 'Emergency Call Additional Data'. The following sub-registries are created for this registry.
This document creates a new sub-registry called 'Additional Call Data Provider ID Series'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should determine that the entity requesting a new value is a legitimate issuer of service provider IDs suitable for use in Additional Call Data.
Private entities issuing and using internally-generated IDs are encouraged to register and use a unique identifier. This guarantees that IDs issued and used by the entity are globally unique and distinguishable.
The content of this registry includes:
The initial set of values is listed in Figure 21.
+-----------+--------------------------+----------------------+ | Name | Source | URL | +-----------+--------------------------+----------------------+ | NENA | National Emergency | http://www.nena.org | | | Number Association | | | EENA | European Emergency | http://www.eena.org | | | Number Association | | | domain | (The ID is a fully- | (not applicable) | | | qualified domain name) | | +-----------+--------------------------+----------------------+
Figure 21: Provider ID Series Registry.
This document creates a new sub-registry called 'Additional Call Service Environment'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should determine that the entity requesting a new value is relevant for this service element, and that the new value is distinct from existing values, and its use is unambiguous.
The content of this registry includes:
The initial set of values is listed in Figure 22.
+-----------+--------------------------+ | Token | Description | +-----------+--------------------------+ | Business | Business service | | Residence | Residential service | | unknown | Type of service unknown | | | (e.g., anonymous pre- | | | paid service) | +-----------+--------------------------+
Figure 22: Service Environment Registry.
This document creates a new sub-registry called 'Additional Call Service Type'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should determine that the entity requesting a new value is relevant for this service element and that the requested value is clearly distinct from other values so that there is no ambiguity as to when the value is to be used or which value is to be used.
The content of this registry includes:
The initial set of values is listed in Figure 3.
This document creates a new sub-registry called 'Additional Call Service Mobility'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should determine that the entity requesting a new value is relevant for this service element and that the requested value is clearly distinct from other values so that there is no ambiguity as to when the value is to be used or which value is to be used.
The content of this registry includes:
The initial set of values is listed in Figure 23.
+-----------+----------------------------+ | Token | Description | +-----------+----------------------------+ | Mobile | The device is able to | | | move at any time | | Fixed | The device is not expected | | | to move unless the service | | | is relocated | | Nomadic | The device is not expected | | | to change its point of | | | attachment while on a call | | Unknown | No information is known | | | about the service mobility | | | environment for the device | +-----------+----------------------------+
Figure 23: Service Environment Registry.
This document creates a new sub-registry called 'Service Provider Type'. As defined in [RFC5226], this registry operates under "Expert Review". The expert should determine that the proposed new value is distinct from existing values and appropriate for use in the TypeOfServicerProvider element
The content of this registry includes:
The initial set of values is defined in Figure 1.
This document creates a new sub-registry called 'Service Delivered'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should consider whether the proposed service is unique from existing services and the definition of the service will be clear to implementors and PSAPs/responders.
The content of this registry includes:
The initial set of values are defined in Figure 3.
This document creates a new sub-registry called 'Device Classification'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should consider whether the proposed class is unique from existing classes and the definition of the class will be clear to implementors and PSAPs/responders.
The content of this registry includes:
The initial set of values are defined in Figure 5.
This document creates a new sub-registry called 'Additional Call Data Device ID Type'. As defined in [RFC5226], this registry operates under "Expert Review" rules. The expert should ascertain that the proposed type is well understood, and provides the information useful to PSAPs and responders to uniquely identify a device.
The content of this registry includes:
The initial set of values are defined in Figure 6.
This document creates a new sub-registry called 'Device/Service Data Type Registry'. As defined in [RFC5226], this registry operates under "Expert Review" and "Specification Required" rules. The expert should ascertain that the proposed type is well understood, and provides information useful to PSAPs and responders. The specification must contain a complete description of the data, and a precise format specification suitable to allow interoperable implementations.
The content of this registry includes:
The initial set of values are listed in Figure 24.
+----------+----------------------------------------+---------------+ | Token | Description | Specification | +----------+----------------------------------------+---------------+ | IEEE1512 | Common Incident Management Message Set | IEEE 1512-2006| +----------+----------------------------------------+---------------+
Figure 24: Device/Service Data Type Registry.
This document creates a new sub-registry called 'Emergency Call Data Types' in the 'purpose' registry established by RFC 3261 [RFC3261]. As defined in [RFC5226], this registry operates under "Expert Review" and "Specification Required" rules. The expert is responsible for verifying that the document contains a complete and clear specification and the proposed functionality does not obviously duplicate existing functionality.
The content of this registry includes:
Note that the values from this registry are part of the 'EmergencyCallData' compound value; when used as a value of the 'purpose' parameter of the Call-Info header, the values listed in this registry are prefixed by 'EmergencyCallData.' per the the 'EmergencyCallData' registation Section 10.2.
The initial set of values are listed in Figure 25.
+----------------+------------+ | Token | Reference | +----------------+------------+ | ProviderInfo | [This RFC] | | ServiceInfo | [This RFC] | | DeviceInfo | [This RFC] | | SubscriberInfo | [This RFC] | | Comment | [This RFC] | +----------------+------------+
Figure 25: Additional Data Blocks Registry.
This document defines the 'EmergencyCallData' value for the "purpose" parameter of the Call-Info header field. The Call-Info header and the corresponding registry for the 'purpose' parameter was established with RFC 3261 [RFC3261]. Note that 'EmergencyCallData' is a compound value; when used as a value of the 'purpose' parameter of the Call-Info header, 'EmergencyCallData' is immediately followed by a dot ('.') and a value from the 'Emergency Call Data Types' registry Section 10.1.10.
Header Parameter New Field Name Value Reference ---------- --------- ----------------- --------- Call-Info purpose EmergencyCallData [This RFC]
This section registers the namespace specified in Section 10.5.1 in the provided-by registry established by RFC 4119, for usage within the <provided-by> element of a PIDF-LO.
The schema for the provided-by element used by this document is specified in Section 7.6.
This specification requests the registration of a new MIME type according to the procedures of RFC 6838 [RFC6838] and guidelines in RFC 7303 [RFC7303].
This specification requests the registration of a new MIME type according to the procedures of RFC 6838 [RFC6838] and guidelines in RFC 7303 [RFC7303].
This specification requests the registration of a new MIME type according to the procedures of RFC 6838 [RFC6838] and guidelines in RFC 7303 [RFC7303].
This specification requests the registration of a new MIME type according to the procedures of RFC 6838 [RFC6838] and guidelines in RFC 7303 [RFC7303].
This specification requests the registration of a new MIME type according to the procedures of RFC 6838 [RFC6838] and guidelines in RFC 7303 [RFC7303].
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data</title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <p>See [TBD: This document].</p> </body> </html> END
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data: Data Provider Information</title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <h2>Data Provider Information</h2> <p>See [TBD: This document].</p> </body> </html> END
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data: Service Information</title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <h2>Service Information</h2> <p>See [TBD: This document].</p> </body> </html> END
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data: Device Information</title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <h2>Device Information</h2> <p>See [TBD: This document].</p> </body> </html> END
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data: Owner/Subscriber Information</title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <h2> Owner/Subscriber Information</h2> <p>See [TBD: This document].</p> </body> </html> END
This section registers a new XML namespace, as per the guidelines in RFC 3688 [RFC3688].
BEGIN <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/> <title>Namespace for Additional Emergency Call Data:Comment </title> </head> <body> <h1>Namespace for Additional Data related to an Emergency Call </h1> <h2> Comment</h2> <p>See [TBD: This document].</p> </body> </html> END
This specification registers five schemas, as per the guidelines in RFC 3688 [RFC3688].
This document registers a new value in the vCARD Parameter Values registry as defined by [RFC6350] with the following template:
This work was originally started in NENA and has benefitted from a large number of participants in NENA standardization efforts, originally in the Long Term Definition Working Group, the Data Technical Committee and most recently the Additional Data working group. The authors are grateful for the initial work and extended comments provided by many NENA participants, including Delaine Arnold, Marc Berryman, Guy Caron, Mark Fletcher, Brian Dupras, James Leyerle, Kathy McMahon, Christian, Militeau, Ira Pyles, Matt Serra, and Robert (Bob) Sherry.
We would also like to thank Paul Kyzivat, Gunnar Hellstrom, Martin Thomson, Keith Drage, Laura Liess, Chris Santer, Barbara Stark, Chris Santer, and Archie Cobbs for their review comments. Guy Caron deserves special mention for his detailed and extensive review comments.
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:vcard-4.0" xmlns:ns1="urn:ietf:params:xml:ns:vcard-4.0"> <!-- 3.3 iana-token = xsd:string { pattern = "[a-zA-Z0-9-]+" } x-name = xsd:string { pattern = "x-[a-zA-Z0-9-]+" } --> <xs:simpleType name="iana-token"> <xs:annotation> <xs:documentation>vCard Format Specification </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="x-name"> <xs:restriction base="xs:string"/> </xs:simpleType> <!-- 4.1 --> <xs:element name="text" type="xs:string"/> <xs:group name="value-text-list"> <xs:sequence> <xs:element maxOccurs="unbounded" ref="ns1:text"/> </xs:sequence> </xs:group> <!-- 4.2 --> <xs:element name="uri" type="xs:anyURI"/> <!-- 4.3.1 --> <xs:element name="date" substitutionGroup="ns1:value-date-and-or-time"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{8}|\d{4}-\d\d| --\d\d(\d\d)?|---\d\d"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 4.3.2 --> <xs:element name="time" substitutionGroup="ns1:value-date-and-or-time"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d) (Z|[+\-]\d\d(\d\d)?)?"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 4.3.3 --> <xs:element name="date-time" substitutionGroup="ns1:value-date-and-or-time"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value= "(\d{8}|--\d{4}|---\d\d)T \d\d(\d\d(\d\d)?)?(Z|[+\-]\d\d(\d\d)?)?"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 4.3.4 --> <xs:element name="value-date-and-or-time" abstract="true"/> <!-- 4.3.5 --> <xs:complexType name="value-timestamp"> <xs:sequence> <xs:element ref="ns1:timestamp"/> </xs:sequence> </xs:complexType> <xs:element name="timestamp"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 4.4 --> <xs:element name="boolean" type="xs:boolean"/> <!-- 4.5 --> <xs:element name="integer" type="xs:integer"/> <!-- 4.6 --> <xs:element name="float" type="xs:float"/> <!-- 4.7 --> <xs:element name="utc-offset"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[+\-]\d\d(\d\d)?"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 4.8 --> <xs:element name="language-tag"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8}) (-[a-z]{4})?(-([a-z]{2}|\d{3}))?(-([0-9a-z]{5,8}| \d[0-9a-z]{3}))*(-[0-9a-wyz](-[0-9a-z]{2,8})+)* (-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|[a-z]{1,3} (-[0-9a-z]{2,8}){1,2}"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 5.1 --> <xs:group name="param-language"> <xs:annotation> <xs:documentation>Section 5: Parameters</xs:documentation> </xs:annotation> <xs:sequence> <xs:element minOccurs="0" ref="ns1:language"/> </xs:sequence> </xs:group> <xs:element name="language"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:language-tag"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.2 --> <xs:group name="param-pref"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:pref"/> </xs:sequence> </xs:group> <xs:element name="pref"> <xs:complexType> <xs:sequence> <xs:element name="integer"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="100"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.4 --> <xs:group name="param-altid"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:altid"/> </xs:sequence> </xs:group> <xs:element name="altid"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.5 --> <xs:group name="param-pid"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:pid"/> </xs:sequence> </xs:group> <xs:element name="pid"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="text"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d+(\.\d+)?"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.6 --> <xs:group name="param-type"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:type"/> </xs:sequence> </xs:group> <xs:element name="type"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="text"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="work"/> <xs:enumeration value="home"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.7 --> <xs:group name="param-mediatype"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:mediatype"/> </xs:sequence> </xs:group> <xs:element name="mediatype"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.8 --> <xs:group name="param-calscale"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:calscale"/> </xs:sequence> </xs:group> <xs:element name="calscale"> <xs:complexType> <xs:sequence> <xs:element name="text"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="gregorian"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.9 --> <xs:group name="param-sort-as"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:sort-as"/> </xs:sequence> </xs:group> <xs:element name="sort-as"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 5.10 --> <xs:group name="param-geo"> <xs:sequence> <xs:element minOccurs="0" name="geo"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:group> <!-- 5.11 --> <xs:group name="param-tz"> <xs:sequence> <xs:element minOccurs="0" name="tz"> <xs:complexType> <xs:choice> <xs:element ref="ns1:text"/> <xs:element ref="ns1:uri"/> </xs:choice> </xs:complexType> </xs:element> </xs:sequence> </xs:group> <!-- 6.1.3 --> <xs:element name="source"> <xs:complexType> <xs:sequence> <xs:element name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.1.4 --> <xs:element name="kind"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="text"> <xs:simpleType> <xs:union memberTypes="ns1:x-name ns1:iana-token"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="individual"/> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="group"/> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="org"/> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="location"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.1 --> <xs:element name="fn"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.2 --> <xs:element name="n"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-sort-as"/> <xs:group ref="ns1:param-altid"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element maxOccurs="unbounded" ref="ns1:surname"/> <xs:element maxOccurs="unbounded" ref="ns1:given"/> <xs:element maxOccurs="unbounded" ref="ns1:additional"/> <xs:element maxOccurs="unbounded" ref="ns1:prefix"/> <xs:element maxOccurs="unbounded" ref="ns1:suffix"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="surname" type="xs:string"/> <xs:element name="given" type="xs:string"/> <xs:element name="additional" type="xs:string"/> <xs:element name="prefix" type="xs:string"/> <xs:element name="suffix" type="xs:string"/> <!-- 6.2.3 --> <xs:element name="nickname"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:group ref="ns1:value-text-list"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.4 --> <xs:element name="photo"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.5 --> <xs:element name="bday"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-calscale"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:value-date-and-or-time"/> <xs:element ref="ns1:text"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.6 --> <xs:element name="anniversary"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-calscale"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:value-date-and-or-time"/> <xs:element ref="ns1:text"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.2.7 --> <xs:element name="gender"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:sex"/> <xs:element minOccurs="0" ref="ns1:identity"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="sex"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value=""/> <xs:enumeration value="M"/> <xs:enumeration value="F"/> <xs:enumeration value="O"/> <xs:enumeration value="N"/> <xs:enumeration value="U"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="identity" type="xs:string"/> <!-- 6.3.1 --> <xs:group name="param-label"> <xs:sequence> <xs:element minOccurs="0" ref="ns1:label"/> </xs:sequence> </xs:group> <xs:element name="label"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="adr"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-geo"/> <xs:group ref="ns1:param-tz"/> <xs:group ref="ns1:param-label"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element maxOccurs="unbounded" ref="ns1:pobox"/> <xs:element maxOccurs="unbounded" ref="ns1:ext"/> <xs:element maxOccurs="unbounded" ref="ns1:street"/> <xs:element maxOccurs="unbounded" ref="ns1:locality"/> <xs:element maxOccurs="unbounded" ref="ns1:region"/> <xs:element maxOccurs="unbounded" ref="ns1:code"/> <xs:element maxOccurs="unbounded" ref="ns1:country"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="pobox" type="xs:string"/> <xs:element name="ext" type="xs:string"/> <xs:element name="street" type="xs:string"/> <xs:element name="locality" type="xs:string"/> <xs:element name="region" type="xs:string"/> <xs:element name="code" type="xs:string"/> <xs:element name="country" type="xs:string"/> <!-- 6.4.1 --> <xs:element name="tel"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:element minOccurs="0" name="type"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="text"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="work"/> <xs:enumeration value="home"/> <xs:enumeration value="text"/> <xs:enumeration value="voice"/> <xs:enumeration value="fax"/> <xs:enumeration value="cell"/> <xs:enumeration value="video"/> <xs:enumeration value="pager"/> <xs:enumeration value="textphone"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:text"/> <xs:element ref="ns1:uri"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.4.2 --> <xs:element name="email"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.4.3 --> <xs:element name="impp"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.4.4 --> <xs:element name="lang"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:language-tag"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.5.1 --> <xs:group name="property-tz"> <xs:sequence> <xs:element name="tz"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:text"/> <xs:element ref="ns1:uri"/> <xs:element ref="ns1:utc-offset"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:group> <!-- 6.5.2 --> <xs:group name="property-geo"> <xs:sequence> <xs:element name="geo"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:group> <!-- 6.6.1 --> <xs:element name="title"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.6.2 --> <xs:element name="role"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.6.3 --> <xs:element name="logo"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.6.4 --> <xs:element name="org"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-sort-as"/> </xs:sequence> </xs:complexType> </xs:element> <xs:group ref="ns1:value-text-list"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.6.5 --> <xs:element name="member"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.6.6 --> <xs:element name="related"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:element minOccurs="0" name="type"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="text"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="work"/> <xs:enumeration value="home"/> <xs:enumeration value="contact"/> <xs:enumeration value="acquaintance"/> <xs:enumeration value="friend"/> <xs:enumeration value="met"/> <xs:enumeration value="co-worker"/> <xs:enumeration value="colleague"/> <xs:enumeration value="co-resident"/> <xs:enumeration value="neighbor"/> <xs:enumeration value="child"/> <xs:enumeration value="parent"/> <xs:enumeration value="sibling"/> <xs:enumeration value="spouse"/> <xs:enumeration value="kin"/> <xs:enumeration value="muse"/> <xs:enumeration value="crush"/> <xs:enumeration value="date"/> <xs:enumeration value="sweetheart"/> <xs:enumeration value="me"/> <xs:enumeration value="agent"/> <xs:enumeration value="emergency"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:uri"/> <xs:element ref="ns1:text"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.1 --> <xs:element name="categories"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:group ref="ns1:value-text-list"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.2 --> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.3 --> <xs:element name="prodid"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:text"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.4 --> <xs:element name="rev" type="ns1:value-timestamp"/> <!-- 6.7.5 --> <xs:element name="sound"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-language"/> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.6 --> <xs:element name="uid"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.7.7 --> <xs:element name="clientpidmap"> <xs:complexType> <xs:sequence> <xs:element ref="ns1:sourceid"/> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="sourceid" type="xs:positiveInteger"/> <!-- 6.7.8 --> <xs:element name="url"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.8.1 --> <xs:element name="key"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:choice> <xs:element ref="ns1:uri"/> <xs:element ref="ns1:text"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.9.1 --> <xs:element name="fburl"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.9.2 --> <xs:element name="caladruri"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- 6.9.3 --> <xs:element name="caluri"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="parameters"> <xs:complexType> <xs:sequence> <xs:group ref="ns1:param-altid"/> <xs:group ref="ns1:param-pid"/> <xs:group ref="ns1:param-pref"/> <xs:group ref="ns1:param-type"/> <xs:group ref="ns1:param-mediatype"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref="ns1:uri"/> </xs:sequence> </xs:complexType> </xs:element> <!-- Top-level grammar --> <xs:group name="property"> <xs:choice> <xs:element ref="ns1:adr"/> <xs:element ref="ns1:anniversary"/> <xs:element ref="ns1:bday"/> <xs:element ref="ns1:caladruri"/> <xs:element ref="ns1:caluri"/> <xs:element ref="ns1:categories"/> <xs:element ref="ns1:clientpidmap"/> <xs:element ref="ns1:email"/> <xs:element ref="ns1:fburl"/> <xs:element ref="ns1:fn"/> <xs:group ref="ns1:property-geo"/> <xs:element ref="ns1:impp"/> <xs:element ref="ns1:key"/> <xs:element ref="ns1:kind"/> <xs:element ref="ns1:lang"/> <xs:element ref="ns1:logo"/> <xs:element ref="ns1:member"/> <xs:element ref="ns1:n"/> <xs:element ref="ns1:nickname"/> <xs:element ref="ns1:note"/> <xs:element ref="ns1:org"/> <xs:element ref="ns1:photo"/> <xs:element ref="ns1:prodid"/> <xs:element ref="ns1:related"/> <xs:element ref="ns1:rev"/> <xs:element ref="ns1:role"/> <xs:element ref="ns1:gender"/> <xs:element ref="ns1:sound"/> <xs:element ref="ns1:source"/> <xs:element ref="ns1:tel"/> <xs:element ref="ns1:title"/> <xs:group ref="ns1:property-tz"/> <xs:element ref="ns1:uid"/> <xs:element ref="ns1:url"/> </xs:choice> </xs:group> <xs:element name="vcards"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="ns1:vcard"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="vcardType"> <xs:complexContent> <xs:restriction base="xs:anyType"> <xs:choice maxOccurs="unbounded"> <xs:group ref="ns1:property"/> <xs:element ref="ns1:group"/> </xs:choice> </xs:restriction> </xs:complexContent> </xs:complexType> <xs:element name="vcard" type="ns1:vcardType"/> <xs:element name="group"> <xs:complexType> <xs:group minOccurs="0" maxOccurs="unbounded" ref="ns1:property"/> <xs:attribute name="name" use="required"/> </xs:complexType> </xs:element> </xs:schema>
This section contains the vCard/xCard XML schema version of the Relax NG schema defined in RFC 6351 [RFC6351] for simplified use with the XML schemas defined in this document. The schema in RFC 6351 [RFC6351] is the normative source and this section is informative only.