GSUP: document inter-MSC handover additions

Message formats of the new messages look mostly the same (IMSI,
Message Class, Source Name, Destination Name, AN-APDU). That is, because
AN-APDU is storing results, error reasons etc. This can be seen clearly
in osmo-msc.git:
* src/libmsc/msc_a_remote.c:msc_a_remote_fsm_communicating()
* src/libmsc/msc_i_remote.c:msc_i_remote_fsm_ready()

The message squence charts in the E Procedures section are directly
based on Neels' interMSC_HO_GSUP_msgs.txt [1].

It seems that using AN-APDU made some other new IEs redundant: RR Cause,
BSSAP Cause, Session Management Cause had been added to GSUP for the MSC
handover, and are documented now, but they are currently not used in
osmo-msc.git. The new message OSMO_GSUP_MSGT_E_ABORT is not used either,
so I left a stub for it in the message format section.

I mentioned in the Source Name IE section, that source and destination
names are sent as nul-terminated strings. This is for legacy reasons,
Neels wrote a nice summary in the commit message of [2].

[1] https://osmocom.org/attachments/3720/interMSC_HO_GSUP_msgs.txt
[2] Change-Id: I9ca8c9eef104519ed1ea46e2fef46dcdc0d554eb (osmo-msc)

Related: OS#3774, OS#3619
Change-Id: I6b9f23d08cfe53c8b77f51c6afb900c2badc9e2c
This commit is contained in:
Oliver Smith 2019-05-16 15:24:28 +02:00
parent 5c1ac995db
commit 4c101e8136
1 changed files with 410 additions and 0 deletions

View File

