5. Further Examples
5.1. Example with "source" and "priority" URNs
Now consider an example where the UA can signal "external source", "internal source", "low priority", and "high priority" individually or in any combination of source and priority, along with a default signal. This example is essentially the Cartesian product of two copies of the example in Section 4: one dealing with the call's source and one dealing with the call's priority. So there are a total of 9 signals: Signal URN(s) ---------------------------- ------------------------------- default (none) external source urn:alert:source:external internal source urn:alert:source:internal low priority urn:alert:priority:low low priority/external source urn:alert:priority:low, urn:alert:source:external low priority/internal source urn:alert:priority:low, urn:alert:source:internal high priority urn:alert:priority:high high priority/external source urn:alert:priority:high, urn:alert:source:external high priority/internal source urn:alert:priority:high, urn:alert:source:internal The expressed URNs are: urn:alert:source:external urn:alert:source:internal urn:alert:priority:low urn:alert:priority:high
The relevant categories of "alert" URNs are only:
source
priority
The alphabet of symbols is:
Source
Source:External
Source:Internal
Source:Other
Priority
Priority:Low
Priority:High
Priority:Other
The 16 states are as follows, where 9 states are "sink" states from
which no further information can be recorded, as all transitions from
the state lead to itself.
State: Priority/Source
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source
Priority:High -> Priority:High/Source
Priority:Low -> Priority:Low/Source
Source:Other -> Priority/Source:(Other)
Source:External -> Priority/Source:External
Source:Internal -> Priority/Source:Internal
State: Priority:(Other)/Source
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source
Priority:High -> Priority:(Other)/Source
Priority:Low -> Priority:(Other)/Source
Source:Other -> Priority:(Other)/Source:(Other)
Source:External -> Priority:(Other)/Source:External
Source:Internal -> Priority:(Other)/Source:Internal
State: Priority:(Other)/Source:(Other)
Signal: default
Transitions:
any -> Priority:(Other)/Source:(Other)
State: Priority:(Other)/Source:External
Signal: external source
Transitions:
any -> Priority:(Other)/Source:External
State: Priority:(Other)/Source:Internal
Signal: internal source
Transitions:
any -> Priority:(Other)/Source:Internal
State: Priority:High/Source
Signal: high priority
Transitions:
Priority:Other -> Priority:High/Source
Priority:High -> Priority:High/Source
Priority:Low -> Priority:High/Source
Source:Other -> Priority:High/Source:(Other)
Source:External -> Priority:High/Source:External
Source:Internal -> Priority:High/Source:Internal
State: Priority:High/Source:(Other)
Signal: high priority
Transitions:
any -> Priority:High/Source:(Other)
State: Priority:High/Source:External
Signal: high priority/external source
Transitions:
any -> Priority:High/Source:External
State: Priority:High/Source:Internal
Signal: high priority/internal source
Transitions:
any -> Priority:High/Source:Internal
State: Priority:Low/Source
Signal: low priority
Transitions:
Priority:Other -> Priority:Low/Source
Priority:High -> Priority:Low/Source
Priority:Low -> Priority:Low/Source
Source:Other -> Priority:Low/Source:(Other)
Source:External -> Priority:Low/Source:External
Source:Internal -> Priority:Low/Source:Internal
State: Priority:Low/Source:(Other)
Signal: low priority
Transitions:
any -> Priority:Low/Source:(Other)
State: Priority:Low/Source:External
Signal: low priority/external source
Transitions:
any -> Priority:Low/Source:External
State: Priority:Low/Source:Internal
Signal: low priority/internal source
Transitions:
any -> Priority:Low/Source:Internal
State: Priority/Source:(Other)
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source:(Other)
Priority:High -> Priority:High/Source:(Other)
Priority:Low -> Priority:Low/Source:(Other)
Source:Other -> Priority/Source:(Other)
Source:External -> Priority/Source:(Other)
Source:Internal -> Priority/Source:(Other)
State: Priority/Source:External
Signal: external source
Transitions:
Priority:Other -> Priority:(Other)/Source:External
Priority:High -> Priority:High/Source:External
Priority:Low -> Priority:Low/Source:External
Source:Other -> Priority/Source:External
Source:External -> Priority/Source:External
Source:Internal -> Priority/Source:External
State: Priority/Source:Internal
Signal: internal source
Transitions:
Priority:Other -> Priority:(Other)/Source:Internal
Priority:High -> Priority:High/Source:Internal
Priority:Low -> Priority:Low/Source:Internal
Source:Other -> Priority/Source:Internal
Source:External -> Priority/Source:Internal
Source:Internal -> Priority/Source:Internal
An example of processing that involves multiple "source" URNs and one
"priority" URN:
Alert-Info: <urn:alert:source:internal>,
<urn:alert:source:unclassified>,
<urn:alert:priority:high>
in which case processing progresses:
State: Source/Priority
Process: Source:Internal (urn:alert:source:internal)
State: Source:Internal/Priority
Process: Source:(Other) (urn:alert:source:unclassified)
State: Source:Internal/Priority
Process: Priority:High (urn:alert:priority:high)
State: Source:Internal/Priority:High
Signal: internal source/high priority
5.2. Example 1 of RFC 7462
A more complicated example is provided in Section 12.2.1 of
[RFC7462]. It is like the example in Section 5.1 of this document,
except that the UA can only signal "external source", "internal
source", "low priority", and "high priority" individually but not in
combination, as well as a default signal:
Signal URN(s)
---------------------------- -------------------------------
default (none)
internal source urn:alert:source:external
external source urn:alert:source:internal
low priority urn:alert:priority:low
high priority urn:alert:priority:high
The signals can express the following URNs:
urn:alert:source:external
urn:alert:source:internal
urn:alert:priority:low
urn:alert:priority:high
The relevant categories of "alert" URNs are:
source
priority
The alphabet of symbols is:
Source
Source:External
Source:Internal
Source:Other
Priority
Priority:Low
Priority:High
Priority:Other
In this example, the FSM has 20 states because both "source" and
"priority" URNs are recorded, but the order in which the two appear
affects the signal:
State: Priority/Source
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source
Priority:High -> Priority:High/Source
Priority:Low -> Priority:Low/Source
Source:Other -> Priority/Source:(Other)
Source:External -> Priority/Source:External
Source:Internal -> Priority/Source:Internal
State Priority:(Other)/Source can transition to states that can
signal the source, because the recorded priority can't be signaled
and thus does not block the signaling of the source:
State: Priority:(Other)/Source
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source
Priority:High -> Priority:(Other)/Source
Priority:Low -> Priority:(Other)/Source
Source:Other -> Priority:(Other)/Source:(Other)
Source:External -> Priority:(Other)/Source:External
Source:Internal -> Priority:(Other)/Source:Internal
State: Priority:(Other)/Source:(Other)
Signal: default
Transitions:
any -> Priority:(Other)/Source:(Other)
State: Priority:(Other)/Source:External
Signal: external source
Transitions:
any -> Priority:(Other)/Source:External
State: Priority:(Other)/Source:Internal
Signal: internal source
Transitions:
any -> Priority:(Other)/Source:Internal
Because there are no signals for combinations of "source" and
"priority" URNs, processing a "source" URN from the state
Priority:High/Source leads to a state that records the priority
information but does not signal it:
State: Priority:High/Source
Signal: high priority
Transitions:
Priority:Other -> Priority:High/Source
Priority:High -> Priority:High/Source
Priority:Low -> Priority:High/Source
Source:Other -> Priority:High/Source:(Other)
Source:External -> Priority:High/Source:(External)
Source:Internal -> Priority:High/Source:(Internal)
State: Priority:High/Source:(Other)
Signal: high priority
Transitions:
any -> Priority:High/Source:(Other)
From the state Priority:High/Source, "source" URNs transition to
states that record both source and priority but signal only priority,
one of which is Priority:High/Source:(External). But from
Priority/Source:External, the symbol Priority:High transitions to the
state Priority:(High)/Source:External, which records the same
information but signals the source, not the priority. One state is
reached by processing a "priority" URN and then a "source" URN,
whereas the other is reached by processing a "source" URN and then a
"priority" URN.
State: Priority:High/Source:(External)
Signal: high priority
Transitions:
any -> Priority:High/Source:(External)
State: Priority:High/Source:(Internal)
Signal: high priority
Transitions:
any -> Priority:High/Source:(Internal)
and similarly for Priority:Low/Source:
State: Priority:Low/Source
Signal: low priority
Transitions:
Priority:Other -> Priority:Low/Source
Priority:High -> Priority:Low/Source
Priority:Low -> Priority:Low/Source
Source:Other -> Priority:Low/Source:(Other)
Source:External -> Priority:Low/Source:(External)
Source:Internal -> Priority:Low/Source:(Internal)
State: Priority:Low/Source:(Other)
Signal: low priority
Transitions:
any -> Priority:Low/Source:(Other)
State: Priority:Low/Source:(External)
Signal: low priority
Transitions:
any -> Priority:Low/Source:(External)
State: Priority:Low/Source:(Internal)
Signal: low priority
Transitions:
any -> Priority:Low/Source:(Internal)
State: Priority/Source:(Other)
Signal: default
Transitions:
Priority:Other -> Priority:(Other)/Source:(Other)
Priority:High -> Priority:High/Source:(Other)
Priority:Low -> Priority:Low/Source:(Other)
Source:Other -> Priority/Source:(Other)
Source:External -> Priority/Source:(Other)
Source:Internal -> Priority/Source:(Other)
State: Priority/Source:External
Signal: external source
Transitions:
Priority:Other -> Priority:(Other)/Source:External
Priority:High -> Priority:(High)/Source:External
Priority:Low -> Priority:(Low)/Source:External
Source:Other -> Priority/Source:External
Source:External -> Priority/Source:External
Source:Internal -> Priority/Source:External
State: Priority:(High)/Source:External
Signal: external source
Transitions:
any -> Priority:(High)/Source:External
State: Priority:(Low)/Source:External
Signal: external source
Transitions:
any -> Priority:(Low)/Source:External
State: Priority/Source:Internal
Signal: internal source
Transitions:
Priority:Other -> Priority:(Other)/Source:Internal
Priority:High -> Priority:(High)/Source:Internal
Priority:Low -> Priority:(Low)/Source:Internal
Source:Other -> Priority/Source:Internal
Source:External -> Priority/Source:Internal
Source:Internal -> Priority/Source:Internal
State: Priority:(High)/Source:Internal
Signal: internal source
Transitions:
any -> Priority:(High)/Source:Internal
State: Priority:(Low)/Source:Internal
Signal: internal source
Transitions:
any -> Priority:(Low)/Source:Internal
As an example of processing, if the UA receives
Alert-Info: <urn:alert:source:internal>
then processing progresses:
State: Priority/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority/Source:Internal
Signal: internal source
A more complicated example involves multiple "source" URNs that do
not select a non-default signal and one "priority" URN that can be
signaled:
Alert-Info: <urn:alert:source:unclassified>,
<urn:alert:source:internal>,
<urn:alert:priority:high>
in which case processing progresses:
State: Priority/Source
Process: Source:Other (urn:alert:source:unclassified)
State: Priority/Source:(Other)
Process: Source:Internal (urn:alert:source:internal)
State: Priority/Source:(Other)
Process: Priority:High (urn:alert:priority:high)
State: Priority:High/Source:(Other)
Signal: high priority
The only output of the FSM is the state's signal. Based on this,
several groups of states in this FSM can be merged using standard FSM
optimization algorithms:
states with signal "high priority":
Priority:High/Source
Priority:High/Source:(Other)
Priority:High/Source:(External)
Priority:High/Source:(Internal)
states with signal "low priority":
Priority:Low/Source
Priority:Low/Source:(Other)
Priority:Low/Source:(External)
Priority:Low/Source:(Internal)
states with signal "external source":
Priority/Source:External
Priority:(High)/Source:External
Priority:(Low)/Source:External
Priority:(Other)/Source:External
states with signal "internal source":
Priority/Source:Internal
Priority:(High)/Source:Internal
Priority:(Low)/Source:Internal
Priority:(Other)/Source:Internal
This reduces the FSM to eight states:
Priority/Source
Priority:(Other)/Source
Priority:(Other)/Source:(Other)
Priority:High/Source [aggregated]
Priority:Low/Source [aggregated]
Priority/Source:(Other)
Priority/Source:External [aggregated]
Priority/Source:Internal [aggregated]
5.3. Examples 2, 3, and 4 of RFC 7462
Examples 2, 3, and 4 of [RFC7462] are similar to the example in
Section 5.1 of this document, but they do not include a signal for
the combination "internal source, low priority" to make resolution
examples work asymmetrically.
The FSM for this example has the same alphabet as the FSM of
Section 5.1. Most of the states of this FSM are the same as the
states of the FSM of Section 5.1, but the state
Source:Internal/Priority:Low is missing because there is no signal
for that combination. It is replaced by two states:
1. One state is Source:Internal/Priority:(Low); it records that
Source:Internal was specified first (and is to be signaled) and
that Priority:Low was specified later (and cannot be signaled --
but it still prevents any further "priority" URNs from having an
effect).
2. The other state is Source:(Internal)/Priority:Low; it records the
reverse sequence of events.
The changes in the FSM are:
State: Priority:Low/Source
Signal: low priority
Transitions:
Source:Internal -> Priority:Low/Source:(Internal)
(other transitions unchanged)
State: Priority:Low/Source:(Internal)
Signal: low priority
Transitions:
any -> Priority:Low/Source:(Internal)
State: Priority/Source:Internal
Signal: internal source
Transitions:
Priority:Low -> Priority:(Low)/Source:Internal
(other transitions unchanged)
State: Priority:(Low)/Source:Internal
Signal: internal source
Transitions:
any -> Priority:(Low)/Source:Internal
An example of processing that involves multiple "source" URNs and one
"priority" URN:
Alert-Info: <urn:alert:source:internal>,
<urn:alert:source:unclassified>,
<urn:alert:priority:high>
then processing progresses:
State: Priority/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority/Source:Internal
Process: Source:Other (urn:alert:source:unclassified)
State: Priority/Source:Internal
Process: Priority:High (urn:alert:priority:high)
State: Priority:High/Source:Internal
Signal: internal source/high priority
If the UA receives
Alert-Info: <urn:alert:source:internal>
then processing progresses:
State: Priority/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority/Source:Internal
Signal: internal source
If the UA receives
Alert-Info: <urn:alert:source:external>,
<urn:alert:priority:low>
then processing progresses:
State: Priority/Source
Process: Source:External (urn:alert:source:external)
State: Priority/Source:External
Process: Priority:Low (urn:alert:priority:low)
State: Priority:Low/Source:External
Signal: external source/low priority
Suppose the same UA receives
Alert-Info: <urn:alert:source:internal>,
<urn:alert:priority:low>
Note that there is no signal that corresponds to this combination.
In that case, the processing is:
State: Priority/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority/Source:Internal
Process: Priority:Low (urn:alert:priority:low)
State: Priority:(Low)/Source:Internal
Signal: internal source
If the order of the URNs is reversed, what is signaled is the meaning
of the now-different first URN:
Alert-Info: <urn:alert:priority:low>,
<urn:alert:source:internal>
State: Priority/Source
Process: Priority:Low (urn:alert:priority:low)
State: Priority:Low/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority:Low/Source:(Internal)
Signal: low priority
Notice that the existence of the new states prevents later URNs of a
category from overriding earlier URNs of that category, even if the
earlier one was not itself signalable and the later one would be
signalable in the absence of the earlier one:
Alert-Info: <urn:alert:priority:low>,
<urn:alert:source:internal>,
<urn:alert:source:external>
State: Priority/Source
Process: Priority:Low (urn:alert:priority:low)
State: Priority:Low/Source
Process: Source:Internal (urn:alert:source:internal)
State: Priority:Low/Source:(Internal)
Process: Source:External (urn:alert:source:external)
State: Priority:Low/Source:(Internal)
Signal: low priority
This situation shows the necessity of states whose labels contain
parentheses. If the second transition had been to the state
Priority:Low/Source (on the basis that there is no proper state
Priority:Low/Source:Internal), then the third transition would have
been to the state Priority:Low/Source:External, and the signal would
have been "external source/low priority".
5.4. An Example That Subsets Internal Sources
In the example of Section 4, there are signals for "external source"
and "internal source". Let us add to that example a signal for
"source internal from a VIP (Very Important Person)". That last
signal expresses the private extension URN
urn:alert:source:internal:vip@example, which is a subset of
urn:alert:source:internal, which is expressed by the "source
internal" signal. There are a total of three expressed URNs, one of
which is a subset of another:
urn:alert:source:internal
urn:alert:source:internal:vip@example
urn:alert:source:external
This generates the following alphabet of symbols, which includes two
"Other" symbols for the "source" category:
Source
Source:Internal
Source:Internal:Vip@example
Source:Internal:Other
Source:Other
5.5. An Example of "alert:service" URNs
In this example, there are signals for "service forward" (the call has been forwarded) and "source recall callback" (a recall due to a callback). This gives two expressed URNs: urn:alert:service:forward urn:alert:service:recall:callback This generates the following alphabet of symbols. Note that there are two "Other" symbols, because the "alert:service" URNs have an additional level of qualification. Service Service:Forward Service:Recall Service:Recall:Callback Service:Recall:Other Service:Other5.6. An Example Using Country Codes
In this example, we consider how a UA generates ringback signals when the UA wishes to reproduce the traditional behavior where the caller hears the ringback signals defined by the telephone service in the callee's country rather than the ringback signals defined by the service in the caller's country. In the Alert-Info header field of the 180 (Ringing) provisional response, we assume that the called UA provides an "alert:country" URN [RFC7462] containing the ISO 3166-1 [ISO-3166-1] alpha-2 country code of the callee's country. The UA has a default signal and a "non-country" signal for urn:alert:service:call-waiting. For the example country with code "XA", the UA has a default signal and signals for urn:alert:service:call-waiting and urn:alert:service:forward. For the example country with code "XB", the UA has a default signal and a signal for urn:alert:service:forward. These inconsistencies between the non-country signals and the country signals are chosen to demonstrate the flexibility of the construction method, showing that three systems of signals can be combined correctly even when the systems were established without coordination between them.
The signals are:
Signal URN(s)
-------------------------- ----------------------------------
default (none)
call-waiting urn:alert:service:call-waiting
XA default urn:alert:country:xa
XA call-waiting urn:alert:country:xa,
urn:alert:service:call-waiting
XA forward urn:alert:country:xa,
urn:alert:service:forward
XB default urn:alert:country:xb
XB forward urn:alert:country:xb,
urn:alert:service:forward
The expressed URNs are:
urn:alert:country:xa
urn:alert:country:xb
urn:alert:service:call-waiting
urn:alert:service:forward
The relevant categories of "alert" URNs are only:
country
service
The alphabet of symbols is:
Country
Country:[other]
Country:Xa
Country:Xb
Service
Service:[other]
Service:Call-waiting
Service:Forward
The 17 states are as follows:
State: 0 Country/Service
Signal: default
Transitions:
Country:[other] -> 1 Country:([other])/Service
Country:Xa -> 5 Country:Xa/Service
Country:Xb -> 9 Country:Xb/Service
Service:[other] -> 13 Country/Service:([other])
Service:Call-waiting -> 14 Country/Service:Call-waiting
Service:Forward -> 16 Country/Service:(Forward)
State: 1 Country:([other])/Service
Signal: default
Transitions:
Country:[other] -> 1 Country:([other])/Service
Country:Xa -> 1 Country:([other])/Service
Country:Xb -> 1 Country:([other])/Service
Service:[other] -> 2 Country:([other])/Service:([other])
Service:Call-waiting -> 3 Country:([other])/Service:Call-waiting
Service:Forward -> 4 Country:([other])/Service:(Forward)
State: 2 Country:([other])/Service:([other])
Signal: default
Transitions:
any -> 2 Country:([other])/Service:([other])
State: 3 Country:([other])/Service:Call-waiting
Signal: call-waiting
Transitions:
any -> 3 Country:([other])/Service:Call-waiting
State: 4 Country:([other])/Service:(Forward)
Signal: default
Transitions:
any -> 4 Country:([other])/Service:(Forward)
State: 5 Country:Xa/Service
Signal: XA default
Transitions:
Country:[other] -> 5 Country:Xa/Service
Country:Xa -> 5 Country:Xa/Service
Country:Xb -> 5 Country:Xa/Service
Service:[other] -> 6 Country:Xa/Service:([other])
Service:Call-waiting -> 7 Country:Xa/Service:Call-waiting
Service:Forward -> 8 Country:Xa/Service:Forward
State: 6 Country:Xa/Service:([other])
Signal: XA default
Transitions:
any -> 6 Country:Xa/Service:([other])
State: 7 Country:Xa/Service:Call-waiting
Signal: XA call-waiting
Transitions:
any -> 7 Country:Xa/Service:Call-waiting
State: 8 Country:Xa/Service:Forward
Signal: XA forward
Transitions:
any -> 8 Country:Xa/Service:Forward
State: 9 Country:Xb/Service
Signal: XB default
Transitions:
Country:[other] -> 9 Country:Xb/Service
Country:Xa -> 9 Country:Xb/Service
Country:Xb -> 9 Country:Xb/Service
Service:[other] -> 10 Country:Xb/Service:([other])
Service:Call-waiting -> 11 Country:Xb/Service:(Call-waiting)
Service:Forward -> 12 Country:Xb/Service:Forward
State: 10 Country:Xb/Service:([other])
Signal: XB default
Transitions:
any -> 10 Country:Xb/Service:([other])
State: 11 Country:Xb/Service:(Call-waiting)
Signal: XB default
Transitions:
any -> 11 Country:Xb/Service:(Call-waiting)
State: 12 Country:Xb/Service:Forward
Signal: XB forward
Transitions:
any -> 12 Country:Xb/Service:Forward
State: 13 Country/Service:([other])
Signal: default
Transitions:
Country:[other] -> 2 Country:([other])/Service:([other])
Country:Xa -> 6 Country:Xa/Service:([other])
Country:Xb -> 10 Country:Xb/Service:([other])
Service:[other] -> 13 Country/Service:([other])
Service:Call-waiting -> 13 Country/Service:([other])
Service:Forward -> 13 Country/Service:([other])
State: 14 Country/Service:Call-waiting
Signal: call-waiting
Transitions:
Country:[other] -> 3 Country:([other])/Service:Call-waiting
Country:Xa -> 7 Country:Xa/Service:Call-waiting
Country:Xb -> 15 Country:(Xb)/Service:Call-waiting
Service:[other] -> 14 Country/Service:Call-waiting
Service:Call-waiting -> 14 Country/Service:Call-waiting
Service:Forward -> 14 Country/Service:Call-waiting
State: 15 Country:(Xb)/Service:Call-waiting
Signal: call-waiting
Transitions:
any -> 15 Country:(Xb)/Service:Call-waiting
State: 16 Country/Service:(Forward)
Signal: default
Transitions:
Country:[other] -> 4 Country:([other])/Service:(Forward)
Country:Xa -> 8 Country:Xa/Service:Forward
Country:Xb -> 12 Country:Xb/Service:Forward
Service:[other] -> 16 Country/Service:(Forward)
Service:Call-waiting -> 16 Country/Service:(Forward)
Service:Forward -> 16 Country/Service:(Forward)
Call-waiting can be signaled in conjunction with country XA but not
in conjunction with country XB, as the UA does not have a signal to
present call-waiting alerts for country XB. Thus, the ordering of
urn:alert:service:call-waiting with urn:alert:country:xa does not
matter, but if urn:alert:country:xb appears before
urn:alert:service:call-waiting, call-waiting cannot be signaled.
On the other hand, if urn:alert:service:call-waiting appears before
urn:alert:country:xb, then call-waiting is signaled, but using the
non-country signal.
Alert-Info: urn:alert:country:xa,
urn:alert:service:call-waiting
State: 0 Country/Service
Process: Country:Xa (urn:alert:country:xa)
State: 5 Country:Xa/Service
Process: Service:Call-waiting (urn:alert:service:call-waiting)
State: 7 Country:Xa/Service:Call-waiting
Signal: XA call-waiting
Alert-Info: urn:alert:service:call-waiting,
urn:alert:country:xa
State: 0 Country/Service
Process: Service:Call-waiting (urn:alert:service:call-waiting)
State: 14 Country/Service:Call-waiting
Process: Country:Xa (urn:alert:country:xa)
State: 7 Country:Xa/Service:Call-waiting
Signal: XA call-waiting
Alert-Info: urn:alert:country:xb,
urn:alert:service:call-waiting
State: 0 Country/Service
Process: Country:Xb (urn:alert:country:xb)
State: 9 Country:Xb/Service
Process: Service:Call-waiting (urn:alert:service:call-waiting)
State: 11 Country:Xb/Service:(Call-waiting)
Signal: XB default
Alert-Info: urn:alert:service:call-waiting,
urn:alert:country:xb
State: 0 Country/Service
Process: Service:Call-waiting (urn:alert:service:call-waiting)
State: 14 Country/Service:Call-waiting
Process: Country:Xb (urn:alert:country:xb)
State: 15 Country:(Xb)/Service:Call-waiting
Signal: call-waiting
6. Prioritizing Signals
The specifications provided in [RFC7462] are oriented toward giving the sender of Alert-Info control over which of the "alert" URNs are most important. But in some situations, the UA may prefer to prioritize expressing one URN category over another regardless of the order in which their URNs appear in Alert-Info. This section describes how that can be accommodated within the framework of [RFC7462] and presents an example FSM resulting from that approach. This example uses the signals of Section 5.2, viz., "external source", "internal source", "low priority", and "high priority", but this time, we want to signal "high priority" in preference to any other signal that might be applicable. We accommodate this within the framework of [RFC7462] by assigning the signal "high priority" for each of these combinations of URNs: urn:alert:priority:high urn:alert:priority:high, urn:alert:source:internal urn:alert:priority:high, urn:alert:source:external The result is that the signal "high priority" is the "best" signal for any combination of urn:alert:priority:high with "source" URNs. Constructing the symbols produces the same results as before. The signals can express the following URNs: urn:alert:source:external urn:alert:source:internal urn:alert:priority:low urn:alert:priority:high The relevant categories of "alert" URNs are: source priority The alphabet of symbols is: Source Source:External Source:Internal Source:Other Priority Priority:Low Priority:High Priority:Other
When the FSM is constructed, it is the same as the FSM of Section 5.2, except that certain states are effectively renamed and merged, because any "source" is defined to be expressed if high priority is expressed: Priority:(High)/Source:External and Priority:High/Source:(External) become: State: Priority:High/Source:External Signal: high priority Priority:(High)/Source:Internal and Priority:High/Source:(Internal) become: State: Priority:High/Source:Internal Signal: high priority This reduces the FSM to 18 states. In addition, these two new states, along with a number of other states, can be merged by FSM optimization, since all of them have the signal "high priority" and from them, there are no transitions to states outside this set. The optimized FSM has 10 states.7. Dynamic Sets of Signals
This section discusses how to construct FSMs for a UA that allows variable sets of signals -- for example, if the user can configure the use of ring tones. Several approaches can be used: o Whenever the set of ring tones is changed, re-execute the processes of Section 4. o Whenever the set of ring tones is changed, rebuild the list of expressed URNs (Section 4.1) and reconstruct the alphabet of symbols (Section 4.2). Then, use an algorithm for dynamically constructing the states of the FSM as needed during Alert-Info processing. o If the sets of possible URNs expressed by the ring tones are sufficiently limited, the steps of Section 4 can be carried out "generically", and the generic FSM can be specialized for the current ring tone configuration. The remainder of this section gives an example of the third approach.
For the example, we will use a set of ring tones that express the
identity of the caller. To signal this information, a private
extension "alert" URN category, "caller@example", is used:
urn:alert:caller@example:alice@example.com
urn:alert:caller@example:bob@example.com
etc.
which we can express by the generic pattern
urn:alert:caller@example:IDENTITY
where "IDENTITY" is replaced in succession by the set of caller
identities that have their own ring tones to generate the set of
expressed URNs.
The alphabet is then:
Caller@example
Caller@example:IDENTITY
Caller@example:Other
where "IDENTITY" is replaced in succession by the set of caller
identities. The "Caller@example:Other" symbol includes all URNs of
the category "caller@example" that are not included in any of the
"Caller@example:IDENTITY" symbols, i.e, where the second
alert-ind-part is not one of the known caller identities.
The states and transitions of the FSM are:
State: Caller@example (initial state)
Signal: default
Transitions:
Caller@example:IDENTITY -> Caller@example:IDENTITY
Caller@example:Other -> Caller@example:(Other)
State: Caller@example:IDENTITY
Signal: signal for caller IDENTITY
Transitions:
any -> Caller@example:IDENTITY
State: Caller@example:(Other)
Signal: default
Transitions:
any -> Caller@example:(Other)
where again, the second state is replicated once for each caller identity that has a ring tone, with "IDENTITY" replaced with the caller identity.8. Security Considerations
The security considerations discussed in Section 16 of [RFC7462] regarding the use and processing of "alert" URNs MUST be followed when the algorithm described in this document is used. Like any implementation of [RFC7462], implementations of the algorithm defined in this document MUST take into account that the value of a received Alert-Info header field may contain URIs of any scheme, may contain syntactically invalid values, and may be syntactically invalid overall. The handling of syntactically invalid values is specified by [RFC3261]. The handling of URIs other than "alert" URIs is outside the scope of this document (and outside the scope of [RFC7462]) and MAY be subject to local policy. Like the algorithm described in Section 12 of [RFC7462], the output of the algorithm defined in this document is limited to a choice among the signals that it has been configured for, limiting the security issues regarding the processing of its output. This algorithm will use at most linear time and constant space to process a sequence of "alert" URNs. This is significantly more efficient than the algorithm of [RFC7462] and minimizes the security vulnerabilities of this processing step that are due to resource consumption. However, the process defined in this document for constructing an FSM can use more than linear time and constant space -- probably exponential time and space in the worst case. This SHOULD be taken into consideration whenever an FSM is constructed using this algorithm and MUST be taken into consideration when it is done dynamically by a UA. Whenever an FSM is constructed by a process that is not under the direct supervision of a human user, procedures MUST be used to ensure that (1) the processing and memory consumption are limited to acceptable amounts and (2) if the FSM construction is aborted due to excessive consumption, the designated consumers of the FSM MUST have appropriate fallback procedures.9. IANA Considerations
This document has no IANA actions.
10. References
10.1. Normative References
[ISO-3166-1] International Organization for Standardization, "Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes", ISO Standard 3166-1:2013, November 2013, <https://www.iso.org/iso-3166-country-codes.html>. [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>. [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, DOI 10.17487/RFC3261, June 2002, <https://www.rfc-editor.org/info/rfc3261>. [RFC7462] Liess, L., Ed., Jesske, R., Johnston, A., Worley, D., and P. Kyzivat, "URNs for the Alert-Info Header Field of the Session Initiation Protocol (SIP)", RFC 7462, DOI 10.17487/RFC7462, March 2015, <https://www.rfc-editor.org/info/rfc7462>. [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.10.2. Informative References
[code] Worley, D., "draft-worley-alert-info-fsm.aux", February 2017, <http://svn.resiprocate.org/rep/ ietf-drafts/worley/draft-worley-alert-info-fsm.aux>.
Acknowledgments
Thanks to Paul Kyzivat, whose relentless identification of the weaknesses of earlier versions made the final document much, much better than it would have been, by changing it from the exposition of a concept into a practical tool. Thanks to Rifaat Shekh-Yusef, Eric Burger, and Gonzalo Camarillo for their thorough reviews. Thanks to the earlier Independent Submissions Editor, Nevil Brownlee, for his work obtaining reviewers, and the later Independent Submissions Editor, Adrian Farrel, for prompting me to write the Security Considerations section (which I had expected to be trivial but was not).Author's Address
Dale R. Worley Ariadne Internet Services 738 Main St. Waltham, MA 02451 United States of America Email: worley@ariadne.com