From 4c101e81369c55d2fa465f339c58a8ff5d8c9567 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Thu, 16 May 2019 15:24:28 +0200 Subject: 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 --- common/chapters/gsup.adoc | 410 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 410 insertions(+) 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 (<>), +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|<>|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|62|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|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|<>|M|V|1 +|01|IMSI|<>|M|TLV|2-10 +|0a|Message Class|<>|M|TLV|3 +|60|Source Name|<>|M|TLV|2-... +|61|Destination Name|<>|M|TLV|2-... +|30|Session ID|<>|M|TLV|6 +|31|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|<> |0x08|MSISDN|ISDN-AddressString/octet, <> |0x09|HLR Number|<> +|0x0a|Message Class| <> |0x10|PDP Context ID|<> |0x11|PDP Type|<> |0x12|Access Point Name|<> @@ -1012,6 +1320,12 @@ IEI that shall be used for the encoding. |0x46|SM Alert Reason|<> |0x50|IMEI|<> |0x51|IMEI Check Result|<> +|0x60|Source Name|<> +|0x61|Destination Name|<> +|0x62|AN-APDU|<> +|0x63|RR Cause|<> +|0x64|BSSAP Cause|<> +|0x65|Session Management Cause|<> |=== [[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-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 -- cgit v1.2.3