@ -219,6 +219,112 @@ msc {
}
----
=== Procedures (E Interface)
The E interface connects two MSCs in the traditional GSM MAP world. It is used
for the inter-MSC handover. In GSUP, we don't need that extra connection, as we
route the messages over the GSUP server (OsmoHLR) instead.
Whenever MSC-A is sending to MSC-B, and vice-versa, the message needs to pass
through the GSUP server. In order to make the following message sequence charts
easier to read, this step has been omitted.
==== E Handover
MSC-A has an active RAN connection and hands it over to MSC-B.
.E Handover (Normal Case)
["mscgen"]
----
msc {
hscale="1.5";
A [label="MSC-A"], B [label="MSC-B"];
A => B [label="E Prepare Handover Request\n\n(AN-APDU: Handover Request)"];
|||;
A <= B [label="E Prepare Handover Result\n\n(AN-APDU: Handover Request Ack)"];
|||;
A <= B [label="E Process Access Signalling Request\n\n(AN-APDU: Handover Detect)"];
|||;
A <= B [label="E Send End Signal Request\n\n(AN-APDU: Handover Complete)"];
}
----
==== E Subsequent Handover
MSC-B has an active RAN connection, and asks MSC-A to hand it over to MSC-B'.
.E Subsequent Handover (Normal Case)
["mscgen"]
----
msc {
hscale="1.5";
A [label="MSC-A"], B [label="MSC-B"], B_ [label="MSC-B'"];
B => A [label="E Prepare Subsequent Handover Request\n\n(AN-APDU: Handover Required)"];
|||;
A => B_ [label="E Prepare Handover Request\n\n(AN-APDU: Handover Request)"];
|||;
B_ => A [label="E Prepare Handover Response\n\n(AN-APDU: Handover Request Ack)"];
|||;
A => B [label="E Prepare Subsequent Handover Response\n\n(AN-APDU: Handover Request Ack)"];
|||;
B_ => A [label="E Process Access Signalling Request\n\n(AN-APDU: Handover Detect)"];
|||;
B_ => A [label="E Process Access Signalling Request\n\n(AN-APDU: Handover Complete)"];
|||;
A => B [label="E Close"];
}
----
==== E Forward and Process Access Signalling
MSC-A is forwarding a message from its BSS (Base Station Subsystem) to MSC-B.
MSC-B forwards the message to its BSS, and answers to MSC-A with a Process
Access Signalling Request.
.E Process and Forward Access Signalling (Normal Case)
["mscgen"]
----
msc {
hscale="1.5";
A [label="MSC-A"], B [label="MSC-B"];
A => B [label="E Forward Access Signalling Request\n\n(AN-APDU: DTAP, e.g. CC, SMS, ...)"];
|||;
B => A [label="E Process Access Signalling Request\n\n(AN-APDU: DTAP, e.g. CC, SMS, ...)"];
}
----
==== E Routing Error
The GSUP server can not route any of the requests above, and responds with an
E Routing Error. Possible reasons for not being able to route the message are
missing routing IEs, a mismatching source name IE (<<gsup-ie-source-name>>),
the destination not being connected to the GSUP server or a failed attempt to
send the message from the GSUP sever to the destination. To figure out, what
went wrong in detail, refer to the GSUP server's logs.
In the traditional GSM MAP world, the participants of an E procedure are
directly connected, hence this routing error message does not exist in MAP.
.E Routing Error example
["mscgen"]
----
msc {
hscale="1.5";
A [label="MSC-A"], HLR [label="GSUP Server (OsmoHLR)"], B [label="MSC-B"];
A => HLR [label="E Prepare Handover Request"];
HLR => A [label="E Routing Error"];
}
----
////
End of "Procedures (E Interface)" chapter. Remember to place unrelated
procedures at the end of the "Procedures" chapter, not here!
////
=== Message Format
==== General
@ -722,6 +828,207 @@ Direction: EIR (via HLR) => VLR
|51|IMEI Check Result|<<gsup-ie-imei-result>>|M|TLV|3
|===
==== E Prepare Handover Request
Direction: MSC-A=MSC-I => MSC-B=MSC-T (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Prepare Handover Error
Direction: MSC-B=MSC-T => MSC-A=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Prepare Handover Result
Direction: MSC-B=MSC-T => MSC-A=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Prepare Subsequent Handover Request
Direction: MSC-B=MSC-I => MSC-A (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Prepare Subsequent Handover Error
Direction: MSC-A => MSC-B=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Prepare Subsequent Handover Result
Direction: MSC-A => MSC-B=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Send End Signal Request
Direction: MSC-B=MSC-T => MSC-A=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Send End Signal Error
Direction: MSC-A=MSC-I => MSC-B=MSC-T (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Send End Signal Result
Direction: MSC-A => MSC-B=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Process Access Signalling Request
Direction: MSC-B=MSC-T => MSC-A=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Forward Access Signalling Request
Direction: MSC-A => MSC-B=MSC-I (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|62|AN-APDU|<<gsup-ie-an-apdu>>|M|TLV|2-...
|===
==== E Close
Direction: MSC-A => MSC-B (via HLR)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|===
==== E Abort
This message was added to GSUP for the inter-MSC handover. But so far it is not
used yet.
==== E Routing Error
Direction: GSUP Server (HLR) => GSUP Client (MSC)
[options="header",cols="5%,45%,20%,10%,10%,10%"]
|===
|IEI|IE|Type|Presence|Format|Length
| |Message Type|<<gsup-ie-msgtype>>|M|V|1
|01|IMSI|<<gsup-ie-imsi>>|M|TLV|2-10
|0a|Message Class|<<gsup-ie-message-class>>|M|TLV|3
|60|Source Name|<<gsup-ie-source-name>>|M|TLV|2-...
|61|Destination Name|<<gsup-ie-destination-name>>|M|TLV|2-...
|30|Session ID|<<gsup-ie-session-id>>|M|TLV|6
|31|Session State|<<gsup-ie-session-state>>|M|TLV|3
|===
=== Information Elements
[[gsup-ie-msgtype]]
@ -986,6 +1293,7 @@ IEI that shall be used for the encoding.
|0x07|Freeze P-TMSI|<<gsup-ie-empty>>
|0x08|MSISDN|ISDN-AddressString/octet, <<gsup-ie-msisdn>>
|0x09|HLR Number|<<gsup-ie-hlr>>
|0x0a|Message Class| <<gsup-ie-message-class>>
|0x10|PDP Context ID|<<gsup-ie-pdpctxid>>
|0x11|PDP Type|<<gsup-ie-pdptype>>
|0x12|Access Point Name|<<gsup-ie-apn>>
@ -1012,6 +1320,12 @@ IEI that shall be used for the encoding.
|0x46|SM Alert Reason|<<gsup-ie-sm-alert-rsn>>
|0x50|IMEI|<<gsup-ie-imei>>
|0x51|IMEI Check Result|<<gsup-ie-imei-result>>
|0x60|Source Name|<<gsup-ie-source-name>>
|0x61|Destination Name|<<gsup-ie-destination-name>>
|0x62|AN-APDU|<<gsup-ie-an-apdu>>
|0x63|RR Cause|<<gsup-ie-cause-rr>>
|0x64|BSSAP Cause|<<gsup-ie-cause-bssap>>
|0x65|Session Management Cause|<<gsup-ie-cause-sm>>
|===
[[gsup-ie-empty]]
@ -1192,6 +1506,102 @@ not permitted on the network (e.g. because it is on a blacklist).
|0x02|NACK
|===
[[gsup-ie-message-class]]
==== Message Class
Indicate, which kind of message is being sent. This allows to trivially dispatch
incoming GSUP messages to the right code paths, and should make writing a GSUP
to MAP converter easier.
This IE was introduced together with inter-MSC handover code. Inter-MSC messages
must include this IE and set it to the appropriate type. The intention of
creating this IE was to use it with all GSUP messages eventually.
[options="header",cols="10%,20%,70%"]
|===
|Type|Always present|Description
|1|no |Subscriber Management
|2|no |SMS
|3|no |USSD
|4|yes|Inter-MSC
|===
[[gsup-ie-source-name]]
==== Source Name
When the GSUP server is asked to forward a message between two GSUP clients, the
source name is the IPA name of the client where the message is coming from. The
source name IE is present, when the GSUP server forwards the message to the
destination. Although redundant, the source name IE is also sent from the source
to the GSUP server (so it is easier to follow the network traces).
Source and destination names are sent as nul-terminated strings.
.Message forwarding example
["mscgen"]
----
msc {
hscale="1.5";
A [label="GSUP Client A"],
HLR [label="GSUP Server (OsmoHLR)"],
B [label="GSUP Client B"];
A => HLR [label="Source: A, Destination: B"];
HLR => B [label="Source: A, Destination: B"];
}
----
[[gsup-ie-destination-name]]
==== Destination Name
The receiving counterpart to source name (<<gsup-ie-source-name>>).
[[gsup-ie-an-apdu]]
==== AN-APDU
This IE encodes the AN-APDU parameter described in 3GPP TS 29.002 7.6.9.1.
.Access Network Protocol
[options="header",cols="10%,90%"]
|===
|Type|Description
|0x01|BSSAP
|0x02|RANAP
|===
[packetdiag]
----
{
colwidth = 8
node_height = 24
0-6: AN-APDU IEI
7: Res
8-15: Length of IE content
16-23: Access Network Protocol
24-31: Data
}
----
[[gsup-ie-cause-rr]]
==== RR Cause
This IE contains the reason for release or completion of an assignment or
handover. See 3GPP TS 44.018 10.5.2.31 for reference.
[[gsup-ie-cause-bssap]]
==== BSSAP Cause
This IE indicates why an event is happening on the BSSAP interface. See 3GPP TS
48.008 3.2.2.5 for reference.
[[gsup-ie-cause-sm]]
==== Session Management Cause
This IE contains the reason for rejecting a session management request. See 3GPP
TS 24.008 10.5.6.6 / Table 10.5.157 for reference.
=== Session (transaction) management
Unlike TCAP/MAP, GSUP is just a transport layer without the