<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/16211">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">doc: add D-GSM documentation<br><br>Change-Id: I392b5523870c2ef3267179160028d26f3f761b77<br>---<br>A doc/manuals/chapters/dgsm.adoc<br>M doc/manuals/osmohlr-usermanual.adoc<br>2 files changed, 483 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/11/16211/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/chapters/dgsm.adoc b/doc/manuals/chapters/dgsm.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..c0b474a</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/chapters/dgsm.adoc</span><br><span>@@ -0,0 +1,481 @@</span><br><span style="color: hsl(120, 100%, 40%);">+== Distributed GSM / Multicast MS Lookup</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Distributed GSM (D-GSM) allows independent mobile core network stacks to provide voice, SMS and Roaming services to each</span><br><span style="color: hsl(120, 100%, 40%);">+other, without the need for centralised entities or administration authority, and in a way that is resilient against</span><br><span style="color: hsl(120, 100%, 40%);">+unstable network links between sites.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+D-GSM aims at communal networks, where several independent sites, let's call them villages, each have a full mobile core</span><br><span style="color: hsl(120, 100%, 40%);">+network infrastructure. It elegantly provides ad-hoc service for subscribers moving across villages, and allows villages</span><br><span style="color: hsl(120, 100%, 40%);">+to dynamically join or leave the cooperative network without the need for configuration changes at other sites.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A challenge for linking separate sites is to find the current location of a subscriber. Typically, in mobile networks, a</span><br><span style="color: hsl(120, 100%, 40%);">+centralized entity keeps track of where to Page for subscribers. Running several fully independent sites with unreliable</span><br><span style="color: hsl(120, 100%, 40%);">+links between them makes it hard to provide such centralisation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+D-GSM finds subscribers by mslookup, a service provided by OsmoHLR, typically using multicast DNS queries.  This allows</span><br><span style="color: hsl(120, 100%, 40%);">+routing Location Updating requests, calls, and SMS to the right site without administrative delay nor the need for a</span><br><span style="color: hsl(120, 100%, 40%);">+reliable link to a central database.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+D-GSM is highly resilient against single sites or links becoming temporarily unavailable. Service between still</span><br><span style="color: hsl(120, 100%, 40%);">+reachable sites simply continues; Service to a disconnected site resumes as soon as it becomes reachable again.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This brings an entirely new paradigm to mobile core network infrastructure: as sites become reachable on the IP network</span><br><span style="color: hsl(120, 100%, 40%);">+and join the common IP multicast group, services between them become available immediately. Basically, the only premise</span><br><span style="color: hsl(120, 100%, 40%);">+is that IP routing and multicast works across sites, and that each site uses unique IPA names in the GSUP config.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This chapter describes how D-GSM and mslookup work, and how to configure sites to use D-GSM, using Osmocom core network</span><br><span style="color: hsl(120, 100%, 40%);">+infrastructure.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Finding Subscribers: mslookup Clients</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+There are two fundamentally distinct subscriber lookups provided by the mslookup service.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Find the Current Location of an MSISDN</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[fig_dgsm_connect]]</span><br><span style="color: hsl(120, 100%, 40%);">+.mslookup for connecting subscribers: Alice is visiting village C; a phone call gets routed directly to her current location independently from her resident village infrastructure</span><br><span style="color: hsl(120, 100%, 40%);">+[graphviz]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=LR</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span style="color: hsl(120, 100%, 40%);">+subgraph cluster_village_b {</span><br><span style="color: hsl(120, 100%, 40%);">+        label="Village B"</span><br><span style="color: hsl(120, 100%, 40%);">+   ms_bob [label="Bob\n(from village B)",shape=box]</span><br><span style="color: hsl(120, 100%, 40%);">+    pbx_b [label="SIP B"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+subgraph cluster_village_c {</span><br><span style="color: hsl(120, 100%, 40%);">+    label="Village C"</span><br><span style="color: hsl(120, 100%, 40%);">+   ms_alice [label="Alice\n(from village A)",shape=box]</span><br><span style="color: hsl(120, 100%, 40%);">+        msc_c [label="MSC C"]</span><br><span style="color: hsl(120, 100%, 40%);">+       hlr_c [label="HLR C"]</span><br><span style="color: hsl(120, 100%, 40%);">+       sip_c [label="SIP C"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_alice -> msc_c [style=dashed,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+msc_c -> hlr_c [label="attached",style=dashed,arrowhead=none]</span><br><span style="color: hsl(120, 100%, 40%);">+ms_bob -> pbx_b [label="call Alice"]</span><br><span style="color: hsl(120, 100%, 40%);">+pbx_b -> hlr_c [label="mslookup by MSISDN",style=dotted,dir=both]</span><br><span style="color: hsl(120, 100%, 40%);">+pbx_b -> sip_c -> msc_c -> ms_alice [label="call"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For example, if a subscriber is currently visiting another village, establish a phone call / send SMS towards that</span><br><span style="color: hsl(120, 100%, 40%);">+village.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- To deliver a phone call, a SIP agent integrates an mslookup client to request the SIP service of an MSISDN's current</span><br><span style="color: hsl(120, 100%, 40%);">+  location (example: <<dgsm_conf_dialplan>>). It receives an IP address and port to send the SIP Invite to.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- To deliver an SMS, an ESME integrates an mslookup client to request the SMPP service of an MSISDN's current location</span><br><span style="color: hsl(120, 100%, 40%);">+  (example: <<dgsm_conf_esme_smpp>>).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The current location of a subscriber may change at any time, and, when moving across locations, a subscriber may</span><br><span style="color: hsl(120, 100%, 40%);">+suddenly lose reception to the previous location without explicitly detaching. Hence an mslookup request for the current</span><br><span style="color: hsl(120, 100%, 40%);">+location of an MSISDN may get numerous responses. To find the currently valid location, mslookup includes the age of the</span><br><span style="color: hsl(120, 100%, 40%);">+subscriber record, i.e. how long ago the subscriber was last reached. The one response with the youngest age reflects</span><br><span style="color: hsl(120, 100%, 40%);">+the current location.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In order to evaluate several responses, mslookup always waits for a fixed amount of time (1 second), and then evaluates</span><br><span style="color: hsl(120, 100%, 40%);">+the available responses.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Services are not limited to SIP and SMPP, arbitrarily named services can be added to the mslookup configuration.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Message sequence for locating an MSISDN to deliver a voice call</span><br><span style="color: hsl(120, 100%, 40%);">+["mscgen"]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+msc {</span><br><span style="color: hsl(120, 100%, 40%);">+  hscale="2";</span><br><span style="color: hsl(120, 100%, 40%);">+  moms[label="MS,BSS\nvillage A"],momsc[label="MSC,MGW\nvillage A"],mosipcon[label="osmo-sip-connector\nvillage A"],mopbx[label="PBX\nvillage A"],mthlr[label="OsmoHLR\nvillage B"],mtsipcon[label="osmo-sip-connector\nvillage B"],mtmsc[label="MGW,MSC\nvillage B"],mtms[label="RAN,MS\nvillage B"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  moms =>> momsc [label="CC Setup"];</span><br><span style="color: hsl(120, 100%, 40%);">+  momsc =>> mosipcon [label="MNCC_SETUP_IND"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mosipcon =>> mopbx [label="SIP INVITE"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mopbx rbox mopbx [label="dialplan: launch mslookup by MSISDN"];</span><br><span style="color: hsl(120, 100%, 40%);">+  --- [label="multicast-DNS query to all connected sites"];</span><br><span style="color: hsl(120, 100%, 40%);">+  ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  mopbx <<= mthlr [label="mDNS response\n(age)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mopbx rbox mopbx [label="wait ~ 1s for more mDNS responses"];</span><br><span style="color: hsl(120, 100%, 40%);">+  ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  mopbx =>> mtsipcon [label="SIP INVITE (MT)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mtmsc <<= mtsipcon [label="MNCC_SETUP_REQ"];</span><br><span style="color: hsl(120, 100%, 40%);">+  mtms <<= mtmsc [label="Paging (CC)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  moms rbox mtms [label="voice call commences"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Find the Home HLR for an IMSI</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[fig_dgsm_roaming]]</span><br><span style="color: hsl(120, 100%, 40%);">+.mslookup for Roaming: Alice visits village B; she can attach to the local mobile network, which proxies HLR administration to her home village.</span><br><span style="color: hsl(120, 100%, 40%);">+[graphviz]</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+rankdir=LR</span><br><span style="color: hsl(120, 100%, 40%);">+      </span><br><span style="color: hsl(120, 100%, 40%);">+subgraph cluster_village_b {</span><br><span style="color: hsl(120, 100%, 40%);">+        label="Village B"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ms_alice [label="Alice\n(from village A)",shape=box]</span><br><span style="color: hsl(120, 100%, 40%);">+        msc_b [label="MSC B"]</span><br><span style="color: hsl(120, 100%, 40%);">+       hlr_b [label="HLR B"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+subgraph cluster_village_a {</span><br><span style="color: hsl(120, 100%, 40%);">+    label="Village A"</span><br><span style="color: hsl(120, 100%, 40%);">+   hlr_alice [label="Alice's home HLR"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_alice -> msc_b -> hlr_b [label="Location\nUpdating"]</span><br><span style="color: hsl(120, 100%, 40%);">+hlr_b -> hlr_alice [label="mslookup by IMSI",style=dotted,dir=both]</span><br><span style="color: hsl(120, 100%, 40%);">+hlr_b -> hlr_alice [label="GSUP proxy forwarding"]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For example, when attaching to a local network, a local resident gets serviced directly by the local village's HLR,</span><br><span style="color: hsl(120, 100%, 40%);">+while a visitor from another village gets serviced by the remote village's HLR (Roaming).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A home HLR typically stays the same for a given IMSI. If the home site is reachable, there should be exactly one</span><br><span style="color: hsl(120, 100%, 40%);">+response to an mslookup request asking for it. The age of such a home-HLR response is always sent as zero.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If a response's age is zero, mslookup does not wait for further responses and immediately uses the result.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If there were more than one HLR accepting service for an IMSI, the one with the shortest response latency is used.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== mslookup Configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR the main mslookup agent. It provides the responses for both current location services as well as for locating</span><br><span style="color: hsl(120, 100%, 40%);">+the fixed home-HLR. But naturally, depending on the mslookup request's purpose, different OsmoHLR instances will respond</span><br><span style="color: hsl(120, 100%, 40%);">+for a given subscriber.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- When querying the home HLR, it is always the (typically single) home HLR instance that sends the mslookup response. As</span><br><span style="color: hsl(120, 100%, 40%);">+  soon as it finds the queried IMSI in the local HLR database, an OsmoHLR will respond to home-HLR requests.</span><br><span style="color: hsl(120, 100%, 40%);">+  In <<fig_dgsm_roaming>>, Alice's home HLR responds to the Roaming request ("where is the home HLR?").</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- When querying the location of an MSISDN, it is always the HLR proxy nearest to the servicing MSC that sends the</span><br><span style="color: hsl(120, 100%, 40%);">+  mslookup response. Even though the home HLR keeps the Location Updating record also for Roaming cases, it will only</span><br><span style="color: hsl(120, 100%, 40%);">+  respond to an mslookup service request if the subscriber has attached at a directly connected MSC. If attached at a</span><br><span style="color: hsl(120, 100%, 40%);">+  remote MSC, that MSC's remote HLR will be the GSUP proxy for the home HLR, and the remote HLR is responsible for</span><br><span style="color: hsl(120, 100%, 40%);">+  responding to service requests.</span><br><span style="color: hsl(120, 100%, 40%);">+  In <<fig_dgsm_roaming>>, HLR B is the nearest proxy and will answer all service requests ("where is this MSISDN?").</span><br><span style="color: hsl(120, 100%, 40%);">+  Alice's home HLR will not answer service requests, because it detects that the servicing MSC is connected via another</span><br><span style="color: hsl(120, 100%, 40%);">+  HLR proxy.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[dgsm_example_config]]</span><br><span style="color: hsl(120, 100%, 40%);">+==== Example</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Here is an osmo-hlr.cfg mslookup configuration example for one site, which is explained in subsequent chapters.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ hlr</span><br><span style="color: hsl(120, 100%, 40%);">+  gsup</span><br><span style="color: hsl(120, 100%, 40%);">+   bind ip 10.9.8.7</span><br><span style="color: hsl(120, 100%, 40%);">+   ipa-name hlr-23</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  mdns</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+   service sip.voice at 10.9.8.7 5060</span><br><span style="color: hsl(120, 100%, 40%);">+   service smpp.sms at 10.9.8.7 2775</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR has both an mslookup server and a client.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- The server responds to incoming service and home-HLR requests, when the local HLR is responsible.</span><br><span style="color: hsl(120, 100%, 40%);">+- The client is used as GSUP proxy to a remote home HLR (found by mslookup upon a locally unknown IMSI).</span><br><span style="color: hsl(120, 100%, 40%);">+- The client may also be used for forwarding SMS-over-GSUP.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The mslookup service can be implemented by various methods.</span><br><span style="color: hsl(120, 100%, 40%);">+At the time of writing, the only method implemented is mDNS.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== mDNS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The stock mslookup method is mDNS, multicast DNS. It consists of standard DNS encoding according to <<ietf-rfc1035>> and</span><br><span style="color: hsl(120, 100%, 40%);">+<<ietf-rfc3596>>, but sent and received on IP multicast. In the response, standard A and AAAA records return the</span><br><span style="color: hsl(120, 100%, 40%);">+service's IP address, while additional TXT records provide the service's port number and the MS attach age.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+TIP: To watch D-GSM mDNS conversations in wireshark, select "udp.port == 4266" (the default mslookup mDNS port</span><br><span style="color: hsl(120, 100%, 40%);">+number), right click on the packet to "Decode as...", and select "DNS".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In OsmoHLR, the mDNS server and client are typically both enabled at the same time:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  mdns</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Server and client can also be enabled/disabled individually:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+   mdns</span><br><span style="color: hsl(120, 100%, 40%);">+  client</span><br><span style="color: hsl(120, 100%, 40%);">+   mdns</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+These examples use the default mslookup multicast IP address and port. It is possible to configure custom IP address and</span><br><span style="color: hsl(120, 100%, 40%);">+port, but beware that the IP address must be from a multicast range, see <<ietf-rfc5771>>:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  mdns 239.192.23.42 4266</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Server: Site Services</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The mslookup server requires a list of service addresses provided at the local site, in order to respond to service</span><br><span style="color: hsl(120, 100%, 40%);">+requests matching locally attached subscribers.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+   service sip.voice at 10.9.8.7 5060</span><br><span style="color: hsl(120, 100%, 40%);">+   service smpp.sms at 10.9.8.7 2775</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In this example, "10.9.8.7 5060" would be the IP address and port on which the local site's PBX is bound to receive SIP</span><br><span style="color: hsl(120, 100%, 40%);">+Invite requests; "10.9.8.7 2775" would be the local site's OsmoMSC SMPP bind address and port.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Obviously, these IP addresses must be routable back to this site from all other sites. If, for example, the PBX is</span><br><span style="color: hsl(120, 100%, 40%);">+configured to bind on "0.0.0.0", it won't work to enter the same as service address -- remote sites cannot route to</span><br><span style="color: hsl(120, 100%, 40%);">+0.0.0.0. Instead, the mslookup service requires a public IP address of a local interface. For the same reasons, never</span><br><span style="color: hsl(120, 100%, 40%);">+add link-local addresses like 127.0.0.1 as mslookup services.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If a site has more than one MSC, services can also be configured for each MSC individually, keyed by the IPA unit name</span><br><span style="color: hsl(120, 100%, 40%);">+that each MSC sends on the GSUP link:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+   msc msc-262-42-0</span><br><span style="color: hsl(120, 100%, 40%);">+    service sip.voice at 10.11.12.13 5060</span><br><span style="color: hsl(120, 100%, 40%);">+    service smpp.sms at 10.11.12.13 2775</span><br><span style="color: hsl(120, 100%, 40%);">+   msc msc-901-70-0</span><br><span style="color: hsl(120, 100%, 40%);">+    service sip.voice at 10.9.8.7 5060</span><br><span style="color: hsl(120, 100%, 40%);">+    service smpp.sms at 10.9.8.7 2775</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Here, "msc-262-42-0" is the IPA name of a local OsmoMSC instance. To configure an OsmoMSC's IPA name on the GSUP link,</span><br><span style="color: hsl(120, 100%, 40%);">+see osmo-msc.cfg, setting `hlr` / `ipa-name`.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For mslookup service responses, only Location Updatings in the Circuit Switched domain are relevant. OsmoHLR does manage</span><br><span style="color: hsl(120, 100%, 40%);">+IMSIs attaching in the Packet Switched domain (via an SGSN) similarly to Circuit Switched (via an MSC), but mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+completely ignores the Packet Switched attach status.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Server: Own GSUP Address</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+When responding to home-HLR requests, OsmoHLR implicitly by default responds with its locally configured GSUP bind</span><br><span style="color: hsl(120, 100%, 40%);">+address (setting `hlr` / `gsup` / `bind ip`). If required, an explicit local GSUP address and port can be configured,</span><br><span style="color: hsl(120, 100%, 40%);">+for example:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ hlr</span><br><span style="color: hsl(120, 100%, 40%);">+  gsup</span><br><span style="color: hsl(120, 100%, 40%);">+   bind ip 0.0.0.0</span><br><span style="color: hsl(120, 100%, 40%);">+   ipa-name hlr-23</span><br><span style="color: hsl(120, 100%, 40%);">+ mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+   # osmo-hlr's own GSUP address to send in mslookup responses:</span><br><span style="color: hsl(120, 100%, 40%);">+   service gsup.hlr at 10.9.8.7 4222</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The gsup.hlr service can only be configured globally (because requests come from arbitrary mDNS clients, before a</span><br><span style="color: hsl(120, 100%, 40%);">+Location Updating has associated the IMSI with the requesting MSC).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Client IPA Naming</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For reliable GSUP proxy routing to a remote HLR (Roaming), it is important that each GSUP client, i.e. each HLR, MSC and</span><br><span style="color: hsl(120, 100%, 40%);">+SGSN instance, has a unique IPA name.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Example for configuring an OsmoHLR instance's IPA name:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ hlr</span><br><span style="color: hsl(120, 100%, 40%);">+  gsup</span><br><span style="color: hsl(120, 100%, 40%);">+   ipa-name hlr-23</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Here, "hlr-23" is the unique identification of this OsmoHLR instance across all potentially connected D-GSM sites.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Furthermore, each MSC and SGSN must have a uniquely distinct IPA name across all sites (here "msc-262-42-0" and</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-901-70-0" are used as example IPA names for local MSCs).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+When this OsmoHLR connects to a remote HLR, be it for GSUP proxying or SMS-over-GSUP, it communicates its own IPA name</span><br><span style="color: hsl(120, 100%, 40%);">+(on GSUP link-up) as well as the IPA name of the requesting client MSC/SGSN (as Source Name in each message) to the</span><br><span style="color: hsl(120, 100%, 40%);">+remote OsmoHLR GSUP server. These names are used to route GSUP responses back to the respective requesting peer.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+If two MSCs were accidentally configured with identical names, a problem will occur as soon as both MSCs attempt to</span><br><span style="color: hsl(120, 100%, 40%);">+attach to the same OsmoHLR (either directly or via GSUP proxying). The MSC that shows up first will work normally, but</span><br><span style="color: hsl(120, 100%, 40%);">+any duplicate that shows up later will be rejected, since a route for its name already exists.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Queries</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In URL notation, typical mslookup queries look like:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gsup.hlr.123456789.imsi</span><br><span style="color: hsl(120, 100%, 40%);">+ sip.voice.123.msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+ smpp.sms.123.msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A query consists of</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- a service name ("gsup.hlr"),</span><br><span style="color: hsl(120, 100%, 40%);">+- an id ("123456789"),</span><br><span style="color: hsl(120, 100%, 40%);">+- the id type ("imsi").</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The calling client also defines a timeout to wait for responses.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The mslookup ID types are fixed, while service names can be chosen arbitrarily.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.mslookup ID types, no other ID types are understood by mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+[options="header",width="100%",cols="20%,80%"]</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+|ID Type|Description</span><br><span style="color: hsl(120, 100%, 40%);">+|imsi|An IMSI as existing in an OsmoHLR subscriber database</span><br><span style="color: hsl(120, 100%, 40%);">+|msisdn|A phone number as configured in an OsmoHLR subscriber database</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.mslookup service name conventions, arbitrary service names can be added as required</span><br><span style="color: hsl(120, 100%, 40%);">+[options="header",width="100%",cols="20%,20%,60%"]</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+|Service Name|Protocol|Description</span><br><span style="color: hsl(120, 100%, 40%);">+|gsup.hlr | GSUP | Home HLR's GSUP server, to handle Location Updating related procedures</span><br><span style="color: hsl(120, 100%, 40%);">+|sip.voice | SIP | SIP PBX or OsmoSIPConnector, to receive a SIP Invite (MT side of a call)</span><br><span style="color: hsl(120, 100%, 40%);">+|smpp.sms | SMPP | Destination OsmoMSC (or other SMPP server) to deliver an SMS to the recipient</span><br><span style="color: hsl(120, 100%, 40%);">+|gsup.sms | GSUP | GSUP peer to deliver an SMS to the recipient using SMS-over-GSUP</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Arbitrarily named services can be added to the mslookup configuration and queried by mslookup clients; as soon as a</span><br><span style="color: hsl(120, 100%, 40%);">+service name is present in osmo-hlr.cfg, it can be queried from any mslookup client.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Service names should consist of a protocol name (like "sip", "gsup", "english") and an intended action/entity (like</span><br><span style="color: hsl(120, 100%, 40%);">+"voice", "hlr", "greeting").</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Service Client Implementation</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+In principle, arbitrary services could query target addresses via mslookup, leaving it up to any and all kinds of</span><br><span style="color: hsl(120, 100%, 40%);">+clients to find their respective destination addresses. But of course, mslookup was designed with specific services in</span><br><span style="color: hsl(120, 100%, 40%);">+mind, namely:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- SIP call agents and</span><br><span style="color: hsl(120, 100%, 40%);">+- SMS delivery (an ESME or SMSC)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The following chapters describe examples of setting up a working distributed core network providing SIP voice calls and</span><br><span style="color: hsl(120, 100%, 40%);">+SMS forwarding across sites.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== mslookup Library</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The OsmoHLR provides an mslookup client C library, libosmo-mslookup. Service lookups can be integrated directly</span><br><span style="color: hsl(120, 100%, 40%);">+in client programs using this library. However, its mDNS implementation requires the libosmocore select() loop, which</span><br><span style="color: hsl(120, 100%, 40%);">+can be challenging to integrate in practice. An alternative solution is the osmo-mslookup-client tool.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[dgsm_osmo_mslookup_client]]</span><br><span style="color: hsl(120, 100%, 40%);">+==== osmo-mslookup-client</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The mslookup C library is available, but often, a simpler approach for client implementations is desirable:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- When querying for a service address, the client is typically interested in the single final best result (youngest age</span><br><span style="color: hsl(120, 100%, 40%);">+  / first responding home HLR).</span><br><span style="color: hsl(120, 100%, 40%);">+- Voice call and SMS clients typically would block until an mslookup result is known. For example, the FreeSwitch</span><br><span style="color: hsl(120, 100%, 40%);">+  dialplan integration expects a result synchronously, i.e. without waiting for mslookup responses via a select() loop.</span><br><span style="color: hsl(120, 100%, 40%);">+- Integrating the libosmocore select() loop required for mDNS can break the already existing socket handling in the</span><br><span style="color: hsl(120, 100%, 40%);">+  client program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The osmo-mslookup-client cmdline tool provides a trivial way to synchronously acquire the single result for an mslookup</span><br><span style="color: hsl(120, 100%, 40%);">+request. The service client can invoke an osmo-mslookup-client process per request and read the result from stdout.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Each invocation obviously spawns a separate process and opens a multicast socket for mDNS. For better scalability,</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-mslookup-client can also be run as a daemon, providing results via a unix domain socket. Using synchronous write()</span><br><span style="color: hsl(120, 100%, 40%);">+and recv() allows blocking until a result is received without interfering with the client program's select() setup.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+By itself, osmo-mslookup-client is also helpful as a diagnostic tool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client sip.voice.1001.msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+sip.voice.1001.msisdn        ok      10.9.8.7        5060</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client gsup.hlr.901700000014701.imsi</span><br><span style="color: hsl(120, 100%, 40%);">+gsup.hlr.901700000014701.imsi     ok      10.9.8.7        4222</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client gsup.hlr.111111.imsi</span><br><span style="color: hsl(120, 100%, 40%);">+gsup.hlr.111111.imsi       not-found</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client gsup.hlr.1001.msisdn sip.voice.1001.msisdn smpp.sms.1001.msisdn foo.1001.msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+gsup.hlr.1001.msisdn       ok      10.9.8.7        4222</span><br><span style="color: hsl(120, 100%, 40%);">+foo.1001.msisdn   not-found</span><br><span style="color: hsl(120, 100%, 40%);">+smpp.sms.1001.msisdn ok      10.9.8.7        2775</span><br><span style="color: hsl(120, 100%, 40%);">+sip.voice.1001.msisdn     ok      10.9.8.7        5060</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client --csv-headers gsup.hlr.901700000014701.imsi</span><br><span style="color: hsl(120, 100%, 40%);">+QUERY       RESULT  V4_IP   V4_PORT V6_IP   V6_PORT</span><br><span style="color: hsl(120, 100%, 40%);">+gsup.hlr.901700000014701.imsi  ok      10.9.8.7        4222</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo-mslookup-client -f json gsup.hlr.901700000014701.imsi</span><br><span style="color: hsl(120, 100%, 40%);">+{"query": "gsup.hlr.901700000014701.imsi", "result": "ok", "v4": ["10.9.8.7", "4222"]}</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+For full help including example client invocations in Python, see the output of:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo-mslookup-client -h</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== SIP Service Client</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[dgsm_conf_dialplan]]</span><br><span style="color: hsl(120, 100%, 40%);">+===== FreeSwitch dialplan.py</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The FreeSWITCH PBX software <<freeswitch_pbx>> offers a Python integration to determine a SIP call recipient by a custom</span><br><span style="color: hsl(120, 100%, 40%);">+dialplan implementation. An example dialplan implementation for FreeSWITCH that uses D-GSM mslookup is provided in the</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hlr source tree under `contrib`, called `freeswitch_dialplan_dgsm.py`.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+To integrate it with your FREESWITCH setup, add a new `extension` block to your `dialplan/public.xml`:</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+    <extension name="outbound"></span><br><span style="color: hsl(120, 100%, 40%);">+      <condition field="destination_number" expression=".*"></span><br><span style="color: hsl(120, 100%, 40%);">+     <action application="set" data="hangup_after_bridge=true"/></span><br><span style="color: hsl(120, 100%, 40%);">+ <action application="set" data="session_in_hangup_hook=true"/></span><br><span style="color: hsl(120, 100%, 40%);">+      <action application="set" data="ringback=%(2000, 4000, 440.0, 480.0)"/></span><br><span style="color: hsl(120, 100%, 40%);">+     <action application="python" data="freeswitch_dialplan_dgsm"/></span><br><span style="color: hsl(120, 100%, 40%);">+      </condition></span><br><span style="color: hsl(120, 100%, 40%);">+    </extension></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Make sure that the dir containing `freeswitch_dialplan_dgsm.py` is in your `PYTHONPATH` environment variable, and start</span><br><span style="color: hsl(120, 100%, 40%);">+the server:</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+$ export PYTHONPATH="$PYTHONPATH:/home/user/code/osmo-hlr/contrib/dgsm"</span><br><span style="color: hsl(120, 100%, 40%);">+$ freeswitch -nf -nonat -nonatmap -nocal -nort -c</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== SMS Service Client</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[dgsm_conf_esme_smpp]]</span><br><span style="color: hsl(120, 100%, 40%);">+===== SMS via SMPP Port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+An example ESME using D-GSM mslookup, `esme_dgsm.py`, is provided in the osmo-hlr source tree under `contrib`. It</span><br><span style="color: hsl(120, 100%, 40%);">+attaches to OsmoMSC's SMPP port to send SMS to recipients determined by mslookup.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC should be configured as "smpp-first", so that all SMS routing is determined by mslookup. If configured without</span><br><span style="color: hsl(120, 100%, 40%);">+smpp-first, OsmoMSC may try to deliver an SMS locally, even though the recipient has recently moved to a different site.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+An example OsmoMSC configuration to work with esme_dgsm.py:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+smpp</span><br><span style="color: hsl(120, 100%, 40%);">+ local-tcp-ip 127.0.0.1 2775</span><br><span style="color: hsl(120, 100%, 40%);">+ system-id test-msc</span><br><span style="color: hsl(120, 100%, 40%);">+ policy closed</span><br><span style="color: hsl(120, 100%, 40%);">+ smpp-first</span><br><span style="color: hsl(120, 100%, 40%);">+ # outgoing to esme_dgsm.py</span><br><span style="color: hsl(120, 100%, 40%);">+ esme OSMPP</span><br><span style="color: hsl(120, 100%, 40%);">+  no alert-notifications</span><br><span style="color: hsl(120, 100%, 40%);">+  password foo</span><br><span style="color: hsl(120, 100%, 40%);">+  default-route</span><br><span style="color: hsl(120, 100%, 40%);">+ # incoming from esme_dgsm.py</span><br><span style="color: hsl(120, 100%, 40%);">+ esme ISMPP</span><br><span style="color: hsl(120, 100%, 40%);">+  no alert-notifications</span><br><span style="color: hsl(120, 100%, 40%);">+  password foo</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Launch esme_dgsm.py alongside OsmoMSC:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+./esme_dgsm.py --src-host 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+esme_dgsm.py will be notified via SMPP for each SMS to be delivered, and will forward them either to a remote</span><br><span style="color: hsl(120, 100%, 40%);">+recipient, or back to the same OsmoMSC, depending on the mslookup result. If the MSISDN is not reachable (or</span><br><span style="color: hsl(120, 100%, 40%);">+esme_dgsm.py can't handle the message for other reasons), it returns the RSYSERR code back to OsmoMSC.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Note that the esme_dgsm.py is a proof of concept and should not be used in production. It has several limitations, such</span><br><span style="color: hsl(120, 100%, 40%);">+as not supporting multipart SMS messages.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===== SMS-Over-GSUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The GSUP protocol defines SMS delivery messages. When OsmoMSC is configured to deliver SMS via GSUP, MO SMS are directly</span><br><span style="color: hsl(120, 100%, 40%);">+forwarded to the HLR, which will determine where to forward the SMS-over-GSUP messages using its mslookup client.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FIXME implement this</span><br><span>diff --git a/doc/manuals/osmohlr-usermanual.adoc b/doc/manuals/osmohlr-usermanual.adoc</span><br><span>index 7e709bd..68db1a7 100644</span><br><span>--- a/doc/manuals/osmohlr-usermanual.adoc</span><br><span>+++ b/doc/manuals/osmohlr-usermanual.adoc</span><br><span>@@ -24,6 +24,8 @@</span><br><span> </span><br><span> include::./common/chapters/control_if.adoc[]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+include::{srcdir}/chapters/dgsm.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> include::./common/chapters/gsup.adoc[]</span><br><span> </span><br><span> include::./common/chapters/port_numbers.adoc[]</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hlr/+/16211">change 16211</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-hlr/+/16211"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I392b5523870c2ef3267179160028d26f3f761b77 </div>
<div style="display:none"> Gerrit-Change-Number: 16211 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Jenkins Builder </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>