Internet DRAFT - draft-culpepper-sip-key-events

draft-culpepper-sip-key-events





   Internet Draft                            Bert Culpepper 
   draft-culpepper-sip-key-events-01.txt     InterVoice-Brite, Inc. 
   March 1, 2002                              
   Expires: September, 2002                  Robert Fairlie-Cuninghame 
                                             Nuera Communications, Inc. 
                                              
                                             Jean-Francois Mule 
                                             CableLabs 
 
 
                        SIP Event Package for Keys 
 
 
Status of this Memo 
 
   This document is an Internet-Draft and is in full conformance with 
   all provisions of Section 10 of RFC2026 [1]. 
    
   Internet-Drafts are working documents of the Internet Engineering 
   Task Force (IETF), its areas, and its working groups.  Note that 
   other groups may also distribute working documents as Internet-
   Drafts. 
    
   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."  
    
   The list of current Internet-Drafts can be accessed at 
   http://www.ietf.org/ietf/1id-abstracts.txt  
    
   The list of Internet-Draft Shadow Directories can be accessed at 
   http://www.ietf.org/shadow.html. 
    
   This particular draft is intended to be discussed in the SIPPING 
   Working Group. Discussion of it therefore belongs on that list. The 
   charter for SIPPING working group may be found at 
   http://www.ietf.org/html.charters/sipping-charter.html 
    
Abstract 
 
   This document defines a protocol independent message format for 
   requesting and reporting state related to keys or buttons.  The 
   document also defines a SIP Event Package to make use of this 
   extensible framework through the SIP SUBSCRIBE & NOTIFY messages. 
   The draft currently defines key event sub-packages to represent the 
   state of telephone dial pads, feature buttons found on many 
   commercial telephones, standard keyboards as well as support for 
   user or device specific buttons (for instance, a "Double Latte" 
   button).  The event package and associated key packages can be used 
   to enable new SIP services where an application or SIP entity 
   requires notification of user interface activity either associated 
   with a particular SIP session or simply in relation to the device 
   itself. 

Culpepper/Cuninghame/Mule                                      [Page 1] 

Internet Draft           SIP Key Events Package           March 1, 2002 

                           Table of Contents 
    
0.    Changes since draft-culpepper-key-events-00....................3 
1.    Introduction...................................................4 
2.    Motivation/Use Cases...........................................4 
 2.1. Relation To Telephony Tones And Events.........................6 
 2.2. Example Usage Scenarios........................................6 
   2.2.1.  Example 1: Application Server acting as B2BUA/3pcc........6 
   2.2.2.  Example 2: Application Server Acting As A Proxy...........7 
 2.3. SIP Call-Control Interaction...................................8 
Part A -- Introducing a protocol independent Key-Event message format.8 
3.    Terminology....................................................8 
4.    Key-Event Messages.............................................9 
5.    Key Representations...........................................10 
6.    Key-Event Framework...........................................11 
7.    Key-Event Sub-Package Definitions.............................11 
 7.1. Shared Key-Event States and Properties........................12 
 7.2. Key Sub-package...............................................13 
 7.3. Keyboard Sub-Package..........................................14 
 7.4. Telephone Sub-Package.........................................15 
 7.5. User Package..................................................15 
8.    Key-Event Message Body Format.................................16 
 8.1. Time-Header Format............................................16 
 8.2. Instance-Header Format........................................17 
 8.3. Event-Header Format...........................................17 
 8.4. Properties-Header Format......................................18 
 8.5. State-Header Format...........................................20 
9.    Key-Event Message Generation..................................20 
 9.1. Generating a Session Request message..........................20 
 9.2. Generating a Session Response message.........................21 
   9.2.1.  Event Header Processing..................................21 
   9.2.2.  Properties Header Processing.............................22 
   9.2.3.  State Header Processing..................................22 
 9.3. Generating Key-Event Notification messages....................22 
10.   Minimal Implementation for Key-Event Notifiers................23 
11.   Guidelines to Future Sub-Package Authors......................23 
12.   MIME type information for the Key-Event Message Format........23 
Part B -- The use of SIP SUBSCRIBE & NOTIFY for Key-Event Transport..24 
13.   Subscription to Key Events....................................24 
 13.1.   Non-Dialog Specific Subscriptions..........................24 
 13.2.   Dialog Specific Subscriptions..............................25 
   13.2.1.   Dialog Attached Mode...................................25 
   13.2.2.   Conversation Space Attached Mode.......................25 
   13.2.3.   Multi-dialog Capable Endpoints.........................25 
   13.2.4.   "Early" Dialog Subscriptions...........................26 
   13.2.5.   Multiple Subscriptions.................................26 
14.   Instance-Header format for SIP Dialog Specific Subscriptions..27 
15.   SIP specific Key-Event error handling.........................27 
 15.1.   Handling of unacceptable instance-header values............27 
 15.2.   Handling of unknown key-event-set enumerations.............28 
16.   Event Package Definition......................................28 
 16.1.   Event Package Name.........................................28 
 16.2.   Event Package Parameters...................................28 
 
Culpepper/Cuninghame/Mule                                      [Page 2] 

Internet Draft           SIP Key Events Package           March 1, 2002 

 16.3.   SUBSCRIBE Bodies...........................................28 
 16.4.   Subscription Duration......................................29 
 16.5.   NOTIFY Bodies..............................................29 
 16.6.   Notifier Processing of SUBSCRIBE Requests..................29 
 16.7.   Notifier Generation of NOTIFY Requests.....................30 
   16.7.1.   Generating Initial NOTIFY Requests.....................30 
   16.7.2.   Generating Subsequent NOTIFY Requests..................30 
 16.8.   Subscriber Processing of NOTIFY Requests...................30 
 16.9.   Subscriber Generation of SUBSCRIBE Requests................31 
 16.10.  Pre-loaded Routes in SUBSCRIBE requests....................31 
 16.11.  Handling of Forked Subscriptions...........................32 
 16.12.  Rate of Notifications......................................32 
17.   Examples......................................................32 
18.   Security Considerations.......................................38 
19.   IANA Considerations...........................................38 
 19.1.   Key-Event Package Registration.............................38 
 19.2.   Key-Event Sub-Package Registration.........................39 
20.   Authors.......................................................39 
21.   References....................................................40 
    
    
0. Changes since draft-culpepper-key-events-00 
    
   - Substantial reorganization of draft. The draft is now split into 
     two parts: a protocol independent Key-Event Message Format section 
     and a SIP Events specific section. This allows other authors to 
     write transport profiles for other protocols. 
    
   - Removed Applies-To header and replaced it will a protocol 
     dependent hole in the application/key-event message body 
     (instance-header). 
 
   - Updated to reflect draft-ietf-sip-events-04 changes. 
    





















Culpepper/Cuninghame/Mule                                      [Page 3] 

Internet Draft           SIP Key Events Package           March 1, 2002 

1. Introduction 
    
   As stated in SIP-specific Event Notification [2], the SIP SUBSCRIBE 
   and NOTIFY methods provide a mechanism by which cooperating SIP [3] 
   endpoints can request and receive asynchronous notification of 
   changes in state related to network resources and calls.  This 
   mechanism, when combined with an event package for keys, can be used 
   for requesting and reporting the status of keys and keypads 
   associated with SIP user agents or indeed any SIP device. 
    
   Communication sessions many times are used as a means to access and 
   deliver services to users.  The operation and use of these services 
   almost always require some user interaction with the service.  One 
   of the primary means for user interactions with services when using 
   the legacy circuit-switched telecommunications network is via tones 
   generated as a result of a key press on the communications device.  
   While tones can be used in the same manner in IP networks, their 
   use, given the distributed nature of the network, is sub-optimal.  
   In addition, their use limits the user interface of many user 
   devices as well as the range of application services possible.  It 
   is for these reasons that a means to transport key presses is 
   needed. 
    
