Hey

Thanks for the suggestion!

I finally had some time for a bit more debugging and was able to make
silent_call work. As it turns out, aside from reverting the silent call
patch from (https://gerrit.osmocom.org/#/c/openbsc/+/1930/) some changes
had to be made to subscr_conn.c to enable the fsm transitions suggested
for silent_call i.e. SUBSCR_CONN_S_NEW to SUBSCR_CONN_S_COMMUNICATING.

If anyone is interested, I'm attaching the patch against the latest git
version (f6400737).

Mihai

On 15/10/2018 11:57, [email protected] wrote:
> On Fri, Oct 12, 2018 at 04:35:04PM +0100, Mihai Ordean wrote:
>> Now I want to enable the silent_call functionality to begin testing but
>> I can't seem able to do so.
> 
> Historically, the silent call feature was an important part of the Osmocom
> heritage: IIRC demonstrating a silent call to locate a phone was one of the
> important early goals of implementing osmo-nitb aka bsc_hack in the first
> place, and from there things have evolved to the multi component externally
> compatible stack we have today.
> 
> But, these days, I don't know of anyone testing on a regular basis whether
> silent call works, be it manually or automatically. Typically that is a
> guarantee for bit rot and breakage.
> 
> I'm fairly certain that is, sadly, the case with the silent call feature. It
> should work, but one refactoring or the other has broken it.
> 
> Looking at the log, I believe the fix is fairly trivial:
> 
> Today's MSC strictly monitors connections by subscribers, and first ensures
> they get accepted (in terms of authentication), and then ensures that they
> establish some sort of meaningful request/response interaction.
> 
> So I think all we need is that in paging_cb_silent(), we transition the conn
> FSM from SUBSCR_CONN_S_ACCEPTED to SUBSCR_CONN_S_COMMUNICATING, to stop the
> timer that watches validity. See msc_subscr_conn_communicating().
> 
> It would be excellent if you could try to implement and test yourself. If you
> need help, do ask again.
> 
> ~N
> 
--- a/src/libmsc/silent_call.c
+++ b/src/libmsc/silent_call.c
@@ -74,7 +74,7 @@
        return rc;
 }
 
-#if 0
+
 /* receive a layer 3 message from a silent call */
 int silent_call_rx(struct gsm_subscriber_connection *conn, struct msgb *msg)
 {
@@ -117,7 +117,7 @@
        LOGP(DLSMS, LOGL_INFO, "Rerouting L3 message from a silent call.\n");
        return 1;
 }
-#endif
+
 
 
 /* initiate a silent call with a given subscriber */


--- a/include/osmocom/msc/silent_call.h
+++ b/include/osmocom/msc/silent_call.h
@@ -7,9 +7,7 @@
                                  void *data, int type);
 extern int gsm_silent_call_stop(struct vlr_subscr *vsub);
 
-#if 0
 extern int silent_call_rx(struct gsm_subscriber_connection *conn, struct msgb 
*msg);
 extern int silent_call_reroute(struct gsm_subscriber_connection *conn, struct 
msgb *msg);
-#endif
 
 #endif /* _SILENT_CALL_H */



--- a/src/libmsc/gsm_04_08.c
+++ a/src/libmsc/gsm_04_08.c
@@ -1470,10 +1470,8 @@
                return -EACCES;
        }
 
-#if 0
        if (silent_call_reroute(conn, msg))
                return silent_call_rx(conn, msg);
-#endif
 
        switch (pdisc) {
        case GSM48_PDISC_CC:

--- a/src/libmsc/subscr_conn.c
+++ b/src/libmsc/subscr_conn.c
@@ -111,8 +111,12 @@
        LOGPFSML(fi, LOGL_NOTICE, "Close event, cause: %s\n", 
gsm48_reject_value_name(*cause));
 }
 
