summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2019-05-16 15:24:28 +0200
committerOliver Smith <osmith@sysmocom.de>2019-05-20 11:46:59 +0200
commit4c101e81369c55d2fa465f339c58a8ff5d8c9567 (patch)
tree38f264569fb80dff06536d8682cff59d75405155
parent5c1ac995dbf828fd18b774d3a48902c71ad409a9 (diff)
GSUP: document inter-MSC handover additionsosmith/gsup-msc-ho-docs
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
-rw-r--r--common/chapters/gsup.adoc410
1 files changed, 410 insertions, 0 deletions
diff --git a/common/chapters/gsup.adoc b/common/chapters/gsup.adoc
index 1fd0bb6..c67dfca 100644
--- a/common/chapters/gsup.adoc
+++ b/common/chapters/gsup.adoc
@@ -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