2. Motivation/Use Cases 
    
   The first and foremost motivation for this proposal is to extend the 
   possibility for user interaction beyond the antiquated telephone 
   dialpad model imposed by limiting interaction to DTMF tones.  The 
   proposal is designed to support full keyboards, multiple key 
   instances, user- or device-specific buttons (for instance, a "Double 
   Latte" button).  It also aims to provide an extensible framework to 
   allow volume controls, multi-position switches or any other user 
   interface widget to be defined in future Key Event Packages.  A 
   secondary goal of the proposal is that devices possessing a simple 
   user interface (such as telephone dialpad) need only implement a 
   smaller subset of the full proposal without losing any 
   interoperability with Application Servers (c.f., section 10). 
    
   DTMF has been used in telephony networks as a means for users of 
   network services to provide input and some control of those 
   services.  DTMF is also used to signal connection destinations in 
   these networks.  This dual role of DTMF does not present problems in 
   circuit-switched networks.  However, with telecommunications move to 
   packet networks, separation of these roles is needed.  Packet 
   networks enable communications and related services to be deployed 
   in a distributed architecture.  An alternative to DTMF for "user 
   input" is needed in order to better support the distributed 
   application architecture possible in IP networks. 
    
   Although a standard mechanism exists for the transport of DTMF tones 
   in IP networks, using it for user input and/or dynamic application 
   control as is done in the PSTN does not carry over into the IP 
   network very well.  Receiving tones via RTP is problematic for the 
 
Culpepper/Cuninghame/Mule                                      [Page 4] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   detector/generator devices in scenarios where multiple network 
   entities are interested in the events.  Replicating media to 
   multiple destinations is not a common feature of endpoints.  In 
   addition, the SDP session description to set up media replication is 
   more complicated than that required to set up typical multi-media 
   communications sessions. 
    
   The mechanism defined here can be used as an alternative to DTMF 
   detection when the detection of these tones is to gather input from 
   a user or provide some user application control independent of any 
   end-to-end media path.  The relationship of the mechanism described 
   in this specification to the transport of telephony tones via RTP 
   defined in RFC 2833 [4] is further described in Section 2.1. 
    
   It is intended that the event notification mechanism defined in this 
   document might be used in scenarios that have the following 
   attributes or requirements: 
    
   - The amount of data to be conveyed is very small compared to the 
     audio, video, text, etc. data in a session. 
   - Dynamic user control of applications is required. 
   - Collecting device input is needed when the device is not engaged 
     in a session. 
   - Security concerns exist due to multiplication attack possible with 
     DTMF forking. 
   - End-to-end security/privacy between caller and destination system 
     is required. 
   - Multiple Application Servers may be involved along the end-to-end 
     call signaling path. 
   - Authentication and/or Privacy of key sequences between an 
     Application Server and an endpoint is desired. 
   - Reliable delivery of key sequences is required even when short 
     periods of network connectivity problems occur. 
   - Support for a device with a user interface consisting of more than 
     a simple keypad is required. 
    
   A network entity subscribing to key events at another network entity 
   may be interested in the events as they relate to an established 
   communications session or as they relate to the device itself.  Many 
   network-based communications services require the user to identify 
   themselves (for instance, by the user providing a PIN).  Pre-paid 
   and post-paid calling card services are a good example where a call-
   associated event subscription is useful.  Key event subscriptions 
   can also be useful outside of communications sessions.  For example, 
   an endpoint (SIP phone) may have a dedicated key used to 
   asynchronously invoke some function on a remote network entity.  In 
   this case, the remote network entity subscribes to key events at the 
   SIP phone in a non-dialog specific manner.  When a key event of 
   interest occurs, the remote endpoint can act on the event.  RFC 2833 
   does not support notification of key events outside of the context 
   of an established session. 
    
 
Culpepper/Cuninghame/Mule                                      [Page 5] 

Internet Draft           SIP Key Events Package           March 1, 2002 

2.1. Relation To Telephony Tones And Events 
    
   RFC 2833 defines an RTP payload format for telephony tones and 
   signals (including DTMF digits).  It allows the transport of such 
   events in the context of an established media session (in SIP, a 
   session must be established with media description in order for 
   endpoints to exchange RFC 2833 events or tones).  This mechanism has 
   several advantages: it is independent from any signaling protocol 
   and can be used with SIP, MEGACO, MGCP and other protocols, it 
   eliminates tone distortion, and it provides a reliable means for 
   telephony endpoints to exchange telephony tones within RTP media 
   flows. 
    
   The purpose of the current document is to provide a general 
   mechanism for SIP entities to request and report the notifications 
   of key events (including keys in keypads or any kind of keyboards).  
   This mechanism is specific to the SIP protocol and is based on SIP 
   events (although the actual Key-Event Message Format is defined in a 
   protocol independent manner).  It offers several advantages: 
    
   - SIP application servers not involved in the media path can now 
     request and receive key state changes. 
   - SIP entities supporting SUBSCRIBE/NOTIFY now have a generic 
     mechanism to exchange key states. 
   - It allows multiple SIP application servers to receive independent 
     key event notification with each application server only receiving 
     notifications for the key-events that it is interested in. 
    
   In conclusion, this mechanism can be used in conjunction with RFC 
   2833 or it can also serve as an alternative to RFC 2833 in the cases 
   where: 
    
   - Key states beyond telephony tones and signals are desired. 
   - A means for simple SIP telephony applications such as software 
     phones or applications, not necessarily able to generate telephony 
     tones, is needed to interact with applications. 
   - IP telephony gateways wish to conserve DSP resources. 
   - Supporting RFC 2833 for the sole purpose of indicating key 
     presses, or supporting the duplication of RFC 2833 RTP payload 
     events to the signaling planes, is not desirable. 
    
2.2. Example Usage Scenarios 
    
   As discussed in the previous section, the scenarios described in 
   this section do not preclude the presence of tone data associated 
   with a telephone keypad.  Specifically, RFC 2833 may still be 
   employed as an end-to-end media-layer transport mechanism for DTMF 
   tones, that is, as an end-to-end transport mechanism between the 
   caller and destination User Agent. 
    
2.2.1. Example 1: Application Server acting as B2BUA/3pcc 
    
 
Culpepper/Cuninghame/Mule                                      [Page 6] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   In this example the Application Server (AS) will generate the INVITE 
   and BYE requests to perform call control.  Due to the nature of this 
   model, the AS can always inherently ensure that it remains on the 
   call signaling path for the duration of the session.  The general 
   B2BUA network model is shown in Figure 1. 
    
     Caller                   AS                    Callee 
   +--------+             +---------+             +--------+ 
   |  UAC   |<--- SIP --->| UAS/UAC |<--- SIP --->|  UAS   | 
   +--------+             +---------+             +--------+ 
        |                                              | 
        +-------------------- RTP ---------------------+ 
    
   Figure 1.  Application Server (B2BUA/3pcc) Model 
 
   The above figure depicts a caller establishing a session with the 
   AS, after which the AS establishes a session with the callee.  The 
   AS provides one endpointÆs session description to the other 
   endpoint.  This results in the media being exchanged between the two 
   endpoints and the SIP signaling occurring between the AS and each 
   endpoint. 
    
   In this scenario, it is desired for the caller and callee to be able 
   to invoke application services & features by pressing keys on the 
   terminal.  The action required by the AS is simple: it sends a 
   SUBSCRIBE to the callerÆs and/or calleeÆs User-Agent as described in 
   section 16.9.  The subscription request should be dialog specific.  
   Now the Application Server will receive all endpoint Key Events for 
   the duration of the subscription. 
    
2.2.2. Example 2: Application Server Acting As A Proxy. 
    
   In this scenario, the Application Server normally functions as a SIP 
   proxy.  The application is co-located with the SIP proxy and may 
   also function as a SIP UA if desired.  The network model is shown in 
   Figure 2 below. 
    
    Caller               AS                  AS                Callee 
   +------+           +-------+           +-------+           +------+ 
   | UAC  |<-- SIP -->| Proxy |<-- SIP -->| Proxy |<-- SIP -->| UAS  | 
   +------+           +-------+           +-------+           +------+ 
      |                                                          | 
      +--------------------------- RTP --------------------------+ 
    
   Figure 2.  Application Server (Proxy) Model 
    
   Any proxy that wants to stay in the signaling path inserts a Record-
   Route header into the session establishment request.  The Record-
   Route mechanism will ensure the Proxy/AS sees all SIP requests and 
   responses for the dialog established between the caller and callee.  
   Applications deployed using this model do not manage user sessions 
   as a user agent but rather exert call-control over the INVITE dialog 
   and/or conversation space [5] using, for instance, the call control 
 
Culpepper/Cuninghame/Mule                                      [Page 7] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   primitives and framework defined in [5] or using some other external 
   mechanism. 
    
   In this usage example the Application Server desires to take action 
   after a certain sequence of key events occurs during a session.  So 
   after possibly record-routing the callerÆs initial INVITE request 
   and forwarding it to the destination system, the AS will send a 
   dialog specific subscription request to the desired User-Agents as 
   described in Section 16.7 (and as for example 1).  This allows any 
   and all SIP proxies/AS in the signaling path to receive key-event 
   notifications independently of any other SIP proxy/AS. 
    
2.3. SIP Call-Control Interaction 
 
   The Key Event Package allows multiple network entities to subscribe 
   to key events for the same SIP session on the same device.  Due to 
   this fact, it is possible for multiple Application Servers to take 
   part in the same call and thus the interaction between the servers 
   must be considered. 
    
   However, solving the problems of multiple AS interaction is beyond 
   the scope of this document.  This document simply defines a 
   mechanism whereby Applications can monitor key events on a network 
   device - it is does not specify the call-control mechanisms used by 
   participating entities.  Different call control models will have 
   different interaction characteristics. 
    
    
Part A -- Introducing a protocol independent Key-Event message format 
    
   The following section introduces a transport protocol independent 
   message format for the requesting and transport of Key-Events. Part 
   A of this draft is intentionally protocol neutral such that the 
   resulting message format is adaptable to any reliable, bi-
   directional transport mechanism. Part B of this draft details the 
   use of Part A within the context of a SIP Event Package [2] using 
   the SIP SUBSCRIBE and NOTIFY methods (an example of a transport 
   mechanism profile). If there is sufficient non-SIP related interest, 
   Part A will be split out into separate internet draft. 
    
   The message format presented in Part A does not specify a complete 
   protocol. However, the combination of the Key-Event Message Format 
   and the transport mechanism profile (Part B) should specify a 
   complete protocol.  
    
   When the Key-Event Messages are transported as MIME message bodies, 
   the MIME content type for this message format is "application/key-
   event" and is officially defined in section 12. 
    
3. Terminology 
    
  To avoid confusion and to maintain a protocol neutral terminology, 
  the following terms will be used in this section of the document. 

 
Culpepper/Cuninghame/Mule                                      [Page 8] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   
  Requestor: the entity requesting Key-Event notification from a target 
     entity (the Notifier). 
   
  Notifier: the entity to which the Requestor is requesting to be 
     notified of Key-Events. 
   
  Transport Mechanism: The protocol mechanism used to reliably route 
     and deliver messages between the Requestor and Notifier. It is the 
     responsibility of the transport mechanism to inform the Requestor 
     and Notifier when a Key-Event Session is terminated due to network 
     or endpoint failure. The transport mechanism should also provide a 
     mechanism whereby the Notifier (and optionally the Requestor) can 
     indicate its desire to terminate an active Key-Event Session. The 
     transport mechanism is not prescribed by the Key-Event Message 
     Format. 
   
  Subscription: the state information held by the Notifier regarding 
     the key event notifications successfully requested by a particular 
     Requestor. 
   
  Key-Event Session: the time period when a subscription for key-events 
     has been established (or in the process of being established).  
   
4. Key-Event Messages 
    
  The Key-Event Message Format consists of the following three message 
  types: 
   
  Key-Event Session Request: The Requestor sends a Session Request to 
    the Notifier to request key-event notification and/or determine a 
    NotifierÆs capabilities. In effect the Session Request creates a 
    subscription to a set of key-events for which the Notifier will 
    send notifications. 
   
  Key-Event Session Response: The Notifier, in response to a Session 
    Request will send this message to indicate the full state of the 
    subscription created by the Session Request and the current full 
    state of all subscribed key-events. 
   
  Key-Event Notification: A Notifier normally sends a Notification 
    whenever the state of any subscribed key-event changes. Each 
    notification contains a state delta from the previous Key-Event 
    Notification message. 
   
  A typical Key-Event Session message flow: 
   
            Requestor               Notifier 
                |                       | 
                |   Session Request     | 
                |---------------------->| 
                |   Session Response    | 
                |<----------------------| 
 
Culpepper/Cuninghame/Mule                                      [Page 9] 

Internet Draft           SIP Key Events Package           March 1, 2002 

                |                       | 
                |   Notification        | 
                |<----------------------| 
                |   Notification Ack    | 
                |---------------------->| 
                |                       | 
                |   Notification        | 
                |<----------------------| 
                |   Notification Ack    | 
                |---------------------->| 
                |                       | 
   
  A Key-Event Session can be renegotiated or terminated by the 
  Requestor by sending another Session Request message. This Session 
  Request message replaces all state established by the previous 
  Session Request and will always solicit a Session Response. A Session 
  Request with no requested events terminates a Key-Event Session.  
 
5. Key Representations 
    
   The representation of keys in the key-event message format has been 
   designed around a few central philosophies. 
    
   Firstly, all keys that represent the same information must map to 
   the same key-event.  For instance, a key representing "1" on a 
   keyboard, keypad, telephone, or vending machine will all map to the 
   same key event; likewise, multiple equivalent keys (e.g., left and 
   right shift keys) will also map to the same key-event.  The key-
   event package does however allow an optional positional indicator to 
   indicate the origin of a particular key event (if multiple 
   equivalent keys are present).  The value can be ignored if desired.  
   This arrangement avoids the situation where an application must 
   observe a (possibly unknown) set of equivalent key events. 
    
   The positional indicator values currently defined are "alt" 
   (alternate) & "keypad" as well as the assumed "pri" (primary) key 
   position.  When a keyboard has two or more equivalent keys, one is 
   always defined to be the primary key and the others are defined to 
   be the alternate/keypad positions.  For Shift, Ctrl, Alt and similar 
   equivalent keys, the bottom-left most key is defined to be the 
   primary key.  If a device has only one instance of a particular key 
   it is always regarded as the primary key regardless of its physical 
   position. 
    
   The second design philosophy is that the event package is 
   independent of key-cap arrangements on keyboards.  A keyboard is 
   represented by two distinct sub-packages: one sub-package represents 
   all characters that are accessible on the keyboard, the second sub-
   package represents all non-character based keys, for instance, 
   Shift, Caps Lock, Insert, Up, Alt, Pause.  [For historical reasons 
   Backspace, Delete, Enter/Carriage-Return & Escape have character 
   representations.]  This, for example, means that the representation 
   of capital Q (i.e., 'Q') is independent of the Shift key event. 
 
Culpepper/Cuninghame/Mule                                     [Page 10] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   Lastly, all basic keys were designed to have two possible states: up 
   or down.  Key presses are signaled by notifying the requestor when a 
   key transitions into a new state ("keyup" or "keydown" state 
   events).  Each state notification is accompanied by state specific 
   information such as key depression start time.  The key-event 
   package states have been arranged such that a "keyup" state event 
   includes both key release event time as well as duration of the 
   depression. 
    
   This arrangement allows the "keydown" state event to be seamlessly 
   delayed or omitted by the Notifier and/or ignored by the Requestor.  
   The role of the "keydown" event is to provide rapid notification of 
   key depression.  For many applications, the "keydown" event 
   notification is only useful for prolonged key depressions.  The key-
   event package provides a useful mechanism whereby a Requestor 
   application can delay "keydown" notifications to achieve a 
   compromise between key response times and reduced bandwidth (1 or 2 
   notify messages per key depression and release).  [c.f., Section 7.1 
   "dwndly" property.] 
    
6. Key-Event Framework 
    
   The Key-Event Message Format does not in itself define key events 
   but rather defines the framework for specifying "Key-Event Sub-
   Packages".  Each Key-Event Sub-Package defines the key-events that 
   make up the sub-package along with the states and properties that 
   the constituent key-events may possess. 
    
   In section 7, this document defines Key-Event Sub-Packages for 
   standard keyboards, telephones and user-defined buttons. Section 11 
   provides guidelines for future sup-package authors. 
    
7. Key-Event Sub-Package Definitions 
    
   All Key-Event Sub-Package definitions consist of the following 
   components: 
    
   Sub-Package Name: The name of the sub-package as used in messages. 
    
   Key-Event Values: This list defines the set of valid key-events of 
   the sub-package.  A key-event can have either a numeric value (e.g., 
   49) or a non-numeric value (e.g., shift). 
    
   Key-Event States: This component defines the set of states that key-
   events in the sub-package can have (e.g., keyup or keydown).  The 
   sub-package must also define a default state. 
    
   Key-Event Properties: This list defines any configurable or 
   retrievable properties held by the key-events.  Support for any 
   particular sub-package property is NOT REQUIRED unless explicitly 
   stated in the sub-package description. 
    
 
Culpepper/Cuninghame/Mule                                     [Page 11] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   Enumerated Key-Event Sets: In order to simplify subscription, the 
   sub-package can define a number of enumerated key-event sets.  These 
   enumerations are entirely equivalent to the set of key-events they 
   represent (e.g., @dialpad = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, * and 
   #} found on common telephones). 
    
   By design, all key-events in a sub-package share the same states and 
   properties. 
    
7.1. Shared Key-Event States and Properties 
    
   All currently defined sub-packages in this document share the 
   following state and property definitions. 
    
   These definitions have been grouped together for clarity however the 
   definitions still belong to the individual Key-Event Sub-Packages.  
   Future sub-packages may define additional states and/or properties; 
   future sub-packages are also not forced to use existing key-event 
   states and properties if they do not make sense within a new sub-
   package (e.g., for a slider/dimmer control). (c.f., Section 11 for 
   further guidelines.) 
    
   Key-Event States: 
    
  - "keydown" 
     State Parameters: 
        * Start Time of Key Depression: Milliseconds offset from the 
          event-time NTP value specified in the Time-header.  Negative 
          values are allowed. 
 
  - "keyup" 
     State Parameters: 
        * Time of Key Release: Milliseconds offset from the event-time 
          NTP value specified in the Time-header.  Negative values are 
          allowed. 
        * Duration of Key Depression: Millisecond duration of key 
          depression. 
 
  Key-Event Properties: 
    
  - "exists" 
     Request Parameters: none 
     Response Result: positional-indicator *("," positional-indicator)  
                   [List of non-primary key instances.] 
     Default value: N/A 
     Support: RECOMMENDED 
     Description: Determines which non-primary key-events exist. 
          e.g., "p: key[49].exists()" may yield a result of  
          "p: key[49].exists(keypad)" which indicate that two '1' keys 
          exists: a primary key instance and a keypad key instance.   
          Note: This property only produces a result for key-events 
          possessing non-primary key positions. 
    
 
Culpepper/Cuninghame/Mule                                     [Page 12] 

Internet Draft           SIP Key Events Package           March 1, 2002 

  - "name" 
     Request Parameters: none 
     Response Result: positional-indicator "=" quoted-string 
                    *( "," positional-indicator "=" quoted-string )  
                    [Lists of names for all key instances.] 
     Default value: N/A 
     Support: RECOMMENDED 
     Description:  
          The property when requested (e.g., "p: keybd[49].name()" ) 
          returns the printable name of the key-event in the Session 
          Response result (e.g., "key[49].name(pri="1", keypad="Keypad 
          1")" ). 
          The description should be sufficiently detailed such that a 
          user would be able to identify the key from the description.  
          This property can also very useful when the name of the key 
          is configured locally, for instance, a Session Request for 
          "phone[line:*].name()" could conceivably yield a result of 
          "phone[line:1].name(pri="Reception")". 
      
  - "dwndly": (DownDelay) 
     Request Parameters: 1*DIGIT (milliseconds delay) 
     Response Result: 1*DIGIT (milliseconds delay) 
     Default value: 0 
     Support: OPTIONAL 
          Description: Milliseconds delay that Notifier should/will 
          wait before generating a "keydown" state event after a key is 
          depressed.  If the key is raised before this duration elapses 
          then only the "keyup" state event will be generated.  This 
          allows a tradeoff between key responsiveness (for longer 
          keypresses) and the number of Key-Event Notification messages 
          per keypress.  The Session Response result contains a 
          confirmation of the new value. 
          This value (and any change thereof) is local to the Key-Event 
          Session in which it is requested. 
    
7.2. Key Sub-package 
    
   Sub-Package Name: "key" 
    
   Key-Event Values: Decimal Unicode values [7]. 
    
   Key-Event States: keydown, keyup (default) 
    
   Key-Event Properties: name, exists, dwndly 
    
   Enumerated Key Event Sets: 
     - "@dialpad" = "35,42,48-57" 
          This set represents a standard telephone dialpad: 0-9, *, #. 
     - "@uslatin" = "9-10,32-126" 
          This set represents the printable and white space character 
          key set found on a typical US keyboard (which is a subset of 
          most other keyboards). 
     - "@uslatin2" = "8-10,27,32-127" 
 
Culpepper/Cuninghame/Mule                                     [Page 13] 

Internet Draft           SIP Key Events Package           March 1, 2002 

          This set is similar to @uslatin but also includes the non-
          printable backspace, delete & escape keyboard characters (see 
          notes below). 
    
   Notes: 
          For mainly historical reasons, the following keys belong to 
          the key sub-package rather than the keybd sub-package: 
            - Backspace: 8 
            - Tab: 9 
            - Enter: (treated as unix '\n') 10 
            - Escape: 27 
            - Delete: 127 
    
7.3. Keyboard Sub-Package 
    
   Sub-Package Name: "keybd" 
    
   Key-Event Values:  
     "shift": name="Shift" (or "Left/Right Shift" if applicable) 
     "caps": name= "Caps Lock" 
     "ctrl": name="Control"  
     "alt": name="Alt" 
     "home": name="Home" 
     "end" : name="End" 
     "insert": name="Insert" 
     "pgup": name="Page Up" 
     "pgdn": name="Page Down" 
     "up": name="Up" 
     "dn": name="Down" 
     "right": name="Right" 
     "left": name="Left" 
     "pause": name="Pause" 
     "numlk": name="Num Lock" 
     "scrlk": name="Scroll Lock" 
     "prtsc": name="Print Screen" 
     "break": name="Break" 
     + "func:*": name="Function Key x"  
     + "os:*": name=<operating system defined> 
     + "vendor:*": name=<vendor defined> 
      
          + Key-events of the form "keyname:*" allow for multiple 
          numbered keys to exist.  These key-events must be always be 
          used in this numbered key form (e.g., "func:3"). 
    
   Notes:  
          The names provided for the Key-Event Values should be only 
          regarded as examples.  The actual Key Event Name should be 
          sufficient to locate the individual key on the device 
          (including the case when there are multiple key instances). 
    
   Key-Event States: keydown, keyup (default) 
    
   Key-Event Properties: name, exists, dwndly  
 
Culpepper/Cuninghame/Mule                                     [Page 14] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   Enumerated Key-Event Sets: 
     -  "@basic" = "shift, caps, ctrl, alt, home, end, insert, pgdn, 
                      pgup, up, dn, right, left" 
          (basic keyboard) 
     -  "@std" = "shift, caps, ctrl, alt, home, end, insert, pgdn, 
                 pgup, up, dn, right, left, pause, numlk, scrlk, prtsc, 
                 break" 
          (standard keyboard) 
    
7.4. Telephone Sub-Package 
    
   Sub-Package Name: "phone" 
    
   Key-Event Values:  
     "hook": name = "Hookswitch" 
          Notes: The state of this button is actually the opposite of 
          the hook switch, that is, the "keyup" state represents the 
          on-hook condition.  Normally this key-event would only be 
          available in non-dialog specific subscriptions. 
     "hold": name = "Hold" 
     "conf": name = "Conference" 
     "flash": name = "Flash" 
     "redial": name = "Redial" 
     "transfer": name = "Transfer" 
     + "line:*": name = "Line x" or locally defined 
     + "speed:*": name = "Speed Dial x" or locally defined 
     + "vendor:*": name = <vendor defined> 
    
          + Key-events of the form "keyname:*" allow for multiple 
          numbered keys to exist.  These key-events must be always be 
          used in this numbered key form. 
    
   Key-Event States: keydown, keyup (default) 
    
   Key-Event Properties: name, exists, dwndly  
    
   Enumerated Key-Event Sets: None. 
    
7.5. User Package 
    
   This sub-package intentionally does not define any key-event values.  
   This package is designed as a sub-package available for any device 
   or user specific key-events and properties. 
    
   Key-Event Values: None.  (see note) 
    
   Key-Event States: keydown, keyup (default) 
    
   Key-Event Properties: name, exists, dwndly 
    
   Enumerated Key-Event Sets: None.  (see note) 
    
 
Culpepper/Cuninghame/Mule                                     [Page 15] 

Internet Draft           SIP Key Events Package           March 1, 2002 

8. Key-Event Message Body Format 
    
   A Key-Event message body consists of a set of UTF8 header lines.  
   The header lines resemble HTTP header formats however for efficiency 
   all header, sub-package, property, state and key-event names are 
   case-sensitive and multiple headers of the same type are not 
   permitted.  Parsers MUST be tolerant of spaces between header 
   tokens. 
    
   key-event-message = time-header CRLF 
                       [ instance-header CRLF ] 
                       [ event-header CRLF ] 
                       [ properties-header CRLF ] 
                       [ state-header CRLF ] 
                       [ future-extension-header CRLF ] 
    
   The individual key-event headers may appear in Key-Event messages as 
   detailed in the following table: 
    
   Key-Event Header              Request  Response  Notification 
   ----------------              -------  --------  ------------ 
   Time-Header (t:)                 m        m         m 
   Instance-Header (i:)             o        -         - 
   Event-Header (e:)                m        m         - 
   Properties-Header (p:)           o        o         - 
   State-Header (s:)                -        o         m 
    
   m = mandatory; o = optional; otherwise, the header is not allowed. 
    
8.1. Time-Header Format 
    
   The time-header indicates the NTP time [6] that the event message 
   was first issued and a message sequence number. 
    
   The exact starting/ending time of an event often requires greater 
   granularity than is provided by NTP values (in seconds) and so key-
   event state transitions also include a millisecond offset that is 
   added to this NTP time value.  It must also be remembered that the 
   time a key-event message is generated may not always be the same as 
   the time of the actual key-event event (for instance, initial state 
   indications). 
    
   The sequence number allows the key-event message bodies to be 
   sequenced independently of the transport protocol. 
    
   time-header = "t:" event-time sequence-number 
   event-time = 1*DIGIT 
   sequence-number = 1*DIGIT 
    
   The event-time is set equal to the NTP time value when the message 
   body was first issued.  The sequence-number is a 32-bit non-zero 
   integer that is incremented each time a new message is generated 

 
Culpepper/Cuninghame/Mule                                     [Page 16] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   within each key-event session.  The sequence number spaces for the 
   Requestor and Notifier are independent. 
    
   Examples: 
    
   t: 36539655 1 
    
8.2. Instance-Header Format 
 
  This optional header allows for a protocol specific identifier to be 
  placed in a Session Request message to identify the target endpoint 
  instance (and association parameters) when the transport mechanism 
  cannot provide such functionality. 
   
   instance-header = "i:" *( ";" | "/" | "?" | ":" | "@" | "&" | "="  
                       | "+" | "$" | SP | TAB | unreserved | escaped ) 
    
   The headerÆs format and interpretation must be specified in the 
   transport mechanism profile if used. 
    
8.3. Event-Header Format 
    
   The event-header allows the Requestor to request a set of key-events 
   and the Notifier to confirm/indicate the set of key-events 
   subscribed/supported. 
    
   The event-header in a Session Request is used to request a 
   subscription to a set of key events.  The event header in a Session 
   Response is used to indicate the actual set of subscribed key 
   events. 
    
   event-header = "e:" [ ( event-set ( "," event-set ) ) | "*" ] 
   event-set = sub-package-name [ key-event-list ] 
   sub-package-name = token 
   key-event-list = "[" key-event-set *( "," key-event-set ) "]" 
   key-event-set = key-event-identifier | key-event-range | 
                   enumerated-key-event-set 
   key-event-identifier = key-event-name | key-event-value | 
                          key-event-numid | key-event-numidwild 
   key-event-name = token 
   key-event-value = 1*DIGIT 
   key-event-numid = token ":" 1*DIGIT 
   key-event-numidwild = token ":" "*" 
   key-event-range = ( key-event-value "-" key-event-value ) | 
                     ( key-event-numid "-" key-event-numid ) 
   enumerated-key-event-set = "@" token 
    
   If the key-event-list is not present in a Session Request message 
   (e.g., "e: key") then it is assumed that the Requestor wants to be 
   notified of all available key-events in the sub-package.  The key-
   event-list MUST always be present in Session Response messages and 
   indicates all key-events that are subscribed (e.g., e: key[48-57]). 
    
 
Culpepper/Cuninghame/Mule                                     [Page 17] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   Likewise, the "*" wildcard can only appear in Session Request 
   messages.  Wildcards must be expanded in Session Response messages 
   as described in Section 9.2. 
    
   Key-event-ranges with numbered keys (e.g, a "Line 3" telephone 
   button) must have the same key-event type on both sides of the range 
   (e.g., "phone[line:1-line:10]").  Each numbered key is treated as an 
   independent key-event. 
    
   An empty event-header ("e:") in a Session Request or Response 
   message indicates the termination of the Key-Event Session.  The 
   event-header is the only key-event header which may be present but 
   empty. 
    
   Example Session Request message headers: 
    
   e: key[@dialpad, 65-68], keybd 
    
     In this example, the Requestor is requesting event notification 
     for keys: 0-9, *, #, A, B, C, D from the key sub-package and all 
     supported keybd sub-package events. 
    
   e: *         
    
     In this example the Requestor is requesting a subscription to all 
     key-events supported by the Notifier. 
    
   e: phone[line:*] 
    
     In this example the Requestor is requesting all available "line" 
     buttons within the phone sub-package. 
    
   Example Session Response headers for the above Session Request 
   message headers: 
    
   e: key[@dialpad]  
           
     In this example the Notifier is indicating that subscription only 
     occurred for the key-events 0-9,*,#. 
    
   e: key[48-57,8,10], keybd[insert,numlk] 
           
     In this example, the Notifier is indicating that subscriptions 
     have been created for the key-events 0-9, Backspace, Enter, Insert 
     & NumLock. 
    
   e: phone[line:1-line:5] 
    
     In this example, the Notifier is indicating that subscriptions 
     have been created for the "line" buttons 1 through 5. 
    
8.4. Properties-Header Format 
    
 
Culpepper/Cuninghame/Mule                                     [Page 18] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   The properties-header in a Session Request message is used to set or 
   retrieve the properties of subscribed key-events.  The properties- 
   header in a Session Response message indicates the value of each of 
   the listed properties. 
    
   properties-header = "p:" properties-set *( "," properties-set ) 
   properties-set = ( event-set | "*" ) "." property-name  
                    "(" [ parameter-list ] ")" 
   property-name = token 
   parameter-list = parameter *( "," parameter ) 
   parameter = *( ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" 
            | "$" | SP | TAB | unreserved | escaped | quoted-string ) 
    
   As with the event-header, "*" wildcards and empty key-event-listÆs 
   can only appear in  Session Request messages.  Wildcards and key-
   event-listÆs must be expanded in Session Response messages as 
   described in Section 7.2. 
    
   NOTE: The set of key-events that each property operates on is always 
   equal to the intersection of the set of subscribed key-events and 
   the set of key-events requested in the properties-header. 
    
   Examples for Session Request message headers:  
    
   p: key.dwndly(500)          
    
     In this example the Requestor is requesting that a value of 500 is 
     assigned to the "dwndly" property for all subscribed "key" sub-
     package key-events. 
    
   p: *.exists()               
    
     In this example the Requestor is requesting to know the existence 
     of all non-primary key instances for all subscribed key-events. 
    
   p: keybd[ctrl].name()       
    
     The Requestor is requesting the name of all ctrl key instances. 
    
   Example Session Response message headers for above Session Request 
   message examples: 
    
   p: key[@dialpad].dwndly(500) 
    
     In response to the above dwndly set request, the Notifier is 
     confirming the new value for all subscribed key-events in the key 
     sub-package. 
    
   p: key[47-58, 10].exists(keypad) 
    
     The Notifier is indicating that in addition to the primary 
     instances of all subscribed key-events, additional key instances 
     for 0-9 & Enter exist on a keypad. 
 
Culpepper/Cuninghame/Mule                                     [Page 19] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   p: keybd[ctrl].name(pri="Left Control", alt="Right Control") 
    
     In this example, the name property indicates the names for the 
     various control key instances possessed by the device. 
    
8.5. State-Header Format 
    
   The state-header allows the Notifier to indicate the initial key-
   event states and subsequent key-event state changes.  The header 
   only appears in Session Response and Notification messages. In a 
   Session Response message the state header gives key-event state 
   information for all subscribed key-events in non-default states. In 
   a Notification message the state header only indicates a change in 
   key-event state.  
    
   state-header = "s:" state-indication *( "," state-indication ) 
   state-indication = event-descriptor "." state-name 
                      "(" [ parameter-list ] ")" 
   event-descriptor = sub-package-name "[" key-event-descriptor "]" 
   key-event-descriptor = ( key-event-name | key-event-value | 
                          key-event-numid ) 
                          [ "(" positional-indicator ")" ] 
   positional-indicator = "pri" | "alt" | "keypad" | token 
   state-name = token  
    
   An empty positional-indicator infers the request/result applies to 
   the primary key of this key-event type. 
    
   Examples: 
    
   s: key[49].keydown(-1532)   
    
     This example is a keydown state indication for the primary '1' key 
     (Unicode [7] value 49).  It indicates that the button was first 
     depressed 1532 milliseconds before the NTP value in the time-
     header. 
    
   s: key[49(keypad)].keyup(126,1206)              
    
     This example is a keyup state indication for the keypad '1' key.  
     It also indicates that the button was released 126 milliseconds 
     after the NTP value in the time-header and was depressed for 1206 
     milliseconds. 
    
9. Key-Event Message Generation 
    
9.1. Generating a Session Request message 
 
    The Session Request message is generated to establish, renegotiate 
    or terminate a Key-Event Session. The values placed in the 
    messageÆs time-, instance-, event- and properties- headers are 
    described in the relevant sections of section 8. 
 
Culpepper/Cuninghame/Mule                                     [Page 20] 

Internet Draft           SIP Key Events Package           March 1, 2002 

 
9.2. Generating a Session Response message 
 
   A Session Response message is generated in response to a Session 
   Request. Generating the Initial NOTIFY request is the most 
   complicated part of this specification, however, the headers were 
   constructed so that the event-, property- and state- headers have a 
   similar syntax and semantics. 
    
   The procedure for generating the Response is decomposed into the 
   procedures for generating each of the possible Session Response 
   message headers. 
    
9.2.1. Event Header Processing 
    
   This section describes how the subscribed key-events set is 
   generated and how the Session Response event-header is derived from 
   this set.  The subscribed key-events set also forms part of the 
   subscription state information and is used in generating the other 
   headers.  The set is formed from the event header in the Session 
   Request message. 
    
   To summarize, the subscribed key-events set is formed by expanding 
   all wildcards in the requested key-events set and intersecting the 
   resulting key-event set with the supported key-event set. 
    
   Procedure: 
    
   An event header of "*" results in a subscribed key-event set equal 
   to the supported key-event set.  If the event header does not 
   contain a "*" then the following procedure is performed for each 
   element on the event header line: 
    
   If the key-event-list for the sub-package is empty (e.g., "e: user") 
   then all supported key-events in the specified sub-package are added 
   to the subscribed key-events set.  Otherwise, the following 
   procedure is performed for each element in the key-event-list: 
    
   For enumerated key-event sets (e.g., "@dialpad"), if all key-events 
   in the set are supported, then the enumerated key-event set is added 
   to the subscribed key-events set.  Otherwise the enumerated key-
   event set is simply replaced by its equivalent key-event list for 
   individual evaluation. 
    
   All key-event identifiers and ranges are checked against the 
   supported key-event set and supported key-events are added to the 
   subscribed key-event set. 
    
   The resulting set is the subscribed key-event set. 
    
   The event header in the Session Response message is generated from 
   the subscribed key-events set by grouping together all key-events in 
   the same sub-package.  This is done to keep header length down, for 
 
Culpepper/Cuninghame/Mule                                     [Page 21] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   example, "key[47-58,10,35]" is preferred over "key[47], key[48], 
   key[49], ...". 
    
   If the subscribed key-event set is empty then an empty event-header 
   is generated ("e:") and the subscription is terminated after the 
   message is delivered. 
    
9.2.2. Properties Header Processing 
    
   The properties header in the Session Request message is evaluated to 
   form the properties header used in the Session Response message as 
   follows: 
    
   Each element in the Session Request properties header is checked.  
   If the property is not supported for any sub-package then no action 
   is taken for this element.  Otherwise, the input key-event set is 
   calculated (the key-event set on which the property will operate).  
   This set is generated in a similar manner to the subscribed key-
   event set described in the previous section except that the 
   subscribed key-event set is used instead of the supported key-event 
   set (properties only operate on subscribed key-events) and the 
   requested key-event set is equal to the event-set of the current 
   properties header element.  The resulting input key-event set is 
   further reduced by removing all key-events for which the property is 
   not supported.  At this point, the property is evaluated for each 
   element in the input key-event set.  For each evaluation, if the 
   property generated a result then the result is added to the output 
   set, otherwise no action is taken. 
    
   Like the event header, the properties header is generated from the 
   output set by grouping together all key-events with the same 
   property result (and in the same sub-package).  For example, 
   "key[47-58].exists(keypad)" is preferred over 
   "key[47].exists(keypad), key[48].exists(keypad), 
   key[49].exists(keypad), ...". 
    
   If the output set is empty then the properties header is not added 
   to the message. 
    
9.2.3. State Header Processing 
    
   A state notification is generated for each key-event in the 
   subscribed key-event set for which the current state is not equal to 
   the default state.  This set of state notifications forms the 
   Session Response state-header. 
    
   If all subscribed key-events are in the default state then a state-
   header is not added to the message. 
    
9.3. Generating Key-Event Notification messages 
    
   Notification messages generated in response to key state changes 
   only possess two headers: the time-header and the state-header. 
 
Culpepper/Cuninghame/Mule                                     [Page 22] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   The information in the state-header is a delta indication of the 
   key-event state.  In other words, each Notification message only 
   includes the state information of key-events that have changed since 
   the last notification. 
    
10.  Minimal Implementation for Key-Event Notifiers 
    
   Firstly, even a minimal implementation MUST address the security 
   considerations prescribed in each transport profile. 
    
   When a device does not have any user-defined keys, locally-
   configured names, multiple key instances or numbered buttons (e.g., 
   a simple DTMF telephone dialpad) then the implementation can be made 
   quite simple.  In these cases the "exists" and "name" properties can 
   be deemed OPTIONAL. If remote configuration of "dwndly" is also not 
   required then the properties header line MAY be ignored completely. 
    
   This allows simple devices to scale down to a simple implementation 
   without affecting the functionality available to more complicated 
   user interface devices. 
    
11.  Guidelines to Future Sub-Package Authors 
    
   Future sub-packages must not duplicate key-events contained in 
   existing sub-packages. 
    
   If the relevant sub-package already exists then an extension for the 
   existing sub-package should be proposed rather than a new sub-
   package. 
    
   Once published as a standard, new key-event states or enumerated 
   key-event sets SHOULD NOT be added to an existing sub-package.  Only 
   new key-event values and OPTIONAL key-event properties may be added 
   to existing sub-packages. 
    
   New sub-packages should reuse the states and properties of the 
   existing sub-packages where possible. 
    
12.  MIME type information for the Key-Event Message Format 
    
   The MIME definition for the key state message bodies defined in this 
   document follows. 
    
   Media type name: application 
   Media subtype name: key-event 
   Required parameters: none 
   Optional parameters: none 
   Encoding scheme: text 
    
   The media subtype is used to indicate the message content as defined 
   in this document.  A typical header would look like the following. 
    
 
Culpepper/Cuninghame/Mule                                     [Page 23] 

Internet Draft           SIP Key Events Package           March 1, 2002 

      Content-Type: application/key-event 
    
Part B -- The use of SIP SUBSCRIBE & NOTIFY for Key-Event Transport 
    
   This section describes the transport of key state data defined in 
   Part A using the SIP Event Notification framework. 
    
13.  Subscription to Key Events 
    
   Subscriptions to key events are established, maintained, and 
   terminated as described in the SIP-Specific Event Notification 
   framework specification [2].  Key event subscriptions are indicated 
   using "key-event" for the event-type in the Event header of 
   SUBSCRIBE and NOTIFY requests.  Details of the events being 
   subscribed to and being reported are specified in message body of 
   the Key-Event Session request.  (See sections 7 and 8 for normative 
   descriptions of Key-Event Sub-Packages and their message bodies.) 
    
   As specified later, SUBSCRIBE requests contain Key-Event Session 
   Request message bodies that indicate the events being subscribed to.  
   Once accepted, an "event notification dialog" is established and 
   event state is established in the Notifier according to the contents 
   of the SUBSCRIBE message body.  It is possible to modify the set of 
   events being subscribed to by sending another SUBSCRIBE request, 
   with a key events message body, for a previously established event 
   notification dialog.  In this case, the new message body should 
   replace the state established by a previous SUBSCRIBE. 
    
   This document describes two types of key-event subscriptions.  The 
   first is a subscription associated with a SIP dialog or conversation 
   space.  That is, the subscription is only valid for key-events 
   directly associated with the specified session and the subscription 
   ends when the SIP dialog or conversation-space ceases to exist.  The 
   term "dialog specific subscription" will be used to describe this 
   type of subscription.  The second type of key-event subscription 
   described here is a non-dialog associated subscription.  Where the 
   subscribing device is interested in key events regardless of what 
   the device is doing.  The term "non-dialog specific subscription" 
   will be used to describe this second type of key event subscription.  
   Devices supporting the mechanisms defined in this document MUST 
   support dialog specific subscriptions.  Support for non-dialog 
   specific subscriptions is OPTIONAL. 
    
13.1.     Non-Dialog Specific Subscriptions 
    
   Key-Event subscriptions that apply to a device, regardless of any 
   on-going or active SIP dialogs, are established by SUBSCRIBE 
   requests that do not include an instance-header in the Session 
   Request message body.  Notifiers that support non-dialog specific 
   subscriptions MUST support multiple concurrent subscriptions from 
   the same or different subscribers. 
    


 
Culpepper/Cuninghame/Mule                                     [Page 24] 

Internet Draft           SIP Key Events Package           March 1, 2002 

13.2.     Dialog Specific Subscriptions 
    
   A dialog specific subscription is requested by the subscriber by 
   including an instance-header in the Session Request message body of 
   the SUBSCRIBE request.  This header identifies the particulars of 
   the dialog specific subscription; the format of the inserted header 
   is described in section 14. 
    
   There are two modes of dialog specific subscriptions: dialog 
   attached mode and conversation-space attached mode. The primary 
   difference between the two modes is the conditions under which the 
   subscription terminates. 
    
13.2.1. Dialog Attached Mode 
    
   In this mode, the subscription receives key-events from the user 
   endpoint associated with the specified dialog whenever the user is 
   *actively* communicating through that user endpoint.  [An example of 
   a user endpoint in this context could be a single virtual "line" on 
   a multi-line SIP phone.] 
    
   The subscription is terminated when the dialog is terminated.  The 
   RECOMMENDED subscription expiry timeout is on the order of a day.  
   When a subscription is terminated due to dialog termination, the 
   Notifier MAY send a NOTIFY with "Subscription-State: 
   terminated;reason=noresource" header however this is deemed 
   unnecessary in most cases. 
   
13.2.2. Conversation Space Attached Mode 
    
   Just as for dialog attached subscriptions, the subscription receives 
   key-events from the user endpoint associated with the specified 
   dialog (at the time of subscription) whenever the user is *actively* 
   communicating through that user endpoint. 
    
   However for conversation space attached dialogs, the subscription is 
   terminated when the conversation space of the user endpoint is 
   reduced to a conversation space containing only the user endpoint 
   (or an empty conversation space).  For instance, in this mode the 
   subscription would *not* be terminated when an INVITE with a 
   Replaces header was received from the network but would be 
   terminated when all other participants leave a distributed 
   conference.  It is RECOMMENDED that the subscription expiry timeout 
   have a value ranging from minutes up to an hour.  The Notifier MUST 
   send a NOTIFY with "Subscription-State: terminated; 
   reason=noresource" header when the subscription terminates. 
    
13.2.3. Multi-dialog Capable Endpoints 
    
   Dialog specific subscriptions can present a challenge to user 
   devices that support multiple simultaneous dialogs but only have a 
   single user interface (keypad, speaker, microphone) that is shared 
   between all session (e.g., a multi-line SIP phone).  Most devices of 
 
Culpepper/Cuninghame/Mule                                     [Page 25] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   this type have the concept of a single "active" session among the 
   established sessions.  That is, only one session has the use of the 
   shared user interface resources at any point in time.  This 
   characteristic should be applied to key event subscriptions, in 
   other words, notifications will only be sent to subscribers (if any) 
   of the dialog with which the keypad is assigned to at the time of 
   the event detection.  This behavior is consistent with common 
   circuit-based multi-line telephones. 
    
   This should not be confused with devices which terminate multiple 
   dialogs but where each dialog is associated with a different user, 
   for instance, a SIP-PSTN gateway. 
    
13.2.4. "Early" Dialog Subscriptions 
    
   In order for a subscriber to reliably receive all Callee generated 
   key-events from the time a session is fully established/answered, a 
   Callee must be able to receive and setup a dialog specific 
   subscription prior to the associated dialog being fully established.  
   This is accomplished by the caller/AS sending a SUBSCRIBE request 
   after an early dialog has been established (by a provisional INVITE 
   response) but before any final response has been sent by the callee.  
   As with any SUBSCRIBE request received, recipients should process 
   the request according to its policies, however early dialog 
   subscriptions do not produce Key-Event information until the 
   associated dialog is established/answered.  It should be remembered 
   that the SIP Events draft requires that a NOTIFY request is 
   generated immediately, however, the NOTIFY will simply not contain 
   Key-Event message bodies until the subscriptionÆs associated device 
   or dialog becomes active. 
    
   A Caller can also receive a dialog specific subscription for a 
   dialog before it has been fully established.  The same issues with 
   authentication and authorization apply as in the previous case, 
   however, the notification of caller key presses before the dialog is 
   fully established may benefit certain applications (for instance, 
   pre-answer or pre-alerting caller pin-code authorization).  Thus, 
   when the instance-header does not specify a remote tag the early 
   subscription should become active immediately.  If the subscriber 
   does specify a remote tag in the instance-header, then the 
   subscription is only valid while the caller has an end-to-end 
   association with the specified callee (for instance while early 
   media from the specified callee is being played to the caller).  In 
   this case, the subscription is terminated if and when the session is 
   eventually established with a different callee. 
    
13.2.5. Multiple Subscriptions 
    
   A User-Agent/Notifier MUST support multiple concurrent subscriptions 
   for the same dialog from both the same subscriber and from different 
   subscribers. 
      

 
Culpepper/Cuninghame/Mule                                     [Page 26] 

Internet Draft           SIP Key Events Package           March 1, 2002 

14.  Instance-Header format for SIP Dialog Specific Subscriptions 
    
   The purposed of an instance-header in the key-event message body of 
   a SUBSCRIBE request is to identify a SIP dialog and specify the 
   subscription attachment mode; in a SIP SUBSCRIBE, the headerÆs 
   presence indicates that the subscription is dialog specific.   
    
   If a subscriber places an instance-header in the initial SUBSCRIBE 
   request then it MUST also be placed unchanged in all subsequent 
   SUBSCRIBE requests for the SIP dialog specified initially.  However, 
   a Notifier MUST ignore the instance-header in all but the initial 
   SUBSCRIBE request.   
    
      This allows a Notifier to restart but ensures that the 
      subscription does not change over time.  Notifiers can ignore 
      the instance-header in SUBSCRIBE requests that refresh 
      subscriptions since SUBSCRIBE established dialogs are 
      identified by the Call-ID, Local-Tag, and Remote-Tag present in 
      the initial SUBSCRIBE request. 
    
   instance-header = "i:" instance-component *("," instance-component ) 
   instance-component = "call-id" "=" Call-ID  
                       | "local-tag" "=" UUID 
                       | "remote-tag" "=" UUID  
                       | "attach" = ( "dialog" | "cspace" | token ) 
                       | future-extension 
    
   No minimum set of components has been specified for the instance-
   header - it is the responsibility of the generator to ensure that 
   the instance-header uniquely identifies a dialog on the target.  To 
   ensure uniqueness it is RECOMMENDED that the instance-header contain 
   the call-id, local-tag and remote-tag components. 
    
   If none of the "call-id", "local-tag", "remote-tag" components are 
   present then it is assumed that the dialog specific subscription is 
   associated with the subscriptionÆs own dialog "call-id", "local-tag" 
   & "remote-tag" values. This does not preclude the use of the attach 
   component. 
    
   The "attach" component indicates whether the subscription is 
   associated to the dialog itself or to the conversation space to 
   which the dialog currently belongs (as described in section 13.2).  
   The assumed value for the "attach" component (when not present) is 
   "attach=dialog". 
   
15.  SIP specific Key-Event error handling 
    
15.1.     Handling of unacceptable instance-header values. 
    
   When a SUBSCRIBE request is received containing an instance-header 
   referring to a non-existent or unacceptable dialog then the Notifier 
   SHOULD generate a NOTIFY request with a "Subscription-State: 
   terminated;reason=noresource" SIP header.  
 
Culpepper/Cuninghame/Mule                                     [Page 27] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
15.2.     Handling of unknown key-event-set enumerations. 
 
   When a Notifier receives a Key-Event Session Request with an unknown 
   key-event-set enumeration in a supported key-event sub-package 
   (e.g., "e: key[@polish]") then the Notifier MUST generate a SIP 
   Warning header in the Initial NOTIFY request. Unknown key-event-set 
   enumerations in the "user" sub-package MAY be silently ignored. 
    
   The "warn-text" of the SIP Warning header SHOULD include the unknown 
   enumeration, for instance: 
    
   Warning: 390 host53.company.com "Unknown key-event-set enumeration: 
     key[@polish]" 
    
   The subscription should proceed as normal with the unknown key-
  event-set enumerations ignored. 
    
   A warn-code of 390 is chosen as the information to be conveyed falls 
  in the miscellaneous category (as defined in [3]) and to allow 
  automated actions to occur.  For example, a subscriber can modify the 
  subscription and use Key-Event values instead of using an enumerated 
  Key-Event set. 
    
16.  Event Package Definition 
    
   This section contains the formal definition of the Key-events SIP 
   Event Package described in this document.  This information is 
   provided to conform to the requirements for SIP Event Packages as 
   outlined in [2].  As part of these requirements this section details 
   how Key-Event message bodies are generated by the subscriber and 
   Notifier entities. 
    
16.1.     Event Package Name 
    
   The event package token name for the Key Events package is "key-
   event".  The token name is used in the Event and Allow-Event headers 
   defined in [2]. 
    
16.2.     Event Package Parameters 
    
   There are no parameters used in the Event header for the key-events 
   package/sub-packages. 
    
16.3.     SUBSCRIBE Bodies 
    
   SUBSCRIBE requests for Key-Event subscriptions MUST contain a Key-
   Event message body if the SIP Expires header value is non-zero and 
   MAY contain one if the SIP Expires header value is zero.  SUBSCRIBE 
   responses do not contain a message body.  The Content-Type for the 
   Key-Event message body is "application/key-event".  The grammatical 
   specifications for the message body are defined in section 8. 
    
 
Culpepper/Cuninghame/Mule                                     [Page 28] 

Internet Draft           SIP Key Events Package           March 1, 2002 

16.4.     Subscription Duration 
    
   Dialog specific subscriptions implicitly end when the associated 
   dialog or conversation-space ends.  Please refer to section 13.2.1 & 
   13.2.2 for recommended dialog specific subscription expiry timeout 
   values.  It is recommended that the subscription expiry timeout for 
   non-dialog specific subscriptions be from a few minutes to an hour. 
    
   As detailed in [2] a SUBSCRIBE with an "Expires: 0" header indicates 
   the termination of a subscription.  However, if the accepted 
   SUBSCRIBE message also contains a Session Request message body, then 
   the SUBSCRIBE message body should be processed and the normal NOTIFY 
   Session Response message body is generated (ignoring any persistent 
   subscription side effects).  This mechanism can be used to determine 
   the sub-packages & key-events supported as well as the current 
   property values without creating an ongoing subscription. 
    
   If the terminating SUBSCRIBE does not contain a Key-Event message 
   body then a NOTIFY request MUST still be sent (with no message body) 
   as described in [2]. 
    
16.5.     NOTIFY Bodies 
    
   NOTIFY requests MUST contain a Key-Event message body if the 
   associated device, dialog or conversation space of the subscription 
   is in an active state.  Conversely, the lack of a message body in a 
   NOTIFY request with a non-zero Subscription-Expires header value 
   indicates that the Key-Event subscription state is pending (for 
   example, awaiting authorization or for the associated dialog to 
   become active).  NOTIFY responses do not contain a message body.  
   The Content-Type for the Key-Event message body is "application/key-
   event".  The grammatical specifications for the message body are 
   defined in section 8. 
    
16.6.     Notifier Processing of SUBSCRIBE Requests 
    
   The Notifier takes the following basic steps: 
    
   1. Before processing a received SUBSCRIBE request a state-agent MUST 
   check that the subscriber is authorized to perform the requested 
   subscription (c.f., Section 18 and [2]). 
    
   2. If the SUBSCRIBE includes an instance-header in the key-event 
   message body then the Notifier MUST check that the dialog exists and 
   if not, take action as described in section 15. 
    
   3. The SUBSCRIBE message body is parsed for consistency and a 
   SUBSCRIBE response is generated as described in [2]. 
    
   4. The state-agent will then clear existing Key-Event subscription 
   state for this subscription and proceed to generate a Key-Event 
   Session Response message body in a NOTIFY request as described in 
   Section 16.7.1. 
 
Culpepper/Cuninghame/Mule                                     [Page 29] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   5. If the value of the SUBSCRIBEÆs Expires header is non-zero then 
   the new subscription state information is stored. 
    
16.7.     Notifier Generation of NOTIFY Requests 
    
   This section describes both the generation of NOTIFY requests when 
   the subscription is established or modified by the Notifier, and 
   when reporting state changes in the subscribed resource. 
 
16.7.1. Generating Initial NOTIFY Requests 
    
   The Initial NOTIFY request is generated when the subscription state 
   initially transitions to "active" or a subsequent SUBSCRIBE message 
   is received by the Notifier. The initial NOTIFY request may only 
   contain a Session Response message body which is generated in 
   response to the accepted SUBSCRIBE request (although it need not be 
   generated immediately). The Initial NOTIFY request always reports 
   complete state information and can be differentiated from a NOTIFY 
   reporting a change in state by the presence of the event-header in 
   the Key-Event message body.  
    
   If the SUBSCRIBE request did not contain a Key-Event message body 
   (which infers that the request also has an "Expires: 0" header) then 
   the resulting NOTIFY request will also not have a Key-Event message 
   body.  If the SUBSCRIBE request does contain a Session Request 
   message body but has a "Expires: 0" SIP header then an Initial 
   NOTIFY Session Response request is still generated however the 
   subscription is not kept after the Initial NOTIFY request is sent.   
    
   The Key-Event Session Request message body in the Initial NOTIFY 
   request contains the following information: 
   - A confirmation of the subscribed key-events (event-header). 
   - The result of all key-event property evaluations (properties-
     header). 
   - The initial state of subscribed key-events that have a non-default 
     state (state-header). 
    
16.7.2. Generating Subsequent NOTIFY Requests 
    
   NOTIFY requests that are not generated in response to an accepted 
   SUBSCRIBE request MAY include a Key-Event Notification message body 
   to indicate a change in key-event state. 
    
   Once a NOTIFY request with an application/key-event message body has 
   been sent, further "key-event" NOTIFY messages can be delayed until 
   a final response is received for the NOTIFY request.  Thus, the key-
   event state-header MAY contain multiple key-state changes. 
    
16.8.     Subscriber Processing of NOTIFY Requests 
    


 
Culpepper/Cuninghame/Mule                                     [Page 30] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   The NOTIFY response is generated as described in [2].  NOTIFY 
   responses do not contain key-event Event message bodies. 
    
16.9.     Subscriber Generation of SUBSCRIBE Requests 
    
   The SUBSCRIBE request for "key-event" SIP events is generated as 
   described in [2] with the following clarifications: 
     . the Event header is set to "Event: key-event". 
     . the Content-Type header is set to "Content-Type: 
       application/key-event" if a Key-Event message body is included. 
     . if dialog specific subscription is required then the instance-
       header is added to the Key-Event message body as described in 
       section 13.2. 
    
   The event-header will contain the list of desired key-events to 
   receive notifications for and MAY include wildcards.  The 
   properties-header will contain the set of key-event properties for 
   which the subscriber wishes to set or retrieved the value of. 
    
   A new "key-event" SUBSCRIBE request for an existing subscription 
   dialog will entirely replace the subscription state of previous 
   SUBSCRIBE requests in that dialog. 
    
   If the SIP Expires header has a value of zero then the subscriber 
   application can still always expect at least one further NOTIFY 
   request to be sent by the Notifier (as described in [2]).  
    
   When using the "key-event" package, if the SIP Expires header does 
   not have a value of zero then the subscriber application MUST 
   include a Key-Event message body. 
    
16.10.        Pre-loaded Routes in SUBSCRIBE requests 
    
   The following section applies only to dialog-specific subscriptions 
   where the subscriber application is located along the associated 
   INVITE dialog signaling path and wishes to collect key-events from 
   one of the User Agent endpoints. 
    
   In order to maximize the likelihood that a SUBSCRIBE request will 
   successfully reach the desired User Agent, it is RECOMMENDED the 
   subscriber place pre-loaded Route headers in the SUBSCRIBE request 
   to reproduce any Record-Routes established in the associated INVITE 
   dialog.  The presence of record-routed Application Level Gateways 
   controlling firewalls and/or NATÆs is a typical example of when this 
   may be helpful. 
    
   When the subscriber wishes to send a SUBSCRIBE request to the 
   caller, the Route set is constructed (in the manner that the callee 
   would normally use) from the Record-Route and Contact headers in the 
   original INVITE request. 
    


 
Culpepper/Cuninghame/Mule                                     [Page 31] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   When the subscriber wishes to send a SUBSCRIBE request to the 
   callee, the Route set is constructed (in the manner that the caller 
   would normally use) from the Record-Route and Contact headers in the 
   original 200 OK INVITE response.  However in the case where the 
   subscriber application is acting as a proxy in the original INVITE 
   dialog (c.f., Usage Scenario 2, Section 2.2.2), then the subscriber 
   should ignore all Record-Route headers up to and including the 
   Record-Route inserted by the subscriber application in the 200 OK 
   INVITE response. 
    
16.11.        Handling of Forked Subscriptions 
    
   A SUBSCRIBE request may fork and arrive at multiple devices.  In 
   this case, the subscriber can terminate those subscriptions it 
   wishes by sending a SUBSCRIBE with an Expires value set to 0.  It 
   can also respond to any NOTIFYs from a UA with a 481 Transaction 
   Does Not Exist. 
    
   If the subscriber wishes to accept multiple subscriptions, merging 
   of state is not defined due to the fact that the multiple 
   subscriptions represent the state of multiple devices. 
    
   A Notifier SHOULD return 482 Request Merged response to subsequent 
   multiple subscriptions having the same SUBSCRIBE request transaction 
   id (even if they have differing request-uriÆs). 
    
16.12.        Rate of Notifications 
    
   The use of the Key Events packages should be limited to situations 
   that require limited amount of data to be transported.  As each key 
   press can cause a notification (and response) to be sent, this 
   mechanism is inefficient in scenarios where a significant amount of 
   data is to be transferred between two endpoints.  However, as key 
   event packages are designed to transport user indications, the rate 
   of notifications should not be much more than ten per second nor 
   more than 10 to 20 events at a time. 
    
17.  Examples 
    
   In the example call flow below, an application server subscribes to 
   the status of a caller's keypad events.  NOTIFY requests are sent 
   for two key presses, in addition to the initial NOTIFY indicating 
   those key-events the Notifier supports and their initial state.  Via 
   headers are omitted for clarity. 
        
            Subscriber              Notifier 
                |                       | 
                |  F1: SUBSCRIBE        | 
                |---------------------->| 
                |  F2: 200 OK           | 
                |<----------------------| 
                |                       | 
                |  F3: NOTIFY           |    Init. State: '*' key down 
 
Culpepper/Cuninghame/Mule                                     [Page 32] 

Internet Draft           SIP Key Events Package           March 1, 2002 

                |<----------------------|     
                |  F4: 200 OK           | 
                |---------------------->| 
                |                       | 
                |  F5: NOTIFY           |    'A' key pressed and 
                |<----------------------|         released quickly 
                |  A6: 200 OK           | 
                |---------------------->| 
                |                       | 
                |  F5: NOTIFY           |    '1' key depressed 
                |<----------------------|     
                |  A6: 200 OK           | 
                |---------------------->| 
                |                       | 
                |  F7: NOTIFY           |    '*' key released 
                |<----------------------| 
                |  F8: 200 OK           | 
                |---------------------->| 
                |                       | 
                |  F9: NOTIFY           |    '1' key released 
                |<----------------------| 
                |  F10: 200 OK          | 
                |---------------------->| 
                |                       | 
                |  F11: (un)SUBSCRIBE   | 
                |---------------------->| 
                |  F12: 200 OK          | 
                |<----------------------| 
                |                       | 
                |  F13: NOTIFY          | 
                |<----------------------| 
                |  F14: 200 OK          | 
                |---------------------->| 
                |                       | 
    
   F1: Subscriber -> Notifier 
        
   SUBSCRIBE sip:caller@access-22.isp.net SIP/2.0  
   To: <sip:caller@isp.net>  
   From: <sip:appl@appsrv.sp.com>;tag=2356  
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 2 SUBSCRIBE  
   Contact: <sip:appl@appsrv.sp.com>  
   Event: key-event 
   Expires: 3600 
   Content: application/key-event  
   Content-Length: xx 
    
   t: 36539655 1 
   i: call-id=8347-da8d-7657-ab32@192.144.22.1; local-tag=2342354556; 
   remote-tag=00993k23ff8; attach=cspace 
   e: key, keybd 
   p: *.exists(), *.dwndly(1000) 
 
Culpepper/Cuninghame/Mule                                     [Page 33] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   The subscriber is requesting all key and keyboard sub-package key-
   events and also requesting to know the presence of multiple key 
   instances and a delay in keydown notification of 1000ms. 
    
   F2: Notifier -> Subscriber   
        
   SIP/2.0 200 OK 
   To: <sip:caller@isp.net>;tag=789  
   From: <sip:appl@appsrv.sp.com>;tag=2356  
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 2 SUBSCRIBE  
   Contact: <sip:caller@isp.net> 
   Expires: 3600 
   Content-Length: 0  
    
   F3: Notifier -> Subscriber 
        
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 403 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Event: key-event 
   Content: application/key-event 
   Content-Length: xx 
    
   t: 36539658 1 
   e: key[@dialpad, 65-68] 
   p: key[@dialpad, 65-68].dwndly(1000) 
   s: key[42].keydown(-1902) 
    
   The Notifier confirms subscribed key-events and property values 
   along with non-default initial key-event states.  In this example 
   the Notifier has created a subscription for keys { '0' - '9', '*', 
   '#', 'A' - 'D' } and confirms that the dwndly property has been set.  
   All keys except '*' are in the default (keyup) state; '*' has been 
   depressed since 1.902 seconds before the specified NTP time value, 
   that is, the key was depressed at 36539656.098 seconds past the 
   epoch.  No multiple key instances exist. 
    
   F4: Subscriber -> Notifier 
        
   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 403 NOTIFY  
   Content-Length: 0  
    
    
   F5: Notifier -> Subscriber 
 
Culpepper/Cuninghame/Mule                                     [Page 34] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 404 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Event: key-event 
   Content: application/key-event 
   Content-Length: xx 
    
   t: 36539663 2 
   s: key[65].keyup(17, 537) 
    
   The Notifier reports that the 'A' key has been pressed and released.  
   As the duration of depression was less that 1000ms, only the keyup 
   state indication has been generated.  In this case, the depression 
   can be determined to have started at time 36539662.480 and lasted 
   for 537ms. 
    
   F6: Subscriber -> Notifier 
    
   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 404 NOTIFY  
   Content-Length: 0 
    
    
   F7: Notifier -> Subscriber 
    
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 405 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Event: key-event 
   Content: application/key-event 
   Content-Length: xx 
    
   t: 36539668 2 
   s: key[49].keydown(-987) 
    
   The Notifier reports that the '1' key was pressed at time 
   36539667.13.  The keydown has been generated because the key has 
   been depressed for more than 1000ms.  In this example the NOTIFY 
   request was actually generated at time 36539668.13 which explains 
   the -987ms offset from the NTP time. 
    
   F8: Subscriber -> Notifier 
    
 
Culpepper/Cuninghame/Mule                                     [Page 35] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 405 NOTIFY  
   Content-Length: 0 
    
    
   F9: Notifier -> Subscriber 
    
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 406 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Event: key-event 
   Content: application/key-event 
   Content-Length: xx 
    
   t: 36539669 3 
   s: key[42].keyup(756, 13658) 
    
   This notification indicates that the '*' key has eventually been 
   released at time 36539669.756.  The duration of depression is 13658 
   milliseconds; this value is consistent with the time of depression 
   indicated in the initial (keydown) state indication of message F3. 
    
   F10: Subscriber -> Notifier 
    
   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 406 NOTIFY  
   Content-Length: 0 
    
    
   F11: Notifier -> Subscriber 
    
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 407 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Event: key-event 
   Content: application/key-event 
   Content-Length: xx 
    
   t: 36539672 4 
   e: key 
   p: key[49].keyup(154, 5141) 
 
Culpepper/Cuninghame/Mule                                     [Page 36] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   This notification indicates that the '1' key has been released at 
   time 36539672.154.  The duration of depression is 5141 milliseconds; 
   this value is consistent with the time of depression indicated in 
   the (keydown) state indication of message F7. 
    
   F12: Subscriber -> Notifier 
    
   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 407 NOTIFY  
   Content-Length: 0 
    
    
   F13: Subscriber -> Notifier 
        
   SUBSCRIBE sip:caller@access-22.isp.net SIP/2.0  
   To: <sip:caller@isp.net>;tag=789  
   From: <sip:appl@appsrv.sp.com>;tag=2356  
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 3 SUBSCRIBE 
   Contact: <sip:appl@appsrv.sp.com>  
   Event: key-event 
   Expires: 0 
   Content-Length: 0 
    
    
   The subscriber indicates it wishes to terminate the subscription. 
    
   F14: Notifier -> Subscriber   
        
   SIP/2.0 200 OK 
   To: <sip:caller@isp.net>;tag=789  
   From: <sip:appl@appsrv.sp.com>;tag=2356  
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 3 SUBSCRIBE  
   Contact: <sip:caller@isp.net> 
   Expires: 0 
   Content-Length: 0  
    
   F15: Notifier -> Subscriber 
    
   NOTIFY sip:appl@appsrv.sp.com SIP/2.0  
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 408 NOTIFY 
   Contact: <sip:caller@isp.net> 
   Subscription-Expires: 0 
   Content-Length: 0 
    
 
Culpepper/Cuninghame/Mule                                     [Page 37] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
   As described in [1], the Notifier must always send one NOTIFY 
   request in response to any accepted SUBSCRIBE request. 
    
   F16: Subscriber -> Notifier 
    
   SIP/2.0 200 OK 
   To: <sip:appl@appsrv.sp.com>;tag=2356 
   From: <sip:caller@isp.net>;tag=789 
   Call-Id: 321123@appsrv.sp.com  
   CSeq: 408 NOTIFY  
   Content-Length: 0 
    
    
18.  Security Considerations 
    
   Key-Event Subscriptions are very likely to reveal sensitive 
   information such as pin-numbers and destination numbers.  Therefore, 
   it is REQUIRED that devices accepting SUBSCRIBE requests perform 
   some level of authentication before establishing a subscription.  
   When such authentication is not provided by the network layer (e.g., 
   IPSEC or private/trusted networks), then it MUST be provided by the 
   transport-layer (e.g., TLS) or application-layer (e.g., SIP 
   message/header authentication). 
    
   Likewise, the information provided in the NOTIFY request is also 
   likely to contain sensitive information and so the Notifier MUST 
   ensure that the NOTIFY requests are transported securely.  Once 
   again, this protection could be provided by the network-layer (e.g., 
   IPSEC encryption or private networks), transport layer (e.g., TLS 
   encryption) or application layer (e.g., S/MIME or SIP message body 
   encryption). 
    
   Alternatively, it is possible for the Notifier to allow 
   unsecured/unauthenticated subscribers to subscribe to key-events 
   that will not divulge sensitive information.  For instance, 
   subscriptions to the "*" and "#" keys should not divulge sensitive 
   information but may provide sufficient functionality for some 
   3pcc/B2BUA pre-paid calling card applications. 
    
19.  IANA Considerations 
    
   Section 12 provides the registration information needed to register 
   the "application/key-event" MIME type with IANA. 
    
19.1.     Key-Event Package Registration 
    
   This document specifies an event package as defined in [2].  The 
   following information is specified as required by "SIP-Specific 
   Event Notification" [RFC xxxx]. 
    
   Package Name: key-events 
   Type: package 

 
Culpepper/Cuninghame/Mule                                     [Page 38] 

Internet Draft           SIP Key Events Package           March 1, 2002 

   Contact: Robert Fairlie-Cuninghame <rfairlie@nuera.com>, Bert 
   Culpepper <bert.culpepper@intervoice-brite.com>, Jean-Francois Mule 
   <jf.mule@cablelabs.com> 
    
19.2.     Key-Event Sub-Package Registration 
    
   This document defines a Key-Event Sub-Package namespace that should 
   be maintained by a centralized coordinating organization.  Sub-
   Package names share the same namespace.  The following Key-Event 
   Sub-Package registration information is specified in anticipation of 
   the mechanisms and namespace defined in this document being accepted 
   in the IETF. 
    
   Sub-Package Name     Contact           Reference 
   ----------------     ------------      --------------- 
   Key                  [RFC,BC,JFM]      [RFC xxxx] 
   Keyboard             [RFC,BC,JFM]      [RFC xxxx] 
   Telephone            [RFC,BC,JFM]      [RFC xxxx] 
   User                 [RFC,BC,JFM]      [RFC xxxx] 
    
   People: 
   [RFC] Robert Fairlie-Cuninghame <rfairlie@nuera.com> 
   [BC] Bert Culpepper <bert.culpepper@intervoice-brite.com> 
   [JFM] Jean-Francois Mule <jf.mule@cablelabs.com> 
    
   References: 
   [RFC xxxx] B. Culpepper, R. Fairlie-Cuninghame, J. Mule, "SIP Event 
   Package for Keys", March 2002. 
    
   Guidelines for registering key event packages with IANA will be 
   completed in a future draft revision. 
    
20.  Authors 
    
   Robert Fairlie-Cuninghame 
   Nuera Communications, Inc. 
   50 Victoria Rd 
   Farnborough, Hants GU14-7PG 
   United Kingdom 
   Phone: +44-1252-548200 
   Email: rfairlie@nuera.com 
    
   Bert Culpepper 
   InterVoice-Brite, Inc. 
   701 International Parkway 
   Heathrow, FL  32746 
   Phone: 407-357-1536 
   Email: bert.culpepper@intervoice-brite.com 
    
   Jean-Francois Mule 
   Cable Television Laboratories, Inc. 
   400 Centennial Parkway 
   Louisville, CO 80027-1266 
   Phone: 303-661-3708 
   Email: jf.mule@cablelabs.com 

 
Culpepper/Cuninghame/Mule                                     [Page 39] 

Internet Draft           SIP Key Events Package           March 1, 2002 

    
21.  References 
     
                     
   1  S. Bradner, "The Internet Standards Process -- Revision 3", BCP 
      9, RFC 2026, October 1996. 
    
   2  A. Roach, "SIP-Specific Event Notification", Internet-Draft 
      draft-ietf-sip-events-04, February 2002, Work in progress. 
    
   3  M. Handley, H. Schulzrinne, E. Schooler, and J. Rosenberg, "SIP: 
      Session Initiation Protocol", RFC 2543, March 1999. 
    
   4  H. Schulzrinne, S. Petrack, "RTP Payload for DTMF Digits, 
      Telephony Tones and Telephony Signals", RFC 2833, May 2000. 
    
   5  R. Mahy, "A Call Control Model for SIP", Internet-Draft, November 
      2001, Work in progress. 
    
   6  D. Mills, "Network Time Protocol (Version 3)", RFC1305, March 
      1992. 
    
   7  The Unicode Consortium, "The Unicode Standard -- Version 3.0", 
      ISBN 0-201-61633-5. Described at 
      http://www.unicode.org/unicode/standard/versions/Unicode3.0.html 
    

































 
Culpepper/Cuninghame/Mule                                     [Page 40]