+
+
 static void subscr_conn_fsm_new(struct osmo_fsm_inst *fi, uint32_t event, void 
*data)
 {
+       struct gsm_subscriber_connection *conn = fi->priv;
+
        switch (event) {
        case SUBSCR_CONN_E_COMPLETE_LAYER_3:
                osmo_fsm_inst_state_chg(fi, SUBSCR_CONN_S_AUTH_CIPH, 
SUBSCR_CONN_TIMEOUT, 0);
@@ -120,8 +124,14 @@
 
        case SUBSCR_CONN_E_ACCEPTED:
                evaluate_acceptance_outcome(fi, true);
-               osmo_fsm_inst_state_chg(fi, SUBSCR_CONN_S_ACCEPTED, 
SUBSCR_CONN_TIMEOUT, 0);
-               return;
+               if (conn->silent_call == 1){
+                       osmo_fsm_inst_state_chg(fi, 
SUBSCR_CONN_S_COMMUNICATING, 0, 0);
+                       return;
+               }
+               else {
+                       osmo_fsm_inst_state_chg(fi, SUBSCR_CONN_S_ACCEPTED, 
SUBSCR_CONN_TIMEOUT, 0);
+                       return;
+               }
 
        case SUBSCR_CONN_E_MO_CLOSE:
        case SUBSCR_CONN_E_CN_CLOSE:
@@ -309,6 +319,10 @@
                /* no-op */
                return;
 
+       case SUBSCR_CONN_E_COMPLETE_LAYER_3:
+               /* no-op */
+               return;
+
        case SUBSCR_CONN_E_MO_CLOSE:
        case SUBSCR_CONN_E_CN_CLOSE:
                log_close_event(fi, event, data);
@@ -408,11 +422,13 @@
        [SUBSCR_CONN_S_NEW] = {
                .name = OSMO_STRINGIFY(SUBSCR_CONN_S_NEW),
                .in_event_mask = S(SUBSCR_CONN_E_COMPLETE_LAYER_3) |
+                                S(SUBSCR_CONN_E_COMMUNICATING) |
                                 S(SUBSCR_CONN_E_ACCEPTED) |
                                 S(SUBSCR_CONN_E_MO_CLOSE) |
                                 S(SUBSCR_CONN_E_CN_CLOSE) |
                                 S(SUBSCR_CONN_E_UNUSED),
                .out_state_mask = S(SUBSCR_CONN_S_AUTH_CIPH) |
+                                 S(SUBSCR_CONN_S_COMMUNICATING) |
                                  S(SUBSCR_CONN_S_ACCEPTED) |
                                  S(SUBSCR_CONN_S_RELEASING),
                .action = subscr_conn_fsm_new,
@@ -443,7 +459,7 @@
                /* allow everything to release for any odd behavior */
                .in_event_mask = S(SUBSCR_CONN_E_COMPLETE_LAYER_3) |
                                 S(SUBSCR_CONN_E_COMMUNICATING) |
-                                S(SUBSCR_CONN_E_RELEASE_WHEN_UNUSED) |
+                                S(SUBSCR_CONN_E_RELEASE_WHEN_UNUSED) |
                                 S(SUBSCR_CONN_E_ACCEPTED) |
                                 S(SUBSCR_CONN_E_MO_CLOSE) |
                                 S(SUBSCR_CONN_E_CN_CLOSE) |
@@ -457,6 +473,7 @@
                .name = OSMO_STRINGIFY(SUBSCR_CONN_S_COMMUNICATING),
                /* allow everything to release for any odd behavior */
                .in_event_mask = S(SUBSCR_CONN_E_RELEASE_WHEN_UNUSED) |
+                                S(SUBSCR_CONN_E_COMPLETE_LAYER_3) |
                                 S(SUBSCR_CONN_E_ACCEPTED) |
                                 S(SUBSCR_CONN_E_COMMUNICATING) |
                                 S(SUBSCR_CONN_E_MO_CLOSE) |

<<attachment: m_ordean.vcf>>

Reply via email to