<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9661">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/gsm_09_11.c: implement network-initiated sessions support<br><br>Change-Id: Ief14f8914ef013bd6efd7be842f81fbf053f02e2<br>---<br>M include/osmocom/msc/transaction.h<br>M src/libmsc/gsm_09_11.c<br>M tests/msc_vlr/msc_vlr_test_ss.c<br>M tests/msc_vlr/msc_vlr_test_ss.err<br>4 files changed, 491 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/61/9661/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h</span><br><span>index 63b1cc5..0f82f8f 100644</span><br><span>--- a/include/osmocom/msc/transaction.h</span><br><span>+++ b/include/osmocom/msc/transaction.h</span><br><span>@@ -77,6 +77,10 @@</span><br><span> </span><br><span>                      struct gsm_sms *sms;</span><br><span>                 } sms;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Stores a message to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+             } ss;</span><br><span>        };</span><br><span> </span><br><span>       struct {</span><br><span>diff --git a/src/libmsc/gsm_09_11.c b/src/libmsc/gsm_09_11.c</span><br><span>index ea6d9a1..5a292b2 100644</span><br><span>--- a/src/libmsc/gsm_09_11.c</span><br><span>+++ b/src/libmsc/gsm_09_11.c</span><br><span>@@ -29,6 +29,7 @@</span><br><span> #include <errno.h></span><br><span> #include <stdbool.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/gsm/tlv.h></span><br><span>@@ -194,6 +195,151 @@</span><br><span>    return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Call-back from paging the B-end of the connection */</span><br><span style="color: hsl(120, 100%, 40%);">+static int handle_paging_event(unsigned int hooknum, unsigned int event,</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct msgb *msg, void *_conn, void *_transt)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_subscriber_connection *conn = _conn;</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gsm_paging_event paging_event = event;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_trans *transt = _transt;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm48_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *ss_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  int tid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(!transt->conn);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(transt->ss.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (paging_event) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case GSM_PAGING_SUCCEEDED:</span><br><span style="color: hsl(120, 100%, 40%);">+            DEBUGP(DMM, "Paging subscr %s succeeded!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        vlr_subscr_msisdn_or_name(transt->vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Assign connection */</span><br><span style="color: hsl(120, 100%, 40%);">+               transt->conn = msc_subscr_conn_get(conn, MSC_CONN_USE_TRANS_NC_SS);</span><br><span style="color: hsl(120, 100%, 40%);">+                transt->paging_request = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Assign transaction ID */</span><br><span style="color: hsl(120, 100%, 40%);">+           tid = trans_assign_trans_id(transt->net,</span><br><span style="color: hsl(120, 100%, 40%);">+                   transt->vsub, GSM48_PDISC_NC_SS, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (tid < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DMM, LOGL_ERROR, "No free transaction ID\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* TODO: inform HLR about this */</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* TODO: release connection with subscriber */</span><br><span style="color: hsl(120, 100%, 40%);">+                        transt->callref = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                       trans_free(transt);</span><br><span style="color: hsl(120, 100%, 40%);">+                   return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             transt->transaction_id = tid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Send stored message */</span><br><span style="color: hsl(120, 100%, 40%);">+             ss_msg = transt->ss.msg;</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(ss_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                gh = (struct gsm48_hdr *) msgb_push(ss_msg, sizeof(*gh));</span><br><span style="color: hsl(120, 100%, 40%);">+             gh->proto_discr  = GSM48_PDISC_NC_SS;</span><br><span style="color: hsl(120, 100%, 40%);">+              gh->proto_discr |= transt->transaction_id << 4;</span><br><span style="color: hsl(120, 100%, 40%);">+           gh->msg_type = GSM0480_MTYPE_REGISTER;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Sent to the MS, give ownership of ss_msg */</span><br><span style="color: hsl(120, 100%, 40%);">+                msc_tx_dtap(transt->conn, ss_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         transt->ss.msg = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PAGING_EXPIRED:</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM_PAGING_BUSY:</span><br><span style="color: hsl(120, 100%, 40%);">+         DEBUGP(DMM, "Paging subscr %s %s!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       vlr_subscr_msisdn_or_name(transt->vsub),</span><br><span style="color: hsl(120, 100%, 40%);">+                   paging_event == GSM_PAGING_EXPIRED ? "expired" : "busy");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* TODO: inform HLR about this failure */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           msgb_free(transt->ss.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         transt->ss.msg = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           transt->callref = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               transt->paging_request = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+             trans_free(transt);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</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%);">+   return 0;</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%);">+static struct gsm_trans *establish_nc_ss_trans(struct gsm_network *net,</span><br><span style="color: hsl(120, 100%, 40%);">+       struct vlr_subscr *vsub, struct osmo_gsup_message *gsup_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_subscriber_connection *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_trans *trans, *transt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (gsup_msg->session_state != OSMO_GSUP_SESSION_STATE_BEGIN) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DMM, LOGL_ERROR, "Received non-BEGIN message "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "for non-existing transaction\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</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%);">+   if (!gsup_msg->ss_info || gsup_msg->ss_info_len < 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DMM, LOGL_ERROR, "Missing mandatory Facility IE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</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%);">+   /* If subscriber is not "attached" */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!vsub->lac) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DMM, LOGL_ERROR, "Network-originated session "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "rejected - subscriber is not attached\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</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%);">+   DEBUGP(DMM, "Establishing network-originated session\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Allocate a new transaction */</span><br><span style="color: hsl(120, 100%, 40%);">+      trans = trans_alloc(net, vsub, GSM48_PDISC_NC_SS,</span><br><span style="color: hsl(120, 100%, 40%);">+             0xff, gsup_msg->session_id);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!trans) {</span><br><span style="color: hsl(120, 100%, 40%);">+         DEBUGP(DMM, " -> No memory for trans\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</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%);">+   /* Attempt to find connection */</span><br><span style="color: hsl(120, 100%, 40%);">+      conn = connection_for_subscr(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Assign connection */</span><br><span style="color: hsl(120, 100%, 40%);">+               trans->conn = msc_subscr_conn_get(conn, MSC_CONN_USE_TRANS_NC_SS);</span><br><span style="color: hsl(120, 100%, 40%);">+         trans->dlci = 0x00; /* SAPI=0, not SACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+                return trans;</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%);">+   DEBUGP(DMM, "Triggering Paging Request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Find transaction with this subscriber already paging */</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(transt, &net->trans_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Transaction of our conn? */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (transt == trans || transt->vsub != vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+                       continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DMM, LOGL_ERROR, "Paging already started, "</span><br><span style="color: hsl(120, 100%, 40%);">+                    "rejecting message...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          trans_free(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</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%);">+   /* Trigger Paging Request */</span><br><span style="color: hsl(120, 100%, 40%);">+  trans->paging_request = subscr_request_conn(vsub,</span><br><span style="color: hsl(120, 100%, 40%);">+          &handle_paging_event, trans, "GSM 09.11 SS/USSD");</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!trans->paging_request) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMM, LOGL_ERROR, "Failed to allocate paging token\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         trans_free(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</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%);">+   /* Store the Facility IE to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(trans->ss.msg == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        trans->ss.msg = gsm48_msgb_alloc_name("GSM 04.08 SS/USSD");</span><br><span style="color: hsl(120, 100%, 40%);">+      msgb_tlv_put(trans->ss.msg, GSM0480_IE_FACILITY,</span><br><span style="color: hsl(120, 100%, 40%);">+           gsup_msg->ss_info_len, gsup_msg->ss_info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int gsm0911_gsup_handler(struct vlr_instance *vlr,</span><br><span>                       struct osmo_gsup_message *gsup_msg)</span><br><span> {</span><br><span>@@ -229,12 +375,18 @@</span><br><span>    /* Attempt to find DTAP-transaction */</span><br><span>       trans = trans_find_by_callref(net, gsup_msg->session_id);</span><br><span>         if (!trans) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* FIXME: network-originated sessions are not supported yet */</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DMM, LOGL_ERROR, "Network-originated sessions "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "are not supported, dropping request...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          /* TODO: send ERROR back to the HLR */</span><br><span style="color: hsl(0, 100%, 40%);">-          vlr_subscr_put(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-           return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Attempt to establish a new transaction */</span><br><span style="color: hsl(120, 100%, 40%);">+          trans = establish_nc_ss_trans(net, vsub, gsup_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!trans) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 vlr_subscr_put(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return -EINVAL;</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%);">+           /* Wait for Paging Response */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (trans->paging_request) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       vlr_subscr_put(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    }</span><br><span> </span><br><span>        /* Allocate and prepare a new MT message */</span><br><span>diff --git a/tests/msc_vlr/msc_vlr_test_ss.c b/tests/msc_vlr/msc_vlr_test_ss.c</span><br><span>index f0652b0..88e8036 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_test_ss.c</span><br><span>+++ b/tests/msc_vlr/msc_vlr_test_ss.c</span><br><span>@@ -75,7 +75,7 @@</span><br><span>     EXPECT_CONN_COUNT(0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void _test_ss_ussd(enum ran_type via_ran)</span><br><span style="color: hsl(120, 100%, 40%);">+static void _test_ss_ussd_mo(enum ran_type via_ran)</span><br><span> {</span><br><span>     /* TODO: UTRAN requires auth and ciph */</span><br><span>     rx_from_ran = via_ran;</span><br><span>@@ -117,16 +117,99 @@</span><br><span>       EXPECT_CONN_COUNT(0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_ss_ussd_geran()</span><br><span style="color: hsl(120, 100%, 40%);">+static void _test_ss_ussd_no(enum ran_type via_ran)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct vlr_subscr *vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* TODO: UTRAN requires auth and ciph */</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_from_ran = via_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Perform Location Update */</span><br><span style="color: hsl(120, 100%, 40%);">+ perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BTW("after a while, HLR initiates SS/USSD session");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      paging_expect_imsi(IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+     paging_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  vsub = vlr_subscr_find_by_imsi(net->vlr, IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+    VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 0, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* MT: GSM 04.80 REGISTER with request */</span><br><span style="color: hsl(120, 100%, 40%);">+     gsup_rx("20" /* OSMO_GSUP_MSGT_PROC_SS_REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+           "0108" "09710000004026f0" /* IMSI TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+          "3004" "20000101" /* Session ID TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+            "3101" "01" /* Session state: BEGIN */</span><br><span style="color: hsl(120, 100%, 40%);">+            "3515" FACILITY_IE_REQ, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 1, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr_subscr_put(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  VERBOSE_ASSERT(paging_sent, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+ VERBOSE_ASSERT(paging_stopped, == false, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   btw("the subscriber and its pending request should remain");</span><br><span style="color: hsl(120, 100%, 40%);">+        vsub = vlr_subscr_find_by_imsi(net->vlr, IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+    VERBOSE_ASSERT(llist_count(&vsub->cs.requests), == 1, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr_subscr_put(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       btw("MS replies with Paging Response, we deliver the NC/USSD");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   dtap_expect_tx("0b3b" "1c15" FACILITY_IE_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+    ms_sends_msg("06270703305882089910070000006402");</span><br><span style="color: hsl(120, 100%, 40%);">+   VERBOSE_ASSERT(dtap_tx_confirmed, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+   VERBOSE_ASSERT(paging_stopped, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    btw("MS responds to SS/USSD request");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* MO: GSM 04.80 FACILITY with response */</span><br><span style="color: hsl(120, 100%, 40%);">+    gsup_expect_tx("20" /* OSMO_GSUP_MSGT_PROC_SS_REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+            "0108" "09710000004026f0" /* IMSI TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+          "3004" "20000101" /* Session ID TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+            "3101" "02" /* Session state: CONTINUE */</span><br><span style="color: hsl(120, 100%, 40%);">+         "3527" FACILITY_IE_RSP);</span><br><span style="color: hsl(120, 100%, 40%);">+    ms_sends_msg("8b3a" "27" FACILITY_IE_RSP);</span><br><span style="color: hsl(120, 100%, 40%);">+        VERBOSE_ASSERT(dtap_tx_confirmed, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+   VERBOSE_ASSERT(paging_stopped, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    btw("HLR terminates the session");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MT: GSM 04.80 RELEASE COMPLETE without Facility IE */</span><br><span style="color: hsl(120, 100%, 40%);">+      dtap_expect_tx("0b2a");</span><br><span style="color: hsl(120, 100%, 40%);">+     expect_release_clear(via_ran);</span><br><span style="color: hsl(120, 100%, 40%);">+        gsup_rx("20" /* OSMO_GSUP_MSGT_PROC_SS_REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+           "0108" "09710000004026f0" /* IMSI TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+          "3004" "20000101" /* Session ID TLV */</span><br><span style="color: hsl(120, 100%, 40%);">+            "3101" "03", /* Session state: END */</span><br><span style="color: hsl(120, 100%, 40%);">+             NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        VERBOSE_ASSERT(dtap_tx_confirmed, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+   ASSERT_RELEASE_CLEAR(via_ran);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      btw("all requests serviced, conn has been released");</span><br><span style="color: hsl(120, 100%, 40%);">+       bss_sends_clear_complete();</span><br><span style="color: hsl(120, 100%, 40%);">+   EXPECT_CONN_COUNT(0);</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%);">+static void test_ss_ussd_mo_geran()</span><br><span> {</span><br><span>         comment_start();</span><br><span style="color: hsl(0, 100%, 40%);">-        _test_ss_ussd(RAN_GERAN_A);</span><br><span style="color: hsl(120, 100%, 40%);">+   _test_ss_ussd_mo(RAN_GERAN_A);</span><br><span style="color: hsl(120, 100%, 40%);">+        clear_vlr();</span><br><span style="color: hsl(120, 100%, 40%);">+  comment_end();</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%);">+static void test_ss_ussd_no_geran()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   comment_start();</span><br><span style="color: hsl(120, 100%, 40%);">+      _test_ss_ussd_no(RAN_GERAN_A);</span><br><span>       clear_vlr();</span><br><span>         comment_end();</span><br><span> }</span><br><span> </span><br><span> msc_vlr_test_func_t msc_vlr_tests[] = {</span><br><span>   /* TODO: UTRAN requires auth and enc */</span><br><span style="color: hsl(0, 100%, 40%);">- test_ss_ussd_geran,</span><br><span style="color: hsl(120, 100%, 40%);">+   test_ss_ussd_mo_geran, /* MS-originated */</span><br><span style="color: hsl(120, 100%, 40%);">+    test_ss_ussd_no_geran, /* Network-originated */</span><br><span>      NULL</span><br><span> };</span><br><span>diff --git a/tests/msc_vlr/msc_vlr_test_ss.err b/tests/msc_vlr/msc_vlr_test_ss.err</span><br><span>index 35974a7..870bcf5 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_test_ss.err</span><br><span>+++ b/tests/msc_vlr/msc_vlr_test_ss.err</span><br><span>@@ -1,7 +1,7 @@</span><br><span> full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span> talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-===== test_ss_ussd_geran</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ss_ussd_mo_geran</span><br><span> - Location Update request causes a GSUP LU request to HLR</span><br><span>   MSC <--RAN_GERAN_A-- MS: GSM48_MT_MM_LOC_UPD_REQUEST</span><br><span>   new conn</span><br><span>@@ -204,7 +204,247 @@</span><br><span> DMM Subscr_Conn(CM_SERVICE_REQ:901700000004620){SUBSCR_CONN_S_RELEASED}: Deallocated</span><br><span>   llist_count(&net->subscr_conns) == 0</span><br><span> DREF freeing VLR subscr MSISDN:46071</span><br><span style="color: hsl(0, 100%, 40%);">-===== test_ss_ussd_geran: SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ss_ussd_mo_geran: SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span style="color: hsl(120, 100%, 40%);">+talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ss_ussd_no_geran</span><br><span style="color: hsl(120, 100%, 40%);">+- Location Update request causes a GSUP LU request to HLR</span><br><span style="color: hsl(120, 100%, 40%);">+  MSC <--RAN_GERAN_A-- MS: GSM48_MT_MM_LOC_UPD_REQUEST</span><br><span style="color: hsl(120, 100%, 40%);">+  new conn</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn{SUBSCR_CONN_S_NEW}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DREF unknown: MSC conn use + compl_l3 == 1 (0x1: compl_l3)</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL Dispatching 04.08 message GSM48_MT_MM_LOC_UPD_REQUEST (0x5:0x8)</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: Updated ID</span><br><span style="color: hsl(120, 100%, 40%);">+DMM LOCATION UPDATING REQUEST: MI(IMSI)=901700000004620 type=IMSI ATTACH</span><br><span style="color: hsl(120, 100%, 40%);">+DMM LU/new-LAC: 1/23</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: is child of Subscr_Conn(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: rev=GSM net=GERAN (no Auth)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: Received Event VLR_ULA_E_UPDATE_LA</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr unknown usage increases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR set IMSI on subscriber; IMSI=901700000004620 id=901700000004620</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR New subscr, IMSI: 901700000004620</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_node1()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_post_auth()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_post_ciph()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_node_4()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: state_chg to VLR_ULA_S_WAIT_HLR_UPD</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: is child of vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: Received Event UPD_HLR_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP tx: 04010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+GSUP --> HLR: OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST: 04010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: state_chg to UPD_HLR_VLR_S_WAIT_FOR_DATA</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_COMPLETE_LAYER_3</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_AUTH_CIPH</span><br><span style="color: hsl(120, 100%, 40%);">+DREF IMSI:901700000004620: MSC conn use - compl_l3 == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Awaiting results for Auth+Ciph, overruling event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 0</span><br><span style="color: hsl(120, 100%, 40%);">+- HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_INSERT_DATA_REQUEST: 10010809710000004026f00804036470f1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 17: 10010809710000004026f00804036470f1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR IMSI:901700000004620 has MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR SUBSCR(MSISDN:46071) VLR: update for IMSI=901700000004620 (MSISDN=46071, used=2)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP tx: 12010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+GSUP --> HLR: OSMO_GSUP_MSGT_INSERT_DATA_RESULT: 12010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_INSERT_DATA_REQUEST: vlr_gsupc_read_cb() returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 0</span><br><span style="color: hsl(120, 100%, 40%);">+- HLR also sends GSUP _UPDATE_LOCATION_RESULT</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT: 06010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 11: 06010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: Received Event VLR_ULA_E_HLR_LU_RES</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_WAIT_FOR_DATA}: Received Event UPD_HLR_VLR_E_UPD_LOC_ACK</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_WAIT_FOR_DATA}: state_chg to UPD_HLR_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Removing from parent vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: Received Event VLR_ULA_E_UPD_HLR_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: state_chg to VLR_ULA_S_WAIT_LU_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: is child of vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: Received Event LU_COMPL_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: state_chg to LU_COMPL_VLR_S_WAIT_SUB_PRES</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: is child of lu_compl_vlr_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: Received Event SUB_PRES_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: state_chg to SUB_PRES_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Removing from parent lu_compl_vlr_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_WAIT_SUB_PRES}: Received Event LU_COMPL_VLR_E_SUB_PRES_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+- sending LU Accept for MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_WAIT_SUB_PRES}: state_chg to LU_COMPL_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_LU_COMPL}: Received Event VLR_ULA_E_LU_COMPL_SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_PARENT)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Removing from parent vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_LU_COMPL}: state_chg to VLR_ULA_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Received Event SUBSCR_CONN_E_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: state_chg to SUBSCR_CONN_S_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_ACCEPTED}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_ACCEPTED}: state_chg to SUBSCR_CONN_S_RELEASING</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use + release == 1 (0x100: release)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+- BSSAP Clear --RAN_GERAN_A--> MS</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT: vlr_gsupc_read_cb() returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+- LU was successful, and the conn has already been closed</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  bssap_clear_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+  vsub != NULL == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  strcmp(vsub->imsi, IMSI) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+  vsub->lac == 23</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+- BSS sends BSSMAP Clear Complete</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - release == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASING}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASING}: state_chg to SUBSCR_CONN_S_RELEASED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Terminating (cause = OSMO_FSM_TERM_PARENT)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Removing from parent Subscr_Conn(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: fsm_lu_cleanup called with cause OSMO_FSM_TERM_PARENT</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL MSISDN:46071: Freeing subscriber connection</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&net->subscr_conns) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+---</span><br><span style="color: hsl(120, 100%, 40%);">+- after a while, HLR initiates SS/USSD session</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&vsub->cs.requests) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_PROC_SS_REQUEST: 20010809710000004026f03004200001013101013515a11302010102013b300b04010f0406aa510c061b01</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 43: 20010809710000004026f03004200001013101013515a11302010102013b300b04010f0406aa510c061b01</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR SUBSCR(MSISDN:46071) Rx GSUP msg_type=32 not handled at VLR, forwarding to the router at MSC</span><br><span style="color: hsl(120, 100%, 40%);">+DMSC Routed to GSM 09.11 SS/USSD handler</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Establishing network-originated session</span><br><span style="color: hsl(120, 100%, 40%);">+DCC (ti ff sub MSISDN:46071 callref 20000101) New transaction</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 5</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Triggering Paging Request</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscriber MSISDN:46071 not paged yet, start paging.</span><br><span style="color: hsl(120, 100%, 40%);">+  RAN_GERAN_A sends out paging request to IMSI 901700000004620, TMSI 0xffffffff, LAC 23</span><br><span style="color: hsl(120, 100%, 40%);">+  strcmp(paging_expecting_imsi, imsi) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 6</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 5</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_PROC_SS_REQUEST: vlr_gsupc_read_cb() returns -22</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&vsub->cs.requests) == 1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+  paging_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  paging_stopped == 0</span><br><span style="color: hsl(120, 100%, 40%);">+- the subscriber and its pending request should remain</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&vsub->cs.requests) == 1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+- MS replies with Paging Response, we deliver the NC/USSD</span><br><span style="color: hsl(120, 100%, 40%);">+  MSC <--RAN_GERAN_A-- MS: GSM48_MT_RR_PAG_RESP</span><br><span style="color: hsl(120, 100%, 40%);">+  new conn</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn{SUBSCR_CONN_S_NEW}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DREF unknown: MSC conn use + compl_l3 == 1 (0x1: compl_l3)</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL Dispatching 04.08 message GSM48_MT_RR_PAG_RESP (0x6:0x27)</span><br><span style="color: hsl(120, 100%, 40%);">+DRR PAGING RESPONSE: MI(IMSI)=901700000004620</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_NEW}: Updated ID</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: is child of Subscr_Conn(PAGING_RESP:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: rev=GSM net=GERAN (no Auth)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: Received Event PR_ARQ_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 5</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: proc_arq_vlr_fn_post_imsi()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_node2()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_node2_post_ciph()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_node2_post_vlr()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_post_pres()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_post_trace()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: _proc_arq_vlr_post_imei()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: proc_arq_fsm_done(PASSED)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_INIT}: state_chg to PR_ARQ_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_DONE}: Process Access Request result: PASSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DPAG Paging success for MSISDN:46071 (event=0)</span><br><span style="color: hsl(120, 100%, 40%);">+DPAG Calling paging cbfn.</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Paging subscr 46071 succeeded!</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use + trans_nc_ss == 2 (0x41: compl_l3,trans_nc_ss)</span><br><span style="color: hsl(120, 100%, 40%);">+DMSC msc_tx 25 bytes to MSISDN:46071 via RAN_GERAN_A</span><br><span style="color: hsl(120, 100%, 40%);">+- DTAP --RAN_GERAN_A--> MS: GSM0480_MTYPE_REGISTER: 0b3b1c15a11302010102013b300b04010f0406aa510c061b01</span><br><span style="color: hsl(120, 100%, 40%);">+- DTAP matches expected message</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_ACCEPTED}: subscr_conn_fsm_has_active_transactions: connection still has active transaction: NCSS</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_ACCEPTED}: Received Event SUBSCR_CONN_E_COMPLETE_LAYER_3</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_ACCEPTED}: Event SUBSCR_CONN_E_COMPLETE_LAYER_3 not permitted</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - compl_l3 == 1 (0x40: trans_nc_ss)</span><br><span style="color: hsl(120, 100%, 40%);">+  dtap_tx_confirmed == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  paging_stopped == 1</span><br><span style="color: hsl(120, 100%, 40%);">+- MS responds to SS/USSD request</span><br><span style="color: hsl(120, 100%, 40%);">+  MSC <--RAN_GERAN_A-- MS: GSM0480_MTYPE_FACILITY</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use + dtap == 2 (0x42: dtap,trans_nc_ss)</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL Dispatching 04.08 message GSM0480_MTYPE_FACILITY (0xb:0x3a)</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Received SS/USSD data (trans_id=0, msg_type=GSM0480_MTYPE_FACILITY)</span><br><span style="color: hsl(120, 100%, 40%);">+GSUP --> HLR: OSMO_GSUP_MSGT_PROC_SS_REQUEST: 20010809710000004026f03004200001013101023527a225020101302002013b301b04010f0416d9775d0e2ae3e965f73cfd7683d27310cd06bbc51a0d</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_ACCEPTED}: Received Event SUBSCR_CONN_E_COMMUNICATING</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_ACCEPTED}: state_chg to SUBSCR_CONN_S_COMMUNICATING</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - dtap == 1 (0x40: trans_nc_ss)</span><br><span style="color: hsl(120, 100%, 40%);">+  dtap_tx_confirmed == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  paging_stopped == 1</span><br><span style="color: hsl(120, 100%, 40%);">+- HLR terminates the session</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_PROC_SS_REQUEST: 20010809710000004026f0300420000101310103</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 20: 20010809710000004026f0300420000101310103</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR SUBSCR(MSISDN:46071) Rx GSUP msg_type=32 not handled at VLR, forwarding to the router at MSC</span><br><span style="color: hsl(120, 100%, 40%);">+DMSC Routed to GSM 09.11 SS/USSD handler</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 5</span><br><span style="color: hsl(120, 100%, 40%);">+DMSC msc_tx 2 bytes to MSISDN:46071 via RAN_GERAN_A</span><br><span style="color: hsl(120, 100%, 40%);">+- DTAP --RAN_GERAN_A--> MS: GSM0480_MTYPE_RELEASE_COMPLETE: 0b2a</span><br><span style="color: hsl(120, 100%, 40%);">+- DTAP matches expected message</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - trans_nc_ss == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_COMMUNICATING}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_COMMUNICATING}: state_chg to SUBSCR_CONN_S_RELEASING</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use + release == 1 (0x100: release)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 5</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+- BSSAP Clear --RAN_GERAN_A--> MS</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_PROC_SS_REQUEST: vlr_gsupc_read_cb() returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+  dtap_tx_confirmed == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  bssap_clear_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+- all requests serviced, conn has been released</span><br><span style="color: hsl(120, 100%, 40%);">+- BSS sends BSSMAP Clear Complete</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - release == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_RELEASING}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_RELEASING}: state_chg to SUBSCR_CONN_S_RELEASED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_RELEASED}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_DONE}: Terminating (cause = OSMO_FSM_TERM_PARENT)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_DONE}: Removing from parent Subscr_Conn(PAGING_RESP:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR Process_Access_Request_VLR(PAGING_RESP:901700000004620){PR_ARQ_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL MSISDN:46071: Freeing subscriber connection</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_RELEASED}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(PAGING_RESP:901700000004620){SUBSCR_CONN_S_RELEASED}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&net->subscr_conns) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF freeing VLR subscr MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ss_ussd_no_geran: SUCCESS</span><br><span> </span><br><span> full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span> talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9661">change 9661</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/9661"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ief14f8914ef013bd6efd7be842f81fbf053f02e2 </div>
<div style="display:none"> Gerrit-Change-Number: 9661 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>